<?xml version="1.0" encoding="UTF-8"?>
<robot generator="Robot 7.4.2 (Python 3.11.10 on linux)" generated="2026-08-22T23:16:28.185559" rpa="false" schemaversion="5">
<suite id="s1" name="netconf-clustering.txt">
<suite id="s1-s1" name="CRUD" source="/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/CRUD.robot">
<kw name="Setup_Everything" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:28.822185" 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-08-22T23:16:28.817918" elapsed="0.004337"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-08-22T23:16:28.817427" elapsed="0.004912"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-08-22T23:16:28.827537" 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-08-22T23:16:28.823798" elapsed="0.003771"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-08-22T23:16:28.827826" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:28.827695" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:28.827663" elapsed="0.000242"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:28.828470" 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-08-22T23:16:28.828073" elapsed="0.000446"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-08-22T23:16:28.829037" 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-08-22T23:16:28.828706" elapsed="0.000362"/>
</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-08-22T23:16:28.829652" elapsed="0.000300"/>
</kw>
<msg time="2026-08-22T23:16:28.830063" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:28.830113" 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-08-22T23:16:28.829245" elapsed="0.000892"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:16:28.830732" 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-08-22T23:16:28.830307" elapsed="0.000453"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:16:28.832364" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:16:28.832083" elapsed="0.000310"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:16:28.832819" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:16:28.832543" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:16:28.833464" 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-08-22T23:16:28.833003" elapsed="0.000489"/>
</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-08-22T23:16:28.836740" elapsed="0.000239"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:28.837468" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:16:28.837139" 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-08-22T23:16:28.837661" elapsed="0.000295"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:28.838816" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:28.838465" elapsed="0.000378"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:16:28.838891" elapsed="0.000044"/>
</return>
<msg time="2026-08-22T23:16:28.839067" 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-08-22T23:16:28.838159" elapsed="0.000933"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:16:28.839777" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.200:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396bbadbd10&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-08-22T23:16:28.839314" elapsed="0.000634"/>
</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-08-22T23:16:28.840119" 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-08-22T23:16:28.836065" elapsed="0.004309"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:16:28.835865" elapsed="0.004553"/>
</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-08-22T23:16:28.841288" elapsed="0.000191"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:28.842031" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:16:28.841700" elapsed="0.000358"/>
</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-08-22T23:16:28.842209" elapsed="0.000228"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:28.843260" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:28.842956" elapsed="0.000331"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:16:28.843333" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:16:28.843493" 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-08-22T23:16:28.842661" elapsed="0.000857"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:16:28.844104" level="INFO">Creating Session using : alias=ClusterManagement__session_2, url=http://10.30.170.12:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396bbad9550&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-08-22T23:16:28.843684" elapsed="0.000538"/>
</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-08-22T23:16:28.844382" elapsed="0.000191"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-08-22T23:16:28.840704" elapsed="0.003946"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:16:28.840509" elapsed="0.004184"/>
</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-08-22T23:16:28.845688" elapsed="0.000191"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:28.846353" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:16:28.846031" elapsed="0.000349"/>
</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-08-22T23:16:28.846545" elapsed="0.000243"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:28.847560" 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-08-22T23:16:28.847266" elapsed="0.000336"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:16:28.847649" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:16:28.847807" 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-08-22T23:16:28.846978" elapsed="0.000854"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:16:28.848399" level="INFO">Creating Session using : alias=ClusterManagement__session_3, url=http://10.30.170.79:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396bba77a10&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-08-22T23:16:28.847983" elapsed="0.000526"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-08-22T23:16:28.848684" 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-08-22T23:16:28.845109" elapsed="0.003826"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:16:28.844783" elapsed="0.004195"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-08-22T23:16:28.833562" elapsed="0.015448"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:28.849600" 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-08-22T23:16:28.849175" elapsed="0.000469"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:28.850207" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.200', 2: '10.30.170.12', 3: '10.30.170.79'}</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-08-22T23:16:28.849804" elapsed="0.000447"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:28.850846" 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-08-22T23:16:28.850407" elapsed="0.000482"/>
</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-08-22T23:16:28.831604" elapsed="0.019344"/>
</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-08-22T23:16:28.823396" elapsed="0.027647"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:16:28.851231" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:28.851112" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:28.851091" elapsed="0.000209"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:16:28.854380" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:16:28.853995" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:16:28.854903" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:16:28.854595" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:16:28.854974" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:16:28.855133" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:16:28.853672" elapsed="0.001490"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:16:28.856161" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:16:28.855892" elapsed="0.000296"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:28.857037" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:16:28.857145" 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-08-22T23:16:28.856844" 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-08-22T23:16:28.861095" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:28.860112" elapsed="0.001072"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:28.860090" elapsed="0.001135"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:28.861885" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:16:28.861424" elapsed="0.000746"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:28.863136" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.200" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:28.862431" elapsed="0.000810"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:28.864435" 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-08-22T23:16:28.863511" elapsed="0.000975"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:16:28.866273" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:16:28.866453" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:16:28.865832" elapsed="0.000684"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:16:28.866871" elapsed="0.000459"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:16:28.868470" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:16:29.235822" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:15:32 UTC 2026

  System load:  0.42               Processes:             127
  Usage of /:   13.2% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


[?2004h[jenkins@releng-63244-201-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-08-22T23:16:28.868147" elapsed="0.367848"/>
</kw>
<msg time="2026-08-22T23:16:29.236072" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:16:28.867704" elapsed="0.368532"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:16:28.864949" elapsed="0.371446"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:16:29.237380" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-08-22T23:16:29.250566" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-08-22T23:16:29.250874" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:16:29.251065" 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-08-22T23:16:29.236806" elapsed="0.014362"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:16:29.252004" elapsed="0.001449"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:29.256962" 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-08-22T23:16:29.255207" elapsed="0.002037"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:16:29.258443" elapsed="0.000260"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:29.257720" elapsed="0.001200"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:29.257659" elapsed="0.001360"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:16:29.259546" elapsed="0.000098"/>
</return>
<status status="PASS" start="2026-08-22T23:16:29.259249" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:29.259207" elapsed="0.000580"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:16:29.259857" elapsed="0.000017"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:16:29.263571" 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-08-22T23:16:29.264494" elapsed="0.000367"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:16:29.265166" 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-08-22T23:16:29.260402" elapsed="0.005113"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:16:28.859147" elapsed="0.406631"/>
</kw>
<msg time="2026-08-22T23:16:29.265836" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:16:28.858324" elapsed="0.407569"/>
</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-08-22T23:16:28.857849" elapsed="0.408127"/>
</kw>
<msg time="2026-08-22T23:16:29.266019" 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-08-22T23:16:28.857324" elapsed="0.408746"/>
</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-08-22T23:16:29.268815" elapsed="0.000309"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:16:29.269284" elapsed="0.000149"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:16:29.269599" 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-08-22T23:16:29.266377" elapsed="0.003374"/>
</kw>
<msg time="2026-08-22T23:16:29.269842" 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-08-22T23:16:28.856402" elapsed="0.413467"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:29.270283" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:29.270039" elapsed="0.000309"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:16:29.270393" 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-08-22T23:16:28.855525" elapsed="0.414995"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:16:28.855351" elapsed="0.415265"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:16:29.271546" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:16:29.271274" elapsed="0.000299"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:29.272339" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:16:29.272442" 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-08-22T23:16:29.272171" 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-08-22T23:16:29.276296" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:29.275627" elapsed="0.000764"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:29.275603" elapsed="0.000834"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:29.277243" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:16:29.276679" elapsed="0.000935"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:29.278733" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.12" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:29.277921" elapsed="0.000941"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:29.280465" 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-08-22T23:16:29.279172" elapsed="0.001353"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:16:29.282647" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:16:29.282862" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:16:29.282207" elapsed="0.000706"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:16:29.283322" elapsed="0.000624"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:16:29.285168" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:16:29.631326" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:15:32 UTC 2026

  System load:  0.24               Processes:             126
  Usage of /:   13.2% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


[?2004h[jenkins@releng-63244-201-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-08-22T23:16:29.284849" elapsed="0.346635"/>
</kw>
<msg time="2026-08-22T23:16:29.631575" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:16:29.284359" elapsed="0.347392"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:16:29.281058" elapsed="0.350861"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:16:29.632856" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-08-22T23:16:29.645650" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-08-22T23:16:29.645914" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:16:29.646061" 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-08-22T23:16:29.632303" elapsed="0.013851"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:16:29.646621" elapsed="0.000718"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:29.649086" 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-08-22T23:16:29.648159" elapsed="0.001166"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:16:29.650002" elapsed="0.000077"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:29.649612" elapsed="0.000627"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:29.649537" elapsed="0.000760"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:16:29.650800" elapsed="0.000088"/>
</return>
<status status="PASS" start="2026-08-22T23:16:29.650425" elapsed="0.000575"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:29.650394" elapsed="0.000667"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:16:29.651154" 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-08-22T23:16:29.656299" elapsed="0.000711"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:16:29.657395" elapsed="0.000473"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:16:29.658256" elapsed="0.000431"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:16:29.652054" elapsed="0.006743"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:16:29.274496" elapsed="0.384551"/>
</kw>
<msg time="2026-08-22T23:16:29.659132" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:16:29.273632" elapsed="0.385576"/>
</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-08-22T23:16:29.273142" elapsed="0.386178"/>
</kw>
<msg time="2026-08-22T23:16:29.659378" 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-08-22T23:16:29.272638" elapsed="0.386805"/>
</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-08-22T23:16:29.663370" elapsed="0.000382"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:16:29.663916" elapsed="0.000151"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:16:29.664215" 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-08-22T23:16:29.659969" elapsed="0.004399"/>
</kw>
<msg time="2026-08-22T23:16:29.664462" 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-08-22T23:16:29.271803" elapsed="0.392694"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:29.664968" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:29.664710" elapsed="0.000301"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:16:29.665055" 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-08-22T23:16:29.270917" elapsed="0.394267"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:16:29.270732" elapsed="0.394490"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:16:29.666214" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:16:29.665911" elapsed="0.000330"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:29.666986" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:16:29.667090" 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-08-22T23:16:29.666841" 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-08-22T23:16:29.670515" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:29.669937" elapsed="0.000690"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:29.669915" elapsed="0.000758"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:29.671353" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:16:29.670879" elapsed="0.000800"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:29.672676" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.79" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:29.671941" elapsed="0.000861"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:29.674185" 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-08-22T23:16:29.673071" elapsed="0.001169"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:16:29.676041" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:16:29.676222" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:16:29.675645" elapsed="0.000621"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:16:29.676615" elapsed="0.000632"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:16:29.678511" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:16:30.047300" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:15:45 UTC 2026

  System load:  0.21               Processes:             125
  Usage of /:   13.2% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


[?2004h[jenkins@releng-63244-201-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-08-22T23:16:29.678162" elapsed="0.369405"/>
</kw>
<msg time="2026-08-22T23:16:30.047825" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:16:29.677686" elapsed="0.370516"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:16:29.674713" elapsed="0.373854"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:16:30.051174" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-08-22T23:16:30.064237" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-08-22T23:16:30.064797" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:16:30.065115" 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-08-22T23:16:30.049692" elapsed="0.015569"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:16:30.066272" elapsed="0.001620"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:30.071622" 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-08-22T23:16:30.069650" elapsed="0.002288"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:16:30.073297" elapsed="0.000148"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:30.072481" elapsed="0.001237"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:30.072419" elapsed="0.001406"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:16:30.074932" elapsed="0.000183"/>
</return>
<status status="PASS" start="2026-08-22T23:16:30.074097" elapsed="0.001221"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:30.074054" elapsed="0.001327"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:16:30.075480" elapsed="0.000024"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:16:30.080516" 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="PASS" start="2026-08-22T23:16:30.081799" elapsed="0.000532"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:16:30.082803" elapsed="0.000395"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:16:30.076300" elapsed="0.007008"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:16:29.668956" elapsed="0.414680"/>
</kw>
<msg time="2026-08-22T23:16:30.083798" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:16:29.668294" elapsed="0.415592"/>
</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-08-22T23:16:29.667805" elapsed="0.416197"/>
</kw>
<msg time="2026-08-22T23:16:30.084060" 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-08-22T23:16:29.667272" elapsed="0.416854"/>
</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-08-22T23:16:30.087590" 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-08-22T23:16:30.088067" elapsed="0.000146"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:16:30.088358" elapsed="0.000112"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:16:30.084534" elapsed="0.004004"/>
</kw>
<msg time="2026-08-22T23:16:30.088680" 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-08-22T23:16:29.666462" elapsed="0.422252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:30.089196" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:30.088909" elapsed="0.000330"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:16:30.089299" elapsed="0.000036"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-08-22T23:16:29.665522" elapsed="0.423917"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:16:29.665331" elapsed="0.424147"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:16:28.855214" elapsed="1.234305"/>
</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-08-22T23:16:28.851516" elapsed="1.238103"/>
</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-08-22T23:16:30.089788" elapsed="0.000234"/>
</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-08-22T23:16:30.103750" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:30.103623" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:30.103594" elapsed="0.000238"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:30.104121" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:16:30.104227" 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-08-22T23:16:30.103983" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:30.104675" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:30.104400" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:30.105146" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:30.104866" elapsed="0.000325"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:16:30.106001" 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-08-22T23:16:30.105739" elapsed="0.000477">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-08-22T23:16:30.106329" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:16:30.106375" 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-08-22T23:16:30.105349" elapsed="0.001048"/>
</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-08-22T23:16:30.106729" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:30.106473" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:30.106454" elapsed="0.000378"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:16:30.107789" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:16:30.107305" elapsed="0.000512"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:16:30.107868" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:16:30.108022" level="INFO">${odl_ip} = 10.30.170.200</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:16:30.107034" elapsed="0.001013"/>
</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-08-22T23:16:30.108201" elapsed="0.000438"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:30.108921" level="INFO">index=10
host=10.30.170.200
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-08-22T23:16:30.109024" level="INFO">${karaf_connection_object} = index=10
host=10.30.170.200
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-08-22T23:16:30.108809" elapsed="0.000241"/>
</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-08-22T23:16:30.109203" elapsed="0.002223"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:16:30.111888" level="INFO">Logging into '10.30.170.200:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:16:30.958588" 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-08-22T23:16:30.111614" elapsed="0.847126"/>
</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-08-22T23:16:30.963720" elapsed="0.000374"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:16:30.964261" elapsed="0.000169"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:16:30.964595" 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-08-22T23:16:30.961446" elapsed="0.003308"/>
</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-08-22T23:16:30.959162" elapsed="0.005639"/>
</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-08-22T23:16:30.103300" elapsed="0.861552"/>
</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-08-22T23:16:30.090777" elapsed="0.874121"/>
</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-08-22T23:16:30.090388" elapsed="0.874559"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:16:30.090250" elapsed="0.874737"/>
</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-08-22T23:16:30.978288" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:30.978168" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:30.978143" elapsed="0.000220"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:30.978669" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:16:30.978779" 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-08-22T23:16:30.978513" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:30.979220" 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-08-22T23:16:30.978955" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:30.979674" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:30.979414" elapsed="0.000304"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:16:30.980524" 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-08-22T23:16:30.980283" elapsed="0.000391">Dictionary does not contain key '2'.</status>
</kw>
<msg time="2026-08-22T23:16:30.980790" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:16:30.980836" 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-08-22T23:16:30.979923" elapsed="0.000937"/>
</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-08-22T23:16:30.981159" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:30.980936" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:30.980917" elapsed="0.000342"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:16:30.982025" level="INFO">${ip_address} = 10.30.170.12</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:16:30.981753" elapsed="0.000298"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:16:30.982100" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:16:30.982255" level="INFO">${odl_ip} = 10.30.170.12</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:16:30.981453" elapsed="0.000826"/>
</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-08-22T23:16:30.982429" elapsed="0.000420"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:30.983121" level="INFO">index=12
host=10.30.170.12
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-08-22T23:16:30.983221" level="INFO">${karaf_connection_object} = index=12
host=10.30.170.12
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:16:30.983014" elapsed="0.000233"/>
</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-08-22T23:16:30.983391" elapsed="0.002324"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:16:30.986140" level="INFO">Logging into '10.30.170.12:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:16:31.670598" 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-08-22T23:16:30.985879" elapsed="0.684841"/>
</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-08-22T23:16:31.674005" elapsed="0.000355"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:16:31.674525" elapsed="0.000184"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:16:31.674856" 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-08-22T23:16:31.671719" elapsed="0.003291"/>
</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-08-22T23:16:31.671060" elapsed="0.003996"/>
</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-08-22T23:16:30.977872" elapsed="0.697237"/>
</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-08-22T23:16:30.965639" elapsed="0.709517"/>
</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-08-22T23:16:30.965238" elapsed="0.709971"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:16:30.965095" elapsed="0.710157"/>
</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-08-22T23:16:31.688625" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:31.688492" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:31.688470" elapsed="0.000227"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:31.688980" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:16:31.689087" 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-08-22T23:16:31.688846" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:31.689542" 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-08-22T23:16:31.689278" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:31.689996" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:31.689753" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:16:31.690806" 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-08-22T23:16:31.690558" elapsed="0.000359">Dictionary does not contain key '3'.</status>
</kw>
<msg time="2026-08-22T23:16:31.691028" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:16:31.691074" 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-08-22T23:16:31.690196" elapsed="0.000901"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:31.691398" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:31.691174" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:31.691155" elapsed="0.000341"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:16:31.692439" level="INFO">${ip_address} = 10.30.170.79</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:16:31.692154" elapsed="0.000311"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:16:31.692515" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:16:31.692686" level="INFO">${odl_ip} = 10.30.170.79</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:16:31.691710" elapsed="0.001002"/>
</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-08-22T23:16:31.692865" elapsed="0.000437"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:31.693590" level="INFO">index=14
host=10.30.170.79
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-08-22T23:16:31.693695" level="INFO">${karaf_connection_object} = index=14
host=10.30.170.79
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:16:31.693469" elapsed="0.000253"/>
</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-08-22T23:16:31.693868" elapsed="0.002157"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:16:31.696443" level="INFO">Logging into '10.30.170.79:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:16:32.272455" 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-08-22T23:16:31.696184" elapsed="0.576519"/>
</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-08-22T23:16:32.276213" 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-08-22T23:16:32.276768" elapsed="0.000192"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:16:32.277110" elapsed="0.000204"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:16:32.273944" elapsed="0.003426"/>
</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-08-22T23:16:32.273202" elapsed="0.004212"/>
</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-08-22T23:16:31.688208" elapsed="0.589258"/>
</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-08-22T23:16:31.675948" elapsed="0.601565"/>
</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-08-22T23:16:31.675561" elapsed="0.602004"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:16:31.675419" elapsed="0.602225"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-08-22T23:16:30.090086" elapsed="2.187600"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-08-22T23:16:28.822762" elapsed="3.455003"/>
</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-08-22T23:16:32.280396" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:32.280277" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:32.280254" 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-08-22T23:16:32.285433" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:32.285325" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:32.285306" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:16:32.286448" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:16:32.286062" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:16:32.286949" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:16:32.286646" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:16:32.287019" elapsed="0.000040"/>
</return>
<msg time="2026-08-22T23:16:32.287188" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:16:32.285737" elapsed="0.001475"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:16:32.292439" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:32.292333" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:32.292315" 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-08-22T23:16:32.293732" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:32.293602" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:32.293560" elapsed="0.000240"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:16:32.294263" 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-08-22T23:16:32.293940" elapsed="0.000349"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:32.294687" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:16:32.294442" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:16:32.373473" 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 "/ "n "e "t "[78Cc "[A[78Co</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:16:32.295353" elapsed="0.078300"/>
</kw>
<msg time="2026-08-22T23:16:32.373796" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:16:32.373843" 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-08-22T23:16:32.294865" elapsed="0.079015"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:16:32.488610" level="INFO">"n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "C "R "U "[78CD "[A[78C.
 "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-08-22T23:16:32.374564" elapsed="0.114197"/>
</kw>
<msg time="2026-08-22T23:16:32.488975" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:16:32.489022" level="INFO">${message_wait} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:16:32.374053" elapsed="0.115007"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:32.489395" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:32.489140" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:32.489118" elapsed="0.000452"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:32.490095" level="INFO"> "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "C "R "U "[78CD "[A[78C.
 "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-08-22T23:16:32.489730" elapsed="0.000447"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:32.490478" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:32.490245" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:32.490226" elapsed="0.000456"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:16:32.490718" 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-08-22T23:16:32.492689" elapsed="0.000461"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:16:32.493483" elapsed="0.000350"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:16:32.494153" 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-08-22T23:16:32.491897" elapsed="0.002750"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:16:32.490995" elapsed="0.003786"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:16:32.293293" elapsed="0.201589"/>
</kw>
<msg time="2026-08-22T23:16:32.494975" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:32.495018" level="INFO">${message} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:16:32.292667" elapsed="0.202388"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:16:32.495238" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:16:32.495131" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:32.495112" 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-08-22T23:16:32.496055" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:32.496385" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:16:32.496457" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:16:32.292051" elapsed="0.204514"/>
</kw>
<msg time="2026-08-22T23:16:32.496675" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:32.496719" level="INFO">${output} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:16:32.287608" elapsed="0.209148"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:32.497112" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:32.496866" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:32.496848" elapsed="0.000340"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:16:32.287454" elapsed="0.209757"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:16:32.502522" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:32.502415" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:32.502397" 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-08-22T23:16:32.503856" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:32.503726" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:32.503707" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:16:32.504385" 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-08-22T23:16:32.504066" elapsed="0.000345"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:32.504832" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:16:32.504565" elapsed="0.000293"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:16:32.585770" 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 "/ "n "e "t "[78Cc "[A[78Co</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:16:32.505500" elapsed="0.080400"/>
</kw>
<msg time="2026-08-22T23:16:32.586026" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:16:32.586073" 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-08-22T23:16:32.505015" elapsed="0.081095"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:16:32.676276" level="INFO">"n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "C "R "U "[78CD "[A[78C.
 "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-08-22T23:16:32.586791" elapsed="0.089628"/>
</kw>
<msg time="2026-08-22T23:16:32.676543" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:16:32.676740" level="INFO">${message_wait} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:16:32.586278" elapsed="0.090502"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:32.677131" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:32.676858" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:32.676839" elapsed="0.000465"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:32.677821" level="INFO"> "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "C "R "U "[78CD "[A[78C.
 "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-08-22T23:16:32.677452" 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-08-22T23:16:32.678201" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:32.677967" elapsed="0.000379"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:32.677949" elapsed="0.000424"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:16:32.678407" 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-08-22T23:16:32.680393" 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-08-22T23:16:32.681253" elapsed="0.000282"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:16:32.681875" elapsed="0.000228"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:16:32.679646" elapsed="0.002544"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:16:32.678777" elapsed="0.003542"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:16:32.503403" elapsed="0.179015"/>
</kw>
<msg time="2026-08-22T23:16:32.682510" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:32.682555" level="INFO">${message} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:16:32.502765" elapsed="0.179931"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:16:32.682882" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:16:32.682775" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:32.682756" 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-08-22T23:16:32.683347" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:32.683894" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:16:32.683969" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:16:32.502125" elapsed="0.181953"/>
</kw>
<msg time="2026-08-22T23:16:32.684169" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:32.684213" level="INFO">${output} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:16:32.497469" elapsed="0.186781"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:32.684570" elapsed="0.000071"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:32.684324" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:32.684307" elapsed="0.000409"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:16:32.497334" elapsed="0.187405"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:16:32.689926" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:32.689818" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:32.689800" 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-08-22T23:16:32.691165" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:32.691040" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:32.691021" elapsed="0.000213"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:16:32.691707" 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-08-22T23:16:32.691375" elapsed="0.000358"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:32.692116" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:16:32.691892" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:16:32.773230" 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 "/ "n "e "t "[78Cc "[A[78Co</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:16:32.692837" elapsed="0.080530"/>
</kw>
<msg time="2026-08-22T23:16:32.773500" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:16:32.773547" 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-08-22T23:16:32.692297" elapsed="0.081370"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:16:32.867260" level="INFO">"n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "C "R "U "[78CD "[A[78C.
 "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-08-22T23:16:32.774347" elapsed="0.093055"/>
</kw>
<msg time="2026-08-22T23:16:32.867527" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:16:32.867572" level="INFO">${message_wait} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:16:32.773841" elapsed="0.094021"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:32.868184" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:32.867940" elapsed="0.000389"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:32.867920" elapsed="0.000436"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:32.868892" level="INFO"> "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "C "R "U "[78CD "[A[78C.
 "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-08-22T23:16:32.868500" 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-08-22T23:16:32.869273" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:32.869040" elapsed="0.000379"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:32.869022" elapsed="0.000423"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:16:32.869478" 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-08-22T23:16:32.871453" elapsed="0.000484"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:16:32.872273" elapsed="0.000282"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:16:32.872907" elapsed="0.000231"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:16:32.870708" elapsed="0.002519"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:16:32.869799" elapsed="0.003560"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:16:32.690756" elapsed="0.182704"/>
</kw>
<msg time="2026-08-22T23:16:32.873552" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:32.873617" level="INFO">${message} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:16:32.690140" elapsed="0.183515"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:16:32.873838" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:16:32.873731" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:32.873713" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:32.874298" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:32.874759" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:16:32.874832" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:16:32.689511" elapsed="0.185429"/>
</kw>
<msg time="2026-08-22T23:16:32.875032" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:32.875076" level="INFO">${output} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:16:32.684998" elapsed="0.190115"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:32.875437" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:32.875187" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:32.875170" elapsed="0.000344"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:16:32.684861" elapsed="0.190677"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:16:32.287270" elapsed="0.588296"/>
</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-08-22T23:16:32.285033" elapsed="0.590607"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-08-22T23:16:32.278363" elapsed="0.597334"/>
</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-08-22T23:16:32.277922" elapsed="0.597817"/>
</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-08-22T23:16:28.817063" elapsed="4.058728"/>
</kw>
<kw name="Setup_NetconfKeywords" owner="NetconfKeywords">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:16:32.876671" level="INFO">${tmp} = {}</msg>
<var>${tmp}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:16:32.876323" elapsed="0.000374"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:32.880801" level="INFO">${NetconfKeywords__mounted_device_types} = {}</msg>
<arg>${NetconfKeywords__mounted_device_types}</arg>
<arg>${tmp}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:16:32.876856" elapsed="0.003993"/>
</kw>
<if>
<branch type="IF" condition="${create_session_for_templated_requests}">
<kw name="Create_Default_Session" owner="TemplatedRequests">
<arg>timeout=2</arg>
<doc>Create "default" session to ${url} with authentication and connection parameters.
This Keyword is in this Resource only so that user do not need to call RequestsLibrary directly.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:32.884257" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:32.880922" elapsed="0.003397"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:32.880903" elapsed="0.003440"/>
</if>
<kw name="Initialize_Artifact_Deployment_And_Usage" owner="NexusKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:32.889370" level="INFO">${odl_connection} = 19</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:16:32.888995" elapsed="0.000401"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:16:32.891074" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:16:32.891152" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:16:32.890788" elapsed="0.000388"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:16:32.891331" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:16:32.892493" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:16:33.485465" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:16:33 UTC 2026

  System load:  0.68               Processes:             129
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:16:29 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:16:32.892175" elapsed="0.593380"/>
</kw>
<msg time="2026-08-22T23:16:33.485634" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:16:32.891827" elapsed="0.593874"/>
</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-08-22T23:16:32.890340" elapsed="0.595449"/>
</kw>
<msg time="2026-08-22T23:16:33.485839" 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-08-22T23:16:32.889913" elapsed="0.595972"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:16:32.889573" elapsed="0.596385"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:16:33.485998" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:16:33.486163" level="INFO">${odl} = 19</msg>
<var>${odl}</var>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:16:32.888707" elapsed="0.597481"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-08-22T23:16:33.496600" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-08-22T23:16:33.504685" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../../tools/deployment/search.sh' -&gt; '/home/jenkins//search.sh'</msg>
<arg>/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../../tools/deployment/search.sh</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-08-22T23:16:33.486362" elapsed="0.018455"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:16:33.505164" elapsed="0.000560"/>
</kw>
<if>
<branch type="IF" condition="not (${tools_system_connect})">
<return>
<status status="NOT RUN" start="2026-08-22T23:16:33.506168" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:33.505885" elapsed="0.000377"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:33.505841" elapsed="0.000470"/>
</if>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:33.514425" level="INFO">${tools_connection} = 20</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-08-22T23:16:33.513898" elapsed="0.000564"/>
</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-08-22T23:16:33.516850" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:16:33.516959" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:16:33.516430" elapsed="0.000562"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:16:33.517209" elapsed="0.000512"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:16:33.518906" level="INFO">Logging into '10.30.171.196:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:16:34.194475" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:16:33 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


[?2004h[jenkins@releng-63244-201-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-08-22T23:16:33.518445" elapsed="0.676184"/>
</kw>
<msg time="2026-08-22T23:16:34.194709" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:16:33.517955" elapsed="0.676827"/>
</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-08-22T23:16:33.515780" elapsed="0.679178"/>
</kw>
<msg time="2026-08-22T23:16:34.195009" 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-08-22T23:16:33.515201" elapsed="0.679854"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-08-22T23:16:33.514739" elapsed="0.680390"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-08-22T23:16:34.195181" elapsed="0.000037"/>
</return>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:16:33.513389" elapsed="0.681954"/>
</kw>
<doc>Places search utility to ODL system, which will be needed for version detection.
By default also initialize a SSH connection to Tools system,
as following Keywords assume a working connection towards target system.</doc>
<status status="PASS" start="2026-08-22T23:16:32.884612" elapsed="1.310785"/>
</kw>
<arg>create_session_for_templated_requests=False</arg>
<doc>Setup the environment for the other keywords of this Resource to work properly.</doc>
<status status="PASS" start="2026-08-22T23:16:32.876033" elapsed="1.319416"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:16:34.196084" level="INFO">Creating Session using : alias=node1, url=http://10.30.170.200:8181, headers={'Content-Type': 'application/xml'},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396bb9595d0&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>node1</arg>
<arg>http://${ODL_SYSTEM_1_IP}:${RESTCONFPORT}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-08-22T23:16:34.195664" elapsed="0.000607"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:16:34.196759" level="INFO">Creating Session using : alias=node2, url=http://10.30.170.12:8181, headers={'Content-Type': 'application/xml'},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396bb963790&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>node2</arg>
<arg>http://${ODL_SYSTEM_2_IP}:${RESTCONFPORT}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-08-22T23:16:34.196435" elapsed="0.000462"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:16:34.197361" level="INFO">Creating Session using : alias=node3, url=http://10.30.170.79:8181, headers={'Content-Type': 'application/xml'},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396bb96e4d0&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>node3</arg>
<arg>http://${ODL_SYSTEM_3_IP}:${RESTCONFPORT}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-08-22T23:16:34.197058" elapsed="0.000435"/>
</kw>
<doc>Initialize SetupUtils, setup everything needed for the test cases.</doc>
<status status="PASS" start="2026-08-22T23:16:28.816663" elapsed="5.380898"/>
</kw>
<test id="s1-s1-t1" name="Start_Testtool" line="68">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:16:34.201138" elapsed="0.000240"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:16:34.200872" 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-08-22T23:16:34.202481" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:34.202349" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:34.202327" elapsed="0.000222"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:16:34.207395" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:34.207287" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:34.207269" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:16:34.208490" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:16:34.208100" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:16:34.208994" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:16:34.208690" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:16:34.209064" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:16:34.209217" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:16:34.207703" 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-08-22T23:16:34.214634" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:34.214502" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:34.214482" 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-08-22T23:16:34.215865" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:34.215758" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:34.215740" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:16:34.216409" 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-08-22T23:16:34.216090" elapsed="0.000382"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:34.216880" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:16:34.216648" elapsed="0.000258"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:16:34.271630" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:16:34.217392" elapsed="0.054787"/>
</kw>
<msg time="2026-08-22T23:16:34.272404" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:16:34.272451" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:34.217062" elapsed="0.055427"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:16:34.294067" level="INFO">"t "x "t ". "C "R "U "D ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:16:34.273031" elapsed="0.021140"/>
</kw>
<msg time="2026-08-22T23:16:34.294347" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:16:34.294394" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                           ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:34.272689" elapsed="0.021741"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:34.294765" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:34.294509" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:34.294488" elapsed="0.000357"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:34.295299" level="INFO"> "t "x "t ". "C "R "U "D ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:34.294985" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:34.295657" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:34.295426" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:34.295408" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:16:34.295769" 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-08-22T23:16:34.298524" elapsed="0.000171"/>
</kw>
<msg time="2026-08-22T23:16:34.298760" 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-08-22T23:16:34.297286" elapsed="0.001614"/>
</kw>
<kw name="Open 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-08-22T23:16:34.299196" elapsed="0.000089"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:34.299565" 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-08-22T23:16:34.296615" 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-08-22T23:16:34.296060" elapsed="0.003795"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:16:34.215436" elapsed="0.084545"/>
</kw>
<msg time="2026-08-22T23:16:34.300072" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:34.300115" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                           ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:34.214849" elapsed="0.085301"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:16:34.300330" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:16:34.300225" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:34.300207" elapsed="0.000204"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:34.300831" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:34.301157" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:16:34.301262" 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-08-22T23:16:34.214164" elapsed="0.087209"/>
</kw>
<msg time="2026-08-22T23:16:34.301464" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:34.301507" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                           ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:34.209637" elapsed="0.091904"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:34.301966" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:34.301718" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:34.301700" elapsed="0.000343"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:16:34.209482" elapsed="0.092585"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:16:34.307386" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:34.307278" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:34.307259" 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-08-22T23:16:34.308649" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:34.308514" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:34.308496" elapsed="0.000222"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:16:34.309169" 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-08-22T23:16:34.308858" elapsed="0.000337"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:34.309569" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:16:34.309349" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:16:34.363048" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:16:34.310094" elapsed="0.053055"/>
</kw>
<msg time="2026-08-22T23:16:34.363320" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:16:34.363365" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:34.309766" elapsed="0.053635"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:16:34.386274" level="INFO">"t "x "t ". "C "R "U "D ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:16:34.364094" elapsed="0.022276"/>
</kw>
<msg time="2026-08-22T23:16:34.386539" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:16:34.386609" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                           ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:34.363567" elapsed="0.023080"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:34.386939" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:34.386722" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:34.386703" elapsed="0.000314"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:34.387450" level="INFO"> "t "x "t ". "C "R "U "D ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:34.387152" 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-08-22T23:16:34.387803" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:34.387575" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:34.387557" elapsed="0.000336"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:16:34.387926" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<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-08-22T23:16:34.390542" elapsed="0.000164"/>
</kw>
<msg time="2026-08-22T23:16:34.390770" 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-08-22T23:16:34.389382" elapsed="0.001531"/>
</kw>
<kw name="Open 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-08-22T23:16:34.391202" elapsed="0.000088"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:34.391614" 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-08-22T23:16:34.388715" elapsed="0.003107"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:16:34.388175" elapsed="0.003749"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:16:34.308211" elapsed="0.083811"/>
</kw>
<msg time="2026-08-22T23:16:34.392113" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:34.392156" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                           ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:34.307615" elapsed="0.084577"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:16:34.392372" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:16:34.392267" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:34.392249" elapsed="0.000204"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:34.392879" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:34.393205" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:16:34.393276" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:16:34.306941" elapsed="0.086441"/>
</kw>
<msg time="2026-08-22T23:16:34.393472" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:34.393515" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                           ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:34.302325" elapsed="0.091225"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:34.393891" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:34.393646" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:34.393628" elapsed="0.000338"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:16:34.302189" elapsed="0.091800"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:16:34.399446" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:34.399339" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:34.399320" 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-08-22T23:16:34.400691" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:34.400560" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:34.400542" elapsed="0.000215"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:16:34.401204" 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-08-22T23:16:34.400896" elapsed="0.000334"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:34.401621" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:16:34.401381" elapsed="0.000267"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:16:34.473241" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:16:34.402128" elapsed="0.071361"/>
</kw>
<msg time="2026-08-22T23:16:34.473777" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:16:34.473828" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:34.401802" elapsed="0.072065"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:16:34.492897" level="INFO">"t "x "t ". "C "R "U "D ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:16:34.474616" elapsed="0.018405"/>
</kw>
<msg time="2026-08-22T23:16:34.493208" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:16:34.493254" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                           ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:34.474132" elapsed="0.019238"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:34.493774" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:34.493475" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:34.493442" elapsed="0.000417"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:34.494726" level="INFO"> "t "x "t ". "C "R "U "D ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:34.494000" elapsed="0.000788"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:34.495077" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:34.494858" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:34.494840" elapsed="0.000316"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:16:34.495194" 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-08-22T23:16:34.498200" elapsed="0.000151"/>
</kw>
<msg time="2026-08-22T23:16:34.498417" 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-08-22T23:16:34.496931" elapsed="0.001669"/>
</kw>
<kw name="Open 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-08-22T23:16:34.498904" elapsed="0.000090"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:34.499275" 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-08-22T23:16:34.496198" elapsed="0.003295"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:16:34.495521" elapsed="0.004040"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:16:34.400263" elapsed="0.099422"/>
</kw>
<msg time="2026-08-22T23:16:34.499777" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:34.499834" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                           ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:34.399681" elapsed="0.100190"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:16:34.500053" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:16:34.499946" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:34.499928" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:34.500533" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:34.501041" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:16:34.501112" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:16:34.398960" elapsed="0.102260"/>
</kw>
<msg time="2026-08-22T23:16:34.501313" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:34.501357" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                           ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:34.394243" elapsed="0.107149"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:34.501731" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:34.501466" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:34.501449" elapsed="0.000360"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:16:34.394107" elapsed="0.107726"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:16:34.209301" elapsed="0.292563"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:16:34.206930" elapsed="0.294997"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:16:34.202052" elapsed="0.299931"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:34.201603" elapsed="0.300475"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:16:34.198430" elapsed="0.303707"/>
</kw>
<kw name="Install_And_Start_Testtool" owner="NetconfKeywords">
<kw name="Deploy_Test_Tool" owner="NexusKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:34.522696" level="INFO">${name_prefix} = netconf-testtool-</msg>
<var>${name_prefix}</var>
<arg>${artifact}-</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:34.522362" elapsed="0.000362"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:16:34.523234" level="INFO">${extension} = jar</msg>
<var>${extension}</var>
<arg>'${component}'=='odl-micro'</arg>
<arg>tar</arg>
<arg>jar</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:16:34.522886" elapsed="0.000374"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:16:34.523871" level="INFO">${name_suffix} = -executable.jar</msg>
<var>${name_suffix}</var>
<arg>"${suffix}" != ""</arg>
<arg>-${suffix}.${extension}</arg>
<arg>.${extension}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:16:34.523430" elapsed="0.000468"/>
</kw>
<kw name="Deploy_Artifact" owner="NexusKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_url}""" != ""</arg>
<arg>Deploy_From_Url</arg>
<arg>${explicit_url}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:16:34.525137" elapsed="0.000317"/>
</kw>
<kw name="Fetch From Left" owner="String">
<msg time="2026-08-22T23:16:34.525845" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot</msg>
<var>${urlbase}</var>
<arg>${BUNDLE_URL}</arg>
<arg>/org/opendaylight</arg>
<doc>Returns contents of the ``string`` before the first occurrence of ``marker``.</doc>
<status status="PASS" start="2026-08-22T23:16:34.525628" elapsed="0.000244"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:16:34.526416" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot</msg>
<var>${urlbase}</var>
<arg>'${urlbase}' != '${BUNDLE_URL}'</arg>
<arg>${urlbase}</arg>
<arg>${fallback_url}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:16:34.526030" elapsed="0.000412"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Magnesium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_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-08-22T23:16:34.546977" elapsed="0.000407"/>
</kw>
<arg>magnesium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to titanium and in case titanium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'carpeople'] {} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:16:34.546507" elapsed="0.000947"/>
</kw>
<msg time="2026-08-22T23:16:34.547499" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>magnesium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:16:34.538018" elapsed="0.009530"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>carpeople</arg>
<doc>Compare magnesium to titanium and in case titanium is at most magnesium,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:16:34.537618" elapsed="0.010023"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Aluminium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_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-08-22T23:16:34.566136" elapsed="0.000400"/>
</kw>
<arg>aluminium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to titanium and in case titanium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'netconf'] {} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:16:34.565685" elapsed="0.000936"/>
</kw>
<msg time="2026-08-22T23:16:34.566668" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>aluminium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:16:34.557059" elapsed="0.009658"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>netconf</arg>
<doc>Compare aluminium to titanium and in case titanium is at most aluminium,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:16:34.556675" elapsed="0.010117"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Silicon" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_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-08-22T23:16:34.585080" elapsed="0.000395"/>
</kw>
<arg>silicon</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to titanium and in case titanium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'bgpcep'] {} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:16:34.584629" elapsed="0.000914"/>
</kw>
<msg time="2026-08-22T23:16:34.585606" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>silicon</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:16:34.576156" elapsed="0.009499"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>bgpcep</arg>
<doc>Compare silicon to titanium and in case titanium is at most silicon,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:16:34.575759" elapsed="0.009970"/>
</kw>
<if>
<branch type="IF" condition="'${build_version}'=='${EMPTY}'">
<kw name="NexusKeywords__Detect_Version_To_Pull" owner="NexusKeywords">
<kw name="NexusKeywords__Get_Items_To_Look_At" owner="NexusKeywords">
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<arg>Component not supported by NexusKeywords version detection: ${component}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:16:34.588776" elapsed="0.000254"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:16:34.589527" elapsed="0.000198"/>
</kw>
<msg time="2026-08-22T23:16:34.589770" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Collections.Get_From_Dictionary</arg>
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:16:34.589190" elapsed="0.000628"/>
</kw>
<msg time="2026-08-22T23:16:34.589920" level="INFO">${itemlist} = netconf-api</msg>
<var>${itemlist}</var>
<arg>${component}</arg>
<doc>Get a list of items that might contain the version number that we are looking for.</doc>
<status status="PASS" start="2026-08-22T23:16:34.588395" elapsed="0.001549"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:34.590223" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:16:34.590324" level="INFO">${current_ssh_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:16:34.590099" elapsed="0.000251"/>
</kw>
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:34.595350" level="INFO">${odl_connection} = 21</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:16:34.594956" elapsed="0.000420"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:16:34.597132" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:16:34.597210" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:16:34.596852" elapsed="0.000382"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:16:34.597388" elapsed="0.000370"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:16:34.599257" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:16:34.924937" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:16:33 UTC 2026

  System load:  0.68               Processes:             129
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:16:33 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:16:34.598270" elapsed="0.326846"/>
</kw>
<msg time="2026-08-22T23:16:34.925191" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:16:34.597924" elapsed="0.327350"/>
</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-08-22T23:16:34.596357" elapsed="0.329036"/>
</kw>
<msg time="2026-08-22T23:16:34.925454" 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-08-22T23:16:34.595978" elapsed="0.329535"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:16:34.595565" elapsed="0.330058"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:16:34.925676" elapsed="0.000047"/>
</return>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:16:34.594610" elapsed="0.331242"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:16:34.926346" level="INFO">Executing command 'sh search.sh /tmp/netconf-karaf-9.0.4-SNAPSHOT/system netconf-api'.</msg>
<msg time="2026-08-22T23:16:34.959828" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:16:34.959964" level="INFO">${version} = 9.0.4-SNAPSHOT
org/opendaylight/netconf</msg>
<msg time="2026-08-22T23:16:34.960012" level="INFO">${result} = 0</msg>
<var>${version}</var>
<var>${result}</var>
<arg>sh search.sh ${WORKSPACE}/${BUNDLEFOLDER}/system ${itemlist}</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:16:34.926062" elapsed="0.033974"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:16:34.960210" elapsed="0.000673"/>
</kw>
<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-08-22T23:16:34.964301" elapsed="0.000143"/>
</kw>
<msg time="2026-08-22T23:16:34.964487" 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-08-22T23:16:34.963670" 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-08-22T23:16:34.964781" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:34.964941" 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-08-22T23:16:34.961168" elapsed="0.003852"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:34.965445" level="INFO">9.0.4-SNAPSHOT
org/opendaylight/netconf</msg>
<arg>${version}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:34.965168" elapsed="0.000332"/>
</kw>
<if>
<branch type="IF" condition="${result}!=0">
<kw name="Fail" owner="BuiltIn">
<arg>Component "${component}": searching for "${itemlist}" found no version, cannot locate test tool.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:34.965833" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:34.965609" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:34.965565" elapsed="0.000348"/>
</if>
<kw name="Split String" owner="String">
<msg time="2026-08-22T23:16:34.966295" level="INFO">${version} = 9.0.4-SNAPSHOT</msg>
<msg time="2026-08-22T23:16:34.966338" level="INFO">${location} = org/opendaylight/netconf</msg>
<var>${version}</var>
<var>${location}</var>
<arg>${version}</arg>
<arg>max_split=1</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-08-22T23:16:34.966055" elapsed="0.000306"/>
</kw>
<return>
<value>${version}</value>
<value>${location}</value>
<status status="PASS" start="2026-08-22T23:16:34.966416" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:16:34.966636" level="INFO">${version} = 9.0.4-SNAPSHOT</msg>
<msg time="2026-08-22T23:16:34.966682" level="INFO">${location} = org/opendaylight/netconf</msg>
<var>${version}</var>
<var>${location}</var>
<arg>${component}</arg>
<doc>Determine the exact Nexus directory to be used as a source for a particular test tool
Figure out what version of the tool needs to be pulled out of the
Nexus by looking at the version directory of the subsystem from
which the tool is being pulled. This code is REALLY UGLY but there
is no way around it until the bug
https://bugs.opendaylight.org/show_bug.cgi?id=5206 gets fixed.
I also don't want to depend on maven-metadata-local.xml and other
bits and pieces of ODL distribution which are not required for ODL
to function properly.</doc>
<status status="PASS" start="2026-08-22T23:16:34.587981" elapsed="0.378723"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:34.585802" elapsed="0.380945"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${version}</var>
<var>${location}</var>
<arg>${build_version}</arg>
<arg>${build_location}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:34.966927" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:34.966775" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:34.585782" elapsed="0.381228"/>
</if>
<if>
<branch type="IF" condition="'SNAPSHOT' in '${version}'">
<kw name="Remove Values From List" owner="Collections">
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>netconf</arg>
<arg>bgpcep</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:16:34.967321" elapsed="0.000207"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:34.967068" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:34.967052" elapsed="0.000563"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:16:34.968146" level="INFO">${is_staged} = "FALSE"</msg>
<var>${is_staged}</var>
<arg>"opendaylight.release" not in '${urlbase}' and "opendaylight.snapshot" not in '${urlbase}'</arg>
<arg>"TRUE"</arg>
<arg>"FALSE"</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:16:34.967767" elapsed="0.000406"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:16:34.968734" level="INFO">${is_mri_component} = "FALSE"</msg>
<var>${is_mri_component}</var>
<arg>'${component}' in ${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>"TRUE"</arg>
<arg>"FALSE"</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:16:34.968339" elapsed="0.000421"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:16:34.969305" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot</msg>
<var>${urlbase}</var>
<arg>${is_mri_component} == "TRUE" and ${is_staged} == "FALSE"</arg>
<arg>${NEXUS_RELEASE_BASE_URL}</arg>
<arg>${urlbase}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:16:34.968923" elapsed="0.000408"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:34.969868" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.4-SNAPSHOT</msg>
<var>${url}</var>
<arg>${urlbase}/${location}/${artifact}/${version}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:34.969487" elapsed="0.000407"/>
</kw>
<kw name="Execute_Command_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:16:34.971863" level="INFO">Executing command 'curl -L https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.4-SNAPSHOT/maven-metadata.xml'.</msg>
<msg time="2026-08-22T23:16:35.066444" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:16:35.066750" level="INFO">${stdout} = &lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;metadata modelVersion="1.1.0"&gt;
  &lt;groupId&gt;org.opendaylight.netconf&lt;/groupId&gt;
  &lt;artifactId&gt;netconf-testtool&lt;/artifactId&gt;
  &lt;versioning&gt;
    &lt;lastUpdated&gt;2026082...</msg>
<msg time="2026-08-22T23:16:35.066860" level="INFO">${stderr} =   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0   ...</msg>
<msg time="2026-08-22T23:16:35.066954" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:16:34.971673" elapsed="0.095331"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:16:35.069734" level="INFO">Length is 316.</msg>
<msg time="2026-08-22T23:16:35.069961" level="FAIL">'  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  2763  100  2763    0     0  45723      0 --:--:-- --:--:-- --:--:-- 46050' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-08-22T23:16:35.068827" elapsed="0.001347">'  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  2763  100  2763    0     0  45723      0 --:--:-- --:--:-- --:--:-- 46050' should be empty.</status>
</kw>
<msg time="2026-08-22T23:16:35.070533" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-08-22T23:16:35.070673" level="INFO">${result} = '  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0  ...</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:35.067401" elapsed="0.003329"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:16:35.072103" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:16:35.071103" elapsed="0.001058"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:35.074694" level="INFO">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;metadata modelVersion="1.1.0"&gt;
  &lt;groupId&gt;org.opendaylight.netconf&lt;/groupId&gt;
  &lt;artifactId&gt;netconf-testtool&lt;/artifactId&gt;
  &lt;versioning&gt;
    &lt;lastUpdated&gt;20260822052751&lt;/lastUpdated&gt;
    &lt;snapshot&gt;
      &lt;timestamp&gt;20260822.052751&lt;/timestamp&gt;
      &lt;buildNumber&gt;14&lt;/buildNumber&gt;
    &lt;/snapshot&gt;
    &lt;snapshotVersions&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;pom&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;javadoc&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;executable&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;stress-client&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;rest-perf-client&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;scale-util&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;stress-client&lt;/classifier&gt;
        &lt;extension&gt;tar.gz&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;cyclonedx&lt;/classifier&gt;
        &lt;extension&gt;xml&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;cyclonedx&lt;/classifier&gt;
        &lt;extension&gt;json&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;sources&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
    &lt;/snapshotVersions&gt;
  &lt;/versioning&gt;
  &lt;version&gt;9.0.4-SNAPSHOT&lt;/version&gt;
&lt;/metadata&gt;</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:35.074114" elapsed="0.000761"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:35.075784" level="INFO">  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  2763  100  2763    0     0  45723      0 --:--:-- --:--:-- --:--:-- 46050</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:35.075207" elapsed="0.000682"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:35.076778" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:35.076216" elapsed="0.000658"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:16:35.073130" elapsed="0.003867"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:35.072337" elapsed="0.004738"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:35.072290" elapsed="0.004843"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:16:35.077487" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:35.077258" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:35.077220" elapsed="0.000446"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:16:35.078033" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-08-22T23:16:35.077784" elapsed="0.000380"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:35.077750" elapsed="0.000466"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:35.078453" elapsed="0.000022"/>
</kw>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:16:34.971047" elapsed="0.107524"/>
</kw>
<msg time="2026-08-22T23:16:35.078656" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:16:34.970486" elapsed="0.108218"/>
</kw>
<msg time="2026-08-22T23:16:35.078893" level="INFO">${metadata} = &lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;metadata modelVersion="1.1.0"&gt;
  &lt;groupId&gt;org.opendaylight.netconf&lt;/groupId&gt;
  &lt;artifactId&gt;netconf-testtool&lt;/artifactId&gt;
  &lt;versioning&gt;
    &lt;lastUpdated&gt;2026082...</msg>
<var>${metadata}</var>
<arg>curl -L ${url}/maven-metadata.xml</arg>
<doc>A wrapper for Execute_Command_Passes with return_success_only=False
Also, log_on_success defaults to True (but is customizable, unlike return_success_only)..</doc>
<status status="PASS" start="2026-08-22T23:16:34.970095" elapsed="0.108827"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:16:35.081240" level="INFO">Executing command 'echo "&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;metadata modelVersion="1.1.0"&gt;
  &lt;groupId&gt;org.opendaylight.netconf&lt;/groupId&gt;
  &lt;artifactId&gt;netconf-testtool&lt;/artifactId&gt;
  &lt;versioning&gt;
    &lt;lastUpdated&gt;20260822052751&lt;/lastUpdated&gt;
    &lt;snapshot&gt;
      &lt;timestamp&gt;20260822.052751&lt;/timestamp&gt;
      &lt;buildNumber&gt;14&lt;/buildNumber&gt;
    &lt;/snapshot&gt;
    &lt;snapshotVersions&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;pom&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;javadoc&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;executable&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;stress-client&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;rest-perf-client&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;scale-util&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;stress-client&lt;/classifier&gt;
        &lt;extension&gt;tar.gz&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;cyclonedx&lt;/classifier&gt;
        &lt;extension&gt;xml&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;cyclonedx&lt;/classifier&gt;
        &lt;extension&gt;json&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;sources&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
    &lt;/snapshotVersions&gt;
  &lt;/versioning&gt;
  &lt;version&gt;9.0.4-SNAPSHOT&lt;/version&gt;
&lt;/metadata&gt;" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1'.</msg>
<msg time="2026-08-22T23:16:35.113091" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:16:35.113348" level="INFO">${stdout} = 9.0.4-20260822.052751-14</msg>
<msg time="2026-08-22T23:16:35.113448" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:16:35.113566" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:16:35.081058" elapsed="0.032601"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:16:35.115458" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:16:35.114845" elapsed="0.000718"/>
</kw>
<msg time="2026-08-22T23:16:35.115807" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:16:35.115903" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:35.114057" elapsed="0.001895"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:16:35.117292" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:16:35.116317" elapsed="0.001041"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:35.119325" level="INFO">9.0.4-20260822.052751-14</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:35.118975" elapsed="0.000427"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:35.120213" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:35.119648" elapsed="0.000622"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:35.120849" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:35.120482" elapsed="0.000427"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:16:35.118388" elapsed="0.002599"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:35.117626" elapsed="0.003411"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:35.117547" elapsed="0.003526"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:16:35.121293" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:35.121151" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:35.121128" elapsed="0.000293"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:16:35.121717" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:16:35.121507" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:35.121485" elapsed="0.000351"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:35.122036" elapsed="0.000030"/>
</kw>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:16:35.080438" elapsed="0.041763"/>
</kw>
<msg time="2026-08-22T23:16:35.122272" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:16:35.079930" elapsed="0.042408"/>
</kw>
<arg>echo "${metadata}" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1</arg>
<arg>stderr_must_be_empty=${True}</arg>
<doc>A wrapper for Execute_Command_Passes with return_success_only=False
Also, log_on_success defaults to True (but is customizable, unlike return_success_only)..</doc>
<status status="PASS" start="2026-08-22T23:16:35.079465" elapsed="0.042981"/>
</kw>
<msg time="2026-08-22T23:16:35.122605" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:35.122671" level="INFO">${namepart} = 9.0.4-20260822.052751-14</msg>
<var>${status}</var>
<var>${namepart}</var>
<arg>SSHKeywords.Execute_Command_Should_Pass</arg>
<arg>echo "${metadata}" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1</arg>
<arg>stderr_must_be_empty=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:35.079079" elapsed="0.043624"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:16:35.123288" level="INFO">Length is 24.</msg>
<msg time="2026-08-22T23:16:35.123391" level="INFO">${length} = 24</msg>
<var>${length}</var>
<arg>${namepart}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:16:35.122924" elapsed="0.000500"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:16:35.124220" level="INFO">${namepart} = 9.0.4-20260822.052751-14</msg>
<var>${namepart}</var>
<arg>"${status}" != "PASS" or ${length} == 0</arg>
<arg>${version}</arg>
<arg>${namepart}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:16:35.123669" elapsed="0.000588"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:35.124981" level="INFO">${filename} = netconf-testtool-9.0.4-20260822.052751-14-executable.jar</msg>
<var>${filename}</var>
<arg>${name_prefix}${namepart}${name_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:35.124481" elapsed="0.000537"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:35.125627" level="INFO">netconf-testtool-9.0.4-20260822.052751-14-executable.jar</msg>
<arg>${filename}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:35.125238" elapsed="0.000453"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:35.126347" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.4-SNAPSHOT/netconf-testtool-9.0.4-20260822.052751-14-executable.jar</msg>
<var>${url}</var>
<arg>${url}/${filename}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:35.125899" elapsed="0.000494"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:16:35.126879" level="INFO">Executing command 'wget -q -N 'https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.4-SNAPSHOT/netconf-testtool-9.0.4-20260822.052751-14-executable.jar' 2&gt;&amp;1'.</msg>
<msg time="2026-08-22T23:16:35.438243" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:16:35.438755" level="INFO">${response} = </msg>
<msg time="2026-08-22T23:16:35.438864" level="INFO">${result} = 0</msg>
<var>${response}</var>
<var>${result}</var>
<arg>wget -q -N '${url}' 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:16:35.126646" elapsed="0.312273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:35.440312" level="INFO"/>
<arg>${response}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:35.439503" elapsed="0.000907"/>
</kw>
<if>
<branch type="IF" condition="${result} == 0">
<return>
<value>${filename}</value>
<status status="PASS" start="2026-08-22T23:16:35.440947" elapsed="0.000083"/>
</return>
<status status="PASS" start="2026-08-22T23:16:35.440634" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:35.440542" elapsed="0.000632"/>
</if>
<kw name="Replace String Using Regexp" owner="String">
<var>${release_url}</var>
<arg>${url}</arg>
<arg>autorelease-[0-9]{4}</arg>
<arg>opendaylight.release</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:35.441543" elapsed="0.000082"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${response}</var>
<var>${result}</var>
<arg>wget -q -N '${release_url}' 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:35.442048" elapsed="0.000049"/>
</kw>
<if>
<branch type="IF" condition="${result} != 0">
<kw name="Fail" owner="BuiltIn">
<arg>Artifact "${artifact}" in component "${component}" could not be downloaded from ${release_url} nor ${url}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:35.442488" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:35.442265" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:16:35.442223" elapsed="0.000393"/>
</if>
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-08-22T23:16:35.442664" elapsed="0.000021"/>
</return>
<msg time="2026-08-22T23:16:35.442883" level="INFO">${filename} = netconf-testtool-9.0.4-20260822.052751-14-executable.jar</msg>
<var>${filename}</var>
<arg>${component}</arg>
<arg>${artifact}</arg>
<arg>${name_prefix}</arg>
<arg>${name_suffix}</arg>
<arg>${fallback_url}</arg>
<arg>${explicit_url}</arg>
<arg>${build_version}</arg>
<arg>${build_location}</arg>
<doc>Deploy the specified artifact from Nexus to the cwd of the machine to which the active SSHLibrary connection points.
netconf is a name part of an artifact present in system/ of ODl installation with the same version as netconf-testtool should have.
Must have https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-karaf/9.0.4-SNAPSHOT/netconf-karaf-9.0.4-20260822.052751-14.zip variable set to the URL from which the
tested ODL distribution was downloaded and this place must be
inside a repository created by a standard distribution
construction job. If this is detected to ne be the case, fallback URL is used.
If  is non-empty, Deploy_From_Utrl is called instead.
TODO: Allow deploying to a specific directory, we have SSHKeywords.Execute_Command_At_Cwd_Should_Pass now.</doc>
<status status="PASS" start="2026-08-22T23:16:34.524480" elapsed="0.918440"/>
</kw>
<return>
<value>${filename}</value>
<status status="PASS" start="2026-08-22T23:16:35.443144" elapsed="0.000040"/>
</return>
<msg time="2026-08-22T23:16:35.443387" level="INFO">${filename} = netconf-testtool-9.0.4-20260822.052751-14-executable.jar</msg>
<var>${filename}</var>
<arg>netconf</arg>
<arg>netconf-testtool</arg>
<doc>Deploy a test tool.
The test tools have naming convention of the form
"&lt;repository_url&gt;/some/dir/somewhere/&lt;tool-name&gt;/&lt;tool-name&gt;-&lt;version-tag&gt;-${suffix}.jar"
where "&lt;tool-name&gt;" is the name of the tool and "&lt;version-tag&gt;" is
the version tag that is digged out of the maven metadata. This
keyword calculates ${name_prefix} and ${name_suffix} for
"Deploy_Artifact" and then calls "Deploy_Artifact" to do the real
work of deploying the artifact.</doc>
<status status="PASS" start="2026-08-22T23:16:34.516593" elapsed="0.926838"/>
</kw>
<kw name="Start_Testtool" owner="NetconfKeywords">
<kw name="NetconfKeywords__Deploy_Additional_Schemas" owner="NetconfKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:16:35.445872" level="INFO">Executing command 'rm -rf schemas 2&gt;&amp;1'.</msg>
<msg time="2026-08-22T23:16:35.488385" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:16:35.488644" level="INFO">${response} = </msg>
<var>${response}</var>
<arg>rm -rf schemas 2&gt;&amp;1</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:16:35.445717" elapsed="0.042986"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:35.489788" level="INFO"/>
<arg>${response}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:35.489140" elapsed="0.000745"/>
</kw>
<if>
<branch type="IF" condition="'${schemas}' == 'none'">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-08-22T23:16:35.490297" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:35.490038" elapsed="0.000371"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:35.489996" elapsed="0.000469"/>
</if>
<kw name="Put Directory" owner="SSHLibrary">
<msg time="2026-08-22T23:16:35.535976" level="INFO">[chan 5] Opened sftp connection (server version 3)</msg>
<msg time="2026-08-22T23:16:35.612727" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/yang-ext@2013-07-09.yang' -&gt; '/home/jenkins/./schemas/yang-ext@2013-07-09.yang'</msg>
<msg time="2026-08-22T23:16:35.612792" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/example-action@2016-07-07.yang' -&gt; '/home/jenkins/./schemas/example-action@2016-07-07.yang'</msg>
<msg time="2026-08-22T23:16:35.612831" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/car@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/car@2014-08-18.yang'</msg>
<msg time="2026-08-22T23:16:35.612867" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/car-purchase@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/car-purchase@2014-08-18.yang'</msg>
<msg time="2026-08-22T23:16:35.612902" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/ncmount-l2fib@2016-03-07.yang' -&gt; '/home/jenkins/./schemas/ncmount-l2fib@2016-03-07.yang'</msg>
<msg time="2026-08-22T23:16:35.612939" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/augment-main-a@2014-01-21.yang' -&gt; '/home/jenkins/./schemas/augment-main-a@2014-01-21.yang'</msg>
<msg time="2026-08-22T23:16:35.612974" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/ietf-netconf-monitoring@2010-10-04.yang' -&gt; '/home/jenkins/./schemas/ietf-netconf-monitoring@2010-10-04.yang'</msg>
<msg time="2026-08-22T23:16:35.613009" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/ietf-netconf-monitoring-extension@2013-12-10.yang' -&gt; '/home/jenkins/./schemas/ietf-netconf-monitoring-extension@2013-12-10.yang'</msg>
<msg time="2026-08-22T23:16:35.613045" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/people@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/people@2014-08-18.yang'</msg>
<msg time="2026-08-22T23:16:35.613078" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/test@2014-10-18.yang' -&gt; '/home/jenkins/./schemas/test@2014-10-18.yang'</msg>
<msg time="2026-08-22T23:16:35.613113" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/car-people@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/car-people@2014-08-18.yang'</msg>
<msg time="2026-08-22T23:16:35.613145" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/ietf-inet-types@2010-09-24.yang' -&gt; '/home/jenkins/./schemas/ietf-inet-types@2010-09-24.yang'</msg>
<msg time="2026-08-22T23:16:35.613178" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/main@2014-01-21.yang' -&gt; '/home/jenkins/./schemas/main@2014-01-21.yang'</msg>
<arg>${schemas}</arg>
<arg>destination=./schemas</arg>
<doc>Uploads a directory, including its content, from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-08-22T23:16:35.490819" elapsed="0.122426"/>
</kw>
<kw name="List Directory" owner="SSHLibrary">
<msg time="2026-08-22T23:16:35.616737" level="INFO">13 items:
augment-main-a@2014-01-21.yang
car-people@2014-08-18.yang
car-purchase@2014-08-18.yang
car@2014-08-18.yang
example-action@2016-07-07.yang
ietf-inet-types@2010-09-24.yang
ietf-netconf-monitoring-extension@2013-12-10.yang
ietf-netconf-monitoring@2010-10-04.yang
main@2014-01-21.yang
ncmount-l2fib@2016-03-07.yang
people@2014-08-18.yang
test@2014-10-18.yang
yang-ext@2013-07-09.yang</msg>
<arg>./schemas</arg>
<doc>Returns and logs items in the remote ``path``, optionally filtered with ``pattern``.</doc>
<status status="PASS" start="2026-08-22T23:16:35.613483" elapsed="0.003334"/>
</kw>
<return>
<value>--schemas-dir ./schemas</value>
<status status="PASS" start="2026-08-22T23:16:35.616884" elapsed="0.000047"/>
</return>
<msg time="2026-08-22T23:16:35.617078" level="INFO">${schemas_option} = --schemas-dir ./schemas</msg>
<var>${schemas_option}</var>
<arg>${schemas}</arg>
<doc>Internal keyword for Install_And_Start_TestTool
This deploys the additional schemas if any and returns a
command line argument to be added to the testtool commandline
to tell it to load them. While this code could be integrated
into its only user, I considered the resulting code to be too
unreadable as the actions are quite different in the two
possibilities (additional schemas present versus no additional
schemas present), therefore a separate keyword is used.</doc>
<status status="PASS" start="2026-08-22T23:16:35.445185" elapsed="0.171928"/>
</kw>
<kw name="NetconfKeywords__Deploy_Custom_RPC" owner="NetconfKeywords">
<if>
<branch type="IF" condition="'${rpc_config}' == 'none'">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-08-22T23:16:35.618002" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:16:35.617845" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:35.617815" elapsed="0.000353"/>
</if>
<kw name="Copy_File_To_Tools_System" owner="SSHKeywords">
<arg>${TOOLS_SYSTEM_1_IP}</arg>
<arg>${rpc_config}</arg>
<arg>/tmp</arg>
<doc>Wrapper keyword to make it easier to copy a file to an Tools specific system</doc>
<status status="NOT RUN" start="2026-08-22T23:16:35.618475" elapsed="0.000040"/>
</kw>
<return>
<value>--rpc-config /tmp/customaction.xml</value>
<status status="NOT RUN" start="2026-08-22T23:16:35.618603" elapsed="0.000024"/>
</return>
<msg time="2026-08-22T23:16:35.621819" level="INFO">${rpc_config_option} = </msg>
<var>${rpc_config_option}</var>
<arg>${rpc_config}</arg>
<doc>Internal keyword for Install_And_Start_TestTool
This deploys the optional custom rpc file.
Drop out of the keyword, returning no command line argument when there
is no rpc file to deploy.</doc>
<status status="PASS" start="2026-08-22T23:16:35.617469" elapsed="0.004388"/>
</kw>
<kw name="Compose_Full_Java_Command" owner="NexusKeywords">
<kw name="Compose_Base_Java_Command" owner="NexusKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${openjdk}""" == "openjdk8"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_8_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_8_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:16:35.623847" elapsed="0.000491"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${openjdk}""" == "openjdk11"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_11_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_11_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:16:35.624574" elapsed="0.000456"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${openjdk}""" == "openjdk17"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_17_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_17_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:16:35.625257" elapsed="0.000481"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Compose_Dilemma_Filepath" owner="NexusKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:16:35.627491" level="INFO">Executing command 'ls -lA /usr/lib/jvm/java-21-openjdk-amd64/bin/java 2&gt;&amp;1'.</msg>
<msg time="2026-08-22T23:16:35.639326" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:16:35.639432" level="INFO">${out} = -rwxr-xr-x 1 root root 14456 Apr 26 09:33 /usr/lib/jvm/java-21-openjdk-amd64/bin/java</msg>
<msg time="2026-08-22T23:16:35.639495" level="INFO">${rc} = 0</msg>
<var>${out}</var>
<var>${rc}</var>
<arg>ls -lA ${specific_path} 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:16:35.627209" elapsed="0.012309"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${specific_path}</value>
<status status="PASS" start="2026-08-22T23:16:35.639730" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-08-22T23:16:35.639620" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:35.639599" elapsed="0.000220"/>
</if>
<return>
<value>${default_path}</value>
<status status="NOT RUN" start="2026-08-22T23:16:35.639852" elapsed="0.000014"/>
</return>
<arg>${JAVA_21_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_21_HOME_UBUNTU}/bin/java</arg>
<doc>Query active SSH connection, return specific path if it exists else default path.</doc>
<status status="PASS" start="2026-08-22T23:16:35.626667" elapsed="0.013293"/>
</kw>
<msg time="2026-08-22T23:16:35.640005" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>"""${openjdk}""" == "openjdk21"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_21_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_21_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:16:35.625966" elapsed="0.014093"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${out}</var>
<var>${rc}</var>
<arg>java -version 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:35.640226" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>java</value>
<status status="NOT RUN" start="2026-08-22T23:16:35.640397" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:35.640319" elapsed="0.000168"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:16:35.640302" elapsed="0.000231"/>
</if>
<kw name="Execute Command" owner="SSHLibrary">
<var>${java}</var>
<arg>echo $JAVA_HOME/bin/java 2&gt;&amp;1</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:35.640890" elapsed="0.000048"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${out}</var>
<var>${rc}</var>
<arg>${java} -version 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:35.641269" elapsed="0.000046"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${java}</value>
<status status="NOT RUN" start="2026-08-22T23:16:35.641612" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:35.641495" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:16:35.641453" elapsed="0.000300"/>
</if>
<kw name="Get Environment Variable" owner="OperatingSystem">
<var>${JAVA_HOME}</var>
<arg>JAVA_HOME</arg>
<arg>${EMPTY}</arg>
<doc>Returns the value of an environment variable with the given name.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:35.642060" elapsed="0.000046"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${java}</var>
<arg>"""${JAVA_HOME}"""!=""</arg>
<arg>${JAVA_HOME}/bin/java</arg>
<arg>false</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:35.642468" elapsed="0.000047"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${out}</var>
<var>${rc}</var>
<arg>${java} -version 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:35.642887" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${java}</value>
<status status="NOT RUN" start="2026-08-22T23:16:35.643169" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:35.643089" elapsed="0.000171"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:16:35.643052" elapsed="0.000255"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unable to find Java; specify \${JDKVERSION}, put it to your PATH or set JAVA_HOME environment variable.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:35.643681" elapsed="0.000049"/>
</kw>
<msg time="2026-08-22T23:16:35.643957" level="INFO">${base_command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java</msg>
<var>${base_command}</var>
<arg>openjdk=${openjdk}</arg>
<doc>Return string suitable for launching Java programs over SSHLibrary, depending on JRE version needed.
This requires that the SSH connection on which the command is going to be used is active as it is needed for querying files.
Commands composed for one SSH connection shall not be reused on other SSH connections as the two connections may have different Java setups.
Not directly related to Nexus, but versioned Java tools may need this.</doc>
<status status="PASS" start="2026-08-22T23:16:35.623291" elapsed="0.020722"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:35.645207" level="INFO">${full_command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.4-20260822.052751-14-executable.jar  --device-count 1 --debug true --schemas-dir ./...</msg>
<var>${full_command}</var>
<arg>${base_command} ${options}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:35.644347" elapsed="0.000922"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:35.646229" level="INFO">/usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.4-20260822.052751-14-executable.jar  --device-count 1 --debug true --schemas-dir ./schemas  --md-sal true</msg>
<arg>${full_command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:35.645682" elapsed="0.000651"/>
</kw>
<return>
<value>${full_command}</value>
<status status="PASS" start="2026-08-22T23:16:35.646432" elapsed="0.000062"/>
</return>
<msg time="2026-08-22T23:16:35.646804" level="INFO">${command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.4-20260822.052751-14-executable.jar  --device-count 1 --debug true --schemas-dir ./...</msg>
<var>${command}</var>
<arg>${java_options} -jar ${filename} ${tool_options} --device-count ${device-count} --debug ${debug} ${schemas_option} ${rpc_config_option} --md-sal ${mdsal}</arg>
<doc>Return full Bash command to run Java with given options.
This requires that the SSH connection on which the command is going to be used is active as it is needed for querying files.
The options may include JVM options, application command line arguments, Bash redirects and other constructs.</doc>
<status status="PASS" start="2026-08-22T23:16:35.622190" elapsed="0.024674"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:35.647878" level="INFO">Running testtool: /usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.4-20260822.052751-14-executable.jar  --device-count 1 --debug true --schemas-dir ./schemas  --md-sal true</msg>
<arg>Running testtool: ${command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:35.647205" elapsed="0.000775"/>
</kw>
<kw name="Get Log File Name" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:16:35.651065" level="INFO">${name} = netconf-clustering-txt-CRUD</msg>
<var>${name}</var>
<arg>"""${SUITE_NAME}""".replace(" ","-").replace("/","-").replace(".","-")</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:35.650705" elapsed="0.000386"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:16:35.653567" level="INFO">${suffix} = </msg>
<var>${suffix}</var>
<arg>'${testcase}' != ''</arg>
<arg>--${testcase}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:16:35.651253" elapsed="0.002357"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-08-22T23:16:35.653969" level="INFO">${date} = 2026-08-22 23:16:35.654</msg>
<var>${date}</var>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-08-22T23:16:35.653778" elapsed="0.000216"/>
</kw>
<kw name="Convert Date" owner="DateTime">
<msg time="2026-08-22T23:16:35.656995" level="INFO">${timestamp} = 1787440595.654</msg>
<var>${timestamp}</var>
<arg>${date}</arg>
<arg>epoch</arg>
<doc>Converts between supported `date formats`.</doc>
<status status="PASS" start="2026-08-22T23:16:35.654144" elapsed="0.002880"/>
</kw>
<return>
<value>${testtool}--${name}${suffix}.${timestamp}.log</value>
<status status="PASS" start="2026-08-22T23:16:35.657074" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:16:35.657315" level="INFO">${logfile} = testtool--netconf-clustering-txt-CRUD.1787440595.654.log</msg>
<var>${logfile}</var>
<arg>testtool</arg>
<doc>Get the name of the suite sanitized to be usable as a part of filename.
These names are used to constructs names of the log files produced
by the testing tools so two suites using a tool wont overwrite the
log files if they happen to run in one job.</doc>
<status status="PASS" start="2026-08-22T23:16:35.648419" elapsed="0.008922"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:35.661969" level="INFO">${testtool_log} = testtool--netconf-clustering-txt-CRUD.1787440595.654.log</msg>
<arg>${testtool_log}</arg>
<arg>${logfile}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:16:35.657506" elapsed="0.004510"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:16:35.679972" level="INFO">/usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.4-20260822.052751-14-executable.jar  --device-count 1 --debug true --schemas-dir ./schemas  --md-sal true &gt;testtool--netconf-clustering-txt-CRUD.1787440595.654.log 2&gt;&amp;1</msg>
<arg>${command} &gt;${logfile} 2&gt;&amp;1</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:16:35.662172" elapsed="0.017860"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:35.684013" level="INFO">${NetconfKeywords__testtool_device_count} = 1</msg>
<arg>${NetconfKeywords__testtool_device_count}</arg>
<arg>${device-count}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:16:35.680202" elapsed="0.003858"/>
</kw>
<kw name="Perform_Operation_On_Each_Device" owner="NetconfKeywords">
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-08-22T23:16:35.684882" level="INFO">${current_Date} = 2026-08-22 23:16:35.685</msg>
<var>${current_Date}</var>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-08-22T23:16:35.684725" elapsed="0.000183"/>
</kw>
<kw name="Add Time To Date" owner="DateTime">
<msg time="2026-08-22T23:16:35.685394" level="INFO">${deadline_Date} = 2026-08-23 00:01:35.685</msg>
<var>${deadline_Date}</var>
<arg>${current_Date}</arg>
<arg>${timeout}</arg>
<doc>Adds time to date and returns the resulting date.</doc>
<status status="PASS" start="2026-08-22T23:16:35.685058" elapsed="0.000361"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:35.689945" level="INFO">${current_port} = 17830</msg>
<arg>${current_port}</arg>
<arg>${BASE_NETCONF_DEVICE_PORT}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:16:35.685595" elapsed="0.004395"/>
</kw>
<kw name="Repeat Keyword" owner="BuiltIn">
<msg time="2026-08-22T23:16:35.690463" level="INFO">Repeating keyword, round 1/1.</msg>
<kw name="NetconfKeywords__Perform_Operation_With_Checking_On_Next_Device" owner="NetconfKeywords">
<kw name="NetconfKeywords__Check_Netconf_Test_Timeout_Not_Expired" owner="NetconfKeywords">
<if>
<branch type="IF" condition="not ${ENABLE_NETCONF_TEST_TIMEOUT}">
<return>
<status status="NOT RUN" start="2026-08-22T23:16:35.691608" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:35.691480" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:35.691462" elapsed="0.000211"/>
</if>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-08-22T23:16:35.691976" level="INFO">${current_Date} = 2026-08-22 23:16:35.692</msg>
<var>${current_Date}</var>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-08-22T23:16:35.691821" elapsed="0.000180"/>
</kw>
<kw name="Subtract Date From Date" owner="DateTime">
<msg time="2026-08-22T23:16:35.692463" level="INFO">${ellapsed_seconds} = 2699.993</msg>
<var>${ellapsed_seconds}</var>
<arg>${deadline_Date}</arg>
<arg>${current_Date}</arg>
<doc>Subtracts date from another date and returns time between.</doc>
<status status="PASS" start="2026-08-22T23:16:35.692148" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="${ellapsed_seconds}&lt;0">
<kw name="Fail" owner="BuiltIn">
<arg>The global time out period expired</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:35.692863" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:35.692611" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:35.692591" elapsed="0.000350"/>
</if>
<arg>${deadline_Date}</arg>
<status status="PASS" start="2026-08-22T23:16:35.691246" elapsed="0.001742"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:16:35.693496" level="INFO">${number} = 1</msg>
<var>${number}</var>
<arg>${current_port}-${BASE_NETCONF_DEVICE_PORT}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:35.693132" elapsed="0.000390"/>
</kw>
<kw name="Run Keyword" owner="BuiltIn">
<kw name="NetconfKeywords__Wait_Device_Is_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:16:35.694971" level="INFO">${number} = 1</msg>
<var>${number}</var>
<arg>'${device_name}'.split('-').pop()</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:35.694617" elapsed="0.000381"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:16:35.696622" level="INFO">${device-port} = 17830</msg>
<var>${device-port}</var>
<arg>${FIRST_TESTTOOL_PORT}+${device-number}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:35.695999" elapsed="0.000651"/>
</kw>
<kw name="NetconfKeywords__Check_Device_Is_Up" owner="NetconfKeywords">
<kw name="Count_Port_Occurences" owner="SSHKeywords">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_And_Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:16:35.700356" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-08-22T23:16:35.712016" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:16:35.712232" level="INFO">${netstat_installed} = net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET...</msg>
<var>${netstat_installed}</var>
<arg>netstat --version</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:16:35.700259" elapsed="0.012032"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<doc>Install netstat if it is not already installed.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:35.713270" elapsed="0.000055"/>
</kw>
<msg time="2026-08-22T23:16:35.713407" level="FAIL">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</msg>
<status status="FAIL" start="2026-08-22T23:16:35.712451" elapsed="0.001068">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</branch>
<status status="FAIL" start="2026-08-22T23:16:35.712408" elapsed="0.001235">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="FAIL" start="2026-08-22T23:16:35.699975" elapsed="0.013985">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</kw>
<arg>Check_And_Install_Netstat</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:35.699336" elapsed="0.015013"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:16:35.717970" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-08-22T23:16:35.760524" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:16:35.761026" level="INFO">${output} = 0</msg>
<var>${output}</var>
<arg>${NETSTAT_COMMAND} 2&gt; /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:16:35.717068" elapsed="0.044069"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:16:35.761287" elapsed="0.000151"/>
</return>
<msg time="2026-08-22T23:16:35.762128" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${last-port}</arg>
<arg>LISTEN</arg>
<arg>java</arg>
<doc>Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.</doc>
<status status="PASS" start="2026-08-22T23:16:35.697446" elapsed="0.064931"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-08-22T23:16:35.765002" level="FAIL">0 != 1</msg>
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-08-22T23:16:35.763380" elapsed="0.001950">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-08-22T23:16:35.696825" elapsed="0.069240">0 != 1</status>
</kw>
<arg>${number}</arg>
<doc>Query netstat on remote machine whether testtool device with the specified number has its port open and fail if not.</doc>
<status status="FAIL" start="2026-08-22T23:16:35.695681" elapsed="0.070627">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:16:36.769938" level="INFO">${device-port} = 17830</msg>
<var>${device-port}</var>
<arg>${FIRST_TESTTOOL_PORT}+${device-number}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:36.768221" elapsed="0.001798"/>
</kw>
<kw name="NetconfKeywords__Check_Device_Is_Up" owner="NetconfKeywords">
<kw name="Count_Port_Occurences" owner="SSHKeywords">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_And_Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:16:36.777986" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-08-22T23:16:36.790961" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:16:36.791102" level="INFO">${netstat_installed} = net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET...</msg>
<var>${netstat_installed}</var>
<arg>netstat --version</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:16:36.777825" elapsed="0.013314"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<doc>Install netstat if it is not already installed.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:36.791780" elapsed="0.000037"/>
</kw>
<msg time="2026-08-22T23:16:36.791890" level="FAIL">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</msg>
<status status="FAIL" start="2026-08-22T23:16:36.791264" elapsed="0.000705">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</branch>
<status status="FAIL" start="2026-08-22T23:16:36.791227" elapsed="0.000805">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="FAIL" start="2026-08-22T23:16:36.777174" elapsed="0.015053">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</kw>
<arg>Check_And_Install_Netstat</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:36.776198" elapsed="0.016337"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:16:36.794808" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-08-22T23:16:36.840624" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:16:36.841093" level="INFO">${output} = 0</msg>
<var>${output}</var>
<arg>${NETSTAT_COMMAND} 2&gt; /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:16:36.794228" elapsed="0.046974"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:16:36.841355" elapsed="0.000139"/>
</return>
<msg time="2026-08-22T23:16:36.842169" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${last-port}</arg>
<arg>LISTEN</arg>
<arg>java</arg>
<doc>Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.</doc>
<status status="PASS" start="2026-08-22T23:16:36.771790" elapsed="0.070587"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-08-22T23:16:36.844995" level="FAIL">0 != 1</msg>
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-08-22T23:16:36.843340" elapsed="0.001942">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-08-22T23:16:36.770525" elapsed="0.075448">0 != 1</status>
</kw>
<arg>${number}</arg>
<doc>Query netstat on remote machine whether testtool device with the specified number has its port open and fail if not.</doc>
<status status="FAIL" start="2026-08-22T23:16:36.767180" elapsed="0.079013">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:16:37.849753" level="INFO">${device-port} = 17830</msg>
<var>${device-port}</var>
<arg>${FIRST_TESTTOOL_PORT}+${device-number}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:37.848165" elapsed="0.001663"/>
</kw>
<kw name="NetconfKeywords__Check_Device_Is_Up" owner="NetconfKeywords">
<kw name="Count_Port_Occurences" owner="SSHKeywords">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_And_Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:16:37.856786" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-08-22T23:16:37.869546" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:16:37.869717" level="INFO">${netstat_installed} = net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET...</msg>
<var>${netstat_installed}</var>
<arg>netstat --version</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:16:37.856511" elapsed="0.013243"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<doc>Install netstat if it is not already installed.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:37.870371" elapsed="0.000040"/>
</kw>
<msg time="2026-08-22T23:16:37.870484" level="FAIL">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</msg>
<status status="FAIL" start="2026-08-22T23:16:37.869876" elapsed="0.000690">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</branch>
<status status="FAIL" start="2026-08-22T23:16:37.869840" elapsed="0.000815">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="FAIL" start="2026-08-22T23:16:37.856227" elapsed="0.014645">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</kw>
<arg>Check_And_Install_Netstat</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:37.855431" elapsed="0.015714"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:16:37.873285" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-08-22T23:16:37.920483" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:16:37.920989" level="INFO">${output} = 0</msg>
<var>${output}</var>
<arg>${NETSTAT_COMMAND} 2&gt; /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:16:37.872771" elapsed="0.048327"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:16:37.921255" elapsed="0.000141"/>
</return>
<msg time="2026-08-22T23:16:37.922073" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${last-port}</arg>
<arg>LISTEN</arg>
<arg>java</arg>
<doc>Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.</doc>
<status status="PASS" start="2026-08-22T23:16:37.851333" elapsed="0.070945"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-08-22T23:16:37.924974" level="FAIL">0 != 1</msg>
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-08-22T23:16:37.923291" elapsed="0.001983">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-08-22T23:16:37.850239" elapsed="0.075968">0 != 1</status>
</kw>
<arg>${number}</arg>
<doc>Query netstat on remote machine whether testtool device with the specified number has its port open and fail if not.</doc>
<status status="FAIL" start="2026-08-22T23:16:37.847151" elapsed="0.079279">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:16:38.930044" level="INFO">${device-port} = 17830</msg>
<var>${device-port}</var>
<arg>${FIRST_TESTTOOL_PORT}+${device-number}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:38.928427" elapsed="0.001704"/>
</kw>
<kw name="NetconfKeywords__Check_Device_Is_Up" owner="NetconfKeywords">
<kw name="Count_Port_Occurences" owner="SSHKeywords">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_And_Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:16:38.937326" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-08-22T23:16:38.949463" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:16:38.949632" level="INFO">${netstat_installed} = net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET...</msg>
<var>${netstat_installed}</var>
<arg>netstat --version</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:16:38.937210" elapsed="0.012468"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<doc>Install netstat if it is not already installed.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:38.950299" elapsed="0.000037"/>
</kw>
<msg time="2026-08-22T23:16:38.950388" level="FAIL">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</msg>
<status status="FAIL" start="2026-08-22T23:16:38.949799" elapsed="0.000661">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</branch>
<status status="FAIL" start="2026-08-22T23:16:38.949761" elapsed="0.000761">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="FAIL" start="2026-08-22T23:16:38.936927" elapsed="0.013825">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</kw>
<arg>Check_And_Install_Netstat</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:38.935867" elapsed="0.015148"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:16:38.953173" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-08-22T23:16:39.010491" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:16:39.010846" level="INFO">${output} = 0</msg>
<var>${output}</var>
<arg>${NETSTAT_COMMAND} 2&gt; /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:16:38.952661" elapsed="0.058257"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:16:39.011022" elapsed="0.000096"/>
</return>
<msg time="2026-08-22T23:16:39.011522" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${last-port}</arg>
<arg>LISTEN</arg>
<arg>java</arg>
<doc>Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.</doc>
<status status="PASS" start="2026-08-22T23:16:38.931905" elapsed="0.079785"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-08-22T23:16:39.013391" level="FAIL">0 != 1</msg>
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-08-22T23:16:39.012314" elapsed="0.001313">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-08-22T23:16:38.930747" elapsed="0.083388">0 != 1</status>
</kw>
<arg>${number}</arg>
<doc>Query netstat on remote machine whether testtool device with the specified number has its port open and fail if not.</doc>
<status status="FAIL" start="2026-08-22T23:16:38.927334" elapsed="0.086943">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:16:40.018622" level="INFO">${device-port} = 17830</msg>
<var>${device-port}</var>
<arg>${FIRST_TESTTOOL_PORT}+${device-number}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:40.017091" elapsed="0.001602"/>
</kw>
<kw name="NetconfKeywords__Check_Device_Is_Up" owner="NetconfKeywords">
<kw name="Count_Port_Occurences" owner="SSHKeywords">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_And_Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:16:40.025196" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-08-22T23:16:40.047477" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:16:40.047731" level="INFO">${netstat_installed} = net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET...</msg>
<var>${netstat_installed}</var>
<arg>netstat --version</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:16:40.025073" elapsed="0.022718"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<doc>Install netstat if it is not already installed.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:40.048757" elapsed="0.000056"/>
</kw>
<msg time="2026-08-22T23:16:40.048891" level="FAIL">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</msg>
<status status="FAIL" start="2026-08-22T23:16:40.047982" elapsed="0.001031">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</branch>
<status status="FAIL" start="2026-08-22T23:16:40.047917" elapsed="0.001191">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="FAIL" start="2026-08-22T23:16:40.024779" elapsed="0.024633">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</kw>
<arg>Check_And_Install_Netstat</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:40.024013" elapsed="0.025859"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:16:40.053286" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-08-22T23:16:40.106615" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:16:40.107070" level="INFO">${output} = 0</msg>
<var>${output}</var>
<arg>${NETSTAT_COMMAND} 2&gt; /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:16:40.052428" elapsed="0.054749"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:16:40.107329" elapsed="0.000141"/>
</return>
<msg time="2026-08-22T23:16:40.108161" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${last-port}</arg>
<arg>LISTEN</arg>
<arg>java</arg>
<doc>Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.</doc>
<status status="PASS" start="2026-08-22T23:16:40.020261" elapsed="0.088098"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-08-22T23:16:40.111435" level="FAIL">0 != 1</msg>
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-08-22T23:16:40.109314" elapsed="0.002488">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-08-22T23:16:40.019154" elapsed="0.093310">0 != 1</status>
</kw>
<arg>${number}</arg>
<doc>Query netstat on remote machine whether testtool device with the specified number has its port open and fail if not.</doc>
<status status="FAIL" start="2026-08-22T23:16:40.016018" elapsed="0.096709">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:16:41.115727" level="INFO">${device-port} = 17830</msg>
<var>${device-port}</var>
<arg>${FIRST_TESTTOOL_PORT}+${device-number}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:41.114292" elapsed="0.001498"/>
</kw>
<kw name="NetconfKeywords__Check_Device_Is_Up" owner="NetconfKeywords">
<kw name="Count_Port_Occurences" owner="SSHKeywords">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_And_Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:16:41.121569" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-08-22T23:16:41.134003" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:16:41.134144" level="INFO">${netstat_installed} = net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET...</msg>
<var>${netstat_installed}</var>
<arg>netstat --version</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:16:41.121433" elapsed="0.012747"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<doc>Install netstat if it is not already installed.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:41.134918" elapsed="0.000058"/>
</kw>
<msg time="2026-08-22T23:16:41.135053" level="FAIL">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</msg>
<status status="FAIL" start="2026-08-22T23:16:41.134286" elapsed="0.000874">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</branch>
<status status="FAIL" start="2026-08-22T23:16:41.134256" elapsed="0.000997">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="FAIL" start="2026-08-22T23:16:41.121055" elapsed="0.014463">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</kw>
<arg>Check_And_Install_Netstat</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:41.120204" elapsed="0.015711"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:16:41.139317" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-08-22T23:16:41.184403" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:16:41.184900" level="INFO">${output} = 1</msg>
<var>${output}</var>
<arg>${NETSTAT_COMMAND} 2&gt; /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:16:41.138464" elapsed="0.046543"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:16:41.185152" elapsed="0.000132"/>
</return>
<msg time="2026-08-22T23:16:41.185942" level="INFO">${count} = 1</msg>
<var>${count}</var>
<arg>${last-port}</arg>
<arg>LISTEN</arg>
<arg>java</arg>
<doc>Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.</doc>
<status status="PASS" start="2026-08-22T23:16:41.117769" elapsed="0.068373"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-08-22T23:16:41.187104" elapsed="0.001542"/>
</kw>
<arg>${device-port}</arg>
<status status="PASS" start="2026-08-22T23:16:41.116187" elapsed="0.072911"/>
</kw>
<arg>${number}</arg>
<doc>Query netstat on remote machine whether testtool device with the specified number has its port open and fail if not.</doc>
<status status="PASS" start="2026-08-22T23:16:41.113432" elapsed="0.075777"/>
</kw>
<arg>${TESTTOOL_BOOT_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Device_Up_And_Running</arg>
<arg>${number}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:16:35.695157" elapsed="5.494150"/>
</kw>
<arg>${DEVICE_NAME_BASE}-${number}</arg>
<arg>log_response=${log_response}</arg>
<status status="PASS" start="2026-08-22T23:16:35.694149" elapsed="5.495287"/>
</kw>
<arg>${operation}</arg>
<arg>${DEVICE_NAME_BASE}-${number}</arg>
<arg>log_response=${log_response}</arg>
<doc>Executes the given keyword with the given arguments.</doc>
<status status="PASS" start="2026-08-22T23:16:35.693693" elapsed="5.495840"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:16:41.190947" level="INFO">${next} = 17831</msg>
<var>${next}</var>
<arg>${current_port}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:41.190132" elapsed="0.000873"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:41.192337" level="INFO">${current_port} = 17831</msg>
<arg>${current_port}</arg>
<arg>${next}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:16:41.191364" elapsed="0.001073"/>
</kw>
<arg>${operation}</arg>
<arg>${deadline_Date}</arg>
<arg>log_response=${log_response}</arg>
<status status="PASS" start="2026-08-22T23:16:35.690673" elapsed="5.501944"/>
</kw>
<arg>${count} times</arg>
<arg>NetconfKeywords__Perform_Operation_With_Checking_On_Next_Device</arg>
<arg>${operation}</arg>
<arg>${deadline_Date}</arg>
<arg>log_response=${log_response}</arg>
<doc>Executes the specified keyword multiple times.</doc>
<status status="PASS" start="2026-08-22T23:16:35.690149" elapsed="5.502552"/>
</kw>
<arg>NetconfKeywords__Wait_Device_Is_Up_And_Running</arg>
<arg>log_response=${log_response}</arg>
<status status="PASS" start="2026-08-22T23:16:35.684259" elapsed="5.508528"/>
</kw>
<arg>${filename}</arg>
<arg>${device-count}</arg>
<arg>${debug}</arg>
<arg>${schemas}</arg>
<arg>${rpc_config}</arg>
<arg>${tool_options}</arg>
<arg>${java_options}</arg>
<arg>${mdsal}</arg>
<arg>log_response=${log_response}</arg>
<doc>Arrange to collect tool's output into a log file.
Will use specific /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas unless argument resolves to 'none',
which signifies that there are no additional schemas to be deployed.
If so the directory for the additional schemas is deleted on the
remote machine and the additional schemas argument is left out.</doc>
<status status="PASS" start="2026-08-22T23:16:35.443927" elapsed="5.748932"/>
</kw>
<arg>device-count=1</arg>
<arg>schemas=/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas</arg>
<doc>Install and run testtool.</doc>
<status status="PASS" start="2026-08-22T23:16:34.502363" elapsed="6.690600"/>
</kw>
<doc>Deploy and start test tool, then wait for all its devices to become online.</doc>
<status status="PASS" start="2026-08-22T23:16:34.197647" elapsed="6.995495"/>
</test>
<test id="s1-s1-t2" name="Check_Device_Is_Not_Mounted_At_Beginning" 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-08-22T23:16:41.198738" elapsed="0.000293"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:16:41.198342" elapsed="0.000766"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:16:41.200531" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:41.200360" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:41.200333" elapsed="0.000316"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:16:41.206952" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:41.206845" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:41.206826" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:16:41.208017" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:16:41.207637" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:16:41.208522" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:16:41.208215" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:16:41.208611" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:16:41.208767" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:16:41.207245" elapsed="0.001547"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:16:41.214249" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:41.214142" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:41.214124" 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-08-22T23:16:41.215463" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:41.215357" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:41.215338" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:16:41.216012" 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-08-22T23:16:41.215694" elapsed="0.000345"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:41.216445" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:16:41.216220" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:16:41.266305" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:16:41.216980" elapsed="0.049456"/>
</kw>
<msg time="2026-08-22T23:16:41.266661" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:16:41.266712" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:41.216649" elapsed="0.050100"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:16:41.297220" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:16:41.267316" elapsed="0.030012"/>
</kw>
<msg time="2026-08-22T23:16:41.297498" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:16:41.297544" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "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-08-22T23:16:41.266944" elapsed="0.030654"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:41.297919" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:41.297685" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:41.297662" elapsed="0.000337"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:41.298453" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:41.298143" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:41.298817" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:41.298604" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:41.298570" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:16:41.298929" 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-08-22T23:16:41.301787" elapsed="0.000149"/>
</kw>
<msg time="2026-08-22T23:16:41.302002" 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-08-22T23:16:41.300479" elapsed="0.001672"/>
</kw>
<kw name="Open 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-08-22T23:16:41.302447" elapsed="0.000088"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:41.302839" 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-08-22T23:16:41.299802" 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-08-22T23:16:41.299215" elapsed="0.004048"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:16:41.215060" elapsed="0.088304"/>
</kw>
<msg time="2026-08-22T23:16:41.303459" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:41.303504" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "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-08-22T23:16:41.214465" elapsed="0.089076"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:16:41.305247" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-08-22T23:16:41.303702" elapsed="0.001609"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:41.303682" elapsed="0.001655"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:41.305907" 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-08-22T23:16:41.306239" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:16:41.306311" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:16:41.213808" elapsed="0.092611"/>
</kw>
<msg time="2026-08-22T23:16:41.306513" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:41.306558" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "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-08-22T23:16:41.209224" elapsed="0.097385"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:41.306935" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:41.306686" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:41.306668" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:16:41.209080" elapsed="0.097956"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:16:41.312441" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:41.312333" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:41.312314" 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-08-22T23:16:41.313671" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:41.313541" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:41.313523" elapsed="0.000217"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:16:41.314199" 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-08-22T23:16:41.313882" elapsed="0.000344"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:41.314621" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:16:41.314383" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:16:41.366285" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:16:41.315139" elapsed="0.051272"/>
</kw>
<msg time="2026-08-22T23:16:41.366632" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:16:41.366680" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:41.314806" elapsed="0.051912"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:16:41.394381" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:16:41.367276" elapsed="0.027216"/>
</kw>
<msg time="2026-08-22T23:16:41.394686" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:16:41.394732" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "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-08-22T23:16:41.366904" elapsed="0.027866"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:41.395079" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:41.394856" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:41.394828" elapsed="0.000361"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:41.395655" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:41.395330" 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-08-22T23:16:41.396063" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:41.395841" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:41.395774" elapsed="0.000368"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:16:41.396176" 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-08-22T23:16:41.399093" elapsed="0.000159"/>
</kw>
<msg time="2026-08-22T23:16:41.399318" 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-08-22T23:16:41.397742" elapsed="0.001726"/>
</kw>
<kw name="Open 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-08-22T23:16:41.399864" elapsed="0.000092"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:41.400235" 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-08-22T23:16:41.397021" elapsed="0.003442"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:16:41.396464" elapsed="0.004066"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:16:41.313238" elapsed="0.087429"/>
</kw>
<msg time="2026-08-22T23:16:41.400760" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:41.400803" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "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-08-22T23:16:41.312675" elapsed="0.088165"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:16:41.401199" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:16:41.401086" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:41.401060" 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-08-22T23:16:41.401884" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:41.402216" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:16:41.402289" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:16:41.311990" elapsed="0.090408"/>
</kw>
<msg time="2026-08-22T23:16:41.402491" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:41.402534" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "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-08-22T23:16:41.307300" elapsed="0.095271"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:41.403042" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:41.402793" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:41.402774" elapsed="0.000364"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:16:41.307161" elapsed="0.096002"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:16:41.408533" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:41.408426" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:41.408407" 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-08-22T23:16:41.409767" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:41.409658" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:41.409639" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:16:41.410290" 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-08-22T23:16:41.409975" elapsed="0.000341"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:41.410713" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:16:41.410471" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:16:41.464336" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:16:41.411242" elapsed="0.053201"/>
</kw>
<msg time="2026-08-22T23:16:41.464674" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:16:41.464722" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:41.410896" elapsed="0.053861"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:16:41.499083" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:16:41.465261" elapsed="0.033928"/>
</kw>
<msg time="2026-08-22T23:16:41.499361" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:16:41.499407" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "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-08-22T23:16:41.464925" elapsed="0.034518"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:41.499761" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:41.499519" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:41.499499" elapsed="0.000341"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:41.500286" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:41.499982" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:41.500653" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:41.500418" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:41.500400" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:16:41.500764" 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-08-22T23:16:41.503397" elapsed="0.000141"/>
</kw>
<msg time="2026-08-22T23:16:41.503624" 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-08-22T23:16:41.502216" elapsed="0.001553"/>
</kw>
<kw name="Open 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-08-22T23:16:41.504065" elapsed="0.000090"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:41.504434" 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-08-22T23:16:41.501534" 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-08-22T23:16:41.501014" elapsed="0.003835"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:16:41.409332" elapsed="0.095615"/>
</kw>
<msg time="2026-08-22T23:16:41.505039" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:41.505083" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "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-08-22T23:16:41.408768" elapsed="0.096350"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:16:41.505301" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:16:41.505194" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:41.505176" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:41.505934" 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-08-22T23:16:41.506261" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:16:41.506331" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:16:41.408079" elapsed="0.098358"/>
</kw>
<msg time="2026-08-22T23:16:41.506546" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:41.506611" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "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-08-22T23:16:41.403423" elapsed="0.103224"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:41.507186" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:41.506758" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:41.506740" elapsed="0.000526"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:16:41.403285" elapsed="0.104005"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:16:41.208890" elapsed="0.298429"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:16:41.206466" elapsed="0.300911"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:16:41.199916" elapsed="0.307516"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:41.199308" elapsed="0.308170"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:16:41.195008" elapsed="0.312522"/>
</kw>
<kw name="Check_Device_Has_No_Netconf_Connector" owner="NetconfKeywords">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:41.518890" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:41.516796" elapsed="0.002120"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:41.519248" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-22T23:16:41.519100" elapsed="0.000207"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-22T23:16:41.518975" elapsed="0.000357"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:41.519645" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:41.519394" elapsed="0.000309"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:41.520423" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:41.519955" elapsed="0.000495"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:41.519727" elapsed="0.000759"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:41.520687" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:41.520511" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:41.519378" elapsed="0.001387"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:41.520799" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:16:41.520944" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:16:41.516334" elapsed="0.004635"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:41.521014" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:16:41.521153" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:16:41.515855" elapsed="0.005323"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:41.529632" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:41.529347" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:41.530080" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:41.529835" 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-08-22T23:16:42.379561" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:16:42.381388" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Fri, 21-Aug-2026 23:16:42 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1011'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}} 
 </msg>
<msg time="2026-08-22T23:16:42.381909" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:16:41.532267" elapsed="0.849709"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:41.530192" elapsed="0.851897"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:42.382619" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:42.382158" elapsed="0.000617"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:41.530174" elapsed="0.852652"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.388734" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:42.385311" elapsed="0.003480"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:42.384760" elapsed="0.004068"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.384714" elapsed="0.004139"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.391501" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:42.389136" elapsed="0.002415"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:42.388910" elapsed="0.002694"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.388894" elapsed="0.002736"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.395181" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:42.391810" elapsed="0.003400"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:42.395528" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:42.395284" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.396103" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:42.395796" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:42.395632" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.395266" elapsed="0.000922"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.396742" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:42.396344" 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-08-22T23:16:42.397072" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:42.396840" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.397626" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:42.397309" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:42.397153" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.396822" 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-08-22T23:16:42.397866" elapsed="0.000365"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:16:42.398870" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:42.398395" elapsed="0.000502"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:16:42.399051" 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-08-22T23:16:42.383708" elapsed="0.017882"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:42.401778" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:42.401664" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.401645" elapsed="0.000203"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:16:42.404985" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:16:42.401992" elapsed="0.003023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:16:42.405103" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:16:42.405273" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:16:41.525003" elapsed="0.880296"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:16:42.405358" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:16:42.405507" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:16:41.521391" elapsed="0.884142"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.405970" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:42.405716" elapsed="0.000310"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.406599" level="INFO">${actual_count} = 0</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:42.406190" elapsed="0.000437"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-22T23:16:42.406674" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:16:42.406830" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-22T23:16:41.508231" elapsed="0.898624"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.407270" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:16:42.407010" elapsed="0.000317"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${NODE_CONFIGURER}</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="PASS" start="2026-08-22T23:16:41.507770" elapsed="0.899619"/>
</kw>
<doc>Sanity check making sure our device is not there. Fail if found.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-08-22T23:16:41.193817" elapsed="1.213699"/>
</test>
<test id="s1-s1-t3" name="Configure_Device_On_Netconf" line="79">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:16:42.411161" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:16:42.410888" elapsed="0.000537"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:16:42.412438" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:42.412329" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.412310" 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-08-22T23:16:42.417366" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:42.417259" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.417241" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.418450" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:16:42.418069" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.418958" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:16:42.418651" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:16:42.419028" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:16:42.419182" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:16:42.417675" 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-08-22T23:16:42.424674" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:42.424548" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.424529" 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-08-22T23:16:42.425915" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:42.425807" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.425788" elapsed="0.000207"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:16:42.426462" 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-08-22T23:16:42.426140" elapsed="0.000348"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:42.426897" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:16:42.426663" elapsed="0.000260"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:16:42.480130" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:16:42.427407" elapsed="0.052844"/>
</kw>
<msg time="2026-08-22T23:16:42.480446" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:16:42.480494" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:42.427080" elapsed="0.053453"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:16:42.501413" level="INFO">"t "x "t ". "C "R "U "D ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:16:42.481101" elapsed="0.020431"/>
</kw>
<msg time="2026-08-22T23:16:42.501773" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:16:42.501819" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&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-08-22T23:16:42.480740" elapsed="0.021118"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:42.502214" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:42.501953" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.501926" elapsed="0.000371"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.502789" level="INFO"> "t "x "t ". "C "R "U "D ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:42.502437" 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-08-22T23:16:42.503142" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:42.502924" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.502905" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:16:42.503259" 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-08-22T23:16:42.506171" elapsed="0.000149"/>
</kw>
<msg time="2026-08-22T23:16:42.506386" 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-08-22T23:16:42.504881" elapsed="0.001658"/>
</kw>
<kw name="Open 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-08-22T23:16:42.506874" elapsed="0.000091"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:42.507249" 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-08-22T23:16:42.504162" elapsed="0.003302"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:16:42.503570" elapsed="0.003963"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:16:42.425478" elapsed="0.082263"/>
</kw>
<msg time="2026-08-22T23:16:42.507841" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:42.507886" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&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-08-22T23:16:42.424895" elapsed="0.083031"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:16:42.508113" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:16:42.508004" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.507986" 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-08-22T23:16:42.508883" 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-08-22T23:16:42.509231" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:16:42.509303" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:16:42.424172" elapsed="0.085242"/>
</kw>
<msg time="2026-08-22T23:16:42.509509" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:42.509553" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&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-08-22T23:16:42.419612" elapsed="0.090008"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:42.509951" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:42.509700" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.509683" elapsed="0.000347"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:16:42.419457" elapsed="0.090597"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:16:42.515488" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:42.515372" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.515354" 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-08-22T23:16:42.516733" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:42.516624" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.516604" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:16:42.517261" 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-08-22T23:16:42.516941" elapsed="0.000347"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:42.517710" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:16:42.517440" elapsed="0.000297"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:16:42.570751" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:16:42.518218" elapsed="0.052775"/>
</kw>
<msg time="2026-08-22T23:16:42.571241" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:16:42.571290" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:42.517890" elapsed="0.053437"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:16:42.589460" level="INFO">"t "x "t ". "C "R "U "D ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:16:42.572038" elapsed="0.017530"/>
</kw>
<msg time="2026-08-22T23:16:42.589767" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:16:42.589814" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&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-08-22T23:16:42.571574" elapsed="0.018279"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:42.590204" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:42.589950" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.589921" elapsed="0.000366"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.590771" level="INFO"> "t "x "t ". "C "R "U "D ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:42.590433" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:42.591146" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:42.590901" elapsed="0.000392"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.590883" elapsed="0.000438"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:16:42.591361" 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-08-22T23:16:42.594277" elapsed="0.000148"/>
</kw>
<msg time="2026-08-22T23:16:42.594489" 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-08-22T23:16:42.592988" elapsed="0.001677"/>
</kw>
<kw name="Open 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-08-22T23:16:42.594960" elapsed="0.000088"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:42.595331" 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-08-22T23:16:42.592267" elapsed="0.003272"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:16:42.591701" elapsed="0.003932"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:16:42.516299" elapsed="0.079434"/>
</kw>
<msg time="2026-08-22T23:16:42.595825" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:42.595869" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&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-08-22T23:16:42.515723" elapsed="0.080185"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:16:42.596093" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:16:42.595986" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.595967" 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-08-22T23:16:42.596741" 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-08-22T23:16:42.597080" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:16:42.597150" 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-08-22T23:16:42.515021" elapsed="0.082273"/>
</kw>
<msg time="2026-08-22T23:16:42.597389" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:42.597432" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&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-08-22T23:16:42.510327" elapsed="0.087144"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:42.597817" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:42.597547" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.597530" elapsed="0.000364"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:16:42.510187" elapsed="0.087731"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:16:42.603318" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:42.603210" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.603191" 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-08-22T23:16:42.604522" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:42.604414" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.604396" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:16:42.605075" 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-08-22T23:16:42.604759" elapsed="0.000343"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:42.605552" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:16:42.605269" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:16:42.667351" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:16:42.606088" elapsed="0.061375"/>
</kw>
<msg time="2026-08-22T23:16:42.667658" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:16:42.667839" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:42.605758" elapsed="0.062212"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:16:42.695769" level="INFO">"t "x "t ". "C "R "U "D ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:16:42.668490" elapsed="0.027598"/>
</kw>
<msg time="2026-08-22T23:16:42.696259" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:16:42.696306" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&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-08-22T23:16:42.668147" elapsed="0.028197"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:42.696674" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:42.696426" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.696404" elapsed="0.000350"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.697218" level="INFO"> "t "x "t ". "C "R "U "D ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:42.696913" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:42.697566" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:42.697348" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.697330" elapsed="0.000338"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:16:42.697703" 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-08-22T23:16:42.700472" elapsed="0.000167"/>
</kw>
<msg time="2026-08-22T23:16:42.700704" 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-08-22T23:16:42.699235" elapsed="0.001630"/>
</kw>
<kw name="Open 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-08-22T23:16:42.701160" elapsed="0.000089"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:42.701528" 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-08-22T23:16:42.698528" elapsed="0.003228"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:16:42.697990" elapsed="0.003835"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:16:42.604116" elapsed="0.097805"/>
</kw>
<msg time="2026-08-22T23:16:42.702011" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:42.702054" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&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-08-22T23:16:42.603534" elapsed="0.098559"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:16:42.702275" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:16:42.702169" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.702150" 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-08-22T23:16:42.702768" 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-08-22T23:16:42.703093" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:16:42.703164" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:16:42.602862" elapsed="0.100407"/>
</kw>
<msg time="2026-08-22T23:16:42.703361" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:42.703404" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&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-08-22T23:16:42.598191" elapsed="0.105252"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:42.703924" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:42.703516" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.703500" elapsed="0.000538"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:16:42.598053" elapsed="0.106010"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:16:42.419272" elapsed="0.284824"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:16:42.416899" elapsed="0.287260"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:16:42.412027" elapsed="0.292190"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:42.411597" elapsed="0.292667"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:16:42.408562" elapsed="0.295758"/>
</kw>
<kw name="Configure_Device_In_Netconf" owner="NetconfKeywords">
<kw name="Set_Variable_If_At_Least_Scandium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Set_Variable_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Set Variable If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:16:42.725221" elapsed="0.000440"/>
</kw>
<msg time="2026-08-22T23:16:42.725713" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>BuiltIn.Set_Variable_If</arg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:16:42.724863" elapsed="0.000899"/>
</kw>
<arg>scandium</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Compare ${lower_bound} to titanium and return scandium if titanium is at least ${lower_bound},
return calcium otherwise.</doc>
<status status="PASS" start="2026-08-22T23:16:42.724447" elapsed="0.001389"/>
</kw>
<msg time="2026-08-22T23:16:42.725877" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Set_Variable_If_At_Least</arg>
<arg>scandium</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:16:42.715952" elapsed="0.009968"/>
</kw>
<msg time="2026-08-22T23:16:42.726020" level="INFO">${version} = scandium</msg>
<var>${version}</var>
<arg>scandium</arg>
<arg>calcium</arg>
<doc>Compare scandium to titanium and return ${value_if_true} if titanium is at least scandium, return ${value_if_false} otherwise.</doc>
<status status="PASS" start="2026-08-22T23:16:42.715633" elapsed="0.010411"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.726958" level="INFO">${mapping} = {'DEVICE_IP': '10.30.171.196', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/t...</msg>
<var>${mapping}</var>
<arg>DEVICE_IP=${device_address}</arg>
<arg>DEVICE_NAME=${device_name}</arg>
<arg>DEVICE_PORT=${device_port}</arg>
<arg>DEVICE_USER=${device_user}</arg>
<arg>DEVICE_PASSWORD=${device_password}</arg>
<arg>DEVICE_KEY=${device_key}</arg>
<arg>SCHEMA_DIRECTORY=${schema_directory}</arg>
<arg>RESTCONF_ROOT=${RESTCONF_ROOT}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:16:42.726206" elapsed="0.000780"/>
</kw>
<if>
<branch type="IF" condition="'${http_method}'=='post'">
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<arg>folder=${DIRECTORY_WITH_DEVICE_TEMPLATES}${/}${version}${/}${device_type}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:42.727387" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:42.727074" elapsed="0.000379"/>
</branch>
<branch type="ELSE">
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.760657" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:42.760227" elapsed="0.000460"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:16:42.761481" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:16:42.761183" elapsed="0.000390">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:16:42.761711" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:16:42.760852" elapsed="0.000883"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.762277" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:16:42.761897" elapsed="0.000407"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:16:42.762619" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:16:42.762791" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:16:42.762462" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.763258" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:42.763009" 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-08-22T23:16:42.764272" level="INFO">mapping: {'DEVICE_IP': '10.30.171.196', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tmp/schema', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:42.764016" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.764779" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:16:42.764483" elapsed="0.000322"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.765640" level="INFO">${value} = 10.30.171.196</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:16:42.765177" elapsed="0.000490"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:16:42.766799" level="INFO">${encoded} = 10.30.171.196</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:16:42.766249" elapsed="0.000668"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:16:42.767246" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:16:42.767407" level="INFO">${encoded_value} = 10.30.171.196</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:16:42.765853" elapsed="0.001579"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:16:42.767610" elapsed="0.000454"/>
</kw>
<var name="${key}">DEVICE_IP</var>
<var name="${value}">10.30.171.196</var>
<status status="PASS" start="2026-08-22T23:16:42.765045" elapsed="0.003060"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.768838" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:16:42.768349" elapsed="0.000516"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:16:42.770037" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:16:42.769601" elapsed="0.000552"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:16:42.770473" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:16:42.770680" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:16:42.769046" elapsed="0.001660"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:16:42.770854" elapsed="0.000426"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:16:42.768219" elapsed="0.003102"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.772041" level="INFO">${value} = 17830</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:16:42.771563" elapsed="0.000504"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:16:42.773238" level="INFO">${encoded} = 17830</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:16:42.772814" elapsed="0.000537"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:16:42.773688" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:16:42.773844" level="INFO">${encoded_value} = 17830</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:16:42.772248" elapsed="0.001621"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:16:42.774021" elapsed="0.000432"/>
</kw>
<var name="${key}">DEVICE_PORT</var>
<var name="${value}">17830</var>
<status status="PASS" start="2026-08-22T23:16:42.771434" elapsed="0.003060"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.775204" level="INFO">${value} = admin</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:16:42.774775" elapsed="0.000456"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:16:42.776248" level="INFO">${encoded} = admin</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:16:42.775820" elapsed="0.000541"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:16:42.776739" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:16:42.776897" level="INFO">${encoded_value} = admin</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:16:42.775412" elapsed="0.001510"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:16:42.777070" elapsed="0.000445"/>
</kw>
<var name="${key}">DEVICE_USER</var>
<var name="${value}">admin</var>
<status status="PASS" start="2026-08-22T23:16:42.774644" elapsed="0.002913"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.778420" level="INFO">${value} = topsecret</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:16:42.777987" elapsed="0.000499"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:16:42.779517" level="INFO">${encoded} = topsecret</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:16:42.779090" elapsed="0.000602"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:16:42.780011" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:16:42.780169" level="INFO">${encoded_value} = topsecret</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:16:42.778692" elapsed="0.001502"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:16:42.780343" elapsed="0.000473"/>
</kw>
<var name="${key}">DEVICE_PASSWORD</var>
<var name="${value}">topsecret</var>
<status status="PASS" start="2026-08-22T23:16:42.777851" elapsed="0.003006"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.781524" level="INFO">${value} = device-key</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:16:42.781098" elapsed="0.000453"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:16:42.782682" level="INFO">${encoded} = device-key</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:16:42.782202" elapsed="0.000599"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:16:42.783118" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:16:42.783276" level="INFO">${encoded_value} = device-key</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:16:42.781801" elapsed="0.001500"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:16:42.783448" elapsed="0.000519"/>
</kw>
<var name="${key}">DEVICE_KEY</var>
<var name="${value}">device-key</var>
<status status="PASS" start="2026-08-22T23:16:42.780969" elapsed="0.003040"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.784747" level="INFO">${value} = /tmp/schema</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:16:42.784251" elapsed="0.000522"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:16:42.787229" level="INFO">${encoded} = /tmp/schema</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:16:42.785349" elapsed="0.001996"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:16:42.787728" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:16:42.787890" level="INFO">${encoded_value} = /tmp/schema</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:16:42.784955" elapsed="0.002960"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:16:42.788066" elapsed="0.000449"/>
</kw>
<var name="${key}">SCHEMA_DIRECTORY</var>
<var name="${value}">/tmp/schema</var>
<status status="PASS" start="2026-08-22T23:16:42.784121" elapsed="0.004437"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.789264" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:16:42.788827" elapsed="0.000464"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:16:42.790372" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:16:42.789941" elapsed="0.000546"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:16:42.790820" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:16:42.790979" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:16:42.789472" elapsed="0.001532"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:16:42.791153" elapsed="0.000533"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:16:42.788695" elapsed="0.003034"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:16:42.764858" elapsed="0.026906"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:16:42.791808" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:16:42.791969" level="INFO">${mapping_to_use} = {'DEVICE_IP': '10.30.171.196', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/t...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:16:42.763696" elapsed="0.028300"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:42.763379" elapsed="0.028648"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:42.792198" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:42.792053" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.763360" elapsed="0.028914"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.793321" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:42.792425" elapsed="0.000925"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:16:42.793398" elapsed="0.000070"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:16:42.759607" elapsed="0.033964"/>
</kw>
<msg time="2026-08-22T23:16:42.793727" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:16:42.746249" elapsed="0.047529"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:42.806232" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:42.818445" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:42.830614" 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-08-22T23:16:42.830804" 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-08-22T23:16:42.830976" 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-08-22T23:16:42.831346" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:42.831205" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:16:42.831189" elapsed="0.000234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:42.831559" 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-08-22T23:16:42.831740" 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-08-22T23:16:42.831900" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:16:42.831160" elapsed="0.000791"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:16:42.831053" elapsed="0.000923"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:42.832119" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:42.832216" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:16:42.832338" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:16:42.741341" elapsed="0.091023"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.884443" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:42.883919" elapsed="0.000558"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:16:42.885271" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology.titanium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:16:42.885013" elapsed="0.000336">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology.titanium/data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:16:42.885442" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:16:42.884666" elapsed="0.000800"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.886028" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:16:42.885641" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:16:42.886354" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:16:42.886517" level="INFO">${template} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;$DEVICE_NAME&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;$DEVICE_IP&lt;/host&gt;
    &lt;port&gt;$DEVI...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:16:42.886211" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.886965" level="INFO">&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;$DEVICE_NAME&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;$DEVICE_IP&lt;/host&gt;
    &lt;port&gt;$DEVICE_PORT&lt;/port&gt;
    &lt;login-password-unencrypted&gt;
      &lt;username&gt;$DEVICE_USER&lt;/username&gt;
      &lt;password&gt;$DEVICE_PASSWORD&lt;/password&gt;
    &lt;/login-password-unencrypted&gt;
    &lt;tcp-only&gt;false&lt;/tcp-only&gt;
    &lt;keepalive-delay&gt;0&lt;/keepalive-delay&gt;
  &lt;/netconf-node&gt;
&lt;/node&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:42.886719" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:16:42.887427" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:42.887096" elapsed="0.000390"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.887986" level="INFO">${mapping_to_use} = {'DEVICE_IP': '10.30.171.196', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/t...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:42.887672" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:42.887513" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.887072" elapsed="0.001002"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.888952" level="INFO">${final_text} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;10.30.171.196&lt;/host&gt;
    &lt;...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:42.888218" elapsed="0.000765"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:16:42.889034" elapsed="0.000034"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:16:42.883160" elapsed="0.006009"/>
</kw>
<msg time="2026-08-22T23:16:42.889226" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:16:42.845007" elapsed="0.044266"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:42.901476" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:42.913819" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:42.926272" 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-08-22T23:16:42.926465" 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-08-22T23:16:42.926654" 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-08-22T23:16:42.927038" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:42.926893" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:16:42.926879" 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-08-22T23:16:42.927256" 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-08-22T23:16:42.927420" 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-08-22T23:16:42.927596" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:16:42.926849" elapsed="0.000801"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:16:42.926737" 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-08-22T23:16:42.927850" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:42.927927" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:16:42.928056" level="INFO">${data} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;10.30.171.196&lt;/host&gt;
    &lt;...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:16:42.842350" elapsed="0.085735"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:16:42.929350" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:16:42.929099" elapsed="0.000317">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:16:42.929510" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:16:42.928760" elapsed="0.000774"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:42.929865" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:42.929620" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.930411" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:42.930117" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:42.929945" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.929601" elapsed="0.000892"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.932917" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:16:42.930671" elapsed="0.002277"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:16:42.933001" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:16:42.933157" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:16:42.928411" elapsed="0.004813"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.934661" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:42.934391" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.935096" level="INFO">&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;10.30.171.196&lt;/host&gt;
    &lt;port&gt;17830&lt;/port&gt;
    &lt;login-password-unencrypted&gt;
      &lt;username&gt;admin&lt;/username&gt;
      &lt;password&gt;topsecret&lt;/password&gt;
    &lt;/login-password-unencrypted&gt;
    &lt;tcp-only&gt;false&lt;/tcp-only&gt;
    &lt;keepalive-delay&gt;0&lt;/keepalive-delay&gt;
  &lt;/netconf-node&gt;
&lt;/node&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:42.934858" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.935538" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:42.935295" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.935999" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:42.935759" elapsed="0.000283"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:16:42.936870" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:16:42.936656" elapsed="0.000240"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:16:42.937220" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:16:42.937045" 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-08-22T23:16:42.937391" elapsed="0.000225"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.938013" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:42.937768" elapsed="0.000290"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:16:42.938102" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:16:42.938255" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:16:42.936239" 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="PUT On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:16:42.971999" level="INFO">PUT Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Content-Length': '452', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;10.30.171.196&lt;/host&gt;
    &lt;port&gt;17830&lt;/port&gt;
    &lt;login-password-unencrypted&gt;
      &lt;username&gt;admin&lt;/username&gt;
      &lt;password&gt;topsecret&lt;/password&gt;
    &lt;/login-password-unencrypted&gt;
    &lt;tcp-only&gt;false&lt;/tcp-only&gt;
    &lt;keepalive-delay&gt;0&lt;/keepalive-delay&gt;
  &lt;/netconf-node&gt;
&lt;/node&gt; 
 </msg>
<msg time="2026-08-22T23:16:42.972133" level="INFO">PUT Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-08-22T23:16:42.972372" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:16:42.940608" elapsed="0.031821"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:42.938350" elapsed="0.034179"/>
</branch>
<branch type="ELSE">
<kw name="PUT 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 PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:42.972968" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:42.972624" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.938333" elapsed="0.034834"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.980595" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:42.975300" elapsed="0.005358"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:42.974816" elapsed="0.005891"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.974775" elapsed="0.005966"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.984371" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:42.981119" elapsed="0.003316"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:42.980818" elapsed="0.003666"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.980795" elapsed="0.003723"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.985300" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:42.984760" 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-08-22T23:16:42.985886" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:42.985529" elapsed="0.000438"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.986665" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:42.986222" elapsed="0.000480"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:42.986001" elapsed="0.000751"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.985502" elapsed="0.001280"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.987517" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:42.986996" 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-08-22T23:16:42.987998" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:42.987676" elapsed="0.000401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.988760" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:42.988328" elapsed="0.000468"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:42.988111" elapsed="0.000734"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.987650" 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-08-22T23:16:42.989081" elapsed="0.000481"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:16:42.990209" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:42.989809" 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-08-22T23:16:42.990453" elapsed="0.002983"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:16:42.973987" elapsed="0.019512"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:16:42.993688" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-08-22T23:16:42.993565" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.993547" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:42.993920" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:16:42.993987" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:16:42.996241" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT 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-08-22T23:16:42.933569" elapsed="0.062709"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:16:42.996343" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:16:42.996499" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-08-22T23:16:42.730549" elapsed="0.265975"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:42.996879" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:42.996641" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.996624" elapsed="0.000345"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:16:42.997001" elapsed="0.000025"/>
</return>
<arg>folder=${DIRECTORY_WITH_DEVICE_TEMPLATES}${/}${version}${/}${device_type}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-08-22T23:16:42.727728" elapsed="0.269396"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:42.727478" elapsed="0.269689"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.727055" elapsed="0.270134"/>
</if>
<kw name="Set To Dictionary" owner="Collections">
<arg>${NetconfKeywords__mounted_device_types}</arg>
<arg>${device_name}</arg>
<arg>${device_type}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:16:42.997330" elapsed="0.000242"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>device_type=configure-via-topology</arg>
<arg>session=${NODE_CONFIGURER}</arg>
<doc>Tell Netconf about the specified device so it can add it into its configuration.</doc>
<status status="PASS" start="2026-08-22T23:16:42.704628" elapsed="0.293028"/>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:16:42.998951" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:42.998460" elapsed="0.000520"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-08-22T23:16:42.999196" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:16:42.999054" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:42.999036" elapsed="0.000240"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:42.999436" elapsed="0.000042"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:42.999653" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:42.999833" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.000003" elapsed="0.000019"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.000165" elapsed="0.000019"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.000326" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.000487" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.000746" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:43.000569" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:16:43.000552" elapsed="0.000269"/>
</if>
<arg>5089</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:16:42.998066" elapsed="0.002805"/>
</kw>
<doc>Make request to configure a testtool device on Netconf connector</doc>
<tag>critical</tag>
<status status="PASS" start="2026-08-22T23:16:42.408010" elapsed="0.592907"/>
</test>
<test id="s1-s1-t4" name="Check_Configurer_Has_Netconf_Connector_For_Device" 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-08-22T23:16:43.004557" elapsed="0.000231"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:16:43.004291" 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-08-22T23:16:43.005845" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:43.005734" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.005715" 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-08-22T23:16:43.010948" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:43.010841" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.010823" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.012028" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:16:43.011647" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.012515" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:16:43.012212" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:16:43.012605" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:16:43.012762" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:16:43.011239" elapsed="0.001548"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:16:43.018201" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:43.018092" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.018073" 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-08-22T23:16:43.019468" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:43.019348" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.019330" elapsed="0.000206"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:16:43.020026" 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-08-22T23:16:43.019705" elapsed="0.000348"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:43.020484" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:16:43.020247" elapsed="0.000264"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:16:43.063142" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:16:43.021022" elapsed="0.042245"/>
</kw>
<msg time="2026-08-22T23:16:43.063457" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:16:43.063504" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:43.020686" elapsed="0.042854"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:16:43.106820" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o "n "n "e "c "t "o "r "_ "F "o "r "_ "D "e "v "i "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:16:43.064070" elapsed="0.042860"/>
</kw>
<msg time="2026-08-22T23:16:43.107135" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:16:43.107205" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:43.063730" elapsed="0.043516"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.107545" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:43.107325" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.107305" elapsed="0.000339"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.108092" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o "n "n "e "c "t "o "r "_ "F "o "r "_ "D "e "v "i "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:43.107788" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.108441" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:43.108230" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.108213" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:16:43.108550" 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-08-22T23:16:43.111507" elapsed="0.000167"/>
</kw>
<msg time="2026-08-22T23:16:43.111739" 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-08-22T23:16:43.110058" elapsed="0.001830"/>
</kw>
<kw name="Open 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-08-22T23:16:43.112191" elapsed="0.000092"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.112608" 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-08-22T23:16:43.109355" elapsed="0.003464"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:16:43.108827" elapsed="0.004058"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:16:43.019047" elapsed="0.093934"/>
</kw>
<msg time="2026-08-22T23:16:43.113072" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:43.113116" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:43.018418" elapsed="0.094735"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:16:43.113333" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:16:43.113228" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.113210" 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-08-22T23:16:43.113845" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.114175" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:16:43.114246" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:16:43.017757" elapsed="0.096634"/>
</kw>
<msg time="2026-08-22T23:16:43.114484" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:43.114527" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:43.013161" elapsed="0.101403"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.115083" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:43.114796" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.114778" elapsed="0.000384"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:16:43.013020" elapsed="0.102166"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:16:43.120516" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:43.120408" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.120390" 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-08-22T23:16:43.121755" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:43.121645" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.121626" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:16:43.122272" 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-08-22T23:16:43.121963" elapsed="0.000336"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:43.122695" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:16:43.122452" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:16:43.170276" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:16:43.123224" elapsed="0.047159"/>
</kw>
<msg time="2026-08-22T23:16:43.170566" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:16:43.170633" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:43.122878" elapsed="0.047792"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:16:43.218340" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o "n "n "e "c "t "o "r "_ "F "o "r "_ "D "e "v "i "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:16:43.171186" elapsed="0.047275"/>
</kw>
<msg time="2026-08-22T23:16:43.218683" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:16:43.218731" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:43.170851" elapsed="0.047919"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.219084" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:43.218853" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.218831" elapsed="0.000334"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.219634" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o "n "n "e "c "t "o "r "_ "F "o "r "_ "D "e "v "i "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:43.219305" 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-08-22T23:16:43.219983" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:43.219772" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.219754" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:16:43.220093" 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-08-22T23:16:43.222845" elapsed="0.000146"/>
</kw>
<msg time="2026-08-22T23:16:43.223055" 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-08-22T23:16:43.221626" 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-08-22T23:16:43.223537" elapsed="0.000110"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.223926" 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-08-22T23:16:43.220917" elapsed="0.003216"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:16:43.220358" elapsed="0.003842"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:16:43.121323" elapsed="0.102974"/>
</kw>
<msg time="2026-08-22T23:16:43.224389" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:43.224432" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:43.120755" elapsed="0.103714"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:16:43.224694" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:16:43.224545" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.224526" elapsed="0.000251"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.225171" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.225502" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:16:43.225574" elapsed="0.000180"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:16:43.120070" elapsed="0.105785"/>
</kw>
<msg time="2026-08-22T23:16:43.225950" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:43.225993" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:43.115448" elapsed="0.110582"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.226353" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:43.226106" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.226089" elapsed="0.000340"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:16:43.115311" elapsed="0.111142"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:16:43.231846" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:43.231738" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.231720" 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-08-22T23:16:43.233048" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:43.232941" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.232923" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:16:43.233625" 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-08-22T23:16:43.233254" elapsed="0.000399"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:43.234028" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:16:43.233808" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:16:43.273877" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:16:43.234554" elapsed="0.039427"/>
</kw>
<msg time="2026-08-22T23:16:43.274151" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:16:43.274197" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:43.234207" elapsed="0.040027"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:16:43.306340" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o "n "n "e "c "t "o "r "_ "F "o "r "_ "D "e "v "i "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:16:43.274791" elapsed="0.031853"/>
</kw>
<msg time="2026-08-22T23:16:43.306820" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:16:43.306912" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:43.274432" elapsed="0.032520"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.307248" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:43.307029" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.307009" elapsed="0.000317"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.307789" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o "n "n "e "c "t "o "r "_ "F "o "r "_ "D "e "v "i "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:43.307462" 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-08-22T23:16:43.308135" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:43.307925" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.307907" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:16:43.308245" 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-08-22T23:16:43.310990" elapsed="0.000143"/>
</kw>
<msg time="2026-08-22T23:16:43.311197" 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-08-22T23:16:43.309739" elapsed="0.001600"/>
</kw>
<kw name="Open 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-08-22T23:16:43.311668" elapsed="0.000089"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.312034" 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-08-22T23:16:43.309047" 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-08-22T23:16:43.308491" 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-08-22T23:16:43.232642" elapsed="0.079760"/>
</kw>
<msg time="2026-08-22T23:16:43.312492" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:43.312536" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:43.232060" elapsed="0.080514"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:16:43.312807" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:16:43.312700" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.312681" 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-08-22T23:16:43.313273" 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-08-22T23:16:43.313768" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:16:43.313842" 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-08-22T23:16:43.231387" elapsed="0.082564"/>
</kw>
<msg time="2026-08-22T23:16:43.314044" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:43.314101" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:43.226771" elapsed="0.087369"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.314461" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:43.314214" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.314197" elapsed="0.000341"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:16:43.226632" elapsed="0.087929"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:16:43.012843" elapsed="0.301772"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:16:43.010464" elapsed="0.304212"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:16:43.005422" elapsed="0.309311"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:43.004996" elapsed="0.309829"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:16:43.001925" elapsed="0.312957"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Instance_Count">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.326733" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:43.324443" elapsed="0.002317"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.327085" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-22T23:16:43.326934" elapsed="0.000209"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-22T23:16:43.326815" elapsed="0.000354"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.327468" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:43.327231" elapsed="0.000294"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.328269" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:43.327798" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:43.327550" elapsed="0.000782"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.328519" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:43.328357" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.327215" elapsed="0.001397"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:43.328647" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:16:43.328795" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:16:43.323993" elapsed="0.004827"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:43.328866" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:16:43.329015" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:16:43.323493" elapsed="0.005547"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.336286" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:43.336038" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.336746" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:43.336482" 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-08-22T23:16:43.347848" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:16:43.348118" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1235'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}},"node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"connection-status":"connecting","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196"}}]}]}} 
 </msg>
<msg time="2026-08-22T23:16:43.348266" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:16:43.338933" elapsed="0.009371"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:43.336856" elapsed="0.011508"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.348641" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:43.348403" elapsed="0.000378"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.336837" elapsed="0.011979"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.353766" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}},"node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"connection-status":"connecting","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196"}}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:43.350274" elapsed="0.003571"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:43.349963" elapsed="0.003932"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.349917" elapsed="0.004047"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.357647" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:43.354356" elapsed="0.003358"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:43.354046" elapsed="0.003718"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.354023" elapsed="0.003776"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.358600" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:43.358040" 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-08-22T23:16:43.359078" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:43.358743" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.359868" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:43.359416" elapsed="0.000491"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:43.359194" elapsed="0.000763"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.358717" elapsed="0.001271"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.360743" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:43.360209" 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-08-22T23:16:43.361201" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:43.360880" elapsed="0.000400"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.361984" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:43.361532" elapsed="0.000490"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:43.361314" elapsed="0.000758"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.360855" 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-08-22T23:16:43.362306" elapsed="0.000507"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:16:43.363440" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:43.363041" 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-08-22T23:16:43.363714" elapsed="0.003335"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:16:43.349323" elapsed="0.017790"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:43.367291" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:43.367185" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.367166" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:16:43.370570" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "node": [
     {
      "netconf-node-topology:netconf-node": {
       "connection-status": "connecting",
       "host": "10.30.171.19...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:16:43.367499" elapsed="0.003117"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:16:43.370669" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:16:43.370828" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "node": [
     {
      "netconf-node-topology:netconf-node": {
       "connection-status": "connecting",
       "host": "10.30.171.19...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:16:43.331686" elapsed="0.039169"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:16:43.370946" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:16:43.371098" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "node": [
     {
      "netconf-node-topology:netconf-node": {
       "connection-status": "connecting",
       "host": "10.30.171.19...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:16:43.329254" elapsed="0.041870"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.371532" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "node": [
     {
      "netconf-node-topology:netconf-node": {
       "connection-status": "connecting",
       "host": "10.30.171.196",
       "login-password-unencrypted": {
        "password": "topsecret",
        "username": "admin"
       },
       "port": 17830
      },
      "node-id": "netconf-test-device"
     }
    ],
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:43.371280" elapsed="0.000327"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.372151" level="INFO">${actual_count} = 1</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:43.371762" elapsed="0.000416"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-22T23:16:43.372224" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:16:43.372378" level="INFO">${count} = 1</msg>
<var>${count}</var>
<arg>${DEVICE_NAME}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-22T23:16:43.316037" elapsed="0.056367"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.372863" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:16:43.372556" elapsed="0.000366"/>
</kw>
<arg>1</arg>
<arg>session=${NODE_CONFIGURER}</arg>
<status status="PASS" start="2026-08-22T23:16:43.315591" elapsed="0.057391"/>
</kw>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Device_Instance_Count</arg>
<arg>1</arg>
<arg>session=${NODE_CONFIGURER}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:16:43.315059" elapsed="0.057969"/>
</kw>
<doc>Get the list of mounts and search for our device there. Fail if not found.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-08-22T23:16:43.001260" elapsed="0.371888"/>
</test>
<test id="s1-s1-t5" name="Wait_For_Device_To_Become_Visible_For_Configurer" 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-08-22T23:16:43.376512" elapsed="0.000228"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:16:43.376250" 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-08-22T23:16:43.377788" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:43.377678" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.377659" elapsed="0.000223"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:16:43.382863" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:43.382755" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.382737" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.383946" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:16:43.383547" elapsed="0.000426"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.384432" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:16:43.384130" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:16:43.384501" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:16:43.384682" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:16:43.383154" 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-08-22T23:16:43.390349" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:43.390240" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.390221" 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-08-22T23:16:43.391625" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:43.391496" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.391478" elapsed="0.000215"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:16:43.392142" 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-08-22T23:16:43.391833" elapsed="0.000336"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:43.392543" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:16:43.392322" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:16:43.433380" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:16:43.393082" elapsed="0.040416"/>
</kw>
<msg time="2026-08-22T23:16:43.433735" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:16:43.433782" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:43.392748" elapsed="0.041072"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:16:43.462154" level="INFO">"t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:16:43.434357" elapsed="0.027909"/>
</kw>
<msg time="2026-08-22T23:16:43.462435" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:16:43.462480" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:43.434002" elapsed="0.028515"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.462843" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:43.462618" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.462576" elapsed="0.000347"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.463363" level="INFO"> "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:43.463060" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.463738" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:43.463502" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.463484" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:16:43.463852" 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-08-22T23:16:43.466620" elapsed="0.000147"/>
</kw>
<msg time="2026-08-22T23:16:43.466833" 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-08-22T23:16:43.465364" 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-08-22T23:16:43.467282" elapsed="0.000088"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.467674" 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-08-22T23:16:43.464678" elapsed="0.003205"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:16:43.464118" elapsed="0.003833"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:16:43.391196" elapsed="0.076853"/>
</kw>
<msg time="2026-08-22T23:16:43.468141" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:43.468186" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:43.390594" elapsed="0.077631"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:16:43.468449" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:16:43.468342" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.468322" 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-08-22T23:16:43.468945" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.469280" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:16:43.469351" 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-08-22T23:16:43.389863" elapsed="0.079627"/>
</kw>
<msg time="2026-08-22T23:16:43.469750" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:43.469798" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:43.385068" elapsed="0.084768"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.470160" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:43.469914" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.469897" elapsed="0.000341"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:16:43.384929" elapsed="0.085332"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:16:43.475899" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:43.475790" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.475771" 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-08-22T23:16:43.477132" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:43.477024" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.477006" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:16:43.477684" 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-08-22T23:16:43.477341" elapsed="0.000370"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:43.478085" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:16:43.477865" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:16:43.523620" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:16:43.478617" elapsed="0.045107"/>
</kw>
<msg time="2026-08-22T23:16:43.523905" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:16:43.523951" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:43.478265" elapsed="0.045723"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:16:43.551594" level="INFO">"t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:16:43.524493" elapsed="0.027210"/>
</kw>
<msg time="2026-08-22T23:16:43.551871" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:16:43.551917" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:43.524155" elapsed="0.027799"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.552248" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:43.552030" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.552011" elapsed="0.000315"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.552792" level="INFO"> "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:43.552467" 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-08-22T23:16:43.553156" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:43.552930" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.552912" elapsed="0.000360"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:16:43.553306" 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-08-22T23:16:43.555956" elapsed="0.000143"/>
</kw>
<msg time="2026-08-22T23:16:43.556163" 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-08-22T23:16:43.554789" elapsed="0.001514"/>
</kw>
<kw name="Open 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-08-22T23:16:43.556620" elapsed="0.000090"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.556988" elapsed="0.000108"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:16:43.554104" elapsed="0.003117"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:16:43.553558" 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-08-22T23:16:43.476722" elapsed="0.080666"/>
</kw>
<msg time="2026-08-22T23:16:43.557480" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:43.557525" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:43.476120" elapsed="0.081442"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:16:43.557789" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:16:43.557681" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.557662" 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-08-22T23:16:43.558263" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.558620" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:16:43.558694" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:16:43.475433" elapsed="0.083369"/>
</kw>
<msg time="2026-08-22T23:16:43.558895" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:43.558939" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:43.470524" elapsed="0.088452"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.559296" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:43.559051" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.559033" elapsed="0.000340"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:16:43.470387" elapsed="0.089009"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:16:43.565084" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:43.564962" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.564942" 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-08-22T23:16:43.566413" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:43.566195" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.566176" elapsed="0.000304"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:16:43.566954" 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-08-22T23:16:43.566643" elapsed="0.000338"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:43.567351" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:16:43.567134" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:16:43.608561" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:16:43.567880" elapsed="0.040804"/>
</kw>
<msg time="2026-08-22T23:16:43.608909" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:16:43.608959" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:43.567532" elapsed="0.041466"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:16:43.638033" level="INFO">"t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:16:43.609570" elapsed="0.028575"/>
</kw>
<msg time="2026-08-22T23:16:43.638317" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:16:43.638363" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:43.609199" elapsed="0.029202"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.638737" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:43.638485" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.638463" elapsed="0.000355"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.639264" level="INFO"> "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:43.638960" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.639631" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:43.639401" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.639383" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:16:43.639746" 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">
<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-08-22T23:16:43.642507" elapsed="0.000170"/>
</kw>
<msg time="2026-08-22T23:16:43.642742" 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-08-22T23:16:43.641299" elapsed="0.001587"/>
</kw>
<kw name="Open 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-08-22T23:16:43.643180" elapsed="0.000085"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.643543" 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-08-22T23:16:43.640563" 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-08-22T23:16:43.640025" elapsed="0.003817"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:16:43.565887" elapsed="0.078054"/>
</kw>
<msg time="2026-08-22T23:16:43.644035" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:43.644079" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:43.565302" elapsed="0.078818"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:16:43.644304" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:16:43.644197" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.644178" 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-08-22T23:16:43.644820" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.645152" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:16:43.645224" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:16:43.564618" elapsed="0.080715"/>
</kw>
<msg time="2026-08-22T23:16:43.645428" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:43.645473" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:43.559799" elapsed="0.085712"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.646038" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:43.645784" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.645764" elapsed="0.000353"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:16:43.559517" elapsed="0.086625"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:16:43.384759" elapsed="0.261413"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:16:43.382379" elapsed="0.263852"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:16:43.377361" elapsed="0.268928"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:43.376943" elapsed="0.269393"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:16:43.374059" elapsed="0.272330"/>
</kw>
<kw name="Wait_Device_Connected" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.660088" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:43.658004" elapsed="0.002111"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.660825" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:43.660462" elapsed="0.000390"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:16:43.660310" elapsed="0.000579"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.661438" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:43.661117" elapsed="0.000347"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:16:43.660968" elapsed="0.000532"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:16:43.660172" elapsed="0.001357"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.661849" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:43.661610" elapsed="0.000297"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.662646" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:43.662165" elapsed="0.000509"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:43.661932" elapsed="0.000779"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.662902" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:43.662737" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.661591" elapsed="0.001390"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:43.663016" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:16:43.663165" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:16:43.657531" elapsed="0.005660"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:43.663237" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:16:43.663379" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:16:43.656968" elapsed="0.006437"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.670666" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:43.670402" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.671106" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:43.670864" 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-08-22T23:16:43.682244" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:16:43.682447" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"connection-status":"connecting","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196"}}]} 
 </msg>
<msg time="2026-08-22T23:16:43.682560" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:16:43.673314" elapsed="0.009298"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:43.671216" elapsed="0.011441"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:43.682838" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:43.682684" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.671198" elapsed="0.011727"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.687719" level="INFO">{"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"connection-status":"connecting","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196"}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:43.683940" elapsed="0.003892"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:43.683722" elapsed="0.004189"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.683704" elapsed="0.004263"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.693831" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:43.688643" elapsed="0.005291"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:43.688094" elapsed="0.005920"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.688056" elapsed="0.006014"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.695318" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:43.694427" 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-08-22T23:16:43.696095" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:43.695536" elapsed="0.000688"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.697378" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:43.696706" elapsed="0.000731"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:43.696278" elapsed="0.001240"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.695495" elapsed="0.002070"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.698126" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:43.697760" 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-08-22T23:16:43.698450" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:43.698220" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.698999" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:43.698704" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:43.698530" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.698203" 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-08-22T23:16:43.699228" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:16:43.700042" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:43.699749" 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-08-22T23:16:43.700219" elapsed="0.002315"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:16:43.683278" elapsed="0.019335"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:43.702790" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:43.702684" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:43.702665" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:16:43.705722" level="INFO">${text_normalized} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:16:43.702999" elapsed="0.002752"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:16:43.705802" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:16:43.705996" level="INFO">${response_text} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:16:43.666106" elapsed="0.039917"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:16:43.706081" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:16:43.706232" level="INFO">${device_status} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:16:43.663645" elapsed="0.042613"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:16:43.706945" level="FAIL">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</msg>
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:16:43.706418" elapsed="0.000605">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</status>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:16:43.647692" elapsed="0.059457">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:44.724881" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:44.722413" elapsed="0.002502"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:44.725683" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:44.725321" elapsed="0.000390"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:16:44.725143" elapsed="0.000608"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:44.726321" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:44.725989" elapsed="0.000360"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:16:44.725836" elapsed="0.000549"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:16:44.724990" elapsed="0.001425"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:44.726780" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:44.726491" elapsed="0.000349"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:44.727594" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:44.727104" elapsed="0.000520"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:44.726867" elapsed="0.000794"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:44.727852" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:44.727686" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:44.726469" elapsed="0.001462"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:44.727970" elapsed="0.000039"/>
</return>
<msg time="2026-08-22T23:16:44.728190" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:16:44.721896" elapsed="0.006321"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:44.728266" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:16:44.728415" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:16:44.721270" elapsed="0.007172"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:44.735775" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:44.735498" elapsed="0.000397"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:44.736294" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:44.736048" 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-08-22T23:16:44.746179" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:16:44.746387" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"connection-status":"connecting","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196"}}]} 
 </msg>
<msg time="2026-08-22T23:16:44.746530" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:16:44.738480" elapsed="0.008087"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:44.736405" elapsed="0.010255"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:44.746927" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:44.746707" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:44.736387" elapsed="0.010661"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:44.752067" level="INFO">{"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"connection-status":"connecting","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196"}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:44.748489" elapsed="0.003648"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:44.748173" elapsed="0.004013"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:44.748147" elapsed="0.004073"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:44.755869" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:44.752650" elapsed="0.003282"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:44.752300" elapsed="0.003680"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:44.752276" elapsed="0.003738"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:16:44.756842" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:44.756241" 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-08-22T23:16:44.757304" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:44.756979" elapsed="0.000405"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:44.758019" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:44.757676" elapsed="0.000370"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:44.757417" elapsed="0.000665"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:44.756954" elapsed="0.001149"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:16:44.758637" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:44.758258" 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-08-22T23:16:44.758974" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:44.758742" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:44.759508" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:44.759212" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:44.759054" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:44.758724" 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-08-22T23:16:44.759765" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:16:44.760627" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:44.760277" 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-08-22T23:16:44.760816" elapsed="0.002335"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:16:44.747551" elapsed="0.015665"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:44.763485" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:44.763373" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:44.763353" elapsed="0.000201"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:16:44.766463" level="INFO">${text_normalized} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:16:44.763720" elapsed="0.002772"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:16:44.766545" elapsed="0.000046"/>
</return>
<msg time="2026-08-22T23:16:44.766723" level="INFO">${response_text} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:16:44.731221" elapsed="0.035528"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:16:44.766807" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:16:44.766957" level="INFO">${device_status} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:16:44.728748" elapsed="0.038234"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:16:44.767500" level="FAIL">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</msg>
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:16:44.767140" elapsed="0.000452">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</status>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:16:44.708178" elapsed="0.059541">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:45.785332" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:45.782906" elapsed="0.002460"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:45.786108" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:45.785773" elapsed="0.000362"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:16:45.785613" elapsed="0.000561"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:45.786749" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:45.786405" elapsed="0.000371"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:16:45.786256" elapsed="0.000557"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:16:45.785444" elapsed="0.001398"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:45.787185" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:45.786919" elapsed="0.000324"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:45.788121" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:45.787499" elapsed="0.000649"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:45.787269" elapsed="0.000915"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:45.788371" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:45.788209" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:45.786898" elapsed="0.001550"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:45.788488" elapsed="0.000038"/>
</return>
<msg time="2026-08-22T23:16:45.788669" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:16:45.782401" elapsed="0.006295"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:45.788828" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:16:45.788978" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:16:45.781809" elapsed="0.007195"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:45.796323" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:45.796066" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:45.796785" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:45.796520" 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-08-22T23:16:45.811836" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:16:45.812285" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '3689'} 
 body={"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"unavailable-capabilities":{"unavailable-capability":[{"failure-reason":"missing-source","capability":"(urn:ietf:params:xml:ns:netconf:notification:1.0?revision=2008-07-14)notifications"}]},"clustered-connection-status":{"netconf-master-node":"pekko://opendaylight-cluster-data@127.0.0.1:2550"},"negotiated-ssh-transport-parameters":{"encryption-alg":"chacha20-poly1305","host-key-alg":"rsa-sha2-512","mac-alg":"none","key-exchange-alg":"sntrup761x25519-sha512"},"session-id":1,"connection-status":"connected","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196","available-capabilities":{"available-capability":[{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:notification:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:exi:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:candidate:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.1"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.0"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people?revision=2014-08-18)people"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)ietf-yang-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?revision=2010-10-04)ietf-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car?revision=2014-08-18)car"},{"capability-origin":"device-advertised","capability":"(ns:augment:main:a?revision=2014-01-21)augment-main-a"},{"capability-origin":"device-advertised","capability":"(ns:main?revision=2014-01-21)main"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:netconf:monitoring?revision=2022-07-18)odl-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:netconf:base:1.0?revision=2011-06-01)ietf-netconf"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring-extension?revision=2013-12-10)ietf-netconf-monitoring-extension"},{"capability-origin":"device-advertised","capability":"(org:opendaylight:coretutorials:ncmount:example:l2fib?revision=2016-03-07)ncmount-l2fib"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people?revision=2014-08-18)car-people"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-purchase?revision=2014-08-18)car-purchase"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:test:netconf:crud?revision=2014-10-18)test"},{"capability-origin":"device-advertised","capability":"(https://example.com/ns/example-action?revision=2016-07-07)example-action"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2010-09-24)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2013-07-15)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:yang:extension:yang-ext?revision=2013-07-09)yang-ext"}]}}}]} 
 </msg>
<msg time="2026-08-22T23:16:45.812568" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:16:45.798953" elapsed="0.013711"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:45.796896" elapsed="0.015868"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:45.813207" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:45.812828" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:45.796877" elapsed="0.016532"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:45.821770" level="INFO">{"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"unavailable-capabilities":{"unavailable-capability":[{"failure-reason":"missing-source","capability":"(urn:ietf:params:xml:ns:netconf:notification:1.0?revision=2008-07-14)notifications"}]},"clustered-connection-status":{"netconf-master-node":"pekko://opendaylight-cluster-data@127.0.0.1:2550"},"negotiated-ssh-transport-parameters":{"encryption-alg":"chacha20-poly1305","host-key-alg":"rsa-sha2-512","mac-alg":"none","key-exchange-alg":"sntrup761x25519-sha512"},"session-id":1,"connection-status":"connected","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196","available-capabilities":{"available-capability":[{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:notification:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:exi:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:candidate:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.1"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.0"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people?revision=2014-08-18)people"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)ietf-yang-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?revision=2010-10-04)ietf-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car?revision=2014-08-18)car"},{"capability-origin":"device-advertised","capability":"(ns:augment:main:a?revision=2014-01-21)augment-main-a"},{"capability-origin":"device-advertised","capability":"(ns:main?revision=2014-01-21)main"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:netconf:monitoring?revision=2022-07-18)odl-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:netconf:base:1.0?revision=2011-06-01)ietf-netconf"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring-extension?revision=2013-12-10)ietf-netconf-monitoring-extension"},{"capability-origin":"device-advertised","capability":"(org:opendaylight:coretutorials:ncmount:example:l2fib?revision=2016-03-07)ncmount-l2fib"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people?revision=2014-08-18)car-people"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-purchase?revision=2014-08-18)car-purchase"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:test:netconf:crud?revision=2014-10-18)test"},{"capability-origin":"device-advertised","capability":"(https://example.com/ns/example-action?revision=2016-07-07)example-action"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2010-09-24)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2013-07-15)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:yang:extension:yang-ext?revision=2013-07-09)yang-ext"}]}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:45.815790" elapsed="0.006105"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:45.815258" elapsed="0.006674"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:45.815215" elapsed="0.006742"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:45.824508" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:45.822242" elapsed="0.002312"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:45.822015" elapsed="0.002591"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:45.821998" elapsed="0.002634"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:16:45.825237" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:45.824803" 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-08-22T23:16:45.825632" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:45.825346" elapsed="0.000347"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:45.826179" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:45.825876" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:45.825717" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:45.825318" elapsed="0.000946"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:16:45.826798" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:45.826419" 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-08-22T23:16:45.827143" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:45.826907" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:45.827696" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:45.827382" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:45.827225" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:45.826888" 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-08-22T23:16:45.827929" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:16:45.828755" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:16:45.828437" 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-08-22T23:16:45.828931" elapsed="0.002342"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:16:45.814244" elapsed="0.017092"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:45.831513" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:45.831406" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:45.831387" elapsed="0.000214"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:16:45.835163" level="INFO">${text_normalized} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "available-capabilities": {
     "available-capability": [
      {
       "capability": "(https://example.com/ns/exampl...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:16:45.831746" elapsed="0.003447"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:16:45.835245" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:16:45.835409" level="INFO">${response_text} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "available-capabilities": {
     "available-capability": [
      {
       "capability": "(https://example.com/ns/exampl...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:16:45.791736" elapsed="0.043700"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:16:45.835492" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:16:45.835660" level="INFO">${device_status} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "available-capabilities": {
     "available-capability": [
      {
       "capability": "(https://example.com/ns/exampl...</msg>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:16:45.789254" elapsed="0.046432"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-08-22T23:16:45.835915" elapsed="0.000315"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="PASS" start="2026-08-22T23:16:45.768562" elapsed="0.067730"/>
</kw>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Connected</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:16:43.647092" elapsed="2.189291"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${NODE_CONFIGURER}</arg>
<doc>Wait for the device to become connected.
It is more readable to use this keyword in a test case than to put the whole WUKS below into it.</doc>
<status status="PASS" start="2026-08-22T23:16:43.646615" elapsed="2.189837"/>
</kw>
<doc>Wait until the device becomes visible on configurer node.</doc>
<status status="PASS" start="2026-08-22T23:16:43.373435" elapsed="2.463163"/>
</test>
<test id="s1-s1-t6" name="Wait_For_Device_To_Become_Visible_For_Checker" line="102">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:16:45.840002" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:16:45.839734" 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-08-22T23:16:45.841354" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:45.841241" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:45.841221" 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-08-22T23:16:45.846476" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:45.846368" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:45.846350" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:16:45.847671" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:16:45.847203" elapsed="0.000497"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:16:45.848185" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:16:45.847859" elapsed="0.000353"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:16:45.848257" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:16:45.848413" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:16:45.846790" 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-08-22T23:16:45.853966" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:45.853857" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:45.853837" 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-08-22T23:16:45.855255" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:45.855142" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:45.855124" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:16:45.855826" 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-08-22T23:16:45.855468" elapsed="0.000384"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:45.856260" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:16:45.856013" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:16:45.907174" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:16:45.856849" elapsed="0.050540"/>
</kw>
<msg time="2026-08-22T23:16:45.907630" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:16:45.907680" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:45.856449" elapsed="0.051269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:16:45.947809" level="INFO">"t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:16:45.908313" elapsed="0.039781"/>
</kw>
<msg time="2026-08-22T23:16:45.948521" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:16:45.948694" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:45.907936" elapsed="0.040851"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:45.949558" elapsed="0.000088"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:45.948989" elapsed="0.000884"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:45.948929" elapsed="0.001014"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:45.951147" level="INFO"> "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:45.950302" elapsed="0.001032"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:45.952069" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:45.951495" elapsed="0.000706"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:45.951452" elapsed="0.000826"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:16:45.952366" elapsed="0.000086"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<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-08-22T23:16:45.956218" elapsed="0.000344"/>
</kw>
<msg time="2026-08-22T23:16:45.956686" 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-08-22T23:16:45.954926" elapsed="0.001936"/>
</kw>
<kw name="Open 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-08-22T23:16:45.957176" elapsed="0.000118"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:45.957627" elapsed="0.000115"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:16:45.954154" elapsed="0.003722"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:16:45.953099" elapsed="0.004848"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:16:45.854828" elapsed="0.103222"/>
</kw>
<msg time="2026-08-22T23:16:45.958144" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:45.958207" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:45.854196" elapsed="0.104057"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:16:45.958447" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:16:45.958335" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:45.958316" 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-08-22T23:16:45.958961" 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-08-22T23:16:45.959318" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:16:45.959395" 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-08-22T23:16:45.853492" elapsed="0.106016"/>
</kw>
<msg time="2026-08-22T23:16:45.959758" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:45.959805" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:45.848831" elapsed="0.111014"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:45.960178" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:45.959921" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:45.959903" elapsed="0.000361"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:16:45.848690" elapsed="0.111598"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:16:45.965920" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:45.965809" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:45.965790" 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-08-22T23:16:45.967155" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:45.967046" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:45.967027" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:16:45.967703" 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-08-22T23:16:45.967366" elapsed="0.000364"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:45.968165" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:16:45.967938" elapsed="0.000254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:16:46.005464" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:16:45.968733" elapsed="0.036938"/>
</kw>
<msg time="2026-08-22T23:16:46.005899" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:16:46.005947" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:45.968349" elapsed="0.037635"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:16:46.029991" level="INFO">"t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:16:46.006667" elapsed="0.023447"/>
</kw>
<msg time="2026-08-22T23:16:46.030291" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:16:46.030338" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:46.006220" elapsed="0.024155"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:46.030760" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:46.030474" elapsed="0.000344"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:46.030445" elapsed="0.000403"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:46.031322" level="INFO"> "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:46.030998" 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-08-22T23:16:46.031709" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:46.031470" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:46.031451" elapsed="0.000340"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:16:46.031830" 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-08-22T23:16:46.034873" elapsed="0.000154"/>
</kw>
<msg time="2026-08-22T23:16:46.035094" 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-08-22T23:16:46.033506" elapsed="0.001748"/>
</kw>
<kw name="Open 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-08-22T23:16:46.035574" elapsed="0.000113"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:46.035973" elapsed="0.000343"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:16:46.032782" elapsed="0.003697"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:16:46.032158" elapsed="0.004394"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:16:45.966741" elapsed="0.069942"/>
</kw>
<msg time="2026-08-22T23:16:46.036779" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:46.036825" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:45.966138" elapsed="0.070725"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:16:46.037056" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:16:46.036943" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:46.036923" 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-08-22T23:16:46.037563" elapsed="0.000198"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:46.038083" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:16:46.038159" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:16:45.965433" elapsed="0.072937"/>
</kw>
<msg time="2026-08-22T23:16:46.038469" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:46.038514" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:45.960565" elapsed="0.077986"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:46.038927" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:46.038647" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:46.038628" elapsed="0.000386"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:16:45.960425" elapsed="0.078613"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:16:46.044633" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:46.044494" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:46.044474" 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-08-22T23:16:46.045914" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:46.045801" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:46.045782" elapsed="0.000210"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:16:46.046467" 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-08-22T23:16:46.046137" elapsed="0.000358"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:16:46.046904" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:16:46.046673" elapsed="0.000258"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:16:46.088165" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:16:46.047473" elapsed="0.040991"/>
</kw>
<msg time="2026-08-22T23:16:46.088820" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:16:46.088893" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:46.047105" elapsed="0.041845"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:16:46.117921" level="INFO">"t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:16:46.089936" elapsed="0.028294"/>
</kw>
<msg time="2026-08-22T23:16:46.118572" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:16:46.118683" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:46.089290" elapsed="0.029452"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:46.119340" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:46.118895" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:46.118852" elapsed="0.000615"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:46.120290" level="INFO"> "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:46.119708" 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-08-22T23:16:46.120872" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:46.120501" elapsed="0.000456"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:46.120474" elapsed="0.000519"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:16:46.121046" 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-08-22T23:16:46.125208" elapsed="0.000157"/>
</kw>
<msg time="2026-08-22T23:16:46.125433" 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-08-22T23:16:46.123462" elapsed="0.002156"/>
</kw>
<kw name="Open 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-08-22T23:16:46.125925" elapsed="0.000155"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:46.126389" 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-08-22T23:16:46.122387" elapsed="0.004238"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:16:46.121494" elapsed="0.005204"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:16:46.045464" elapsed="0.081336"/>
</kw>
<msg time="2026-08-22T23:16:46.126899" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:46.126945" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:46.044857" elapsed="0.082127"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:16:46.127176" elapsed="0.000273"/>
</return>
<status status="PASS" start="2026-08-22T23:16:46.127064" elapsed="0.000420"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:46.127044" elapsed="0.000465"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:46.128128" 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-08-22T23:16:46.128488" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:16:46.128562" 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-08-22T23:16:46.044117" elapsed="0.084580"/>
</kw>
<msg time="2026-08-22T23:16:46.128795" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:16:46.128840" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:46.039323" elapsed="0.089555"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:46.129217" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:46.128954" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:46.128936" elapsed="0.000376"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:16:46.039179" elapsed="0.090158"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:16:45.848493" elapsed="0.280877"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:16:45.846008" elapsed="0.283429"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:16:45.840928" elapsed="0.288569"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:16:45.840421" elapsed="0.289124"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:16:45.837588" elapsed="0.292040"/>
</kw>
<kw name="Wait_Device_Connected" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:46.142086" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:46.139944" elapsed="0.002170"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:46.142828" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:46.142470" elapsed="0.000385"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:16:46.142318" elapsed="0.000573"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:46.143456" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:46.143120" elapsed="0.000362"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:16:46.142971" elapsed="0.000601"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:16:46.142173" elapsed="0.001446"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:46.143933" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:46.143685" elapsed="0.000307"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:46.144829" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:46.144320" elapsed="0.000539"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:46.144037" elapsed="0.000859"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:46.145087" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:46.144922" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:46.143667" elapsed="0.001498"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:46.145211" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:16:46.145368" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:16:46.139453" elapsed="0.005941"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:46.145440" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:16:46.145601" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:16:46.138870" elapsed="0.006759"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:46.153349" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:46.153005" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:46.153822" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:46.153553" 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-08-22T23:16:46.931316" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:16:46.931976" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Set-Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Fri, 21-Aug-2026 23:16:46 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:16:46.932334" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:16:46.156055" elapsed="0.778998">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:16:46.153936" elapsed="0.781374">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:46.935823" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:46.935404" elapsed="0.000528"/>
</branch>
<status status="FAIL" start="2026-08-22T23:16:46.153916" elapsed="0.782054">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:46.936659" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:46.936883" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:46.936820" elapsed="0.000130"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:16:46.936789" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:46.937225" elapsed="0.000057"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:16:46.937370" elapsed="0.000030"/>
</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-08-22T23:16:46.148564" elapsed="0.789055">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:46.937924" elapsed="0.000028"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:16:46.145854" elapsed="0.792232">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:46.938361" elapsed="0.000035"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:16:46.130975" elapsed="0.807556">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:47.956688" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:47.953561" elapsed="0.003161"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:47.957440" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:47.957101" elapsed="0.000367"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:16:47.956943" elapsed="0.000565"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:47.958090" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:47.957761" elapsed="0.000356"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:16:47.957607" elapsed="0.000547"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:16:47.956796" elapsed="0.001389"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:47.958520" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:47.958258" elapsed="0.000336"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:47.959344" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:47.958856" elapsed="0.000517"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:47.958621" elapsed="0.000790"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:47.959618" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:47.959437" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:47.958239" elapsed="0.001458"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:47.959735" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:16:47.959902" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:16:47.952852" elapsed="0.007076"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:47.959975" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:16:47.960127" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:16:47.951998" elapsed="0.008155"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:47.967713" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:47.967434" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:47.968161" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:47.967915" 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-08-22T23:16:47.980404" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:16:47.980693" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:16:47.980884" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:16:47.970363" elapsed="0.011206">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:16:47.968271" elapsed="0.013456">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:47.982076" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:47.981784" elapsed="0.000388"/>
</branch>
<status status="FAIL" start="2026-08-22T23:16:47.968253" elapsed="0.013953">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:47.982810" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:47.983041" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:47.982958" elapsed="0.000146"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:16:47.982932" elapsed="0.000203"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:47.983340" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:16:47.983438" 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-08-22T23:16:47.962994" elapsed="0.020631">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:47.983734" elapsed="0.000027"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:16:47.960380" elapsed="0.023521">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:47.984156" elapsed="0.000031"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:16:47.939420" elapsed="0.044899">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:49.002456" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:49.000295" elapsed="0.002194"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:49.003202" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:49.002873" elapsed="0.000356"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:16:49.002719" elapsed="0.000548"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:49.003838" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:49.003498" elapsed="0.000372"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:16:49.003349" elapsed="0.000558"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:16:49.002557" elapsed="0.001379"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:49.004274" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:49.004009" elapsed="0.000322"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:49.005098" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:49.004602" elapsed="0.000524"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:49.004356" elapsed="0.000807"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:49.005351" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:49.005187" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:49.003989" elapsed="0.001438"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:49.005466" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:16:49.005725" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:16:48.999817" elapsed="0.005935"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:49.005799" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:16:49.005942" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:16:48.999222" elapsed="0.006746"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:49.013241" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:49.012983" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:49.013700" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:49.013440" 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-08-22T23:16:49.024185" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:16:49.024343" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:16:49.024471" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:16:49.015870" elapsed="0.009037">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:16:49.013811" elapsed="0.011181">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:49.025190" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:49.025027" elapsed="0.000230"/>
</branch>
<status status="FAIL" start="2026-08-22T23:16:49.013793" elapsed="0.011488">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:49.025684" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:49.025821" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:49.025783" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:16:49.025765" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:49.026031" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:16:49.026100" 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-08-22T23:16:49.008665" elapsed="0.017541">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:49.026276" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:16:49.006189" elapsed="0.020182">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:49.026536" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:16:48.985243" elapsed="0.041417">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:50.043073" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:50.040085" elapsed="0.003022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:50.043831" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:50.043483" elapsed="0.000376"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:16:50.043327" elapsed="0.000570"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:50.044453" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:50.044131" elapsed="0.000349"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:16:50.043979" elapsed="0.000537"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:16:50.043179" elapsed="0.001366"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:50.044903" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:50.044638" elapsed="0.000323"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:50.045706" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:50.045219" elapsed="0.000516"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:50.044987" elapsed="0.000784"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:50.045959" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:50.045796" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:50.044617" elapsed="0.001420"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:50.046076" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:16:50.046237" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:16:50.039397" elapsed="0.006866"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:50.046310" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:16:50.046463" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:16:50.038598" elapsed="0.007891"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:50.053872" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:50.053528" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:50.054323" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:50.054078" 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-08-22T23:16:50.065809" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:16:50.066013" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:16:50.066160" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:16:50.056508" elapsed="0.010231">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:16:50.054451" elapsed="0.012403">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:50.067119" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:50.066902" elapsed="0.000308"/>
</branch>
<status status="FAIL" start="2026-08-22T23:16:50.054415" elapsed="0.012829">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:50.067937" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:50.068131" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:50.068078" elapsed="0.000112"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:16:50.068053" elapsed="0.000169"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:50.068422" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:16:50.068522" 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-08-22T23:16:50.049202" elapsed="0.019491">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:50.068793" elapsed="0.000023"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:16:50.046730" elapsed="0.022200">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:50.069165" elapsed="0.000031"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:16:50.027332" elapsed="0.041987">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:51.089823" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:51.087632" elapsed="0.002225"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:51.090557" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:51.090232" elapsed="0.000367"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:16:51.090080" elapsed="0.000557"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:51.091190" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:51.090867" elapsed="0.000350"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:16:51.090718" elapsed="0.000534"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:16:51.089929" elapsed="0.001352"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:51.091644" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:51.091355" elapsed="0.000348"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:51.092425" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:51.091962" elapsed="0.000491"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:51.091729" elapsed="0.000772"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:51.092709" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:51.092526" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:51.091334" elapsed="0.001453"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:51.092826" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:16:51.092989" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:16:51.087135" elapsed="0.005880"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:51.093063" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:16:51.093204" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:16:51.086541" elapsed="0.006689"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:51.100657" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:51.100361" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:51.101111" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:51.100864" 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-08-22T23:16:51.111711" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:16:51.111892" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:16:51.112022" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:16:51.103282" elapsed="0.009185">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:16:51.101223" elapsed="0.011341">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:51.112835" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:51.112624" elapsed="0.000280"/>
</branch>
<status status="FAIL" start="2026-08-22T23:16:51.101205" elapsed="0.011724">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:51.113371" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:51.113519" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:51.113476" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:16:51.113456" elapsed="0.000147"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:51.113752" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:16:51.113825" elapsed="0.000018"/>
</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-08-22T23:16:51.095992" elapsed="0.017953">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:51.114017" elapsed="0.000017"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:16:51.093451" elapsed="0.020666">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:51.114284" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:16:51.070228" elapsed="0.044166">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:52.131647" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:52.129396" elapsed="0.002290"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:52.132407" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:52.132071" elapsed="0.000364"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:16:52.131915" elapsed="0.000558"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:52.133068" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:52.132735" elapsed="0.000445"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:16:52.132557" elapsed="0.000664"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:16:52.131760" elapsed="0.001492"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:52.133621" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:52.133331" elapsed="0.000360"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:52.134447" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:52.133963" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:52.133718" elapsed="0.000796"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:52.134758" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:52.134539" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:52.133309" elapsed="0.001533"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:52.134882" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:16:52.135049" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:16:52.128894" elapsed="0.006182"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:52.135124" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:16:52.135271" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:16:52.128278" elapsed="0.007019"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:52.142753" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:52.142464" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:52.143201" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:52.142955" 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-08-22T23:16:52.154988" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:16:52.155162" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:16:52.155282" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:16:52.145372" elapsed="0.010334">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:16:52.143312" elapsed="0.012479">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:52.155988" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:52.155824" elapsed="0.000230"/>
</branch>
<status status="FAIL" start="2026-08-22T23:16:52.143294" elapsed="0.012784">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:52.156447" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:52.156597" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:52.156543" elapsed="0.000098"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:16:52.156526" elapsed="0.000137"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:52.156803" elapsed="0.000057"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:16:52.156912" 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-08-22T23:16:52.138102" elapsed="0.018918">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:52.157089" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:16:52.135535" elapsed="0.021650">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:52.157350" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:16:52.115310" elapsed="0.042147">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:53.178856" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:53.175656" elapsed="0.003246"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:53.180079" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:53.179601" elapsed="0.000515"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:16:53.179351" elapsed="0.000849"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:53.181020" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:53.180540" elapsed="0.000517"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:16:53.180328" elapsed="0.000812"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:16:53.178998" elapsed="0.002184"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:53.181691" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:53.181286" elapsed="0.000488"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:53.182639" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:53.182151" elapsed="0.000516"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:53.181809" elapsed="0.000895"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:53.182905" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:53.182730" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:53.181257" elapsed="0.001732"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:53.183028" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:16:53.183191" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:16:53.174974" elapsed="0.008244"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:53.183266" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:16:53.183412" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:16:53.174148" elapsed="0.009290"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:53.190849" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:53.190573" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:53.191293" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:53.191050" 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-08-22T23:16:53.202501" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:16:53.202785" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:16:53.202912" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:16:53.193480" elapsed="0.010249">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:16:53.191404" elapsed="0.012512">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:53.204413" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:53.203996" elapsed="0.000618"/>
</branch>
<status status="FAIL" start="2026-08-22T23:16:53.191386" elapsed="0.013289">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:53.205622" elapsed="0.000065"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:53.205955" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:53.205855" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:16:53.205813" 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-08-22T23:16:53.206274" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:16:53.206375" 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-08-22T23:16:53.186211" elapsed="0.020318">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:53.206651" elapsed="0.000022"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:16:53.183684" elapsed="0.023105">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:53.207050" elapsed="0.000049"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:16:53.158246" elapsed="0.048992">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:54.223906" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:54.221702" elapsed="0.002238"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:54.224680" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:54.224332" elapsed="0.000376"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:16:54.224175" elapsed="0.000570"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:54.225310" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:54.224984" elapsed="0.000353"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:16:54.224828" elapsed="0.000547"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:16:54.224023" elapsed="0.001381"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:54.225775" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:54.225485" elapsed="0.000349"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:54.226592" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:54.226105" elapsed="0.000517"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:54.225861" elapsed="0.000866"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:54.226921" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:54.226754" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:54.225462" elapsed="0.001540"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:54.227053" elapsed="0.000040"/>
</return>
<msg time="2026-08-22T23:16:54.227224" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:16:54.221203" elapsed="0.006048"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:54.227300" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:16:54.227448" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:16:54.220612" elapsed="0.006862"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:54.234891" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:54.234628" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:54.235356" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:54.235093" 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-08-22T23:16:54.250196" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:16:54.250357" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:16:54.250472" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:16:54.237549" elapsed="0.013345">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:16:54.235468" elapsed="0.015532">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:54.251440" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:54.251086" elapsed="0.000594"/>
</branch>
<status status="FAIL" start="2026-08-22T23:16:54.235450" elapsed="0.016290">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:54.252571" elapsed="0.000093"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:54.252912" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:54.252827" elapsed="0.000176"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:16:54.252786" 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-08-22T23:16:54.253369" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:16:54.253523" elapsed="0.000040"/>
</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-08-22T23:16:54.230243" elapsed="0.023567">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:54.253970" elapsed="0.000036"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:16:54.227754" elapsed="0.026430">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:54.254679" elapsed="0.000054"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:16:54.208139" elapsed="0.046799">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:55.275879" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:55.273680" elapsed="0.002234"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:55.276666" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:55.276307" elapsed="0.000388"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:16:55.276149" elapsed="0.000584"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:55.277306" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:55.276973" elapsed="0.000361"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:16:55.276820" elapsed="0.000550"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:16:55.275992" elapsed="0.001407"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:55.277780" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:55.277478" elapsed="0.000364"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:55.278665" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:55.278109" elapsed="0.000585"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:55.277868" elapsed="0.000865"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:55.278928" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:55.278759" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:55.277456" elapsed="0.001553"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:55.279049" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:16:55.279216" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:16:55.273033" elapsed="0.006210"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:55.279290" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:16:55.279437" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:16:55.272408" elapsed="0.007055"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:55.288757" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:55.288471" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:55.289216" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:55.288967" 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-08-22T23:16:55.301533" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:16:55.301948" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:16:55.302299" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:16:55.291416" elapsed="0.011928">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:16:55.289328" elapsed="0.014456">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:55.304361" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:55.303886" elapsed="0.000657"/>
</branch>
<status status="FAIL" start="2026-08-22T23:16:55.289310" elapsed="0.015355">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:55.305819" elapsed="0.000073"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:55.306207" elapsed="0.000064"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:55.306097" elapsed="0.000256"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:16:55.306047" elapsed="0.000365"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:55.306832" elapsed="0.000057"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:16:55.307026" elapsed="0.000028"/>
</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-08-22T23:16:55.283951" elapsed="0.023218">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:55.307238" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:16:55.279722" elapsed="0.027611">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:55.307501" elapsed="0.000021"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:16:55.255865" elapsed="0.051761">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:56.325498" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:56.323317" elapsed="0.002215"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:56.326253" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:56.325925" elapsed="0.000356"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:16:56.325772" elapsed="0.000546"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:56.326882" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:56.326544" elapsed="0.000365"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:16:56.326399" elapsed="0.000546"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:16:56.325622" elapsed="0.001352"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:56.327316" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:56.327050" elapsed="0.000325"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:56.328123" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:56.327648" elapsed="0.000502"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:56.327401" elapsed="0.000786"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:56.328374" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:56.328213" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:56.327028" elapsed="0.001424"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:56.328492" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:16:56.328672" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:16:56.322825" elapsed="0.005873"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:56.328746" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:16:56.328962" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:16:56.322211" elapsed="0.006777"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:56.336343" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:56.336083" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:56.336802" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:56.336542" 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-08-22T23:16:56.349116" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:16:56.349333" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:16:56.349514" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:16:56.339429" elapsed="0.010647">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:16:56.336913" elapsed="0.013285">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:56.350505" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:56.350250" elapsed="0.000373"/>
</branch>
<status status="FAIL" start="2026-08-22T23:16:56.336895" elapsed="0.013763">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:56.351268" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:56.351476" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:56.351416" elapsed="0.000125"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:16:56.351389" elapsed="0.000184"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:56.351807" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:16:56.351911" 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-08-22T23:16:56.331738" elapsed="0.020334">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:56.352177" elapsed="0.000023"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:16:56.329255" elapsed="0.023064">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:56.352567" elapsed="0.000054"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:16:56.308483" elapsed="0.044272">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:57.369052" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:57.366832" elapsed="0.002317"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:57.369881" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:57.369528" elapsed="0.000380"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:16:57.369373" elapsed="0.000573"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:57.370507" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:57.370184" elapsed="0.000350"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:16:57.370028" elapsed="0.000543"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:16:57.369224" elapsed="0.001394"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:57.370962" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:57.370691" elapsed="0.000329"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:57.371765" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:57.371277" elapsed="0.000516"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:57.371046" elapsed="0.000784"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:57.372043" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:57.371855" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:57.370671" elapsed="0.001452"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:57.372161" elapsed="0.000038"/>
</return>
<msg time="2026-08-22T23:16:57.372327" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:16:57.366320" elapsed="0.006033"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:57.372400" elapsed="0.000159"/>
</return>
<msg time="2026-08-22T23:16:57.372695" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:16:57.365719" elapsed="0.007002"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:57.380011" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:57.379735" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:57.380460" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:57.380216" 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-08-22T23:16:57.390674" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:16:57.390829" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:16:57.390939" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:16:57.382622" elapsed="0.008719">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:16:57.380571" elapsed="0.010852">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:57.391631" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:57.391457" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-08-22T23:16:57.380553" elapsed="0.011169">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:57.392115" elapsed="0.000075"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:57.392305" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:57.392265" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:16:57.392247" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:57.392510" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:16:57.392596" elapsed="0.000017"/>
</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-08-22T23:16:57.375383" elapsed="0.017322">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:57.392774" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:16:57.372945" elapsed="0.019925">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:57.393040" elapsed="0.000023"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:16:57.353498" elapsed="0.039653">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:58.410265" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:58.408131" elapsed="0.002168"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:58.411046" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:58.410683" elapsed="0.000390"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:16:58.410514" elapsed="0.000598"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:58.411685" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:58.411344" elapsed="0.000368"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:16:58.411194" elapsed="0.000554"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:16:58.410367" elapsed="0.001411"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:58.412118" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:58.411850" elapsed="0.000326"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:58.412910" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:58.412428" elapsed="0.000509"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:58.412200" elapsed="0.000774"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:58.413160" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:58.412998" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:58.411830" elapsed="0.001407"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:58.413274" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:16:58.413433" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:16:58.407656" elapsed="0.005803"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:58.413507" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:16:58.413666" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:16:58.407067" elapsed="0.006625"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:58.420907" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:58.420644" elapsed="0.000376"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:58.421418" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:58.421173" 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-08-22T23:16:58.432341" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:16:58.432503" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:16:58.432636" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:16:58.423558" elapsed="0.009471">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:16:58.421528" elapsed="0.011581">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:58.433297" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:58.433143" elapsed="0.000219"/>
</branch>
<status status="FAIL" start="2026-08-22T23:16:58.421510" elapsed="0.011876">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:58.433775" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:58.433909" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:58.433872" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:16:58.433855" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:58.434112" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:16:58.434182" 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-08-22T23:16:58.416385" elapsed="0.017901">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:58.434354" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:16:58.413914" elapsed="0.020533">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:58.434629" elapsed="0.000023"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:16:58.394002" elapsed="0.040737">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:59.454113" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:59.451032" elapsed="0.003120"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:59.455678" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:59.454859" elapsed="0.000882"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:16:59.454391" elapsed="0.001435"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:59.457220" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:59.456347" elapsed="0.000932"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:16:59.456012" elapsed="0.001452"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:16:59.454234" elapsed="0.003297"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:59.458356" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:59.457728" elapsed="0.000760"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:16:59.459836" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:16:59.459098" elapsed="0.000779"/>
</kw>
<status status="PASS" start="2026-08-22T23:16:59.458545" elapsed="0.001385"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:59.460209" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:59.459967" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-08-22T23:16:59.457682" elapsed="0.002640"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:59.460378" elapsed="0.000053"/>
</return>
<msg time="2026-08-22T23:16:59.460636" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:16:59.450349" elapsed="0.010327"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:16:59.460745" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:16:59.460953" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:16:59.449515" elapsed="0.011476"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:59.471447" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:59.471186" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:16:59.471915" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:16:59.471661" 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-08-22T23:16:59.486092" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:16:59.486336" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:16:59.486494" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:16:59.474228" elapsed="0.012841">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:16:59.472026" elapsed="0.015178">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:59.487468" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:16:59.487252" elapsed="0.000306"/>
</branch>
<status status="FAIL" start="2026-08-22T23:16:59.472008" elapsed="0.015606">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:59.488142" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:59.488327" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:16:59.488276" elapsed="0.000107"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:16:59.488253" elapsed="0.000159"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:59.488632" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:16:59.488864" elapsed="0.000027"/>
</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-08-22T23:16:59.465131" elapsed="0.023895">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:16:59.489122" elapsed="0.000021"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:16:59.461317" elapsed="0.027935">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:16:59.489481" elapsed="0.000030"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:16:59.435567" elapsed="0.054089">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:00.505645" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:00.503428" elapsed="0.002252"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:00.506427" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:00.506088" elapsed="0.000366"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:17:00.505932" elapsed="0.000560"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:00.507097" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:00.506744" elapsed="0.000381"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:17:00.506574" elapsed="0.000588"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:17:00.505774" elapsed="0.001418"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:00.507556" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:00.507279" elapsed="0.000353"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:00.508389" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:00.507907" elapsed="0.000510"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:00.507660" elapsed="0.000794"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:00.508660" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:00.508479" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:00.507256" elapsed="0.001484"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:00.508780" elapsed="0.000040"/>
</return>
<msg time="2026-08-22T23:17:00.508967" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:17:00.502927" elapsed="0.006076"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:00.509132" elapsed="0.000038"/>
</return>
<msg time="2026-08-22T23:17:00.509337" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:17:00.502179" elapsed="0.007197"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:00.519021" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:00.518705" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:00.519485" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:00.519233" 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-08-22T23:17:00.530794" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:00.531045" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:17:00.531225" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:00.521805" elapsed="0.010521">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:00.519617" elapsed="0.012953">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:00.533280" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:00.532729" elapsed="0.000774"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:00.519596" elapsed="0.014042">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:00.534873" elapsed="0.000089"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:00.535295" elapsed="0.000044"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:00.535183" elapsed="0.000241"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:00.535129" 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-08-22T23:17:00.535957" elapsed="0.000068"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:00.536166" elapsed="0.000048"/>
</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-08-22T23:17:00.514051" elapsed="0.022449">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:00.536760" elapsed="0.000052"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:00.509649" elapsed="0.027437">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:00.537628" elapsed="0.000070"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:17:00.490339" elapsed="0.047621">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:01.558990" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:01.555462" elapsed="0.003574"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:01.560141" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:01.559595" elapsed="0.000593"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:17:01.559346" elapsed="0.000899"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:01.561118" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:01.560614" elapsed="0.000543"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:17:01.560366" elapsed="0.000845"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:17:01.559133" elapsed="0.002112"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:01.561608" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:01.561324" elapsed="0.000344"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:01.562411" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:01.561939" elapsed="0.000500"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:01.561695" elapsed="0.000940"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:01.562839" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:01.562665" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:01.561301" elapsed="0.001619"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:01.562960" elapsed="0.000041"/>
</return>
<msg time="2026-08-22T23:17:01.563132" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:17:01.554750" elapsed="0.008409"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:01.563206" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:17:01.563355" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:17:01.553849" elapsed="0.009531"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:01.570788" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:01.570497" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:01.571255" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:01.571004" 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-08-22T23:17:01.581980" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:01.582151" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:17:01.582304" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:01.573479" elapsed="0.009414">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:01.571370" elapsed="0.011646">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:01.583315" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:01.583069" elapsed="0.000344"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:01.571350" elapsed="0.012100">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:01.584035" elapsed="0.000062"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:01.584279" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:01.584220" elapsed="0.000123"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:01.584190" elapsed="0.000185"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:01.584606" elapsed="0.000035"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:01.584714" 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-08-22T23:17:01.566144" elapsed="0.018729">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:01.584976" elapsed="0.000023"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:01.563628" elapsed="0.021490">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:01.585452" elapsed="0.000034"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:17:01.538893" elapsed="0.046749">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:02.602835" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:02.600720" elapsed="0.002148"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:02.603596" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:02.603238" elapsed="0.000387"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:17:02.603085" elapsed="0.000578"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:02.604217" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:02.603895" elapsed="0.000349"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:17:02.603746" elapsed="0.000534"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:17:02.602938" elapsed="0.001371"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:02.604661" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:02.604381" elapsed="0.000339"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:02.606661" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:02.605505" elapsed="0.001222"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:02.604905" elapsed="0.001908"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:02.607240" elapsed="0.000072"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:02.606871" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:02.604361" elapsed="0.003078"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:02.607519" elapsed="0.000091"/>
</return>
<msg time="2026-08-22T23:17:02.607889" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:17:02.600205" elapsed="0.007742"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:02.608050" elapsed="0.000057"/>
</return>
<msg time="2026-08-22T23:17:02.608366" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:17:02.599625" elapsed="0.008798"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:02.620107" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:02.619846" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:02.620554" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:02.620309" 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-08-22T23:17:02.631439" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:02.631620" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:17:02.631731" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:02.622719" elapsed="0.009411">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:02.620682" elapsed="0.011583">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:02.632456" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:02.632300" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:02.620664" elapsed="0.011881">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:02.632934" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:02.633068" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:02.633031" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:02.633014" 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-08-22T23:17:02.633278" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:02.633348" 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-08-22T23:17:02.614530" elapsed="0.018923">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:02.633522" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:02.608943" elapsed="0.024690">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:02.633801" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:17:02.586499" elapsed="0.047410">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:03.651837" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:03.648996" elapsed="0.002874"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:03.652571" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:03.652242" elapsed="0.000371"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:17:03.652089" elapsed="0.000562"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:03.653204" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:03.652882" elapsed="0.000348"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:17:03.652733" elapsed="0.000533"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:17:03.651941" elapsed="0.001355"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:03.653649" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:03.653371" elapsed="0.000339"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:03.654447" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:03.653970" elapsed="0.000505"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:03.653735" elapsed="0.000790"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:03.654734" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:03.654552" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:03.653350" elapsed="0.001463"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:03.654849" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:17:03.655010" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:17:03.648295" elapsed="0.006741"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:03.655084" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:17:03.655336" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:17:03.647483" elapsed="0.007880"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:03.662721" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:03.662401" elapsed="0.000374"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:03.663178" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:03.662930" 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-08-22T23:17:03.673351" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:03.673554" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:17:03.673727" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:03.665337" elapsed="0.008902">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:03.663291" elapsed="0.011062">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:03.674685" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:03.674400" elapsed="0.000391"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:03.663273" elapsed="0.011552">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:03.675346" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:03.675535" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:03.675482" elapsed="0.000135"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:03.675458" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:03.675847" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:03.675946" 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-08-22T23:17:03.658039" elapsed="0.018053">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:03.676189" elapsed="0.000021"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:03.655603" elapsed="0.020717">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:03.676552" elapsed="0.000049"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:17:03.634773" elapsed="0.041952">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:04.694000" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:04.691819" elapsed="0.002290"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:04.694855" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:04.694492" elapsed="0.000393"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:17:04.694332" elapsed="0.000593"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:04.695521" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:04.695166" elapsed="0.000391"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:17:04.695009" elapsed="0.000605"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:17:04.694181" elapsed="0.001465"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:04.695992" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:04.695722" elapsed="0.000330"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:04.696810" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:04.696310" elapsed="0.000530"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:04.696077" elapsed="0.000801"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:04.697072" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:04.696904" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:04.695701" elapsed="0.001451"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:04.697190" elapsed="0.000044"/>
</return>
<msg time="2026-08-22T23:17:04.697394" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:17:04.691316" elapsed="0.006108"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:04.697474" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:17:04.697644" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:17:04.690652" elapsed="0.007020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:04.705077" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:04.704802" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:04.705534" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:04.705282" 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-08-22T23:17:04.717086" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:04.717253" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:17:04.717364" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:04.707765" elapsed="0.010079">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:04.705670" elapsed="0.012260">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:04.718126" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:04.717966" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:04.705650" elapsed="0.012568">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:04.719040" elapsed="0.000156"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:04.719457" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:04.719368" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:04.719326" elapsed="0.000311"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:04.719963" elapsed="0.000051"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:04.720125" elapsed="0.000035"/>
</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-08-22T23:17:04.700404" elapsed="0.019957">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:04.720520" elapsed="0.000034"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:04.697938" elapsed="0.022829">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:04.721143" elapsed="0.000048"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:17:04.677531" elapsed="0.043861">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:05.738348" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:05.736118" elapsed="0.002266"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:05.739136" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:05.738798" elapsed="0.000365"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:17:05.738642" elapsed="0.000559"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:05.739802" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:05.739451" elapsed="0.000379"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:17:05.739285" elapsed="0.000581"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:17:05.738467" elapsed="0.001429"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:05.740241" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:05.739972" elapsed="0.000328"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:05.741116" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:05.740567" elapsed="0.000583"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:05.740326" elapsed="0.000861"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:05.741384" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:05.741212" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:05.739951" elapsed="0.001535"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:05.741532" elapsed="0.000038"/>
</return>
<msg time="2026-08-22T23:17:05.741719" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:17:05.735605" elapsed="0.006141"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:05.741795" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:17:05.741939" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:17:05.734983" elapsed="0.006982"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:05.749341" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:05.749078" elapsed="0.000378"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:05.749900" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:05.749643" 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-08-22T23:17:05.763689" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:05.763865" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:17:05.763981" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:05.752096" elapsed="0.012372">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:05.750013" elapsed="0.014672">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:05.765168" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:05.764769" elapsed="0.000548"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:05.749994" elapsed="0.015379">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:05.766324" elapsed="0.000062"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:05.766671" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:05.766550" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:05.766511" 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-08-22T23:17:05.767190" elapsed="0.000067"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:05.767368" elapsed="0.000036"/>
</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-08-22T23:17:05.744717" elapsed="0.022923">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:05.767797" elapsed="0.000036"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:05.742187" elapsed="0.025840">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:05.768397" elapsed="0.000049"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:17:05.722344" elapsed="0.046329">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:06.784453" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:06.782284" elapsed="0.002202"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:06.785209" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:06.784880" elapsed="0.000356"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:17:06.784725" elapsed="0.000548"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:06.785841" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:06.785505" elapsed="0.000362"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:17:06.785355" elapsed="0.000618"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:17:06.784560" elapsed="0.001444"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:06.786374" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:06.786079" elapsed="0.000355"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:06.787197" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:06.786722" elapsed="0.000502"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:06.786460" elapsed="0.000802"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:06.787451" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:06.787288" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:06.786058" elapsed="0.001473"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:06.787569" elapsed="0.000050"/>
</return>
<msg time="2026-08-22T23:17:06.787748" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:17:06.781801" elapsed="0.005974"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:06.787822" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:17:06.787967" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:17:06.781195" elapsed="0.006798"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:06.795252" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:06.794996" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:06.795715" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:06.795455" 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-08-22T23:17:06.808443" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:06.808613" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:17:06.808722" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:06.797893" elapsed="0.011211">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:06.795826" elapsed="0.013372">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:06.809400" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:06.809234" elapsed="0.000232"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:06.795808" elapsed="0.013683">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:06.809886" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:06.810019" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:06.809982" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:06.809965" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:06.810224" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:06.810334" elapsed="0.000017"/>
</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-08-22T23:17:06.790692" elapsed="0.019752">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:06.810516" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:06.788214" elapsed="0.022415">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:06.810799" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:17:06.769797" elapsed="0.041113">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<msg time="2026-08-22T23:17:06.811009" level="FAIL">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Connected</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:16:46.130354" elapsed="20.680760">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${NODE_CHECKER}</arg>
<doc>Wait for the device to become connected.
It is more readable to use this keyword in a test case than to put the whole WUKS below into it.</doc>
<status status="FAIL" start="2026-08-22T23:16:46.129850" elapsed="20.681378">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<doc>Wait until the device becomes visible on checker node.</doc>
<status status="FAIL" start="2026-08-22T23:16:45.836950" elapsed="20.974442">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</test>
<test id="s1-s1-t7" name="Wait_For_Device_To_Become_Visible_For_Setter" line="106">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:17:06.815025" elapsed="0.000215"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:17:06.814760" elapsed="0.000537"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:17:06.816309" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:06.816198" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:06.816180" 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-08-22T23:17:06.821395" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:06.821287" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:06.821269" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:17:06.822472" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:17:06.822087" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:17:06.822981" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:17:06.822673" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:17:06.823053" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:17:06.823210" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:17:06.821712" elapsed="0.001523"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:17:06.828643" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:06.828509" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:06.828490" 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-08-22T23:17:06.829880" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:06.829774" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:06.829756" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:17:06.830454" 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-08-22T23:17:06.830095" elapsed="0.000387"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:17:06.830899" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:17:06.830661" elapsed="0.000264"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:17:06.874977" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:17:06.831416" elapsed="0.043664"/>
</kw>
<msg time="2026-08-22T23:17:06.875253" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:17:06.875314" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:06.831082" elapsed="0.044272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:17:06.909106" level="INFO">"t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "S "e "t "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-08-22T23:17:06.876023" elapsed="0.033198"/>
</kw>
<msg time="2026-08-22T23:17:06.909393" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:17:06.909439" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:06.875523" elapsed="0.033953"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:06.909818" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:06.909560" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:06.909534" elapsed="0.000365"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:06.910340" level="INFO"> "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "S "e "t "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-08-22T23:17:06.910038" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:06.910712" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:06.910476" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:06.910458" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:17:06.910824" 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-08-22T23:17:06.913527" elapsed="0.000164"/>
</kw>
<msg time="2026-08-22T23:17:06.913756" 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-08-22T23:17:06.912307" 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-08-22T23:17:06.914201" elapsed="0.000089"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:06.914571" 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-08-22T23:17:06.911636" 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-08-22T23:17:06.911081" elapsed="0.003788"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:17:06.829451" elapsed="0.085514"/>
</kw>
<msg time="2026-08-22T23:17:06.915056" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:06.915100" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:06.828857" elapsed="0.086280"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:17:06.915317" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:17:06.915211" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:06.915193" 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-08-22T23:17:06.915816" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:06.916142" elapsed="0.000064"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:17:06.916257" 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-08-22T23:17:06.828153" elapsed="0.088230"/>
</kw>
<msg time="2026-08-22T23:17:06.916481" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:06.916525" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:06.823609" elapsed="0.093122"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:06.917068" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:06.916813" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:06.916795" elapsed="0.000351"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:17:06.823456" elapsed="0.093714"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:17:06.922462" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:06.922354" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:06.922335" 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-08-22T23:17:06.923696" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:06.923562" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:06.923545" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:17:06.924236" 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-08-22T23:17:06.923920" elapsed="0.000342"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:17:06.924664" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:17:06.924419" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:17:06.964388" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:17:06.925268" elapsed="0.039227"/>
</kw>
<msg time="2026-08-22T23:17:06.964692" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:17:06.964738" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:06.924848" elapsed="0.039927"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:17:06.991673" level="INFO">"t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "S "e "t "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-08-22T23:17:06.965429" elapsed="0.026353"/>
</kw>
<msg time="2026-08-22T23:17:06.991956" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:17:06.992002" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:06.964942" elapsed="0.027098"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:06.992341" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:06.992119" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:06.992098" elapsed="0.000321"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:06.992903" level="INFO"> "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "S "e "t "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-08-22T23:17:06.992557" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:06.993249" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:06.993038" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:06.993020" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:17:06.993362" 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-08-22T23:17:06.996112" elapsed="0.000160"/>
</kw>
<msg time="2026-08-22T23:17:06.996337" 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-08-22T23:17:06.994886" elapsed="0.001649"/>
</kw>
<kw name="Open 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-08-22T23:17:06.996872" elapsed="0.000091"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:06.997245" 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-08-22T23:17:06.994184" elapsed="0.003270"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:17:06.993650" elapsed="0.003871"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:17:06.923264" elapsed="0.074395"/>
</kw>
<msg time="2026-08-22T23:17:06.997754" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:06.997798" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:06.922696" elapsed="0.075139"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:17:06.998019" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:17:06.997912" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:06.997893" 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-08-22T23:17:06.998494" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:06.998866" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:17:06.998937" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:17:06.922020" elapsed="0.077026"/>
</kw>
<msg time="2026-08-22T23:17:06.999141" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:06.999189" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:06.917428" elapsed="0.081798"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:06.999547" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:06.999303" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:06.999285" elapsed="0.000386"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:17:06.917292" elapsed="0.082402"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:17:07.005181" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:07.005075" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:07.005057" 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-08-22T23:17:07.006388" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:07.006278" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:07.006260" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:17:07.006937" 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-08-22T23:17:07.006619" elapsed="0.000345"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:17:07.007337" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:17:07.007117" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:17:07.048083" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:17:07.007875" elapsed="0.040315"/>
</kw>
<msg time="2026-08-22T23:17:07.048364" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:17:07.048411" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:07.007524" elapsed="0.040924"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:17:07.078676" level="INFO">"t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "S "e "t "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-08-22T23:17:07.048976" elapsed="0.030022"/>
</kw>
<msg time="2026-08-22T23:17:07.079173" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:17:07.079219" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:07.048641" elapsed="0.030617"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:07.079551" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:07.079334" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:07.079314" elapsed="0.000342"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:07.080099" level="INFO"> "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "S "e "t "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-08-22T23:17:07.079796" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:07.080445" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:07.080234" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:07.080217" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:17:07.080554" 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-08-22T23:17:07.083239" elapsed="0.000142"/>
</kw>
<msg time="2026-08-22T23:17:07.083444" 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-08-22T23:17:07.082059" 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-08-22T23:17:07.083905" elapsed="0.000087"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:07.084267" 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-08-22T23:17:07.081366" 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-08-22T23:17:07.080844" 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-08-22T23:17:07.005982" elapsed="0.078694"/>
</kw>
<msg time="2026-08-22T23:17:07.084767" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:07.084810" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:07.005396" elapsed="0.079450"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:17:07.085026" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:17:07.084921" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:07.084903" 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-08-22T23:17:07.085497" elapsed="0.000024"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:07.085846" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:17:07.085917" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:17:07.004738" elapsed="0.081285"/>
</kw>
<msg time="2026-08-22T23:17:07.086114" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:07.086157" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:06.999957" elapsed="0.086236"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:07.086517" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:07.086267" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:07.086250" elapsed="0.000507"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:17:06.999821" elapsed="0.086960"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:17:06.823287" elapsed="0.263523"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:17:06.820924" elapsed="0.265945"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:17:06.815910" elapsed="0.271053"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:06.815455" elapsed="0.271555"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:17:06.812415" elapsed="0.274651"/>
</kw>
<kw name="Wait_Device_Connected" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:07.099079" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:07.096853" elapsed="0.002253"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:07.099785" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:07.099442" elapsed="0.000370"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:17:07.099293" elapsed="0.000718"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:07.100667" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:07.100306" elapsed="0.000387"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:17:07.100134" elapsed="0.000595"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:17:07.099160" elapsed="0.001598"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:07.101058" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:07.100822" elapsed="0.000293"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:07.101849" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:07.101370" elapsed="0.000507"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:07.101139" elapsed="0.000773"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:07.102097" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:07.101937" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:07.100805" elapsed="0.001367"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:07.102207" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:17:07.102352" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:17:07.096368" elapsed="0.006010"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:07.102423" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:17:07.102570" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:17:07.095788" elapsed="0.006822"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:07.109860" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:07.109610" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:07.110296" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:07.110056" 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-08-22T23:17:08.221141" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:08.221509" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Set-Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Fri, 21-Aug-2026 23:17:08 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:17:08.221831" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:07.112480" elapsed="1.110243">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:07.110409" elapsed="1.112653">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:08.223629" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:08.223151" elapsed="0.000635"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:07.110392" elapsed="1.113450">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:08.224760" elapsed="0.000083"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:08.225102" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:08.225012" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:08.224969" 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-08-22T23:17:08.225602" elapsed="0.000052"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:08.225765" elapsed="0.000034"/>
</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-08-22T23:17:07.105299" elapsed="1.120726">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:08.226179" elapsed="0.000034"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:07.102837" elapsed="1.123551">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:08.226812" elapsed="0.000050"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:17:07.088345" elapsed="1.138709">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:09.246451" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:09.244281" elapsed="0.002203"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:09.247208" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:09.246874" elapsed="0.000361"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:17:09.246715" elapsed="0.000557"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:09.247844" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:09.247502" elapsed="0.000369"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:17:09.247353" elapsed="0.000554"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:17:09.246553" elapsed="0.001383"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:09.248285" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:09.248018" elapsed="0.000325"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:09.249109" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:09.248634" elapsed="0.000503"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:09.248371" elapsed="0.000804"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:09.249364" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:09.249200" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:09.247997" elapsed="0.001445"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:09.249479" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:17:09.249816" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:17:09.243595" elapsed="0.006309"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:09.249954" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:17:09.250097" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:17:09.242782" elapsed="0.007341"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:09.257359" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:09.257105" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:09.257817" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:09.257557" 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-08-22T23:17:09.273021" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:09.273221" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:17:09.273377" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:09.259977" elapsed="0.013943">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:09.257927" elapsed="0.016107">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:09.274300" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:09.274082" elapsed="0.000310"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:09.257910" elapsed="0.016516">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:09.274975" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:09.275202" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:09.275150" elapsed="0.000110"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:09.275125" elapsed="0.000165"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:09.275486" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:09.275620" elapsed="0.000036"/>
</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-08-22T23:17:09.252811" elapsed="0.023048">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:09.276016" elapsed="0.000034"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:09.250342" elapsed="0.025885">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:09.276629" elapsed="0.000051"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:17:09.227916" elapsed="0.048958">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:10.295084" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:10.292954" elapsed="0.002171"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:10.295862" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:10.295507" elapsed="0.000381"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:17:10.295354" elapsed="0.000572"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:10.296478" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:10.296155" elapsed="0.000349"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:17:10.296007" elapsed="0.000533"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:17:10.295206" elapsed="0.001362"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:10.296921" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:10.296660" elapsed="0.000319"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:10.297716" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:10.297234" elapsed="0.000509"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:10.297004" elapsed="0.000776"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:10.297966" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:10.297804" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:10.296639" elapsed="0.001405"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:10.298082" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:17:10.298242" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:17:10.292465" elapsed="0.005803"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:10.298314" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:17:10.298455" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:17:10.291885" elapsed="0.006596"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:10.305788" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:10.305514" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:10.306231" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:10.305988" 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-08-22T23:17:10.318458" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:10.318846" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:17:10.319070" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:10.308467" elapsed="0.011488">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:10.306409" elapsed="0.013728">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:10.320560" elapsed="0.000082"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:10.320213" elapsed="0.000528"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:10.306390" elapsed="0.014404">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:10.321703" elapsed="0.000058"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:10.322000" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:10.321918" elapsed="0.000173"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:10.321879" 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-08-22T23:17:10.322467" elapsed="0.000050"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:10.322671" elapsed="0.000033"/>
</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-08-22T23:17:10.301198" elapsed="0.021705">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:10.323055" elapsed="0.000035"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:10.298717" elapsed="0.024548">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:10.323663" elapsed="0.000050"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:17:10.278112" elapsed="0.045792">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:11.340768" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:11.338265" elapsed="0.002535"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:11.341495" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:11.341164" elapsed="0.000359"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:17:11.341010" elapsed="0.000550"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:11.342136" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:11.341807" elapsed="0.000356"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:17:11.341659" elapsed="0.000540"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:17:11.340866" elapsed="0.001363"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:11.342558" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:11.342298" elapsed="0.000336"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:11.343465" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:11.342902" elapsed="0.000592"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:11.342658" elapsed="0.000878"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:11.343748" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:11.343562" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:11.342279" elapsed="0.001548"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:11.343864" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:17:11.344023" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:17:11.337604" elapsed="0.006445"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:11.344097" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:17:11.344241" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:17:11.336791" elapsed="0.007476"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:11.351556" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:11.351299" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:11.352097" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:11.351848" 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-08-22T23:17:11.365257" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:11.365406" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:17:11.365525" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:11.354285" elapsed="0.011784">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:11.352210" elapsed="0.013971">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:11.366462" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:11.366229" elapsed="0.000326"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:11.352192" elapsed="0.014432">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:11.367135" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:11.367323" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:11.367270" elapsed="0.000112"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:11.367247" elapsed="0.000165"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:11.367627" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:11.367728" 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-08-22T23:17:11.346980" elapsed="0.020892">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:11.367968" elapsed="0.000021"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:11.344488" elapsed="0.023611">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:11.368332" elapsed="0.000030"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:17:11.324748" elapsed="0.043740">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:12.388714" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:12.386534" elapsed="0.002214"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:12.389489" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:12.389144" elapsed="0.000373"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:17:12.388968" elapsed="0.000589"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:12.390168" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:12.389816" elapsed="0.000380"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:17:12.389660" elapsed="0.000645"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:17:12.388819" elapsed="0.001530"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:12.390730" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:12.390429" elapsed="0.000362"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:12.391554" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:12.391061" elapsed="0.000559"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:12.390817" elapsed="0.000859"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:12.391889" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:12.391706" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:12.390408" elapsed="0.001565"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:12.392010" elapsed="0.000044"/>
</return>
<msg time="2026-08-22T23:17:12.392188" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:17:12.386003" elapsed="0.006213"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:12.392265" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:17:12.392416" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:17:12.385380" elapsed="0.007064"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:12.399926" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:12.399660" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:12.400380" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:12.400129" 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-08-22T23:17:12.412187" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:12.412349" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:17:12.412457" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:12.402627" elapsed="0.010252">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:12.400495" elapsed="0.012466">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:12.413151" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:12.412996" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:12.400476" elapsed="0.012765">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:12.413634" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:12.413769" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:12.413731" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:12.413714" elapsed="0.000140"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:12.413999" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:12.414070" elapsed="0.000049"/>
</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-08-22T23:17:12.395224" elapsed="0.018991">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:12.414287" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:12.392696" elapsed="0.021687">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:12.414703" elapsed="0.000050"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:17:12.369332" elapsed="0.045621">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:13.433023" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:13.430804" elapsed="0.002254"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:13.433867" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:13.433467" elapsed="0.000428"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:17:13.433311" elapsed="0.000623"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:13.434494" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:13.434169" elapsed="0.000351"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:17:13.434018" elapsed="0.000538"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:17:13.433157" elapsed="0.001444"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:13.434968" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:13.434681" elapsed="0.000350"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:13.435826" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:13.435324" elapsed="0.000530"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:13.435056" elapsed="0.000834"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:13.436075" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:13.435915" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:13.434660" elapsed="0.001491"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:13.436188" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:17:13.436351" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:17:13.430201" elapsed="0.006177"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:13.436425" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:17:13.436568" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:17:13.429607" elapsed="0.007002"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:13.443855" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:13.443598" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:13.444294" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:13.444052" 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-08-22T23:17:13.456830" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:13.457050" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:17:13.457159" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:13.446446" elapsed="0.011114">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:13.444403" elapsed="0.013386">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:13.458210" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:13.457866" elapsed="0.000491"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:13.444385" elapsed="0.014027">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:13.459272" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:13.459612" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:13.459499" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:13.459459" elapsed="0.000301"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:13.460183" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:13.460342" elapsed="0.000034"/>
</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-08-22T23:17:13.439317" elapsed="0.021309">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:13.460789" elapsed="0.000035"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:13.436833" elapsed="0.024173">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:13.461374" elapsed="0.000048"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:17:13.415892" elapsed="0.045783">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:14.480433" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:14.477573" elapsed="0.002895"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:14.481182" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:14.480857" elapsed="0.000352"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:17:14.480703" elapsed="0.000543"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:14.481806" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:14.481473" elapsed="0.000359"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:17:14.481327" elapsed="0.000540"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:17:14.480540" elapsed="0.001355"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:14.482233" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:14.481971" elapsed="0.000320"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:14.483050" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:14.482574" elapsed="0.000504"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:14.482316" elapsed="0.000862"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:14.483367" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:14.483205" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:14.481950" elapsed="0.001494"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:14.483484" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:17:14.483666" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:17:14.476911" elapsed="0.006781"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:14.483738" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:17:14.483890" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:17:14.475999" elapsed="0.007917"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:14.491204" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:14.490949" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:14.491659" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:14.491402" 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-08-22T23:17:14.503965" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:14.504115" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:17:14.504220" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:14.493832" elapsed="0.010794">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:14.491799" elapsed="0.012915">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:14.504904" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:14.504748" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:14.491779" elapsed="0.013213">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:14.505509" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:14.505718" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:14.505665" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:14.505640" 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-08-22T23:17:14.506009" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:14.506126" 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-08-22T23:17:14.486611" elapsed="0.019664">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:14.506374" elapsed="0.000021"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:14.484135" elapsed="0.022370">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:14.506810" elapsed="0.000030"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:17:14.462637" elapsed="0.044328">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:15.524762" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:15.522516" elapsed="0.002281"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:15.525505" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:15.525169" elapsed="0.000363"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:17:15.525016" elapsed="0.000553"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:15.526153" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:15.525815" elapsed="0.000366"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:17:15.525667" elapsed="0.000550"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:17:15.524867" elapsed="0.001392"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:15.526636" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:15.526339" elapsed="0.000359"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:15.527474" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:15.526967" elapsed="0.000537"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:15.526724" elapsed="0.000819"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:15.527786" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:15.527569" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:15.526317" elapsed="0.001558"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:15.527915" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:17:15.528087" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:17:15.521939" elapsed="0.006175"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:15.528163" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:17:15.528313" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:17:15.521304" elapsed="0.007036"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:15.535866" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:15.535596" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:15.536316" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:15.536066" 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-08-22T23:17:15.548863" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:15.549082" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:17:15.549234" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:15.538773" elapsed="0.011092">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:15.536429" elapsed="0.013671">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:15.550374" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:15.550152" elapsed="0.000317"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:15.536411" elapsed="0.014091">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:15.551105" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:15.551304" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:15.551247" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:15.551222" elapsed="0.000172"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:15.551647" elapsed="0.000054"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:15.551842" elapsed="0.000059"/>
</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-08-22T23:17:15.531205" elapsed="0.020942">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:15.552310" elapsed="0.000037"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:15.528636" elapsed="0.023930">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:15.553017" elapsed="0.000060"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:17:15.508092" elapsed="0.045191">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:16.573401" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:16.571260" elapsed="0.002174"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:16.574146" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:16.573816" elapsed="0.000358"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:17:16.573662" elapsed="0.000550"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:16.574777" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:16.574441" elapsed="0.000364"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:17:16.574293" elapsed="0.000548"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:17:16.573503" elapsed="0.001367"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:16.575203" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:16.574940" elapsed="0.000321"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:16.576001" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:16.575514" elapsed="0.000515"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:16.575286" elapsed="0.000792"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:16.576269" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:16.576105" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:16.574921" elapsed="0.001426"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:16.576384" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:17:16.576544" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:17:16.570785" elapsed="0.005786"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:16.576634" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:17:16.576842" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:17:16.570196" elapsed="0.006673"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:16.584100" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:16.583829" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:16.584543" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:16.584298" 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-08-22T23:17:16.596797" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:16.596944" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:17:16.597048" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:16.586707" elapsed="0.010718">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:16.584675" elapsed="0.012831">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:16.597715" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:16.597539" elapsed="0.000242"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:16.584657" elapsed="0.013148">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:16.598170" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:16.598302" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:16.598265" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:16.598248" 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-08-22T23:17:16.598504" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:16.598574" elapsed="0.000030"/>
</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-08-22T23:17:16.579541" elapsed="0.019154">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:16.598764" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:16.577093" elapsed="0.021770">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:16.599029" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:17:16.554248" elapsed="0.044889">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:17.617239" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:17.614403" elapsed="0.002927"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:17.618046" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:17.617719" elapsed="0.000354"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:17:17.617551" elapsed="0.000559"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:17.618679" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:17.618340" elapsed="0.000366"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:17:17.618192" elapsed="0.000550"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:17:17.617403" elapsed="0.001369"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:17.619107" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:17.618846" elapsed="0.000319"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:17.619917" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:17.619418" elapsed="0.000527"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:17.619190" elapsed="0.000791"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:17.620167" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:17.620007" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:17.618826" elapsed="0.001420"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:17.620283" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:17:17.620442" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:17:17.613748" elapsed="0.006721"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:17.620516" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:17:17.620677" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:17:17.612940" elapsed="0.007763"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:17.627963" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:17.627706" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:17.628400" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:17.628160" 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-08-22T23:17:17.640323" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:17.640472" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:17:17.640596" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:17.630725" elapsed="0.010359">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:17.628508" elapsed="0.012687">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:17.641454" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:17.641242" elapsed="0.000302"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:17.628490" elapsed="0.013108">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:17.642111" elapsed="0.000078"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:17.642344" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:17.642291" elapsed="0.000110"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:17.642267" elapsed="0.000164"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:17.642648" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:17.642746" 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-08-22T23:17:17.623384" elapsed="0.019508">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:17.642989" elapsed="0.000021"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:17.620925" elapsed="0.022196">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:17.643349" elapsed="0.000031"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:17:17.599994" elapsed="0.043520">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:18.661162" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:18.658218" elapsed="0.002985"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:18.662103" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:18.661720" elapsed="0.000410"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:17:18.661471" elapsed="0.000695"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:18.662742" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:18.662394" elapsed="0.000374"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:17:18.662246" elapsed="0.000558"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:17:18.661283" elapsed="0.001550"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:18.663147" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:18.662901" elapsed="0.000304"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:18.663952" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:18.663465" elapsed="0.000516"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:18.663230" elapsed="0.000786"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:18.664202" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:18.664041" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:18.662883" elapsed="0.001397"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:18.664315" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:17:18.664468" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:17:18.657560" elapsed="0.006934"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:18.664541" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:17:18.664699" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:17:18.656776" elapsed="0.007949"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:18.672250" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:18.671996" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:18.672755" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:18.672493" 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-08-22T23:17:18.684464" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:18.684623" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:17:18.684727" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:18.674909" elapsed="0.010189">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:18.672882" elapsed="0.012296">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:18.685367" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:18.685213" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:18.672848" elapsed="0.012609">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:18.685850" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:18.685986" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:18.685948" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:18.685931" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:18.686192" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:18.686264" 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-08-22T23:17:18.667588" elapsed="0.018782">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:18.686440" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:18.664952" elapsed="0.021584">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:18.686716" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:17:18.644210" elapsed="0.042616">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:19.703888" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:19.701467" elapsed="0.002455"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:19.704649" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:19.704300" elapsed="0.000376"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:17:19.704146" elapsed="0.000567"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:19.705257" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:19.704942" elapsed="0.000341"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:17:19.704794" elapsed="0.000582"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:17:19.703994" elapsed="0.001414"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:19.705798" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:19.705486" elapsed="0.000372"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:19.706635" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:19.706126" elapsed="0.000538"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:19.705884" elapsed="0.000821"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:19.706901" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:19.706737" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:19.705463" elapsed="0.001524"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:19.707027" elapsed="0.000039"/>
</return>
<msg time="2026-08-22T23:17:19.707196" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:17:19.700984" elapsed="0.006241"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:19.707273" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:17:19.707421" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:17:19.700389" elapsed="0.007059"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:19.715056" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:19.714788" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:19.715541" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:19.715258" 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-08-22T23:17:19.727450" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:19.727648" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:17:19.727789" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:19.717729" elapsed="0.010471">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:19.715682" elapsed="0.012607">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:19.728507" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:19.728334" elapsed="0.000238"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:19.715664" elapsed="0.012952">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:19.729003" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:19.729137" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:19.729099" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:19.729081" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:19.729340" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:19.729408" elapsed="0.000059"/>
</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-08-22T23:17:19.710406" elapsed="0.019158">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:19.729664" elapsed="0.000018"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:19.707732" elapsed="0.022033">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:19.729931" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:17:19.687737" elapsed="0.042302">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:20.748203" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:20.746074" elapsed="0.002164"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:20.748950" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:20.748621" elapsed="0.000355"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:17:20.748453" elapsed="0.000561"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:20.749560" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:20.749243" elapsed="0.000358"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:17:20.749094" elapsed="0.000544"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:17:20.748310" elapsed="0.001356"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:20.750005" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:20.749740" elapsed="0.000323"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:20.750795" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:20.750316" elapsed="0.000507"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:20.750088" elapsed="0.000771"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:20.751044" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:20.750884" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:20.749719" elapsed="0.001401"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:20.751159" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:17:20.751348" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:17:20.745594" elapsed="0.005781"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:20.751421" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:17:20.751564" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:17:20.744999" elapsed="0.006611"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:20.758812" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:20.758543" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:20.759263" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:20.759009" 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-08-22T23:17:20.770914" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:20.771155" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:17:20.771278" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:20.761502" elapsed="0.010189">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:20.759372" elapsed="0.012401">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:20.771964" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:20.771807" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:20.759354" elapsed="0.012701">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:20.772417" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:20.772551" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:20.772513" elapsed="0.000095"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:20.772496" elapsed="0.000135"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:20.772772" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:20.772843" 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-08-22T23:17:20.754250" elapsed="0.018696">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:20.773015" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:20.751829" elapsed="0.021280">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:20.773273" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:17:20.730873" elapsed="0.042507">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:21.791342" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:21.789185" elapsed="0.002191"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:21.792112" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:21.791768" elapsed="0.000371"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:17:21.791612" elapsed="0.000564"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:21.792747" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:21.792407" elapsed="0.000366"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:17:21.792258" elapsed="0.000551"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:17:21.791449" elapsed="0.001390"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:21.793187" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:21.792918" elapsed="0.000326"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:21.793986" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:21.793501" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:21.793270" elapsed="0.000856"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:21.794316" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:21.794152" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:21.792896" elapsed="0.001498"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:21.794433" elapsed="0.000038"/>
</return>
<msg time="2026-08-22T23:17:21.794613" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:17:21.788705" elapsed="0.005936"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:21.794689" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:17:21.794836" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:17:21.788103" elapsed="0.006758"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:21.802128" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:21.801871" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:21.802573" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:21.802329" 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-08-22T23:17:21.815718" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:21.815971" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:17:21.816207" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:21.804759" elapsed="0.012271">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:21.802701" elapsed="0.014510">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:21.817663" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:21.817285" elapsed="0.000528"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:21.802683" elapsed="0.015184">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:21.818702" elapsed="0.000060"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:21.819003" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:21.818919" elapsed="0.000175"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:21.818881" 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-08-22T23:17:21.819456" elapsed="0.000049"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:21.819644" elapsed="0.000036"/>
</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-08-22T23:17:21.797565" elapsed="0.022342">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:21.820066" elapsed="0.000034"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:21.795082" elapsed="0.025195">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:21.820759" elapsed="0.000051"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:17:21.774254" elapsed="0.046754">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:22.832966" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:22.830811" elapsed="0.002187"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:22.833714" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:22.833358" elapsed="0.000385"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:17:22.833206" elapsed="0.000575"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:22.834342" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:22.834010" elapsed="0.000359"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:17:22.833862" elapsed="0.000544"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:17:22.833064" elapsed="0.001371"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:22.834787" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:22.834507" elapsed="0.000339"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:22.835573" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:22.835102" elapsed="0.000515"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:22.834870" elapsed="0.000785"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:22.835846" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:22.835680" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:22.834487" elapsed="0.001438"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:22.835962" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:17:22.836120" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:17:22.830310" elapsed="0.005836"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:22.836192" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:17:22.836334" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:17:22.829740" elapsed="0.006620"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:22.843595" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:22.843325" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:22.844044" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:22.843796" 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-08-22T23:17:22.856516" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:22.856693" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:17:22.856804" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:22.846312" elapsed="0.010878">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:22.844154" elapsed="0.013169">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:22.857515" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:22.857358" elapsed="0.000260"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:22.844136" elapsed="0.013508">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:22.858028" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:22.858163" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:22.858126" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:22.858109" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:22.858370" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:22.858441" 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-08-22T23:17:22.839046" elapsed="0.019500">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:22.858632" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:22.836594" elapsed="0.022136">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:22.858900" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:17:22.821823" elapsed="0.037185">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:23.870879" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:23.868687" elapsed="0.002224"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:23.871613" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:23.871270" elapsed="0.000371"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:17:23.871119" elapsed="0.000559"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:23.872243" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:23.871907" elapsed="0.000365"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:17:23.871759" elapsed="0.000548"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:17:23.870976" elapsed="0.001360"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:23.872683" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:23.872407" elapsed="0.000336"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:23.873475" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:23.873006" elapsed="0.000496"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:23.872769" elapsed="0.000770"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:23.873746" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:23.873565" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:23.872387" elapsed="0.001440"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:23.873866" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:17:23.874021" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:17:23.868194" elapsed="0.005854"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:23.874095" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:17:23.874300" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:17:23.867610" elapsed="0.006716"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:23.881634" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:23.881364" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:23.882079" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:23.881834" 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-08-22T23:17:23.894262" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:23.894407" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:17:23.894511" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:23.884244" elapsed="0.010669">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:23.882192" elapsed="0.012804">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:23.895184" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:23.895030" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:23.882174" elapsed="0.013101">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:23.895663" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:23.895798" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:23.895760" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:23.895743" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:23.896017" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:23.896090" 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-08-22T23:17:23.877050" elapsed="0.019146">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:23.896266" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:23.874546" elapsed="0.021816">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:23.896527" elapsed="0.000021"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:17:23.859674" elapsed="0.036980">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:24.916418" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:24.914283" elapsed="0.002216"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:24.917207" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:24.916870" elapsed="0.000365"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:17:24.916717" elapsed="0.000556"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:24.917846" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:24.917505" elapsed="0.000368"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:17:24.917355" elapsed="0.000554"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:17:24.916562" elapsed="0.001378"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:24.918259" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:24.918008" elapsed="0.000309"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:24.919056" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:24.918572" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:24.918342" elapsed="0.000779"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:24.919322" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:24.919147" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:24.917989" elapsed="0.001411"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:24.919438" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:17:24.919615" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:17:24.913815" elapsed="0.005828"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:24.919690" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:17:24.919833" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:17:24.913243" elapsed="0.006616"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:24.927143" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:24.926881" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:24.927604" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:24.927343" 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-08-22T23:17:24.940143" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:24.940284" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:17:24.940385" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:24.929754" elapsed="0.011017">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:24.927716" elapsed="0.013148">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:24.941281" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:24.940918" elapsed="0.000508"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:24.927698" elapsed="0.013782">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:24.942322" elapsed="0.000132"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:24.942736" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:24.942649" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:24.942608" 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-08-22T23:17:24.944531" elapsed="0.000072"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:24.944716" elapsed="0.000034"/>
</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-08-22T23:17:24.922521" elapsed="0.022441">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:24.945132" elapsed="0.000034"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:24.920081" elapsed="0.025259">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:24.945732" elapsed="0.000048"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:17:24.897321" elapsed="0.048679">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:25.962828" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:25.960698" elapsed="0.002163"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:25.963547" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:25.963219" elapsed="0.000355"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:17:25.963066" elapsed="0.000561"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:25.964180" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:25.963857" elapsed="0.000350"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:17:25.963709" elapsed="0.000533"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:17:25.962924" elapsed="0.001347"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:25.964614" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:25.964341" elapsed="0.000332"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:25.965393" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:25.964928" elapsed="0.000493"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:25.964699" elapsed="0.000758"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:25.965658" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:25.965482" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:25.964321" elapsed="0.001415"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:25.965773" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:17:25.965932" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:17:25.960213" elapsed="0.005746"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:25.966005" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:17:25.966149" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:17:25.959644" elapsed="0.006532"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:25.973471" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:25.973215" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:25.973994" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:25.973745" 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-08-22T23:17:25.985191" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:25.985343" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:17:25.985450" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:25.976201" elapsed="0.009655">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:25.974107" elapsed="0.011835">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:25.986131" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:25.985976" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:25.974089" elapsed="0.012132">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:25.986608" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:25.986773" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:25.986733" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:25.986689" elapsed="0.000148"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:25.986981" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:25.987051" 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-08-22T23:17:25.968893" elapsed="0.018262">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:25.987224" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:25.966396" elapsed="0.020922">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:25.987482" elapsed="0.000021"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:17:25.946782" elapsed="0.040824">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:27.008255" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:27.006087" elapsed="0.002201"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:27.009003" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:27.008675" elapsed="0.000355"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:17:27.008506" elapsed="0.000562"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:27.009631" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:27.009298" elapsed="0.000360"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:17:27.009150" elapsed="0.000610"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:17:27.008358" elapsed="0.001435"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:27.010142" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:27.009872" elapsed="0.000328"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:27.010956" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:27.010460" elapsed="0.000525"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:27.010225" elapsed="0.000796"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:27.011216" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:27.011047" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:27.009850" elapsed="0.001444"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:27.011332" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:17:27.011496" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:17:27.005600" elapsed="0.005922"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:27.011569" elapsed="0.000043"/>
</return>
<msg time="2026-08-22T23:17:27.011732" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:17:27.005011" elapsed="0.006747"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:27.018996" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:27.018732" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:27.019430" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:27.019192" 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-08-22T23:17:27.032771" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:27.032945" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:17:27.033176" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:27.021573" elapsed="0.012417">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:27.019539" elapsed="0.014633">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:27.034622" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:27.034249" elapsed="0.000526"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:27.019521" elapsed="0.015308">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:27.035705" elapsed="0.000058"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:27.036006" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:27.035922" elapsed="0.000179"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:27.035884" 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-08-22T23:17:27.036464" elapsed="0.000050"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:27.036656" elapsed="0.000102"/>
</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-08-22T23:17:27.014425" elapsed="0.022546">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:27.037129" elapsed="0.000036"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:27.011982" elapsed="0.025364">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:27.037750" elapsed="0.000051"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:17:26.988448" elapsed="0.049551">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:28.057810" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:28.055643" elapsed="0.002207"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:28.058559" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:28.058228" elapsed="0.000373"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:17:28.058074" elapsed="0.000565"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:28.059193" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:28.058870" elapsed="0.000350"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:17:28.058720" elapsed="0.000536"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:17:28.057922" elapsed="0.001363"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.059657" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:28.059356" elapsed="0.000361"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:28.060466" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:28.059999" elapsed="0.000494"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:28.059741" elapsed="0.000790"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.060735" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:28.060555" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.059336" elapsed="0.001477"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:28.060850" elapsed="0.000043"/>
</return>
<msg time="2026-08-22T23:17:28.061023" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:17:28.055126" elapsed="0.005924"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:17:28.061096" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:17:28.061239" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:17:28.054520" elapsed="0.006745"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:28.068564" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:28.068299" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:28.069021" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:28.068777" elapsed="0.000356"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:17:28.081729" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:28.081962" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:17:28.082199" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:28.071235" elapsed="0.011865">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:28.069200" elapsed="0.014120">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.083817" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:28.083399" elapsed="0.000571"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:28.069182" elapsed="0.014846">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.084887" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:28.085192" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:28.085106" elapsed="0.000179"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:28.085067" 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-08-22T23:17:28.085704" elapsed="0.000065"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:28.085884" elapsed="0.000034"/>
</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-08-22T23:17:28.064034" elapsed="0.022086">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:28.086276" elapsed="0.000034"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:28.061509" elapsed="0.024977">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.086895" elapsed="0.000051"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:17:28.039499" elapsed="0.047647">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<msg time="2026-08-22T23:17:28.087358" level="FAIL">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Connected</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:17:07.087768" elapsed="20.999851">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${NODE_SETTER}</arg>
<doc>Wait for the device to become connected.
It is more readable to use this keyword in a test case than to put the whole WUKS below into it.</doc>
<status status="FAIL" start="2026-08-22T23:17:07.087279" elapsed="21.000589">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<doc>Wait until the device becomes visible on setter node.</doc>
<status status="FAIL" start="2026-08-22T23:17:06.811847" elapsed="21.276365">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</test>
<test id="s1-s1-t8" name="Check_Device_Data_Is_Seen_As_Empty_On_Configurer" 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-08-22T23:17:28.094044" elapsed="0.000213"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:17:28.093776" 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-08-22T23:17:28.095367" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:28.095255" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.095237" 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-08-22T23:17:28.100284" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:28.100177" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.100159" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:17:28.101350" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:17:28.100970" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:17:28.101878" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:17:28.101555" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:17:28.101949" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:17:28.102103" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:17:28.100573" elapsed="0.001555"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:17:28.107629" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:28.107503" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.107484" 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-08-22T23:17:28.108872" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:28.108765" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.108746" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:17:28.109403" 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-08-22T23:17:28.109080" elapsed="0.000349"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:17:28.109857" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:17:28.109608" elapsed="0.000283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:17:28.150897" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:17:28.110391" elapsed="0.040609"/>
</kw>
<msg time="2026-08-22T23:17:28.151193" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:17:28.151259" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:28.110062" elapsed="0.041240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:17:28.182297" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:17:28.151972" elapsed="0.030436"/>
</kw>
<msg time="2026-08-22T23:17:28.182598" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:17:28.182648" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:28.151472" elapsed="0.031213"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.182990" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:28.182761" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.182741" elapsed="0.000328"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:28.183566" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:28.183250" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.183952" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:28.183735" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.183717" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:17:28.184064" 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-08-22T23:17:28.186865" elapsed="0.000147"/>
</kw>
<msg time="2026-08-22T23:17:28.187076" 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-08-22T23:17:28.185654" elapsed="0.001585"/>
</kw>
<kw name="Open 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-08-22T23:17:28.187542" elapsed="0.000111"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.187938" 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-08-22T23:17:28.184932" elapsed="0.003216"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:17:28.184336" 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-08-22T23:17:28.108442" elapsed="0.079872"/>
</kw>
<msg time="2026-08-22T23:17:28.188405" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:28.188449" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:28.107844" elapsed="0.080640"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:17:28.188722" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:17:28.188559" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.188541" elapsed="0.000263"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.189199" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.189523" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:17:28.189731" 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-08-22T23:17:28.107142" elapsed="0.082700"/>
</kw>
<msg time="2026-08-22T23:17:28.189936" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:28.189980" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:28.102485" elapsed="0.087531"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.190336" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:28.190090" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.190073" elapsed="0.000338"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:17:28.102347" elapsed="0.088087"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:17:28.195835" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:28.195727" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.195709" 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-08-22T23:17:28.197033" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:28.196927" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.196909" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:17:28.197548" 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-08-22T23:17:28.197240" elapsed="0.000334"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:17:28.197970" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:17:28.197752" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:17:28.239104" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:17:28.198474" elapsed="0.040734"/>
</kw>
<msg time="2026-08-22T23:17:28.239394" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:17:28.239442" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:28.198148" elapsed="0.041330"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:17:28.270495" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:17:28.240192" elapsed="0.030482"/>
</kw>
<msg time="2026-08-22T23:17:28.270926" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:17:28.270995" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:28.239698" elapsed="0.031349"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.271521" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:28.271173" elapsed="0.000447"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.271139" elapsed="0.000521"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:28.272274" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:28.271855" 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-08-22T23:17:28.272793" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:28.272466" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.272441" elapsed="0.000461"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:17:28.272947" 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-08-22T23:17:28.278435" elapsed="0.000367"/>
</kw>
<msg time="2026-08-22T23:17:28.278991" 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-08-22T23:17:28.275774" elapsed="0.003535"/>
</kw>
<kw name="Open 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-08-22T23:17:28.280061" elapsed="0.000086"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.280418" 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-08-22T23:17:28.274205" elapsed="0.006431"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:17:28.273324" elapsed="0.007380"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:17:28.196629" elapsed="0.084171"/>
</kw>
<msg time="2026-08-22T23:17:28.280889" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:28.280932" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:28.196048" elapsed="0.084919"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:17:28.281144" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:17:28.281041" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.281023" elapsed="0.000202"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.281659" 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-08-22T23:17:28.281990" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:17:28.282060" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:17:28.195376" elapsed="0.086790"/>
</kw>
<msg time="2026-08-22T23:17:28.282257" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:28.282301" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:28.190713" elapsed="0.091623"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.282681" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:28.282411" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.282394" elapsed="0.000365"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:17:28.190562" elapsed="0.092287"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:17:28.288233" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:28.288124" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.288106" 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-08-22T23:17:28.289484" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:28.289376" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.289359" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:17:28.290020" 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-08-22T23:17:28.289712" elapsed="0.000335"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:17:28.290418" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:17:28.290200" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:17:28.327224" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:17:28.290968" elapsed="0.036545"/>
</kw>
<msg time="2026-08-22T23:17:28.327983" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:17:28.328088" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:28.290613" elapsed="0.037557"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:17:28.346865" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:17:28.329515" elapsed="0.017759"/>
</kw>
<msg time="2026-08-22T23:17:28.347466" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:17:28.347513" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:28.328656" elapsed="0.018894"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.347951" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:28.347668" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.347638" elapsed="0.000397"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:28.348519" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:28.348176" 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-08-22T23:17:28.348900" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:28.348685" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.348667" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:17:28.349020" 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-08-22T23:17:28.351864" elapsed="0.000150"/>
</kw>
<msg time="2026-08-22T23:17:28.352078" 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-08-22T23:17:28.350609" elapsed="0.001620"/>
</kw>
<kw name="Open 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-08-22T23:17:28.352526" elapsed="0.000110"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.352928" 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-08-22T23:17:28.349899" elapsed="0.003240"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:17:28.349317" 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-08-22T23:17:28.289061" elapsed="0.064242"/>
</kw>
<msg time="2026-08-22T23:17:28.353396" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:28.353440" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:28.288447" elapsed="0.065030"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:17:28.353730" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:17:28.353622" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.353602" 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-08-22T23:17:28.354209" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.354549" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:17:28.354798" 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-08-22T23:17:28.287789" elapsed="0.067121"/>
</kw>
<msg time="2026-08-22T23:17:28.355006" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:28.355056" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:28.283126" elapsed="0.071966"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.355417" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:28.355168" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.355151" elapsed="0.000343"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:17:28.282989" elapsed="0.072529"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:17:28.102179" elapsed="0.253371"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:17:28.099816" elapsed="0.255810"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:17:28.094923" elapsed="0.260768"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:28.094468" elapsed="0.261272"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:17:28.090451" elapsed="0.265352"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:28.357350" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:28.356968" elapsed="0.000410"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:28.366460" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:28.366205" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:28.366955" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:28.366702" 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-08-22T23:17:28.408033" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:28.408312" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:17:28.408527" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:17:28.369116" elapsed="0.039525"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:28.367069" elapsed="0.041672"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.409136" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:28.408800" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.367051" elapsed="0.042276"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:28.417265" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:28.411724" elapsed="0.005651"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:28.411131" elapsed="0.006323"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.411091" elapsed="0.006420"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:28.420999" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:28.418163" elapsed="0.002884"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:28.417670" elapsed="0.003412"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.417632" elapsed="0.003476"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:17:28.421691" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:17:28.421278" 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-08-22T23:17:28.422029" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:28.421791" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:28.422598" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:28.422269" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:28.422112" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.421773" elapsed="0.000912"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:17:28.423209" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:17:28.422842" 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-08-22T23:17:28.423533" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:28.423305" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:28.424088" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:28.423788" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:28.423631" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.423288" 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-08-22T23:17:28.424316" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:17:28.425140" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:17:28.424836" 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-08-22T23:17:28.425318" elapsed="0.002361"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:17:28.410136" elapsed="0.017606"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:17:28.427916" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-08-22T23:17:28.427810" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.427792" 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-08-22T23:17:28.428147" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:28.428218" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:17:28.430617" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:17:28.360065" elapsed="0.070584"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:17:28.430709" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:17:28.430861" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:17:28.357602" elapsed="0.073286"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:17:28.431166" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:28.430958" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.430941" elapsed="0.000613"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.431827" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:28.431626" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.431609" elapsed="0.000298"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${empty_data}</arg>
<status status="PASS" start="2026-08-22T23:17:28.356563" elapsed="0.075424"/>
</kw>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${NODE_CONFIGURER}</arg>
<arg>${empty_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:17:28.355977" elapsed="0.076059"/>
</kw>
<doc>Get the device data as seen by configurer and make sure it is empty.</doc>
<status status="PASS" start="2026-08-22T23:17:28.089053" elapsed="0.343107"/>
</test>
<test id="s1-s1-t9" name="Check_Device_Data_Is_Seen_As_Empty_On_Checker" 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-08-22T23:17:28.435601" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:17:28.435326" 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-08-22T23:17:28.436852" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:28.436742" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.436723" 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-08-22T23:17:28.441756" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:28.441649" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.441631" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:17:28.442839" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:17:28.442440" elapsed="0.000426"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:17:28.443330" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:17:28.443026" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:17:28.443400" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:17:28.443551" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:17:28.442042" elapsed="0.001548"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:17:28.449014" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:28.448900" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.448881" 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-08-22T23:17:28.450230" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:28.450124" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.450106" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:17:28.450787" 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-08-22T23:17:28.450449" elapsed="0.000365"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:17:28.451194" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:17:28.450969" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:17:28.489048" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:17:28.451720" elapsed="0.037431"/>
</kw>
<msg time="2026-08-22T23:17:28.489344" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:17:28.489391" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:28.451374" elapsed="0.038053"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:17:28.522492" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:17:28.489966" elapsed="0.032650"/>
</kw>
<msg time="2026-08-22T23:17:28.522793" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:17:28.522840" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:28.489616" elapsed="0.033261"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.523173" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:28.522955" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.522935" elapsed="0.000316"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:28.523764" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:28.523430" 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-08-22T23:17:28.524116" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:28.523902" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.523884" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:17:28.524225" 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-08-22T23:17:28.526926" elapsed="0.000145"/>
</kw>
<msg time="2026-08-22T23:17:28.527134" 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-08-22T23:17:28.525727" elapsed="0.001550"/>
</kw>
<kw name="Open 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-08-22T23:17:28.527573" elapsed="0.000123"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.527975" 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-08-22T23:17:28.525043" elapsed="0.003136"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:17:28.524478" 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-08-22T23:17:28.449823" elapsed="0.078519"/>
</kw>
<msg time="2026-08-22T23:17:28.528432" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:28.528481" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:28.449231" elapsed="0.079286"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:17:28.528720" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:17:28.528612" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.528573" 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-08-22T23:17:28.529194" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.529528" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:17:28.529761" 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-08-22T23:17:28.448548" elapsed="0.081325"/>
</kw>
<msg time="2026-08-22T23:17:28.529965" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:28.530008" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:28.443975" elapsed="0.086070"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.530384" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:28.530135" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.530102" elapsed="0.000359"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:17:28.443832" elapsed="0.086652"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:17:28.535803" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:28.535697" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.535678" 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-08-22T23:17:28.537007" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:28.536901" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.536882" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:17:28.537552" 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-08-22T23:17:28.537242" elapsed="0.000351"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:17:28.537971" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:17:28.537751" elapsed="0.000279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:17:28.575789" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:17:28.538556" elapsed="0.037335"/>
</kw>
<msg time="2026-08-22T23:17:28.576078" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:17:28.576125" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:28.538222" elapsed="0.037940"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:17:28.598242" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:17:28.576686" elapsed="0.021666"/>
</kw>
<msg time="2026-08-22T23:17:28.598520" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:17:28.598566" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:28.576328" elapsed="0.022295"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.598917" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:28.598701" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.598681" elapsed="0.000315"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:28.599619" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:28.599135" elapsed="0.000564"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.599985" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:28.599769" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.599750" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:17:28.600098" 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-08-22T23:17:28.602739" elapsed="0.000144"/>
</kw>
<msg time="2026-08-22T23:17:28.602945" 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-08-22T23:17:28.601555" 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-08-22T23:17:28.603382" elapsed="0.000085"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.603771" 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-08-22T23:17:28.600901" 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-08-22T23:17:28.600350" elapsed="0.003695"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:17:28.536599" elapsed="0.067543"/>
</kw>
<msg time="2026-08-22T23:17:28.604234" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:28.604277" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:28.536016" elapsed="0.068298"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:17:28.604494" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:17:28.604389" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.604371" elapsed="0.000222"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.604996" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.605323" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:17:28.605396" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:17:28.535345" elapsed="0.070158"/>
</kw>
<msg time="2026-08-22T23:17:28.605787" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:28.605832" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:28.530771" elapsed="0.075098"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.606207" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:28.605960" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.605942" elapsed="0.000342"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:17:28.530624" elapsed="0.075684"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:17:28.611739" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:28.611622" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.611601" 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-08-22T23:17:28.612955" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:28.612846" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.612828" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:17:28.613476" 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-08-22T23:17:28.613168" elapsed="0.000334"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:17:28.613913" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:17:28.613672" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:17:28.651666" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:17:28.614432" elapsed="0.037337"/>
</kw>
<msg time="2026-08-22T23:17:28.651959" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:17:28.652006" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:28.614102" elapsed="0.037941"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:17:28.678547" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:17:28.652542" elapsed="0.026128"/>
</kw>
<msg time="2026-08-22T23:17:28.678839" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:17:28.678885" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:28.652209" elapsed="0.026712"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.679211" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:28.678997" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.678978" elapsed="0.000310"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:28.679748" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:28.679427" 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-08-22T23:17:28.680095" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:28.679884" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.679866" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:17:28.680204" 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-08-22T23:17:28.683047" elapsed="0.000144"/>
</kw>
<msg time="2026-08-22T23:17:28.683255" 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-08-22T23:17:28.681889" 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-08-22T23:17:28.683714" elapsed="0.000086"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.684114" 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-08-22T23:17:28.681184" elapsed="0.003132"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:17:28.680451" elapsed="0.003932"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:17:28.612524" elapsed="0.071956"/>
</kw>
<msg time="2026-08-22T23:17:28.684571" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:28.684637" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:28.611956" elapsed="0.072720"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:17:28.684858" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:17:28.684753" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.684734" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.685321" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.685825" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:17:28.685899" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:17:28.611267" elapsed="0.074740"/>
</kw>
<msg time="2026-08-22T23:17:28.686098" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:28.686141" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:28.606567" elapsed="0.079610"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.686496" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:28.686252" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:28.686235" elapsed="0.000338"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:17:28.606429" elapsed="0.080183"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:17:28.443656" elapsed="0.242989"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:17:28.441277" elapsed="0.245424"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:17:28.436439" elapsed="0.250316"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:28.436019" elapsed="0.250780"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:17:28.433048" elapsed="0.253803"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:28.688352" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:28.687971" elapsed="0.000409"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:28.695599" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:28.695336" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:28.696040" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:28.695797" 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-08-22T23:17:28.716289" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:28.716480" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:28.716736" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:28.698387" elapsed="0.019056">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:28.696148" elapsed="0.021536">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.718103" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:28.717762" elapsed="0.000483"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:28.696130" elapsed="0.022167">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.719121" elapsed="0.000056"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:28.719412" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:28.719331" elapsed="0.000171"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:28.719294" 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-08-22T23:17:28.719886" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:28.720039" elapsed="0.000032"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:28.691049" elapsed="0.029215">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:28.720411" elapsed="0.000033"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:28.688603" elapsed="0.032037">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.721120" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:28.720812" elapsed="0.000429"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:28.720776" elapsed="0.000515"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:28.721800" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:28.721405" elapsed="0.000527"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:28.721371" elapsed="0.000619"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:17:28.687569" elapsed="0.034595">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:29.724315" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:29.723611" elapsed="0.000751"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:29.734847" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:29.734449" elapsed="0.000468"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:29.735471" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:29.735130" 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-08-22T23:17:29.747048" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:29.747204" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:29.747385" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:29.738550" elapsed="0.009239">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:29.735661" elapsed="0.012212">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:29.748067" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:29.747910" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:29.735628" elapsed="0.012528">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:29.748536" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:29.748690" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:29.748650" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:29.748632" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:29.748898" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:29.748968" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:29.728288" elapsed="0.020785">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:29.749140" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:29.724712" elapsed="0.024520">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:29.749450" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:29.749309" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:29.749293" elapsed="0.000235"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:29.749737" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:29.749595" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:29.749565" elapsed="0.000250"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:17:29.722820" elapsed="0.027070">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:30.753605" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:30.752568" elapsed="0.001114"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:30.767508" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:30.767242" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:30.767999" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:30.767743" 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-08-22T23:17:30.778520" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:30.778718" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:30.778894" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:30.770218" elapsed="0.009195">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:30.768122" elapsed="0.011406">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:30.779833" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:30.779598" elapsed="0.000332"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:30.768098" elapsed="0.011866">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:30.780505" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:30.780722" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:30.780666" elapsed="0.000132"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:30.780640" elapsed="0.000190"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:30.781032" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:30.781132" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:30.759844" elapsed="0.021434">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:30.781376" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:30.754199" elapsed="0.027307">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:30.781852" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:30.781640" elapsed="0.000312"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:30.781615" elapsed="0.000384"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:30.782383" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:30.782114" elapsed="0.000373"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:30.782081" elapsed="0.000450"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:17:30.751421" elapsed="0.031277">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:31.785729" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:31.784730" elapsed="0.001072"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:31.798617" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:31.798341" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:31.799068" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:31.798820" 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-08-22T23:17:31.809287" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:31.809450" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:31.809657" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:31.801278" elapsed="0.008768">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:31.799200" elapsed="0.010949">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:31.810343" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:31.810186" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:31.799176" elapsed="0.011259">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:31.810827" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:31.810966" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:31.810925" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:31.810908" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:31.811174" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:31.811243" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:31.792484" elapsed="0.018864">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:31.811417" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:31.786348" elapsed="0.025162">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:31.811745" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:31.811603" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:31.811571" elapsed="0.000253"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:31.812015" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:31.811877" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:31.811862" elapsed="0.000240"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:17:31.783573" elapsed="0.028608">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:32.815394" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:32.814338" elapsed="0.001133"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:32.828761" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:32.828462" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:32.829228" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:32.828972" 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-08-22T23:17:32.839974" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:32.840181" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:32.840404" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:32.831464" elapsed="0.009376">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:32.829358" elapsed="0.011573">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:32.841136" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:32.840970" elapsed="0.000234"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:32.829331" elapsed="0.011899">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:32.841643" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:32.841797" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:32.841754" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:32.841735" elapsed="0.000131"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:32.842013" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:32.842089" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:32.821863" elapsed="0.020336">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:32.842270" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:32.816017" elapsed="0.026348">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:32.842606" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:32.842445" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:32.842428" elapsed="0.000270"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:32.842897" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:32.842755" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:32.842739" elapsed="0.000239"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:17:32.813139" elapsed="0.029917">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:33.846191" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:33.845154" elapsed="0.001111"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:33.858951" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:33.858679" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:33.859413" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:33.859160" 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-08-22T23:17:33.869468" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:33.869657" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:33.869847" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:33.861615" elapsed="0.008774">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:33.859537" elapsed="0.010991">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:33.870844" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:33.870610" elapsed="0.000329"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:33.859514" elapsed="0.011460">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:33.871510" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:33.871731" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:33.871674" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:33.871647" elapsed="0.000178"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:33.872056" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:33.872161" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:33.852524" elapsed="0.019787">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:33.872407" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:33.846967" elapsed="0.025572">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:33.872889" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:33.872676" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:33.872652" elapsed="0.000353"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:33.873327" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:33.873089" elapsed="0.000314"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:33.873062" elapsed="0.000372"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:17:33.843989" elapsed="0.029553">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:34.876661" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:34.875646" elapsed="0.001099"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:34.890603" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:34.890215" elapsed="0.000460"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:34.891240" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:34.890890" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:17:34.903533" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:34.903770" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:34.904001" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:34.894305" elapsed="0.010210">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:34.891409" elapsed="0.013261">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:34.904939" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:34.904721" elapsed="0.000310"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:34.891377" elapsed="0.013687">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:34.905602" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:34.905795" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:34.905741" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:34.905717" elapsed="0.000170"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:34.906086" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:34.906184" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:34.882992" elapsed="0.023339">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:34.906427" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:34.877277" elapsed="0.029281">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:34.906889" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:34.906691" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:34.906667" elapsed="0.000333"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:34.907266" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:34.907075" elapsed="0.000268"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:34.907054" elapsed="0.000322"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:17:34.874475" elapsed="0.033009">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:35.910622" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:35.909534" elapsed="0.001182"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:35.924135" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:35.923868" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:35.924599" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:35.924337" 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-08-22T23:17:35.935021" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:35.935211" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:35.935393" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:35.926777" elapsed="0.009039">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:35.924725" elapsed="0.011177">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:35.936093" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:35.935940" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:35.924700" elapsed="0.011489">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:35.936565" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:35.936720" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:35.936679" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:35.936661" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:35.936931" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:35.937001" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:35.916938" elapsed="0.020168">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:35.937174" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:35.911246" elapsed="0.026020">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:35.937484" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:35.937344" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:35.937328" elapsed="0.000236"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:35.937772" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:35.937634" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:35.937618" elapsed="0.000232"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:17:35.908376" elapsed="0.029550">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:36.940980" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:36.939982" elapsed="0.001071"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:36.955296" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:36.955025" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:36.955762" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:36.955498" 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-08-22T23:17:36.965446" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:36.965644" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:36.965853" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:36.957985" elapsed="0.008276">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:36.955884" elapsed="0.010463">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:36.966549" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:36.966384" elapsed="0.000248"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:36.955860" elapsed="0.010797">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:36.967053" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:36.967198" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:36.967154" elapsed="0.000099"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:36.967135" elapsed="0.000145"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:36.967447" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:36.967517" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:36.947271" elapsed="0.020369">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:36.967710" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:36.941549" elapsed="0.026253">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:36.968019" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:36.967879" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:36.967863" elapsed="0.000234"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:36.968287" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:36.968149" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:36.968134" elapsed="0.000231"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:17:36.938837" elapsed="0.029604">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:37.971458" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:37.970461" elapsed="0.001069"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:37.983837" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:37.983455" elapsed="0.000449"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:37.984456" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:37.984116" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:17:37.996665" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:37.996828" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:37.997011" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:37.987782" elapsed="0.009625">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:37.984663" elapsed="0.012829">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:37.997700" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:37.997529" elapsed="0.000239"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:37.984630" elapsed="0.013163">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:37.998171" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:37.998311" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:37.998268" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:37.998251" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:37.998520" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:37.998611" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:37.977528" elapsed="0.021192">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:37.998790" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:37.972059" elapsed="0.026824">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:37.999104" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:37.998961" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:37.998945" elapsed="0.000239"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:37.999382" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:37.999240" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:37.999223" elapsed="0.000237"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:17:37.969316" elapsed="0.030233">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:39.002630" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:39.001611" elapsed="0.001098"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:39.015775" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:39.015388" elapsed="0.000456"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:39.016399" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:39.016056" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:17:39.027837" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:39.028016" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:39.028216" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:39.019763" elapsed="0.009336">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:39.016571" elapsed="0.012730">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:39.029808" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:39.029385" elapsed="0.000582"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:39.016538" elapsed="0.013488">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:39.030918" elapsed="0.000058"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:39.031224" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:39.031137" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:39.031097" elapsed="0.000317"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:39.031757" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:39.031913" elapsed="0.000032"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:39.009299" elapsed="0.022843">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:39.032292" elapsed="0.000034"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:39.003909" elapsed="0.028589">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:39.033011" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:39.032699" elapsed="0.000436"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:39.032662" elapsed="0.000525"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:39.033637" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:39.033307" elapsed="0.000454"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:39.033272" elapsed="0.000539"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:17:39.000441" elapsed="0.033539">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<msg time="2026-08-22T23:17:39.034177" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:17:28.687013" elapsed="10.347367">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<doc>Get the device data as seen by checker and make sure it is empty.</doc>
<status status="FAIL" start="2026-08-22T23:17:28.432459" elapsed="10.602306">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</test>
<test id="s1-s1-t10" name="Check_Device_Data_Is_Seen_As_Empty_On_Setter" 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-08-22T23:17:39.041791" elapsed="0.000248"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:17:39.041511" 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-08-22T23:17:39.043155" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:39.043033" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:39.043014" 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-08-22T23:17:39.048300" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:39.048193" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:39.048175" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:17:39.049381" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:17:39.048987" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:17:39.049890" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:17:39.049568" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:17:39.049963" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:17:39.050126" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:17:39.048609" 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-08-22T23:17:39.055560" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:39.055451" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:39.055432" 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-08-22T23:17:39.056855" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:39.056747" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:39.056728" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:17:39.057401" 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-08-22T23:17:39.057068" elapsed="0.000360"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:17:39.057843" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:17:39.057603" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:17:39.101375" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:17:39.058358" elapsed="0.043164"/>
</kw>
<msg time="2026-08-22T23:17:39.101766" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:17:39.101815" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:39.058027" elapsed="0.043826"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:17:39.126235" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "S "e "t "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-08-22T23:17:39.102448" elapsed="0.023906"/>
</kw>
<msg time="2026-08-22T23:17:39.126532" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:17:39.126599" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:39.102056" elapsed="0.024583"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:39.127010" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:39.126744" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:39.126716" elapsed="0.000378"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:39.127565" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "S "e "t "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-08-22T23:17:39.127240" 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-08-22T23:17:39.127941" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:39.127727" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:39.127709" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:17:39.128056" 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-08-22T23:17:39.130966" elapsed="0.000151"/>
</kw>
<msg time="2026-08-22T23:17:39.131183" 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-08-22T23:17:39.129700" elapsed="0.001701"/>
</kw>
<kw name="Open 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-08-22T23:17:39.131727" elapsed="0.000092"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:39.132108" 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-08-22T23:17:39.128974" elapsed="0.003553"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:17:39.128378" elapsed="0.004241"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:17:39.056411" elapsed="0.076310"/>
</kw>
<msg time="2026-08-22T23:17:39.132816" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:39.132860" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:39.055793" elapsed="0.077104"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:17:39.133082" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:17:39.132973" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:39.132954" 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-08-22T23:17:39.133597" 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-08-22T23:17:39.133942" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:17:39.134014" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:17:39.055105" elapsed="0.079016"/>
</kw>
<msg time="2026-08-22T23:17:39.134215" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:39.134258" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:39.050535" elapsed="0.083759"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:39.134702" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:39.134370" elapsed="0.000388"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:39.134353" elapsed="0.000429"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:17:39.050393" elapsed="0.084413"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:17:39.140379" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:39.140266" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:39.140247" 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-08-22T23:17:39.141619" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:39.141485" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:39.141467" elapsed="0.000220"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:17:39.142224" 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-08-22T23:17:39.141831" elapsed="0.000422"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:17:39.142670" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:17:39.142412" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:17:39.179062" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:17:39.143183" elapsed="0.036188"/>
</kw>
<msg time="2026-08-22T23:17:39.179756" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:17:39.179826" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:39.142852" elapsed="0.037026"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:17:39.205740" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "S "e "t "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-08-22T23:17:39.180991" elapsed="0.024971"/>
</kw>
<msg time="2026-08-22T23:17:39.206140" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:17:39.206187" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:39.180254" elapsed="0.025970"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:39.206642" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:39.206338" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:39.206303" elapsed="0.000430"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:39.207210" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "S "e "t "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-08-22T23:17:39.206879" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:39.207565" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:39.207349" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:39.207331" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:17:39.207705" 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-08-22T23:17:39.210702" elapsed="0.000155"/>
</kw>
<msg time="2026-08-22T23:17:39.210923" 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-08-22T23:17:39.209409" elapsed="0.001674"/>
</kw>
<kw name="Open 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-08-22T23:17:39.211392" elapsed="0.000093"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:39.211822" elapsed="0.000446"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:17:39.208681" elapsed="0.003736"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:17:39.208068" elapsed="0.004423"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:17:39.141185" elapsed="0.071432"/>
</kw>
<msg time="2026-08-22T23:17:39.212713" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:39.212757" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:39.140609" elapsed="0.072186"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:17:39.212980" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:17:39.212872" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:39.212853" 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-08-22T23:17:39.213673" 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-08-22T23:17:39.214027" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:17:39.214099" 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-08-22T23:17:39.139921" elapsed="0.074291"/>
</kw>
<msg time="2026-08-22T23:17:39.214311" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:39.214355" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:39.135078" elapsed="0.079317"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:39.214738" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:39.214470" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:39.214452" elapsed="0.000365"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:17:39.134939" elapsed="0.079902"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:17:39.220721" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:39.220550" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:39.220531" 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-08-22T23:17:39.222023" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:39.221914" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:39.221896" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:17:39.222558" 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-08-22T23:17:39.222234" elapsed="0.000366"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:17:39.222986" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:17:39.222762" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:17:39.257410" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:17:39.223539" elapsed="0.034031"/>
</kw>
<msg time="2026-08-22T23:17:39.257817" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:17:39.257865" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:39.223166" elapsed="0.034736"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:17:39.292459" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "S "e "t "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-08-22T23:17:39.258531" elapsed="0.034189"/>
</kw>
<msg time="2026-08-22T23:17:39.292996" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:17:39.293044" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:39.258134" elapsed="0.034949"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:39.293520" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:39.293199" elapsed="0.000400"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:39.293165" elapsed="0.000462"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:39.294174" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "S "e "t "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-08-22T23:17:39.293778" 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-08-22T23:17:39.294540" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:39.294324" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:39.294305" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:17:39.294676" 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-08-22T23:17:39.297486" elapsed="0.000175"/>
</kw>
<msg time="2026-08-22T23:17:39.297728" 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-08-22T23:17:39.296292" elapsed="0.001585"/>
</kw>
<kw name="Open 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-08-22T23:17:39.298175" elapsed="0.000089"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:39.298545" 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-08-22T23:17:39.295590" elapsed="0.003187"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:17:39.294998" elapsed="0.003848"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:17:39.221606" elapsed="0.077341"/>
</kw>
<msg time="2026-08-22T23:17:39.299049" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:39.299094" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:39.220984" elapsed="0.078150"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:17:39.299555" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-08-22T23:17:39.299211" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:39.299193" elapsed="0.000540"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:39.300145" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:39.300486" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:17:39.300662" 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-08-22T23:17:39.220198" elapsed="0.080581"/>
</kw>
<msg time="2026-08-22T23:17:39.300876" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:39.300920" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:39.215116" elapsed="0.085842"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:39.301288" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:39.301033" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:39.301016" elapsed="0.000351"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:17:39.214976" elapsed="0.086415"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:17:39.050210" elapsed="0.251214"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:17:39.047785" elapsed="0.253702"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:17:39.042734" elapsed="0.258813"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:39.042251" elapsed="0.259359"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:17:39.038031" elapsed="0.263637"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:39.303212" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:39.302822" elapsed="0.000418"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:39.310753" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:39.310483" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:39.311194" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:39.310950" 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-08-22T23:17:39.335958" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:39.336268" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:39.336541" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:39.313430" elapsed="0.023931">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:39.311304" elapsed="0.026240">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:39.337998" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:39.337652" elapsed="0.000584"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:39.311285" elapsed="0.027007">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:39.339188" elapsed="0.000068"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:39.339508" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:39.339422" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:39.339383" 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-08-22T23:17:39.340027" elapsed="0.000050"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:39.340188" elapsed="0.000035"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:39.306076" elapsed="0.034389">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:39.340664" elapsed="0.000036"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:39.303453" elapsed="0.037426">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:39.341379" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:39.341055" elapsed="0.000464"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:39.341019" elapsed="0.000553"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:39.342039" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:39.341726" elapsed="0.000464"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:39.341691" elapsed="0.000555"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:17:39.302414" elapsed="0.040007">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:40.345411" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:40.344387" elapsed="0.001097"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:40.357549" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:40.357288" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:40.358016" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:40.357766" 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-08-22T23:17:40.369771" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:40.369932" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:40.370055" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:40.360217" elapsed="0.010228">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:40.358137" elapsed="0.012460">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:40.370793" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:40.370636" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:40.358114" elapsed="0.012769">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:40.371257" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:40.371401" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:40.371361" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:40.371343" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:40.371626" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:40.371698" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:40.352263" elapsed="0.019578">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:40.371914" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:40.346632" elapsed="0.025376">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:40.372236" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:40.372088" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:40.372071" elapsed="0.000245"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:40.372630" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:40.372369" elapsed="0.000400"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:40.372354" elapsed="0.000467"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:17:40.343233" elapsed="0.029761">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:41.375664" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:41.374701" elapsed="0.001030"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:41.387106" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:41.386750" elapsed="0.000424"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:41.387758" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:41.387389" elapsed="0.000433"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:17:41.400075" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:41.400209" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:41.400329" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:41.390703" elapsed="0.010540">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:41.387918" elapsed="0.013502">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:41.401873" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:41.401495" elapsed="0.000526"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:41.387891" elapsed="0.014184">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:41.402925" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:41.403228" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:41.403144" elapsed="0.000176"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:41.403106" elapsed="0.000261"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:41.403708" elapsed="0.000050"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:41.403866" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:41.380720" elapsed="0.023372">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:41.404242" elapsed="0.000034"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:41.376207" elapsed="0.028239">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:41.404974" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:41.404648" elapsed="0.000472"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:41.404609" elapsed="0.000563"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:41.405627" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:41.405289" elapsed="0.000464"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:41.405255" elapsed="0.000550"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:17:41.373736" elapsed="0.032239">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:42.409076" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:42.408071" elapsed="0.001076"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:42.420027" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:42.419760" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:42.420472" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:42.420226" 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-08-22T23:17:42.431446" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:42.431629" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:42.431804" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:42.422770" elapsed="0.009425">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:42.420608" elapsed="0.011670">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:42.432471" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:42.432313" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:42.420570" elapsed="0.011991">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:42.432957" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:42.433095" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:42.433056" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:42.433038" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:42.433305" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:42.433381" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:42.415458" elapsed="0.018028">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:42.433556" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:42.409675" elapsed="0.023991">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:42.433887" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:42.433746" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:42.433729" elapsed="0.000239"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:42.434161" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:42.434022" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:42.434007" elapsed="0.000233"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:17:42.406955" elapsed="0.027388">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:43.437789" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:43.436767" elapsed="0.001099"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:43.451332" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:43.451059" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:43.451806" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:43.451531" 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-08-22T23:17:43.462804" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:43.462974" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:43.463178" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:43.453994" elapsed="0.009623">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:43.451933" elapsed="0.011771">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:43.463896" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:43.463742" elapsed="0.000219"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:43.451905" elapsed="0.012080">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:43.464361" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:43.464498" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:43.464456" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:43.464440" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:43.464724" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:43.464794" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:43.444416" elapsed="0.020484">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:43.464968" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:43.438365" elapsed="0.026695">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:43.465286" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:43.465136" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:43.465120" elapsed="0.000245"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:43.465555" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:43.465417" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:43.465402" elapsed="0.000245"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:17:43.435457" elapsed="0.030266">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:44.468808" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:44.467807" elapsed="0.001073"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:44.480370" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:44.480011" elapsed="0.000425"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:44.481005" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:44.480666" 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-08-22T23:17:44.492102" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:44.492258" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:44.492437" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:44.483961" elapsed="0.009304">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:44.481171" elapsed="0.012298">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:44.493921" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:44.493548" elapsed="0.000517"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:44.481139" elapsed="0.012979">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:44.495010" elapsed="0.000057"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:44.495310" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:44.495225" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:44.495186" 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-08-22T23:17:44.495820" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:44.495976" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:44.473899" elapsed="0.022305">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:44.496353" elapsed="0.000033"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:44.469375" elapsed="0.027182">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:44.497090" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:44.496763" elapsed="0.000451"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:44.496726" elapsed="0.000541"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:44.497721" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:44.497387" elapsed="0.000458"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:44.497352" elapsed="0.000544"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:17:44.466641" elapsed="0.031427">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:45.501042" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:45.500054" elapsed="0.001058"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:45.516886" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:45.516501" elapsed="0.000453"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:45.517525" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:45.517179" 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-08-22T23:17:45.529511" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:45.529690" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:45.529870" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:45.520559" elapsed="0.009694">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:45.517712" elapsed="0.012622">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:45.530522" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:45.530369" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:45.517682" elapsed="0.012949">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:45.531001" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:45.531139" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:45.531099" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:45.531082" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:45.531346" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:45.531418" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:45.510488" elapsed="0.021241">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:45.531800" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:45.501670" elapsed="0.030223">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:45.532112" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:45.531970" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:45.531954" elapsed="0.000238"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:45.532384" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:45.532246" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:45.532231" elapsed="0.000232"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:17:45.498933" elapsed="0.033607">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:46.535510" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:46.534501" elapsed="0.001109"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:46.547767" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:46.547486" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:46.548218" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:46.547970" 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-08-22T23:17:46.558894" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:46.559050" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:46.559221" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:46.550472" elapsed="0.009156">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:46.548340" elapsed="0.011372">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:46.559902" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:46.559748" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:46.548318" elapsed="0.011675">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:46.560363" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:46.560500" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:46.560460" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:46.560442" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:46.560724" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:46.560794" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:46.541556" elapsed="0.019341">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:46.560966" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:46.536109" elapsed="0.024949">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:46.561277" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:46.561135" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:46.561119" elapsed="0.000237"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:46.561599" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:46.561433" elapsed="0.000234"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:46.561394" elapsed="0.000296"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:17:46.533310" elapsed="0.028456">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:47.564761" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:47.563718" elapsed="0.001117"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:47.579036" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:47.578776" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:47.579493" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:47.579238" 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-08-22T23:17:47.588896" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:47.589057" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:47.589234" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:47.581707" elapsed="0.007942">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:47.579631" elapsed="0.010101">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:47.589922" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:47.589767" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:47.579606" elapsed="0.010406">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:47.590380" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:47.590517" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:47.590477" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:47.590460" elapsed="0.000137"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:47.590742" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:47.590812" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:47.570940" elapsed="0.019974">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:47.590982" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:47.565339" elapsed="0.025735">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:47.591292" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:47.591152" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:47.591135" elapsed="0.000236"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:47.591563" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:47.591424" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:47.591409" elapsed="0.000251"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:17:47.562628" elapsed="0.029108">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:48.594611" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:48.593638" elapsed="0.001046"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:48.606901" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:48.606488" elapsed="0.000487"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:48.607573" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:48.607204" elapsed="0.000458"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:17:48.619238" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:48.619396" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:48.619651" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:48.610150" elapsed="0.010066">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:48.607770" elapsed="0.012571">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:48.620664" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:48.620394" elapsed="0.000367"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:48.607738" elapsed="0.013058">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:48.621379" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:48.621602" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:48.621524" elapsed="0.000146"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:48.621498" 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-08-22T23:17:48.621914" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:48.622017" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:48.599749" elapsed="0.022423">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:48.622274" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:48.595176" elapsed="0.027237">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:48.622765" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:48.622532" elapsed="0.000317"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:48.622506" elapsed="0.000378"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:48.623169" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:48.622964" elapsed="0.000286"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:48.622942" elapsed="0.000343"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:17:48.592539" elapsed="0.030858">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:49.625609" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:49.624963" elapsed="0.000695"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:49.635738" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:49.635462" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:49.636189" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:49.635940" 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-08-22T23:17:49.647887" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:49.648047" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:49.648210" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:49.638387" elapsed="0.010304">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:49.636309" elapsed="0.012496">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:49.649066" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:49.648853" elapsed="0.000305"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:49.636287" elapsed="0.012905">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:49.649779" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:49.649977" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:49.649921" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:49.649894" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:49.650265" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:49.650363" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:49.629435" elapsed="0.021071">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:49.650651" elapsed="0.000024"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:49.625986" elapsed="0.024804">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:49.651101" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:49.650899" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:49.650876" elapsed="0.000335"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:49.651479" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:49.651285" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:49.651264" elapsed="0.000342"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:17:49.624129" elapsed="0.027586">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<msg time="2026-08-22T23:17:49.651840" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:17:39.301839" elapsed="10.350132">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<doc>Get the device data as seen by setter and make sure it is empty.</doc>
<status status="FAIL" start="2026-08-22T23:17:39.035898" elapsed="10.616298">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</test>
<test id="s1-s1-t11" name="Create_Device_Data" 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-08-22T23:17:49.656959" elapsed="0.000295"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:17:49.656560" elapsed="0.000773"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:17:49.658736" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:49.658622" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:49.658600" 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-08-22T23:17:49.663839" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:49.663726" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:49.663676" elapsed="0.000231"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:17:49.664910" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:17:49.664507" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:17:49.665399" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:17:49.665095" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:17:49.665470" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:17:49.665664" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:17:49.664133" 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-08-22T23:17:49.671071" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:49.670962" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:49.670944" 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-08-22T23:17:49.672306" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:49.672199" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:49.672181" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:17:49.672853" 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-08-22T23:17:49.672516" elapsed="0.000363"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:17:49.673265" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:17:49.673037" elapsed="0.000254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:17:49.712693" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:17:49.673825" elapsed="0.038969"/>
</kw>
<msg time="2026-08-22T23:17:49.712987" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:17:49.713034" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:49.673447" elapsed="0.039623"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:17:49.731135" level="INFO">"t "x "t ". "C "R "U "D ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:17:49.713632" elapsed="0.017599"/>
</kw>
<msg time="2026-08-22T23:17:49.731401" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:17:49.731447" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:49.713269" elapsed="0.018214"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:49.731799" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:49.731560" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:49.731540" elapsed="0.000337"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:49.732314" level="INFO"> "t "x "t ". "C "R "U "D ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:49.732014" elapsed="0.000360"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:49.732670" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:49.732441" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:49.732423" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:17:49.732781" 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-08-22T23:17:49.735502" elapsed="0.000296"/>
</kw>
<msg time="2026-08-22T23:17:49.735866" 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-08-22T23:17:49.734300" elapsed="0.001715"/>
</kw>
<kw name="Open 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-08-22T23:17:49.736353" elapsed="0.000091"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:49.736751" 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-08-22T23:17:49.733627" elapsed="0.003379"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:17:49.733076" 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-08-22T23:17:49.671898" elapsed="0.065276"/>
</kw>
<msg time="2026-08-22T23:17:49.737265" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:49.737309" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:49.671287" elapsed="0.066059"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:17:49.737528" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:17:49.737422" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:49.737404" 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-08-22T23:17:49.738026" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:49.738358" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:17:49.738431" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:17:49.670627" elapsed="0.067916"/>
</kw>
<msg time="2026-08-22T23:17:49.738821" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:49.738868" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:49.666068" elapsed="0.072837"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:49.739229" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:49.738982" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:49.738964" elapsed="0.000342"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:17:49.665929" elapsed="0.073401"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:17:49.744756" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:49.744649" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:49.744630" 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-08-22T23:17:49.745985" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:49.745877" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:49.745859" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:17:49.746499" 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-08-22T23:17:49.746191" elapsed="0.000334"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:17:49.746916" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:17:49.746696" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:17:49.781756" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:17:49.747421" elapsed="0.034435"/>
</kw>
<msg time="2026-08-22T23:17:49.782041" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:17:49.782087" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:49.747094" elapsed="0.035030"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:17:49.797525" level="INFO">"t "x "t ". "C "R "U "D ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:17:49.782652" elapsed="0.014986"/>
</kw>
<msg time="2026-08-22T23:17:49.797848" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:17:49.797894" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:49.782288" elapsed="0.015643"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:49.798222" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:49.798007" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:49.797988" elapsed="0.000312"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:49.798763" level="INFO"> "t "x "t ". "C "R "U "D ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:49.798437" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:49.799104" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:49.798892" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:49.798874" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:17:49.799215" 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-08-22T23:17:49.801887" elapsed="0.000146"/>
</kw>
<msg time="2026-08-22T23:17:49.802096" 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-08-22T23:17:49.800717" elapsed="0.001519"/>
</kw>
<kw name="Open 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-08-22T23:17:49.802718" elapsed="0.000094"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:49.803120" 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-08-22T23:17:49.800006" elapsed="0.003321"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:17:49.799463" elapsed="0.003933"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:17:49.745559" elapsed="0.057936"/>
</kw>
<msg time="2026-08-22T23:17:49.803603" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:49.803649" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:49.744993" elapsed="0.058693"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:17:49.803870" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:17:49.803763" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:49.803745" 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-08-22T23:17:49.804352" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:49.804852" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:17:49.804925" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:17:49.744291" elapsed="0.060744"/>
</kw>
<msg time="2026-08-22T23:17:49.805127" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:49.805170" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:49.739606" elapsed="0.065600"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:49.805526" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:49.805281" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:49.805263" elapsed="0.000360"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:17:49.739453" elapsed="0.066194"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:17:49.810924" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:49.810817" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:49.810799" 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-08-22T23:17:49.812204" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:49.812070" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:49.812051" elapsed="0.000220"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:17:49.812754" 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-08-22T23:17:49.812412" elapsed="0.000369"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:17:49.813158" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:17:49.812935" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:17:49.852337" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:17:49.813690" elapsed="0.038757"/>
</kw>
<msg time="2026-08-22T23:17:49.852637" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:17:49.852685" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:49.813339" elapsed="0.039382"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:17:49.867386" level="INFO">"t "x "t ". "C "R "U "D ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:17:49.853222" elapsed="0.014260"/>
</kw>
<msg time="2026-08-22T23:17:49.867683" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:17:49.867730" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:49.852888" elapsed="0.014877"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:49.868055" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:49.867841" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:49.867821" elapsed="0.000313"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:49.868570" level="INFO"> "t "x "t ". "C "R "U "D ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:49.868272" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:49.868923" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:49.868713" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:49.868695" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:17:49.869033" 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-08-22T23:17:49.871727" elapsed="0.000147"/>
</kw>
<msg time="2026-08-22T23:17:49.871937" 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-08-22T23:17:49.870477" elapsed="0.001599"/>
</kw>
<kw name="Open 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-08-22T23:17:49.872364" elapsed="0.000089"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:49.872782" elapsed="0.000087"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:17:49.869827" elapsed="0.003163"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:17:49.869280" 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-08-22T23:17:49.811768" elapsed="0.061386"/>
</kw>
<msg time="2026-08-22T23:17:49.873246" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:49.873289" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:49.811174" elapsed="0.062152"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:17:49.873507" elapsed="0.000213"/>
</return>
<status status="PASS" start="2026-08-22T23:17:49.873403" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:49.873384" elapsed="0.000396"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:49.874167" 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-08-22T23:17:49.874535" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:17:49.874768" 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-08-22T23:17:49.810470" elapsed="0.064410"/>
</kw>
<msg time="2026-08-22T23:17:49.874972" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:49.875015" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:49.805912" elapsed="0.069139"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:49.875369" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:49.875125" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:49.875108" elapsed="0.000337"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:17:49.805772" elapsed="0.069696"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:17:49.665751" elapsed="0.209745"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:17:49.663321" elapsed="0.212271"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:17:49.658203" elapsed="0.217458"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:49.657543" elapsed="0.218162"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:17:49.653374" elapsed="0.222383"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:17:49.876373" level="INFO">${template_as_string} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${template_as_string}</var>
<arg>DEVICE_NAME=${device_name}</arg>
<arg>RESTCONF_ROOT=${RESTCONF_ROOT}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:17:49.875930" elapsed="0.000469"/>
</kw>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:49.909712" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:49.909324" elapsed="0.000416"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:17:49.910511" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:17:49.910234" elapsed="0.000360">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:17:49.910690" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:17:49.909902" elapsed="0.000818"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:17:49.911279" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:17:49.910879" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:17:49.911622" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:17:49.911785" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:17:49.911463" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:49.912213" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:49.911969" 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-08-22T23:17:49.913214" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:49.912961" elapsed="0.000297"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:17:49.913689" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:17:49.913412" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:17:49.914520" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:17:49.914212" elapsed="0.000390"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:17:49.915359" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:17:49.915117" elapsed="0.000267"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:17:49.915434" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:17:49.915609" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:17:49.914794" elapsed="0.000841"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:17:49.915786" elapsed="0.000244"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:17:49.913931" elapsed="0.002140"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:17:49.916625" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:17:49.916312" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:17:49.917364" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:17:49.917153" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:17:49.917437" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:17:49.917603" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:17:49.916831" elapsed="0.000798"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:17:49.917776" elapsed="0.000232"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:17:49.916185" elapsed="0.001863"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:17:49.913763" elapsed="0.004320"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:17:49.918126" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:17:49.918284" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:17:49.912637" elapsed="0.005672"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:49.912324" elapsed="0.006017"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:49.918510" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:49.918365" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:49.912305" elapsed="0.006299"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:17:49.919365" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:17:49.918748" elapsed="0.000645"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:17:49.919441" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:17:49.908716" elapsed="0.010849"/>
</kw>
<msg time="2026-08-22T23:17:49.919639" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:17:49.896260" elapsed="0.023426"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:49.931905" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:49.944088" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:49.956297" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:49.956486" 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-08-22T23:17:49.956671" 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-08-22T23:17:49.957035" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:49.956892" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:49.956878" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:49.957250" 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-08-22T23:17:49.957412" 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-08-22T23:17:49.957573" elapsed="0.000040"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:17:49.956850" elapsed="0.000797"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:17:49.956748" elapsed="0.000924"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:49.957824" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:49.957899" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:17:49.958018" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:17:49.892029" elapsed="0.066015"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:49.983387" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:49.983013" elapsed="0.000410"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:17:49.984194" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:17:49.983932" elapsed="0.000330">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:17:49.984356" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:17:49.983596" elapsed="0.000784"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:17:49.984941" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:17:49.984539" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:17:49.985263" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:17:49.985417" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:17:49.985125" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:49.985861" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:49.985608" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:17:49.986254" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:49.985972" elapsed="0.000340"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:49.986874" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:49.986538" elapsed="0.000362"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:49.986389" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:49.985954" elapsed="0.001004"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:17:49.987527" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:17:49.987100" elapsed="0.000460"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:17:49.987624" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:17:49.982385" elapsed="0.005370"/>
</kw>
<msg time="2026-08-22T23:17:49.987807" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:17:49.969922" elapsed="0.017932"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:50.000098" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:50.012303" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:50.024597" 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-08-22T23:17:50.024788" 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-08-22T23:17:50.024959" 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-08-22T23:17:50.025314" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:50.025175" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:50.025160" elapsed="0.000233"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:50.025529" 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-08-22T23:17:50.025715" 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-08-22T23:17:50.025877" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:17:50.025133" elapsed="0.000803"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:17:50.025032" 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-08-22T23:17:50.026102" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:50.026177" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:17:50.026323" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:17:49.968969" elapsed="0.057418"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:17:50.027658" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:17:50.027396" elapsed="0.000326">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:17:50.027814" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:17:50.027060" elapsed="0.000779"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:50.028149" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:50.027909" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:50.028698" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:50.028390" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-08-22T23:17:50.028229" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:50.027891" elapsed="0.000889"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:17:50.031094" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:17:50.028927" elapsed="0.002193"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:17:50.031172" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:17:50.031323" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:17:50.026741" elapsed="0.004607"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:50.032869" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:50.032623" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:50.033300" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:50.033065" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:50.033752" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:50.033493" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:50.034198" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:50.033943" elapsed="0.000298"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:17:50.035070" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:17:50.034877" elapsed="0.000219"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:17:50.035432" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:17:50.035254" 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-08-22T23:17:50.035626" elapsed="0.000203"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:50.036227" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:50.035983" elapsed="0.000294"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:17:50.036320" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:17:50.036474" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:17:50.034439" elapsed="0.002059"/>
</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-08-22T23:17:50.054077" level="INFO">POST Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Content-Length': '72', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:17:50.054286" level="INFO">POST Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:50.054478" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:50.040098" elapsed="0.014914">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:50.036567" elapsed="0.018561">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:50.055388" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:50.055175" elapsed="0.000307"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:50.036550" elapsed="0.018965">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:50.056045" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:50.056234" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:50.056184" elapsed="0.000107"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:50.056160" elapsed="0.000160"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:50.056513" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:50.056626" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:50.031688" elapsed="0.025079">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:50.056873" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:49.881121" elapsed="0.175880">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:50.057392" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:50.057151" elapsed="0.000334"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:50.057129" elapsed="0.000388"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:50.057567" elapsed="0.000039"/>
</return>
<arg>${directory_with_template_folders}${/}dataorig</arg>
<arg>${template_as_string}</arg>
<arg>session=${NODE_SETTER}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:17:49.876668" elapsed="0.181048">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<doc>Send some sample test data into the device and check that the request went OK.</doc>
<status status="FAIL" start="2026-08-22T23:17:49.652660" elapsed="0.405262">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</test>
<test id="s1-s1-t12" name="Check_New_Device_Data_Is_Visible_On_Setter" line="147">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:17:50.062941" elapsed="0.000299"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:17:50.062547" elapsed="0.000770"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:17:50.064750" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:50.064572" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:50.064547" 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-08-22T23:17:50.071611" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:50.071445" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:50.071420" elapsed="0.000286"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:17:50.073079" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:17:50.072526" elapsed="0.000590"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:17:50.073783" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:17:50.073334" elapsed="0.000520"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:17:50.073925" elapsed="0.000041"/>
</return>
<msg time="2026-08-22T23:17:50.074145" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:17:50.072010" elapsed="0.002173"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:17:50.079982" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:50.079874" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:50.079856" 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-08-22T23:17:50.081203" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:50.081097" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:50.081079" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:17:50.081760" 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-08-22T23:17:50.081411" elapsed="0.000376"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:17:50.082169" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:17:50.081942" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:17:50.116902" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:17:50.082709" elapsed="0.034295"/>
</kw>
<msg time="2026-08-22T23:17:50.117189" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:17:50.117235" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:50.082349" elapsed="0.034922"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:17:50.140912" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "S "e "t "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-08-22T23:17:50.117832" elapsed="0.023185"/>
</kw>
<msg time="2026-08-22T23:17:50.141184" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:17:50.141253" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:17:50.117461" elapsed="0.023831"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:50.141607" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:50.141367" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:50.141348" elapsed="0.000340"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:50.142131" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "S "e "t "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-08-22T23:17:50.141828" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:50.142480" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:50.142267" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:50.142249" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:17:50.142607" 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-08-22T23:17:50.145335" elapsed="0.000147"/>
</kw>
<msg time="2026-08-22T23:17:50.145545" 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-08-22T23:17:50.144118" elapsed="0.001594"/>
</kw>
<kw name="Open 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-08-22T23:17:50.146014" elapsed="0.000088"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:50.146385" 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-08-22T23:17:50.143432" 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-08-22T23:17:50.142905" 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-08-22T23:17:50.080798" elapsed="0.066019"/>
</kw>
<msg time="2026-08-22T23:17:50.146910" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:50.146955" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:17:50.080198" elapsed="0.066795"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:17:50.147176" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:17:50.147069" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:50.147051" 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-08-22T23:17:50.147667" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:50.147997" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:17:50.148069" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:17:50.079522" elapsed="0.068654"/>
</kw>
<msg time="2026-08-22T23:17:50.148268" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:50.148312" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:17:50.074710" elapsed="0.073638"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:50.148815" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:50.148422" elapsed="0.000448"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:50.148405" elapsed="0.000488"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:17:50.074493" elapsed="0.074424"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:17:50.154430" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:50.154323" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:50.154304" 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-08-22T23:17:50.155663" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:50.155535" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:50.155516" elapsed="0.000214"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:17:50.156181" 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-08-22T23:17:50.155870" elapsed="0.000337"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:17:50.156596" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:17:50.156359" elapsed="0.000264"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:17:50.190931" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:17:50.157127" elapsed="0.033904"/>
</kw>
<msg time="2026-08-22T23:17:50.191218" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:17:50.191264" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:50.156778" elapsed="0.034524"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:17:50.216183" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "S "e "t "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-08-22T23:17:50.191861" elapsed="0.024433"/>
</kw>
<msg time="2026-08-22T23:17:50.216470" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:17:50.216516" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:17:50.191501" elapsed="0.025052"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:50.216884" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:50.216658" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:50.216637" elapsed="0.000327"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:50.217412" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "S "e "t "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-08-22T23:17:50.217103" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:50.217780" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:50.217547" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:50.217528" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:17:50.217891" 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-08-22T23:17:50.220514" elapsed="0.000194"/>
</kw>
<msg time="2026-08-22T23:17:50.220773" 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-08-22T23:17:50.219350" elapsed="0.001565"/>
</kw>
<kw name="Open 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-08-22T23:17:50.221209" elapsed="0.000085"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:50.221570" 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-08-22T23:17:50.218691" elapsed="0.003107"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:17:50.218141" elapsed="0.003723"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:17:50.155233" elapsed="0.066728"/>
</kw>
<msg time="2026-08-22T23:17:50.222050" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:50.222093" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:17:50.154667" elapsed="0.067464"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:17:50.222311" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:17:50.222206" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:50.222188" elapsed="0.000204"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:50.222801" 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-08-22T23:17:50.223126" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:17:50.223197" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:17:50.153983" elapsed="0.069322"/>
</kw>
<msg time="2026-08-22T23:17:50.223397" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:50.223440" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:17:50.149187" elapsed="0.074290"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:50.223956" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:50.223551" elapsed="0.000459"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:50.223534" elapsed="0.000533"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:17:50.149039" elapsed="0.075055"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:17:50.229633" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:50.229507" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:50.229488" 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-08-22T23:17:50.230853" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:50.230745" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:50.230727" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:17:50.231371" 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-08-22T23:17:50.231062" elapsed="0.000335"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:17:50.231788" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:17:50.231550" elapsed="0.000264"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:17:50.269051" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:17:50.232300" elapsed="0.036865"/>
</kw>
<msg time="2026-08-22T23:17:50.269340" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:17:50.269386" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:50.231970" elapsed="0.037452"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:17:50.291433" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "S "e "t "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-08-22T23:17:50.269959" elapsed="0.021578"/>
</kw>
<msg time="2026-08-22T23:17:50.291725" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:17:50.291770" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:17:50.269611" elapsed="0.022196"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:50.292119" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:50.291881" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:50.291863" elapsed="0.000334"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:50.292650" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "S "e "t "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-08-22T23:17:50.292334" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:50.292995" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:50.292784" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:50.292766" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:17:50.293104" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<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-08-22T23:17:50.295762" elapsed="0.000155"/>
</kw>
<msg time="2026-08-22T23:17:50.295980" 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-08-22T23:17:50.294540" 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-08-22T23:17:50.296421" elapsed="0.000088"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:50.296812" 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-08-22T23:17:50.293890" elapsed="0.003126"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:17:50.293351" 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-08-22T23:17:50.230420" elapsed="0.066757"/>
</kw>
<msg time="2026-08-22T23:17:50.297268" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:50.297312" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:17:50.229850" elapsed="0.067531"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:17:50.297566" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-08-22T23:17:50.297460" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:50.297442" 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-08-22T23:17:50.298052" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:50.298387" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:17:50.298458" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:17:50.229165" elapsed="0.069402"/>
</kw>
<msg time="2026-08-22T23:17:50.298823" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:17:50.298866" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:17:50.224351" elapsed="0.074552"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:50.299223" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:50.298978" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-08-22T23:17:50.298960" elapsed="0.000340"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:17:50.224215" elapsed="0.075108"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:17:50.074256" elapsed="0.225096"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:17:50.070951" elapsed="0.228457"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:17:50.064175" elapsed="0.235286"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:17:50.063567" elapsed="0.235937"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:17:50.059403" elapsed="0.240151"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:50.301097" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:50.300716" elapsed="0.000408"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:50.308524" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:50.308274" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:50.308988" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:50.308742" 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-08-22T23:17:50.320230" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:50.320374" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:50.320486" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:50.311151" elapsed="0.009720">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:50.309099" elapsed="0.011884">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:50.321174" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:50.321019" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:50.309081" elapsed="0.012182">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:50.321652" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:50.321787" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:50.321749" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:50.321732" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:50.321992" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:50.322063" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:50.303975" elapsed="0.018191">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:50.322235" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:50.301334" elapsed="0.020995">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:50.322550" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:50.322407" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:50.322391" elapsed="0.000255"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:50.322840" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:50.322699" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:50.322683" elapsed="0.000235"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:17:50.300313" elapsed="0.022682">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:51.326106" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:51.325043" elapsed="0.001136"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:51.339503" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:51.339099" elapsed="0.000514"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:51.340217" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:51.339872" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:17:51.353036" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:51.353208" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:51.353335" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:51.343535" elapsed="0.010483">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:51.340387" elapsed="0.013816">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:51.354664" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:51.354284" elapsed="0.000529"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:51.340353" elapsed="0.014514">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:51.355747" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:51.356054" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:51.355967" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:51.355928" 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-08-22T23:17:51.356516" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:51.356705" elapsed="0.000035"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:51.332909" elapsed="0.024029">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:51.357090" elapsed="0.000034"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:51.326713" elapsed="0.030583">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:51.357847" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:51.357471" elapsed="0.000502"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:51.357435" elapsed="0.000590"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:51.358463" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:51.358146" elapsed="0.000469"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:51.358111" elapsed="0.000562"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:17:51.323868" elapsed="0.034979">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:52.362260" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:52.361238" elapsed="0.001093"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:52.375503" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:52.375111" elapsed="0.000484"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:52.376207" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:52.375826" elapsed="0.000447"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:17:52.387963" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:52.388146" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:52.388332" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:52.379457" elapsed="0.009306">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:52.376384" elapsed="0.012463">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:52.389041" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:52.388883" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:52.376351" elapsed="0.012779">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:52.389511" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:52.389667" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:52.389625" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:52.389606" elapsed="0.000128"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:52.389877" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:52.389946" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:52.368757" elapsed="0.021296">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:52.390120" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:52.362853" elapsed="0.027359">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:52.390429" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:52.390289" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:52.390273" elapsed="0.000233"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:52.390719" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:52.390559" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:52.390544" elapsed="0.000253"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:17:52.360037" elapsed="0.030836">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:53.392748" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:53.392266" elapsed="0.000518"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:53.403722" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:53.403438" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:53.404163" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:53.403920" 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-08-22T23:17:53.415084" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:53.415239" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:53.415414" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:53.406435" elapsed="0.009435">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:53.404285" elapsed="0.011698">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:53.416246" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:53.416033" elapsed="0.000305"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:53.404261" elapsed="0.012109">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:53.416917" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:53.417108" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:53.417054" elapsed="0.000113"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:53.417030" elapsed="0.000167"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:53.417395" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:53.417492" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:53.395862" elapsed="0.021811">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:53.417771" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:53.393016" elapsed="0.024884">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:53.418206" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:53.418008" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:53.417985" elapsed="0.000331"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:53.418602" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:53.418391" elapsed="0.000289"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:53.418369" elapsed="0.000344"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:17:53.391673" elapsed="0.027145">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:54.421438" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:54.420505" elapsed="0.000999"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:54.433077" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:54.432720" elapsed="0.000424"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:54.433718" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:54.433356" elapsed="0.000425"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:17:54.445944" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:54.446092" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:54.446251" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:54.436824" elapsed="0.009818">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:54.433876" elapsed="0.012873">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:54.447207" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:54.446848" elapsed="0.000505"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:54.433850" elapsed="0.013555">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:54.448283" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:54.448618" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:54.448502" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:54.448463" 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-08-22T23:17:54.449103" elapsed="0.000049"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:54.449264" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:54.426661" elapsed="0.022835">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:54.449691" elapsed="0.000041"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:54.422011" elapsed="0.027910">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:54.450422" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:54.450097" elapsed="0.000453"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:54.450060" elapsed="0.000572"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:54.451061" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:54.450755" elapsed="0.000428"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:54.450720" elapsed="0.000515"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:17:54.419501" elapsed="0.031906">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:55.454762" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:55.453695" elapsed="0.001145"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:55.467303" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:55.467038" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:55.467768" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:55.467503" 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-08-22T23:17:55.479469" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:55.479683" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:55.479886" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:55.469968" elapsed="0.010405">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:55.467901" elapsed="0.012563">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:55.480677" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:55.480503" elapsed="0.000245"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:55.467870" elapsed="0.012904">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:55.481153" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:55.481294" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:55.481251" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:55.481234" elapsed="0.000129"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:55.481505" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:55.481592" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:55.461497" elapsed="0.020210">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:55.481778" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:55.455404" elapsed="0.026467">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:55.482091" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:55.481949" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:55.481933" elapsed="0.000237"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:55.482366" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:55.482223" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:55.482208" elapsed="0.000236"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:17:55.452388" elapsed="0.030132">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:56.485969" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:56.484863" elapsed="0.001179"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:56.499105" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:56.498721" elapsed="0.000453"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:56.499805" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:56.499410" 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-08-22T23:17:56.511128" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:56.511308" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:56.511489" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:56.503002" elapsed="0.008973">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:56.500001" elapsed="0.012171">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:56.512642" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:56.512254" elapsed="0.000570"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:56.499966" elapsed="0.012918">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:56.513757" elapsed="0.000061"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:56.514115" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:56.514021" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:56.513977" 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-08-22T23:17:56.514644" elapsed="0.000052"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:56.514810" elapsed="0.000036"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:56.492541" elapsed="0.022533">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:56.515241" elapsed="0.000036"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:56.486747" elapsed="0.028709">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:56.516037" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:56.515685" elapsed="0.000513"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:56.515645" elapsed="0.000608"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:56.516729" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:56.516378" elapsed="0.000477"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:56.516342" elapsed="0.000567"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:17:56.483533" elapsed="0.033550">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:57.520337" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:57.519258" elapsed="0.001153"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:57.532070" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:57.531799" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:57.532518" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:57.532273" 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-08-22T23:17:57.542822" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:57.542997" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:57.543194" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:57.534734" elapsed="0.008875">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:57.532661" elapsed="0.011038">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:57.543928" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:57.543740" elapsed="0.000256"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:57.532634" elapsed="0.011386">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:57.544457" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:57.544619" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:57.544561" elapsed="0.000105"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:57.544542" elapsed="0.000145"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:57.544834" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:57.544904" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:57.527135" elapsed="0.017876">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:57.545079" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:57.520999" elapsed="0.024171">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:57.545391" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:57.545248" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:57.545232" elapsed="0.000237"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:57.545677" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:57.545522" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:57.545506" elapsed="0.000250"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:17:57.518058" elapsed="0.027780">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:58.549034" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:58.547998" elapsed="0.001116"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:58.562966" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:58.562568" elapsed="0.000468"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:58.563683" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:58.563290" elapsed="0.000458"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:17:58.572987" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:58.573197" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:58.573450" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:58.565949" elapsed="0.008052">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:58.563839" elapsed="0.010276">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:58.574396" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:58.574163" elapsed="0.000342"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:58.563815" elapsed="0.010726">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:58.575122" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:58.575322" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:58.575266" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:58.575240" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:58.575658" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:58.575763" elapsed="0.000024"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:58.556367" elapsed="0.019550">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:58.576012" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:58.549769" elapsed="0.026374">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:58.576455" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:58.576253" elapsed="0.000282"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:58.576230" elapsed="0.000341"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:58.576903" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:58.576700" elapsed="0.000282"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:58.576676" elapsed="0.000339"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:17:58.546799" elapsed="0.030324">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:17:59.580091" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:17:59.579084" elapsed="0.001081"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:59.592546" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:59.592276" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:17:59.593011" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:17:59.592764" 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-08-22T23:17:59.602796" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:17:59.602949" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:17:59.603125" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:17:59.595193" elapsed="0.008318">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:17:59.593134" elapsed="0.010475">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:59.603802" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:59.603646" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:17:59.593110" elapsed="0.010782">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:59.604284" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:59.604422" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:17:59.604382" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:59.604364" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:59.604650" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:17:59.604720" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:17:59.586192" elapsed="0.018632">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:17:59.604892" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:17:59.580698" elapsed="0.024285">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:59.605202" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:59.605059" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:59.605043" elapsed="0.000237"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:17:59.605472" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:17:59.605333" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:17:59.605317" elapsed="0.000232"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:17:59.578002" elapsed="0.027638">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:00.608569" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:00.607619" elapsed="0.001053"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:00.621355" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:00.620959" elapsed="0.000465"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:00.622009" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:00.621659" 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-08-22T23:18:00.633542" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:00.633717" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:00.633902" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:00.625063" elapsed="0.009230">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:00.622184" elapsed="0.012191">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:00.634565" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:00.634411" elapsed="0.000238"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:00.622145" elapsed="0.012529">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:00.635059" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:00.635198" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:00.635157" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:00.635139" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:00.635408" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:00.635480" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:00.614619" elapsed="0.020982">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:00.635673" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:00.609167" elapsed="0.026600">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:00.635989" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:00.635845" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:00.635829" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:00.636263" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:00.636123" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:00.636108" elapsed="0.000234"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:00.606449" elapsed="0.029971">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<msg time="2026-08-22T23:18:00.636510" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:17:50.299735" elapsed="10.336885">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<doc>Get the device data and make sure it contains the created content.</doc>
<status status="FAIL" start="2026-08-22T23:17:50.058554" elapsed="10.578235">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</test>
<test id="s1-s1-t13" name="Check_New_Device_Data_Is_Visible_On_Checker" line="156">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:18:00.641496" elapsed="0.000323"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:18:00.641111" elapsed="0.000789"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:18:00.643285" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:00.643127" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:00.643102" elapsed="0.000277"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:18:00.652731" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:00.652453" elapsed="0.000381"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:00.652411" elapsed="0.000474"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:18:00.655192" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:18:00.654295" elapsed="0.000959"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:18:00.656322" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:18:00.655639" elapsed="0.000741"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:18:00.656483" elapsed="0.000066"/>
</return>
<msg time="2026-08-22T23:18:00.656866" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:18:00.653424" elapsed="0.003497"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:18:00.665338" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:00.665174" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:00.665134" elapsed="0.000308"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:18:00.667219" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:00.667061" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:00.667035" elapsed="0.000285"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:18:00.668030" 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-08-22T23:18:00.667530" elapsed="0.000540"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:18:00.668659" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:18:00.668300" elapsed="0.000399"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:18:00.706071" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:18:00.669541" elapsed="0.036634"/>
</kw>
<msg time="2026-08-22T23:18:00.706367" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:18:00.706414" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:00.668932" elapsed="0.037519"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:18:00.730322" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:18:00.706985" elapsed="0.023445"/>
</kw>
<msg time="2026-08-22T23:18:00.730623" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:18:00.730671" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:18:00.706642" elapsed="0.024066"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:00.731006" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:00.730785" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:00.730765" elapsed="0.000320"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:00.731528" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:00.731225" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:00.731908" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:00.731695" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:00.731677" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:18:00.732018" 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-08-22T23:18:00.734834" elapsed="0.000146"/>
</kw>
<msg time="2026-08-22T23:18:00.735045" 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-08-22T23:18:00.733527" elapsed="0.001709"/>
</kw>
<kw name="Open 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-08-22T23:18:00.735536" elapsed="0.000118"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:00.735966" 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-08-22T23:18:00.732841" elapsed="0.003338"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:18:00.732286" 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-08-22T23:18:00.666613" elapsed="0.069730"/>
</kw>
<msg time="2026-08-22T23:18:00.736434" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:18:00.736479" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:18:00.665703" elapsed="0.070813"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:18:00.736879" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:18:00.736615" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:00.736574" elapsed="0.000418"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:00.737388" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:00.737889" elapsed="0.000031"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:18:00.737968" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:18:00.664656" elapsed="0.073422"/>
</kw>
<msg time="2026-08-22T23:18:00.738171" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:18:00.738215" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:18:00.657806" elapsed="0.080446"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:00.738599" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:00.738327" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:00.738309" elapsed="0.000369"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:18:00.657469" elapsed="0.081232"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:18:00.743998" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:00.743892" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:00.743873" 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-08-22T23:18:00.745216" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:00.745111" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:00.745092" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:18:00.745759" 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-08-22T23:18:00.745424" elapsed="0.000362"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:18:00.746161" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:18:00.745940" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:18:00.800385" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:18:00.746699" elapsed="0.053796"/>
</kw>
<msg time="2026-08-22T23:18:00.800693" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:18:00.800740" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:00.746341" elapsed="0.054437"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:18:00.831416" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:18:00.801317" elapsed="0.030257"/>
</kw>
<msg time="2026-08-22T23:18:00.831794" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:18:00.831841" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:18:00.800976" elapsed="0.030903"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:00.832182" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:00.831958" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:00.831938" elapsed="0.000322"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:00.832733" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:00.832398" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:00.833114" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:00.832898" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:00.832878" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:18:00.833227" 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-08-22T23:18:00.835987" elapsed="0.000143"/>
</kw>
<msg time="2026-08-22T23:18:00.836193" 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-08-22T23:18:00.834746" 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-08-22T23:18:00.836660" elapsed="0.000110"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:00.837051" 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-08-22T23:18:00.834055" 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-08-22T23:18:00.833496" elapsed="0.003826"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:18:00.744788" elapsed="0.092631"/>
</kw>
<msg time="2026-08-22T23:18:00.837511" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:18:00.837555" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:18:00.744211" elapsed="0.093404"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:18:00.837799" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:18:00.837694" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:00.837675" 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-08-22T23:18:00.838457" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:00.838836" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:18:00.838908" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:18:00.743546" elapsed="0.095469"/>
</kw>
<msg time="2026-08-22T23:18:00.839107" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:18:00.839150" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:18:00.738969" elapsed="0.100218"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:00.839507" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:00.839260" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:00.839243" elapsed="0.000482"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:18:00.738828" elapsed="0.100923"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:18:00.845117" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:00.845010" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:00.844991" 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-08-22T23:18:00.846361" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:00.846254" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:00.846236" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:18:00.846904" 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-08-22T23:18:00.846574" elapsed="0.000357"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:18:00.847301" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:18:00.847085" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:18:00.883192" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:18:00.847834" elapsed="0.035463"/>
</kw>
<msg time="2026-08-22T23:18:00.883470" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:18:00.883517" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:00.847481" elapsed="0.036073"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:18:00.904871" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:18:00.884077" elapsed="0.020903"/>
</kw>
<msg time="2026-08-22T23:18:00.905152" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:18:00.905200" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:18:00.883743" elapsed="0.021504"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:00.905543" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:00.905326" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:00.905306" elapsed="0.000341"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:00.906088" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:00.905787" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:00.906433" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:00.906223" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:00.906206" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:18:00.906544" 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-08-22T23:18:00.909242" elapsed="0.000143"/>
</kw>
<msg time="2026-08-22T23:18:00.909448" 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-08-22T23:18:00.908040" 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-08-22T23:18:00.909911" elapsed="0.000087"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:00.910271" 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-08-22T23:18:00.907351" 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-08-22T23:18:00.906815" elapsed="0.003726"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:18:00.845957" elapsed="0.064713"/>
</kw>
<msg time="2026-08-22T23:18:00.910762" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:18:00.910806" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:18:00.845371" elapsed="0.065472"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:18:00.911025" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:18:00.910920" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:00.910901" 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 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:00.911545" 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-08-22T23:18:00.912072" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:18:00.912147" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:18:00.844660" elapsed="0.067597"/>
</kw>
<msg time="2026-08-22T23:18:00.912349" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:18:00.912392" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:18:00.840027" elapsed="0.072403"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:00.912974" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:00.912505" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:00.912487" elapsed="0.000567"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:18:00.839887" elapsed="0.073190"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:18:00.657039" elapsed="0.256067"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:18:00.651523" elapsed="0.261651"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:18:00.642725" elapsed="0.270506"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:00.642109" elapsed="0.271167"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:18:00.637846" elapsed="0.275483"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:00.914887" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:00.914484" elapsed="0.000430"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:00.922087" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:00.921834" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:00.922524" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:00.922282" 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-08-22T23:18:00.930269" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:00.930423" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:00.930529" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:00.924745" elapsed="0.006275">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:00.922653" elapsed="0.008482">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:00.931393" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:00.931181" elapsed="0.000353"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:00.922634" elapsed="0.008935">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:00.932105" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:00.932292" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:00.932239" elapsed="0.000109"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:00.932216" elapsed="0.000161"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:00.932617" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:00.932720" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:00.917552" elapsed="0.015313">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:00.932990" elapsed="0.000024"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:00.915139" elapsed="0.017987">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:00.933437" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:00.933236" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:00.933213" elapsed="0.000336"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:00.933844" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:00.933648" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:00.933626" elapsed="0.000328"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:00.914083" elapsed="0.019977">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:01.937162" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:01.936177" elapsed="0.001055"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:01.952429" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:01.952169" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:01.952895" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:01.952645" 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-08-22T23:18:01.963240" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:01.963420" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:01.963556" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:01.955124" elapsed="0.008855">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:01.953018" elapsed="0.011118">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:01.964350" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:01.964176" elapsed="0.000252"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:01.952995" elapsed="0.011472">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:01.965024" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:01.965219" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:01.965163" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:01.965138" elapsed="0.000172"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:01.965509" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:01.965626" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:01.944082" elapsed="0.021691">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:01.965868" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:01.937820" elapsed="0.028175">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:01.966328" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:01.966125" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:01.966079" elapsed="0.000358"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:01.966726" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:01.966510" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:01.966488" elapsed="0.000349"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:01.935033" elapsed="0.031909">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:02.970075" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:02.969076" elapsed="0.001071"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:02.981431" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:02.981167" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:02.981905" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:02.981653" 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-08-22T23:18:02.991796" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:02.991998" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:02.992137" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:02.984197" elapsed="0.008413">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:02.982027" elapsed="0.010671">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:02.992894" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:02.992735" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:02.982005" elapsed="0.010980">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:02.993362" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:02.993503" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:02.993462" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:02.993444" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:02.993731" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:02.993803" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:02.976334" elapsed="0.017579">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:02.993983" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:02.970672" elapsed="0.023405">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:02.994300" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:02.994156" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:02.994140" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:02.994574" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:02.994435" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:02.994420" elapsed="0.000251"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:02.967857" elapsed="0.026892">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:03.997982" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:03.996982" elapsed="0.001083"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:04.012795" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:04.012518" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:04.013248" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:04.013001" 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-08-22T23:18:04.023141" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:04.023347" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:04.023572" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:04.015527" elapsed="0.008611">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:04.013366" elapsed="0.010886">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:04.024514" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:04.024301" elapsed="0.000328"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:04.013343" elapsed="0.011321">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:04.025189" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:04.025381" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:04.025326" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:04.025302" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:04.025690" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:04.025791" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:04.004217" elapsed="0.021717">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:04.026052" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:03.998678" elapsed="0.027506">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:04.026491" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:04.026294" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:04.026271" elapsed="0.000354"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:04.026895" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:04.026702" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:04.026680" elapsed="0.000326"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:03.995801" elapsed="0.031312">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:05.030717" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:05.029506" elapsed="0.001291"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:05.042242" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:05.041963" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:05.042722" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:05.042448" 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-08-22T23:18:05.053231" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:05.053427" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:05.053644" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:05.045079" elapsed="0.009001">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:05.042855" elapsed="0.011313">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:05.054368" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:05.054209" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:05.042825" elapsed="0.011635">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:05.054860" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:05.055021" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:05.054969" elapsed="0.000111"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:05.054948" elapsed="0.000159"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:05.055253" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:05.055324" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:05.035714" elapsed="0.019718">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:05.055502" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:05.031367" elapsed="0.024243">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:05.055834" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:05.055691" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:05.055675" elapsed="0.000239"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:05.056105" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:05.055967" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:05.055952" elapsed="0.000232"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:05.028141" elapsed="0.028128">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:06.059350" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:06.058283" elapsed="0.001137"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:06.071405" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:06.071043" elapsed="0.000429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:06.072052" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:06.071705" 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-08-22T23:18:06.083336" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:06.083500" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:06.083691" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:06.075185" elapsed="0.009010">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:06.072218" elapsed="0.012158">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:06.084825" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:06.084451" elapsed="0.000524"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:06.072188" elapsed="0.012841">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:06.085873" elapsed="0.000058"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:06.086176" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:06.086091" elapsed="0.000181"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:06.086052" 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-08-22T23:18:06.086660" elapsed="0.000074"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:06.086847" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:06.064736" elapsed="0.022372">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:06.087313" elapsed="0.000038"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:06.059953" elapsed="0.027582">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:06.088092" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:06.087751" elapsed="0.000469"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:06.087713" elapsed="0.000560"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:06.088729" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:06.088392" elapsed="0.000462"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:06.088358" elapsed="0.000548"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:06.057175" elapsed="0.031901">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:07.090793" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:07.090305" elapsed="0.000525"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:07.099982" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:07.099710" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:07.100435" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:07.100186" 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-08-22T23:18:07.110265" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:07.110426" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:07.110630" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:07.102644" elapsed="0.008379">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:07.100559" elapsed="0.010549">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:07.111301" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:07.111145" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:07.100534" elapsed="0.010858">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:07.111793" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:07.111934" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:07.111892" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:07.111875" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:07.112143" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:07.112214" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:07.093606" elapsed="0.018715">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:07.112391" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:07.091089" elapsed="0.021395">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:07.112722" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:07.112562" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:07.112546" elapsed="0.000257"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:07.112993" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:07.112856" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:07.112841" elapsed="0.000233"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:07.089706" elapsed="0.023447">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:08.116499" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:08.115277" elapsed="0.001297"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:08.131324" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:08.131040" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:08.131798" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:08.131527" 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-08-22T23:18:08.183423" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:08.183623" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:08.183834" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:08.175312" elapsed="0.008974">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:08.131925" elapsed="0.052458">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:08.184621" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:08.184424" elapsed="0.000268"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:08.131900" elapsed="0.052817">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:08.185372" elapsed="0.000065"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:08.185729" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:08.185640" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:08.185565" 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-08-22T23:18:08.186187" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:08.186342" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:08.123225" elapsed="0.063383">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:08.186766" elapsed="0.000035"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:08.117205" elapsed="0.069851">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:08.187679" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:08.187274" elapsed="0.000543"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:08.187232" elapsed="0.000640"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:08.188386" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:08.188036" elapsed="0.000492"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:08.187998" elapsed="0.000619"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:08.114081" elapsed="0.074718">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:09.191967" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:09.190938" elapsed="0.001100"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:09.203559" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:09.203294" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:09.204056" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:09.203780" 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-08-22T23:18:09.214238" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:09.214404" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:09.214608" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:09.206271" elapsed="0.008774">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:09.204182" elapsed="0.010960">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:09.215340" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:09.215179" elapsed="0.000228"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:09.204158" elapsed="0.011274">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:09.215828" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:09.215969" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:09.215929" elapsed="0.000108"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:09.215911" elapsed="0.000163"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:09.216225" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:09.216299" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:09.198054" elapsed="0.018352">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:09.216478" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:09.192535" elapsed="0.024054">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:09.216818" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:09.216673" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:09.216656" elapsed="0.000243"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:09.217101" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:09.216954" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:09.216937" elapsed="0.000248"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:09.189753" elapsed="0.027510">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:10.220350" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:10.219326" elapsed="0.001099"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:10.232004" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:10.231562" elapsed="0.000537"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:10.232807" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:10.232340" elapsed="0.000540"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:18:10.243725" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:10.243918" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:10.244186" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:10.235514" elapsed="0.009257">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:10.233015" elapsed="0.011902">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:10.245243" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:10.244972" elapsed="0.000373"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:10.232975" elapsed="0.012404">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:10.246109" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:10.246315" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:10.246259" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:10.246232" elapsed="0.000176"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:10.246632" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:10.246732" elapsed="0.000025"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:10.224988" elapsed="0.021933">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:10.247044" elapsed="0.000031"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:10.220958" elapsed="0.026249">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:10.247521" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:10.247320" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:10.247297" elapsed="0.000360"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:10.247926" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:10.247732" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:10.247710" elapsed="0.000341"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:10.218197" elapsed="0.029998">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:11.251426" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:11.250371" elapsed="0.001127"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:11.263885" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:11.263598" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:11.264332" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:11.264086" 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-08-22T23:18:11.273189" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:11.273371" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:11.273573" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:11.266512" elapsed="0.007480">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:11.264457" elapsed="0.009636">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:11.274289" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:11.274131" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:11.264432" elapsed="0.009949">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:11.274799" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:11.274939" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:11.274898" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:11.274881" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:11.275152" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:11.275224" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:11.257641" elapsed="0.017690">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:11.275401" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:11.252025" elapsed="0.023469">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:11.275749" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:11.275572" elapsed="0.000235"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:11.275556" elapsed="0.000279"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:11.276091" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:11.275906" elapsed="0.000244"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:11.275886" elapsed="0.000287"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:11.249264" elapsed="0.026987">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<msg time="2026-08-22T23:18:11.276346" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:18:00.913495" elapsed="10.362945">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<doc>Check that the created device data make their way into the checker node.</doc>
<status status="FAIL" start="2026-08-22T23:18:00.637156" elapsed="10.639515">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</test>
<test id="s1-s1-t14" name="Check_New_Device_Data_Is_Visible_On_Configurer" line="165">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:18:11.281420" elapsed="0.000329"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:18:11.281061" elapsed="0.000767"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:18:11.283215" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:11.283055" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:11.283029" elapsed="0.000279"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:18:11.288961" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:11.288854" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:11.288836" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:18:11.290036" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:18:11.289645" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:18:11.290525" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:18:11.290223" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:18:11.290600" elapsed="0.000045"/>
</return>
<msg time="2026-08-22T23:18:11.290774" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:18:11.289255" 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-08-22T23:18:11.296174" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:11.296059" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:11.296040" 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-08-22T23:18:11.297443" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:11.297336" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:11.297318" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:18:11.298001" 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-08-22T23:18:11.297676" elapsed="0.000352"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:18:11.298413" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:18:11.298184" elapsed="0.000255"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:18:11.335181" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:18:11.298948" elapsed="0.036349"/>
</kw>
<msg time="2026-08-22T23:18:11.335495" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:18:11.335544" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:11.298596" elapsed="0.036988"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:18:11.361850" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:18:11.336144" elapsed="0.025837"/>
</kw>
<msg time="2026-08-22T23:18:11.362164" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:18:11.362210" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:18:11.335782" elapsed="0.026465"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:11.362567" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:11.362332" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:11.362308" elapsed="0.000367"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:11.363157" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:11.362837" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:11.363511" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:11.363297" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:11.363279" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:18:11.363646" 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-08-22T23:18:11.366633" elapsed="0.000156"/>
</kw>
<msg time="2026-08-22T23:18:11.366860" 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-08-22T23:18:11.365196" elapsed="0.001919"/>
</kw>
<kw name="Open 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-08-22T23:18:11.367441" elapsed="0.000091"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:11.367847" 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-08-22T23:18:11.364476" elapsed="0.003580"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:18:11.363935" elapsed="0.004189"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:18:11.297035" elapsed="0.071188"/>
</kw>
<msg time="2026-08-22T23:18:11.368314" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:18:11.368358" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:18:11.296390" elapsed="0.072004"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:18:11.368582" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-08-22T23:18:11.368471" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:11.368452" elapsed="0.000236"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:11.369086" 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-08-22T23:18:11.369415" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:18:11.369487" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:18:11.295722" elapsed="0.073875"/>
</kw>
<msg time="2026-08-22T23:18:11.369851" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:18:11.369895" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:18:11.291178" elapsed="0.078754"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:11.370253" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:11.370007" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:11.369990" elapsed="0.000340"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:18:11.291039" elapsed="0.079314"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:18:11.375860" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:11.375748" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:11.375727" 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-08-22T23:18:11.377149" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:11.377039" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:11.377020" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:18:11.377698" 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-08-22T23:18:11.377359" elapsed="0.000365"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:18:11.378132" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:18:11.377889" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:18:11.422311" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:18:11.378675" elapsed="0.043776"/>
</kw>
<msg time="2026-08-22T23:18:11.422678" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:18:11.422728" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:11.378316" elapsed="0.044449"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:18:11.455944" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:18:11.423413" elapsed="0.032735"/>
</kw>
<msg time="2026-08-22T23:18:11.456330" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:18:11.456378" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:18:11.422988" elapsed="0.033427"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:11.456790" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:11.456510" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:11.456483" elapsed="0.000390"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:11.457338" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:11.457017" 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-08-22T23:18:11.457711" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:11.457477" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:11.457459" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:18:11.457828" 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-08-22T23:18:11.460724" elapsed="0.000356"/>
</kw>
<msg time="2026-08-22T23:18:11.461148" 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-08-22T23:18:11.459451" elapsed="0.001851"/>
</kw>
<kw name="Open 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-08-22T23:18:11.461626" elapsed="0.000091"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:11.462021" 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-08-22T23:18:11.458758" elapsed="0.003477"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:18:11.458167" elapsed="0.004137"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:18:11.376677" elapsed="0.085723"/>
</kw>
<msg time="2026-08-22T23:18:11.462491" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:18:11.462535" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:18:11.376080" elapsed="0.086491"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:18:11.462778" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:18:11.462672" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:11.462653" 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-08-22T23:18:11.463253" 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-08-22T23:18:11.463585" elapsed="0.000185"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:18:11.463820" 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-08-22T23:18:11.375355" elapsed="0.088574"/>
</kw>
<msg time="2026-08-22T23:18:11.464026" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:18:11.464070" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:18:11.370632" elapsed="0.093475"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:11.464426" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:11.464181" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:11.464164" elapsed="0.000339"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:18:11.370479" elapsed="0.094047"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:18:11.469980" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:11.469872" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:11.469852" 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-08-22T23:18:11.471245" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:11.471138" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:11.471120" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:18:11.471800" 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-08-22T23:18:11.471454" elapsed="0.000373"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:18:11.472203" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:18:11.471981" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:18:11.507983" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:18:11.472732" elapsed="0.035411"/>
</kw>
<msg time="2026-08-22T23:18:11.508345" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:18:11.508393" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:11.472383" elapsed="0.036047"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:18:11.529743" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:18:11.509055" elapsed="0.020811"/>
</kw>
<msg time="2026-08-22T23:18:11.530045" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:18:11.530090" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:18:11.508664" elapsed="0.021463"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:11.530482" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:11.530226" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:11.530198" elapsed="0.000367"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:11.531067" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:11.530736" 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-08-22T23:18:11.531419" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:11.531207" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:11.531189" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:18:11.531533" 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-08-22T23:18:11.534457" elapsed="0.000171"/>
</kw>
<msg time="2026-08-22T23:18:11.534694" 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-08-22T23:18:11.533198" 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-08-22T23:18:11.535143" elapsed="0.000320"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:11.535780" 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-08-22T23:18:11.532469" elapsed="0.003518"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:18:11.531875" elapsed="0.004179"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:18:11.470838" elapsed="0.065314"/>
</kw>
<msg time="2026-08-22T23:18:11.536243" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:18:11.536286" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:18:11.470243" elapsed="0.066079"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:18:11.536519" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:18:11.536413" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:11.536394" elapsed="0.000278"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:11.537069" 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-08-22T23:18:11.537397" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:18:11.537467" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:18:11.469509" elapsed="0.068068"/>
</kw>
<msg time="2026-08-22T23:18:11.537695" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:18:11.537739" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:18:11.464813" elapsed="0.072962"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:11.538094" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:11.537849" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:11.537832" elapsed="0.000339"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:18:11.464674" elapsed="0.073521"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:18:11.290859" elapsed="0.247369"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:18:11.288405" elapsed="0.249883"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:18:11.282652" elapsed="0.255693"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:11.282037" elapsed="0.256353"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:18:11.278055" elapsed="0.260388"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:11.540172" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:11.539785" elapsed="0.000414"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:11.547572" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:11.547304" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:11.548042" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:11.547793" 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-08-22T23:18:11.571109" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:11.571292" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:18:11.571427" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:18:11.550268" elapsed="0.021186"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:11.548155" elapsed="0.023355"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:11.571781" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:11.571545" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:11.548136" elapsed="0.023736"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:11.575757" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:11.573008" elapsed="0.002802"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:11.572774" elapsed="0.003074"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:11.572754" elapsed="0.003120"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:11.578545" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:11.576232" elapsed="0.002365"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:11.575999" elapsed="0.002647"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:11.575981" elapsed="0.002691"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:18:11.579270" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:11.578865" 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-08-22T23:18:11.579624" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:11.579369" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:11.580173" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:11.579869" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:11.579709" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:11.579350" elapsed="0.000910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:18:11.580802" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:11.580417" 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-08-22T23:18:11.581130" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:11.580899" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:11.581684" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:11.581369" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:11.581212" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:11.580881" elapsed="0.000886"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:18:11.581958" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:18:11.582802" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:11.582473" 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-08-22T23:18:11.582980" 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-08-22T23:18:11.572285" elapsed="0.013200"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:18:11.585694" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:18:11.585558" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:11.585540" 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-08-22T23:18:11.585937" elapsed="0.000046"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:11.586033" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:18:11.588378" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:18:11.542925" elapsed="0.045482"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:18:11.588469" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:18:11.588641" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:18:11.540411" elapsed="0.048259"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:18:11.589324" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:18:11.588952" elapsed="0.000455">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:11.588742" elapsed="0.000739">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:18:11.588725" elapsed="0.000791">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:11.589819" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:11.589668" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:11.589649" elapsed="0.000252"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:11.539348" elapsed="0.050642">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:12.593138" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:12.592163" elapsed="0.001057"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:12.604851" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:12.604573" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:12.605300" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:12.605051" 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-08-22T23:18:12.630682" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:12.630834" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:18:12.630933" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:18:12.607484" elapsed="0.023476"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:12.605421" elapsed="0.025582"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:12.631206" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:12.631033" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:12.605397" elapsed="0.025915"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:12.634818" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:12.632334" elapsed="0.002533"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:12.632114" elapsed="0.002788"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:12.632095" elapsed="0.002832"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:12.637529" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:12.635200" elapsed="0.002379"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:12.634982" elapsed="0.002645"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:12.634966" elapsed="0.002687"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:18:12.638219" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:12.637826" 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-08-22T23:18:12.638549" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:12.638316" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:12.639110" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:12.638811" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:12.638650" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:12.638298" elapsed="0.000896"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:18:12.639726" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:12.639347" 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-08-22T23:18:12.640101" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:12.639824" elapsed="0.000338"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:12.640678" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:12.640345" elapsed="0.000360"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:12.640186" elapsed="0.000614"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:12.639806" 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-08-22T23:18:12.640977" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:18:12.641801" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:12.641488" 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-08-22T23:18:12.641979" elapsed="0.002287"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:18:12.631692" elapsed="0.012640"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:18:12.644510" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:18:12.644402" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:12.644383" 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-08-22T23:18:12.644789" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:12.644861" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:18:12.647167" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:18:12.598245" elapsed="0.048952"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:18:12.647257" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:18:12.647409" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:18:12.593768" elapsed="0.053667"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:18:12.648092" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:18:12.647729" elapsed="0.000440">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:12.647505" elapsed="0.000733">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:18:12.647488" elapsed="0.000784">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:12.648488" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:12.648343" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:12.648326" elapsed="0.000241"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:12.590996" elapsed="0.057671">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:13.651455" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:13.650517" elapsed="0.001006"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:13.663300" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:13.662962" elapsed="0.000386"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:13.663767" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:13.663499" 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-08-22T23:18:13.686415" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:13.686821" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:18:13.687048" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:18:13.665941" elapsed="0.021168"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:13.663885" elapsed="0.023332"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:13.687734" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:13.687353" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:13.663864" elapsed="0.024069"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:13.695912" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:13.690212" elapsed="0.005812"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:13.689726" elapsed="0.006377"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:13.689685" elapsed="0.006474"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:13.698759" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:13.696491" elapsed="0.002313"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:13.696273" elapsed="0.002567"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:13.696249" elapsed="0.002615"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:18:13.699417" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:13.699031" 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-08-22T23:18:13.699795" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:13.699518" elapsed="0.000336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:13.700333" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:13.700036" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:13.699878" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:13.699497" elapsed="0.000920"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:18:13.700946" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:13.700570" 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-08-22T23:18:13.701267" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:13.701042" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:13.701814" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:13.701501" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:13.701347" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:13.701024" 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-08-22T23:18:13.702043" elapsed="0.000379"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:18:13.702891" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:13.702587" 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-08-22T23:18:13.703066" elapsed="0.004150"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:18:13.688743" elapsed="0.018632"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:18:13.707933" elapsed="0.000067"/>
</return>
<status status="PASS" start="2026-08-22T23:18:13.707532" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:13.707491" elapsed="0.000645"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:13.708363" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:13.708435" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:18:13.710772" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:18:13.656921" elapsed="0.053880"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:18:13.710918" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:18:13.711074" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:18:13.652037" elapsed="0.059064"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:18:13.711782" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:18:13.711383" elapsed="0.000501">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:13.711171" elapsed="0.000786">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:18:13.711153" elapsed="0.000839">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:13.712209" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:13.712064" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:13.712047" elapsed="0.000247"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:13.649487" elapsed="0.062889">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:14.715783" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:14.714569" elapsed="0.001296"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:14.727512" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:14.727157" elapsed="0.000404"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:14.727981" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:14.727731" 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-08-22T23:18:14.751010" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:14.751183" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:18:14.751288" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:18:14.730217" elapsed="0.021097"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:14.728107" elapsed="0.023250"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:14.751553" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:14.751395" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:14.728081" elapsed="0.023593"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:14.757004" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:14.752751" elapsed="0.004314"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:14.752502" elapsed="0.004602"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:14.752483" elapsed="0.004647"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:14.760371" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:14.757415" elapsed="0.003006"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:14.757187" elapsed="0.003271"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:14.757170" elapsed="0.003313"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:18:14.761124" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:14.760686" 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-08-22T23:18:14.761527" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:14.761224" elapsed="0.000367"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:14.762149" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:14.761796" elapsed="0.000381"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:14.761631" elapsed="0.000583"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:14.761205" elapsed="0.001031"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:18:14.762784" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:14.762396" 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-08-22T23:18:14.763112" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:14.762881" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:14.763694" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:14.763377" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:14.763217" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:14.762863" 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-08-22T23:18:14.763931" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:18:14.764778" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:14.764445" 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-08-22T23:18:14.764957" elapsed="0.002333"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:18:14.752063" elapsed="0.015295"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:18:14.767540" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:18:14.767428" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:14.767409" 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-08-22T23:18:14.767801" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:14.767874" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:18:14.770956" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:18:14.720918" elapsed="0.050076"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:18:14.771071" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:18:14.771273" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:18:14.716467" elapsed="0.054844"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:18:14.772200" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:18:14.771717" elapsed="0.000609">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:14.771424" elapsed="0.000999">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:18:14.771401" elapsed="0.001069">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:14.772791" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:14.772561" elapsed="0.000312"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:14.772538" elapsed="0.000369"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:14.713385" elapsed="0.059648">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:15.776147" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:15.775170" elapsed="0.001047"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:15.788140" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:15.787877" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:15.788591" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:15.788341" 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-08-22T23:18:15.812325" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:15.812489" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:18:15.812615" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:18:15.790816" elapsed="0.021827"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:15.788733" elapsed="0.023954"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:15.812870" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:15.812718" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:15.788708" elapsed="0.024250"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:15.816413" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:15.813994" elapsed="0.002468"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:15.813769" elapsed="0.002728"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:15.813750" elapsed="0.002772"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:15.819088" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:15.816817" elapsed="0.002317"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:15.816581" elapsed="0.002588"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:15.816561" elapsed="0.002633"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:18:15.819806" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:15.819369" 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-08-22T23:18:15.820139" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:15.819905" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:15.820691" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:15.820376" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:15.820220" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:15.819887" elapsed="0.000889"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:18:15.821291" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:15.820929" 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-08-22T23:18:15.821637" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:15.821390" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:15.822168" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:15.821875" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:15.821719" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:15.821372" 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-08-22T23:18:15.822400" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:18:15.823220" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:15.822924" 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-08-22T23:18:15.823442" elapsed="0.002310"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:18:15.813326" elapsed="0.012489"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:18:15.825993" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:18:15.825885" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:15.825866" 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-08-22T23:18:15.826230" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:15.826300" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:18:15.828772" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:18:15.782802" elapsed="0.045999"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:18:15.828863" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:18:15.829027" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:18:15.776751" elapsed="0.052303"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:18:15.829722" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:18:15.829334" elapsed="0.000472">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:15.829126" elapsed="0.000756">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:18:15.829108" elapsed="0.000810">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:15.830150" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:15.829998" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:15.829980" elapsed="0.000268"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:15.773916" elapsed="0.056419">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:16.833457" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:16.832447" elapsed="0.001081"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:16.845589" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:16.845245" elapsed="0.000407"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:16.846047" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:16.845802" 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-08-22T23:18:16.872187" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:16.872477" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:18:16.872730" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:18:16.848246" elapsed="0.024542"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:16.846169" elapsed="0.026714"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:16.873382" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:16.873037" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:16.846145" elapsed="0.027491"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:16.881341" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:16.875929" elapsed="0.005519"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:16.875406" elapsed="0.006120"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:16.875365" elapsed="0.006223"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:16.884685" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:16.882299" elapsed="0.002432"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:16.881800" elapsed="0.002967"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:16.881760" elapsed="0.003031"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:18:16.885373" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:16.884967" 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-08-22T23:18:16.885737" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:16.885471" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:16.886278" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:16.885978" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:16.885820" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:16.885452" elapsed="0.000909"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:18:16.886899" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:16.886516" 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-08-22T23:18:16.887222" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:16.886995" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:16.887769" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:16.887459" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:16.887303" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:16.886977" 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-08-22T23:18:16.888002" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:18:16.888828" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:16.888508" 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-08-22T23:18:16.889005" 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-08-22T23:18:16.874427" elapsed="0.017157"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:18:16.891779" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:18:16.891668" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:16.891649" 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-08-22T23:18:16.892022" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:16.892092" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:18:16.894420" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:18:16.839140" elapsed="0.055309"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:18:16.894508" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:18:16.894694" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:18:16.834059" elapsed="0.060668"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:18:16.895489" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:18:16.895062" elapsed="0.000594">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:16.894811" elapsed="0.000933">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:18:16.894791" elapsed="0.000992">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:16.896044" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:16.895865" elapsed="0.000244"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:16.895845" elapsed="0.000290"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:16.831290" elapsed="0.064942">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:17.899407" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:17.898411" elapsed="0.001068"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:17.911613" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:17.911232" elapsed="0.000453"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:17.912237" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:17.911895" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:18:17.934772" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:17.935088" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:18:17.935309" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:18:17.914821" elapsed="0.020545"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:17.912414" elapsed="0.023050"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:17.935912" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:17.935525" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:17.912381" elapsed="0.023726"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:17.944251" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:17.938432" elapsed="0.005929"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:17.937942" elapsed="0.006497"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:17.937900" elapsed="0.006596"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:17.948320" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:17.945156" elapsed="0.003210"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:17.944660" elapsed="0.003742"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:17.944618" elapsed="0.003808"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:18:17.949037" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:17.948622" 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-08-22T23:18:17.949376" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:17.949135" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:17.949981" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:17.949676" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:17.949492" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:17.949117" elapsed="0.000949"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:18:17.950680" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:17.950222" 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-08-22T23:18:17.951010" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:17.950778" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:17.951545" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:17.951250" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:17.951092" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:17.950760" 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-08-22T23:18:17.951800" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:18:17.952632" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:17.952312" 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-08-22T23:18:17.952812" elapsed="0.002307"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:18:17.936935" elapsed="0.018250"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:18:17.955364" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:18:17.955254" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:17.955236" 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-08-22T23:18:17.955621" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:17.955695" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:18:17.958012" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:18:17.905225" elapsed="0.052816"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:18:17.958100" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:18:17.958251" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:18:17.900016" elapsed="0.058261"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:18:17.958932" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:18:17.958553" elapsed="0.000459">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:17.958346" elapsed="0.000739">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:18:17.958329" elapsed="0.000790">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:17.959334" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:17.959189" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:17.959172" elapsed="0.000242"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:17.897243" elapsed="0.062252">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:18.962490" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:18.961514" elapsed="0.001144"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:18.975263" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:18.975000" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:18.975832" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:18.975566" 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-08-22T23:18:18.999186" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:18.999499" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:18:18.999791" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:18:18.978042" elapsed="0.021817"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:18.975960" elapsed="0.023999"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:19.000375" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:19.000022" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:18.975934" elapsed="0.024638"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:19.006633" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:19.003011" elapsed="0.003694"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:19.002475" elapsed="0.004280"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:19.002433" elapsed="0.004357"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:19.010423" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:19.007205" elapsed="0.003285"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:19.006870" elapsed="0.003669"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:19.006846" elapsed="0.003734"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:18:19.011519" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:19.010843" 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-08-22T23:18:19.011956" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:19.011715" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:19.012629" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:19.012298" elapsed="0.000359"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:19.012049" elapsed="0.000646"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:19.011693" elapsed="0.001023"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:18:19.013251" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:19.012872" 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-08-22T23:18:19.013600" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:19.013349" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:19.014147" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:19.013840" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:19.013684" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:19.013331" 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-08-22T23:18:19.014385" elapsed="0.000375"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:18:19.015269" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:19.014924" 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-08-22T23:18:19.015468" 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-08-22T23:18:19.001468" elapsed="0.016416"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:18:19.018070" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:18:19.017956" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:19.017937" 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-08-22T23:18:19.018380" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:19.018453" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:18:19.020839" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:18:18.968787" elapsed="0.052081"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:18:19.020930" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:18:19.021084" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:18:18.963170" elapsed="0.057940"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:18:19.021795" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:18:19.021401" elapsed="0.000481">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:19.021183" elapsed="0.000774">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:18:19.021165" elapsed="0.000827">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:19.022209" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:19.022063" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:19.022045" elapsed="0.000254"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:18.960412" elapsed="0.061973">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:20.024515" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:20.024027" elapsed="0.000530"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:20.032189" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:20.031927" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:20.032687" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:20.032395" 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-08-22T23:18:20.055224" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:20.055384" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:18:20.055484" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:18:20.034909" elapsed="0.020601"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:20.032810" elapsed="0.022745"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:20.055765" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:20.055609" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:20.032787" elapsed="0.023068"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:20.059418" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:20.056894" elapsed="0.002572"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:20.056671" elapsed="0.002902"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:20.056653" elapsed="0.002964"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:20.062249" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:20.059900" elapsed="0.002395"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:20.059677" elapsed="0.002653"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:20.059660" elapsed="0.002695"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:18:20.062956" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:20.062539" 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-08-22T23:18:20.063325" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:20.063086" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:20.063886" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:20.063567" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:20.063407" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:20.063068" elapsed="0.000904"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:18:20.064491" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:20.064128" 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-08-22T23:18:20.064842" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:20.064607" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:20.065384" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:20.065085" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:20.064926" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:20.064572" 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-08-22T23:18:20.065649" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:18:20.066460" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:20.066166" 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-08-22T23:18:20.066657" 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-08-22T23:18:20.056214" elapsed="0.013031"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:18:20.069431" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:18:20.069315" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:20.069297" 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-08-22T23:18:20.069693" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:20.069766" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:18:20.072154" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:18:20.027622" elapsed="0.044561"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:18:20.072245" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:18:20.072401" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:18:20.024809" elapsed="0.047621"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:18:20.073094" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:18:20.072727" elapsed="0.000451">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:20.072501" elapsed="0.000753">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:18:20.072484" elapsed="0.000842">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:20.073550" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:20.073402" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:20.073385" elapsed="0.000268"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:20.023378" elapsed="0.050364">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:21.076783" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:21.075787" elapsed="0.001068"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:21.089057" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:21.088796" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:21.089522" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:21.089274" 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-08-22T23:18:21.113852" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:21.114053" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:18:21.114202" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:18:21.091744" elapsed="0.022486"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:21.089671" elapsed="0.024619"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:21.114549" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:21.114327" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:21.089646" elapsed="0.025018"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:21.118576" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:21.115835" elapsed="0.002810"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:21.115572" elapsed="0.003108"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:21.115553" elapsed="0.003153"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:21.121270" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:21.118983" elapsed="0.002333"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:21.118763" elapsed="0.002588"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:21.118746" elapsed="0.002630"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:18:21.122001" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:21.121581" 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-08-22T23:18:21.122336" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:21.122100" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:21.122904" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:21.122581" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:21.122418" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:21.122082" elapsed="0.000906"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:18:21.123504" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:21.123144" 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-08-22T23:18:21.123932" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:21.123621" elapsed="0.000371"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:21.124557" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:21.124251" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:21.124016" elapsed="0.000624"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:21.123601" elapsed="0.001061"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:18:21.124817" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:18:21.125678" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:21.125330" 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-08-22T23:18:21.125860" elapsed="0.002311"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:18:21.115089" elapsed="0.013146"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:18:21.128416" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:18:21.128305" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:21.128287" 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-08-22T23:18:21.128678" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:21.128751" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:18:21.131104" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:18:21.082942" elapsed="0.048192"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:18:21.131195" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:18:21.131348" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:18:21.077376" elapsed="0.054005"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:18:21.132077" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:18:21.131710" elapsed="0.000449">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:21.131467" elapsed="0.000767">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:18:21.131446" elapsed="0.000823">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:21.132487" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:21.132340" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:21.132323" elapsed="0.000244"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:21.074675" elapsed="0.057995">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.135689" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:22.134713" elapsed="0.001048"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.147681" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:22.147398" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.148134" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:22.147885" 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-08-22T23:18:22.178223" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:22.178504" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:18:22.178720" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:18:22.150365" elapsed="0.028385"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:22.148257" elapsed="0.030555"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.179078" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.178851" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.148232" elapsed="0.030938"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.182937" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:22.180362" elapsed="0.002626"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:22.180120" elapsed="0.002904"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.180099" elapsed="0.002951"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.185669" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:22.183326" elapsed="0.002390"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:22.183107" elapsed="0.002645"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.183091" elapsed="0.002687"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.186358" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:22.185956" 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-08-22T23:18:22.186725" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.186458" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.187275" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:22.186971" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:22.186810" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.186439" elapsed="0.000924"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.187905" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:22.187520" 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-08-22T23:18:22.188230" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.188001" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.188784" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:22.188468" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:22.188312" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.187984" 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-08-22T23:18:22.189021" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:18:22.189852" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:22.189531" 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-08-22T23:18:22.190032" elapsed="0.002327"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:18:22.179621" elapsed="0.012804"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:18:22.192631" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-08-22T23:18:22.192497" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.192478" elapsed="0.000256"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.192881" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:22.192951" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:18:22.195299" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:18:22.141892" elapsed="0.053436"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:18:22.195439" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:18:22.195614" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:18:22.136248" elapsed="0.059395"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.196299" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:18:22.195927" elapsed="0.000455">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:22.195716" elapsed="0.000739">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:18:22.195698" elapsed="0.000792">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.196729" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.196561" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:22.196544" elapsed="0.000267"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:22.133567" elapsed="0.063329">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<msg time="2026-08-22T23:18:22.196992" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:18:11.538773" elapsed="10.658320">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<doc>Check that the created device data make their way into the configurer node.</doc>
<status status="FAIL" start="2026-08-22T23:18:11.277064" elapsed="10.920209">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</test>
<test id="s1-s1-t15" name="Modify_Device_Data" line="174">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:18:22.200976" elapsed="0.000253"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:18:22.200712" 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-08-22T23:18:22.202314" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:22.202196" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.202176" 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-08-22T23:18:22.207726" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:22.207609" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.207570" elapsed="0.000226"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.208851" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:18:22.208421" elapsed="0.000467"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.209567" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:18:22.209110" elapsed="0.000510"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:18:22.209680" elapsed="0.000042"/>
</return>
<msg time="2026-08-22T23:18:22.209871" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:18:22.208029" elapsed="0.001873"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:18:22.216545" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:22.216391" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.216362" elapsed="0.000294"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:18:22.218379" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:22.218162" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.218138" elapsed="0.000337"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:18:22.219137" 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-08-22T23:18:22.218696" elapsed="0.000477"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:18:22.219736" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:18:22.219390" elapsed="0.000383"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:18:22.256397" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:18:22.220429" elapsed="0.036144"/>
</kw>
<msg time="2026-08-22T23:18:22.256828" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:18:22.256889" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.219985" elapsed="0.036953"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:18:22.271056" level="INFO">"t "x "t ". "C "R "U "D ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:18:22.257714" elapsed="0.013446"/>
</kw>
<msg time="2026-08-22T23:18:22.271368" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:18:22.271416" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.257183" elapsed="0.014271"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.271819" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.271547" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.271520" elapsed="0.000383"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.272367" level="INFO"> "t "x "t ". "C "R "U "D ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:22.272050" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.272734" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.272498" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.272479" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:18:22.272852" 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-08-22T23:18:22.275763" elapsed="0.000150"/>
</kw>
<msg time="2026-08-22T23:18:22.275979" 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-08-22T23:18:22.274459" 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-08-22T23:18:22.276426" elapsed="0.000091"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.276825" 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-08-22T23:18:22.273757" elapsed="0.003277"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:18:22.273165" elapsed="0.003938"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:18:22.217734" elapsed="0.059468"/>
</kw>
<msg time="2026-08-22T23:18:22.277296" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:18:22.277340" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.216855" elapsed="0.060522"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:18:22.277562" elapsed="0.000049"/>
</return>
<status status="PASS" start="2026-08-22T23:18:22.277455" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.277436" elapsed="0.000234"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.278077" 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-08-22T23:18:22.278478" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:18:22.278551" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:18:22.215937" elapsed="0.062893"/>
</kw>
<msg time="2026-08-22T23:18:22.278925" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:18:22.278969" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.210291" elapsed="0.068715"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.279334" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.279084" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.279066" elapsed="0.000378"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:18:22.210149" elapsed="0.069320"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:18:22.284917" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:22.284808" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.284788" 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-08-22T23:18:22.286160" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:22.286053" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.286035" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:18:22.286714" 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-08-22T23:18:22.286369" elapsed="0.000372"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:18:22.287123" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:18:22.286897" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:18:22.332143" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:18:22.287874" elapsed="0.044508"/>
</kw>
<msg time="2026-08-22T23:18:22.332650" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:18:22.332701" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.287305" elapsed="0.045434"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:18:22.349573" level="INFO">"t "x "t ". "C "R "U "D ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:18:22.335394" elapsed="0.014293"/>
</kw>
<msg time="2026-08-22T23:18:22.349860" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:18:22.349907" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.332987" elapsed="0.016956"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.350291" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.350039" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.350011" elapsed="0.000364"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.350873" level="INFO"> "t "x "t ". "C "R "U "D ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:22.350515" 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-08-22T23:18:22.351216" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.351002" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.350984" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:18:22.351331" 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-08-22T23:18:22.354233" elapsed="0.000149"/>
</kw>
<msg time="2026-08-22T23:18:22.354506" 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-08-22T23:18:22.352979" elapsed="0.001701"/>
</kw>
<kw name="Open 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-08-22T23:18:22.354980" elapsed="0.000088"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.355351" 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-08-22T23:18:22.352256" elapsed="0.003303"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:18:22.351661" elapsed="0.004005"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:18:22.285754" elapsed="0.070011"/>
</kw>
<msg time="2026-08-22T23:18:22.355857" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:18:22.355901" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.285137" elapsed="0.070800"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:18:22.356140" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:18:22.356033" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.356015" 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-08-22T23:18:22.356645" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.356975" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:18:22.357047" 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-08-22T23:18:22.284433" elapsed="0.072724"/>
</kw>
<msg time="2026-08-22T23:18:22.357250" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:18:22.357294" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.279766" elapsed="0.077565"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.357814" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.357408" elapsed="0.000463"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.357391" elapsed="0.000505"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:18:22.279624" elapsed="0.078297"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:18:22.363372" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:22.363266" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.363247" 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-08-22T23:18:22.364628" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:22.364497" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.364479" elapsed="0.000217"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:18:22.365157" 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-08-22T23:18:22.364838" elapsed="0.000345"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:18:22.365635" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:18:22.365338" elapsed="0.000324"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:18:22.399203" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:18:22.366148" elapsed="0.033286"/>
</kw>
<msg time="2026-08-22T23:18:22.399704" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:18:22.399752" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.365818" elapsed="0.033971"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:18:22.413607" level="INFO">"t "x "t ". "C "R "U "D ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:18:22.400556" elapsed="0.013282"/>
</kw>
<msg time="2026-08-22T23:18:22.414036" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:18:22.414083" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.400049" elapsed="0.014070"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.414527" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.414229" elapsed="0.000390"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.414194" elapsed="0.000458"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.415173" level="INFO"> "t "x "t ". "C "R "U "D ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:22.414799" 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-08-22T23:18:22.415881" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.415654" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.415284" elapsed="0.000677"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:18:22.416000" 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-08-22T23:18:22.418952" elapsed="0.000152"/>
</kw>
<msg time="2026-08-22T23:18:22.419168" 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-08-22T23:18:22.417707" elapsed="0.001614"/>
</kw>
<kw name="Open 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-08-22T23:18:22.419644" elapsed="0.000090"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.420013" 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-08-22T23:18:22.416984" elapsed="0.003238"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:18:22.416327" elapsed="0.003965"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:18:22.364197" elapsed="0.056193"/>
</kw>
<msg time="2026-08-22T23:18:22.420512" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:18:22.420557" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.363604" elapsed="0.057011"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:18:22.420801" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:18:22.420694" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.420675" 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-08-22T23:18:22.421286" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.421676" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:18:22.421747" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:18:22.362922" elapsed="0.058933"/>
</kw>
<msg time="2026-08-22T23:18:22.421951" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:18:22.421995" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.358194" elapsed="0.063837"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.422357" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.422107" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.422089" elapsed="0.000345"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:18:22.358053" elapsed="0.064405"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:18:22.209964" elapsed="0.212528"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:18:22.207138" elapsed="0.215416"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:18:22.201900" elapsed="0.220898"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.201439" elapsed="0.221408"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:18:22.198296" elapsed="0.224608"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.423532" level="INFO">${template_as_string} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${template_as_string}</var>
<arg>DEVICE_NAME=${device_name}</arg>
<arg>RESTCONF_ROOT=${RESTCONF_ROOT}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:18:22.423082" elapsed="0.000477"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.457319" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:22.456899" elapsed="0.000455"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:18:22.458180" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:18:22.457896" elapsed="0.000361">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:18:22.458351" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:18:22.457535" elapsed="0.000841"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.458948" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:18:22.458544" elapsed="0.000431"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:18:22.459278" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:18:22.459460" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:18:22.459134" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.459912" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:22.459663" 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-08-22T23:18:22.460979" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:22.460692" elapsed="0.000332"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.461459" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:18:22.461182" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.462167" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:18:22.461870" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:18:22.462935" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:18:22.462710" elapsed="0.000251"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:18:22.463015" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:18:22.463177" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:18:22.462376" elapsed="0.000826"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:18:22.463353" elapsed="0.000258"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:18:22.461735" elapsed="0.001917"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.464192" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:18:22.463896" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:18:22.464968" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:18:22.464727" elapsed="0.000267"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:18:22.465044" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:18:22.465195" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:18:22.464397" elapsed="0.000879"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:18:22.465430" elapsed="0.000243"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:18:22.463767" elapsed="0.001948"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:18:22.461538" elapsed="0.004212"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:18:22.465795" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:18:22.465953" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:18:22.460355" elapsed="0.005623"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:22.460037" elapsed="0.005973"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.466183" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.466036" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.460012" elapsed="0.006247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.467013" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:22.466401" elapsed="0.000640"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:18:22.467090" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:18:22.456189" elapsed="0.011025"/>
</kw>
<msg time="2026-08-22T23:18:22.467268" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:18:22.443177" elapsed="0.024138"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.480031" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.492377" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.504872" 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-08-22T23:18:22.505086" elapsed="0.000050"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.505298" 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-08-22T23:18:22.505724" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.505558" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:22.505541" 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-08-22T23:18:22.505951" 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-08-22T23:18:22.506117" 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-08-22T23:18:22.506356" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:18:22.505506" elapsed="0.000905"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:18:22.505383" elapsed="0.001055"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.506603" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:22.506685" elapsed="0.000018"/>
</return>
<msg time="2026-08-22T23:18:22.506835" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:18:22.438943" elapsed="0.067920"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.533252" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:22.532867" elapsed="0.000414"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:18:22.534061" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:18:22.533803" elapsed="0.000335">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:18:22.534233" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:18:22.533455" elapsed="0.000803"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.534822" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:18:22.534420" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:18:22.535150" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:18:22.535313" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:18:22.535007" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.535773" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:22.535499" elapsed="0.000321"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:18:22.536180" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.535887" elapsed="0.000351"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.536720" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:22.536407" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:22.536262" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.535869" elapsed="0.000935"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.537423" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:22.536947" elapsed="0.000505"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:18:22.537501" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:18:22.532243" elapsed="0.005403"/>
</kw>
<msg time="2026-08-22T23:18:22.537701" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:18:22.519643" elapsed="0.018105"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.551453" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.563729" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.575968" 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-08-22T23:18:22.576175" 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-08-22T23:18:22.576463" 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-08-22T23:18:22.576885" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.576736" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:22.576719" 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-08-22T23:18:22.577110" 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-08-22T23:18:22.577276" 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-08-22T23:18:22.577439" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:18:22.576686" elapsed="0.000805"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:18:22.576548" 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-08-22T23:18:22.577709" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:22.577790" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:18:22.577922" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:18:22.516950" elapsed="0.061002"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:18:22.579322" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:18:22.579024" elapsed="0.000373">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:18:22.579490" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:18:22.578646" elapsed="0.000869"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.579855" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.579603" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.580471" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:22.580171" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:22.579988" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.579567" elapsed="0.000988"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.582915" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:18:22.580724" elapsed="0.002218"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:18:22.582994" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:18:22.583149" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:18:22.578286" elapsed="0.004889"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.584559" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:22.584304" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.585012" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:22.584776" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.585498" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:22.585253" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.585969" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:22.585707" elapsed="0.000306"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:18:22.586830" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:18:22.586624" elapsed="0.000232"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:18:22.587180" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:18:22.587005" elapsed="0.000201"/>
</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-08-22T23:18:22.587352" elapsed="0.000208"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.587975" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:22.587730" elapsed="0.000291"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:18:22.588062" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:18:22.588216" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:18:22.586209" 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="PUT On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:18:22.601977" level="INFO">PUT Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Content-Length': '81', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:18:22.602150" level="INFO">PUT Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:22.602271" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:22.590563" elapsed="0.012124">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:22.588311" elapsed="0.014465">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</branch>
<branch type="ELSE">
<kw name="PUT 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 PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.602967" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.602809" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:22.588294" elapsed="0.014765">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.603475" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:22.603755" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:22.603570" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:22.603553" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.603963" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:22.604030" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:22.583503" elapsed="0.020631">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:22.604206" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:22.428232" elapsed="0.176068">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.604603" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.604407" elapsed="0.000265"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:22.604391" elapsed="0.000305"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:22.604729" elapsed="0.000014"/>
</return>
<arg>${directory_with_template_folders}${/}datamod1</arg>
<arg>${template_as_string}</arg>
<arg>session=${NODE_SETTER}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:18:22.423838" elapsed="0.180986">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.606053" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:22.605619" elapsed="0.000461"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-08-22T23:18:22.606294" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:22.606153" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.606135" elapsed="0.000222"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:18:22.606523" elapsed="0.000232"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.607626" level="FAIL">'4968' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:18:22.607268" elapsed="0.000419">'4968' does not contain '-'</status>
</kw>
<msg time="2026-08-22T23:18:22.607779" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:18:22.606914" elapsed="0.000890"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.608296" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:18:22.607967" elapsed="0.000355"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.608790" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:22.608480" elapsed="0.000336"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.609258" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:22.608968" elapsed="0.000316"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.609822" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968

HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-08-22T23:18:22.609434" elapsed="0.000436"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.610295" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:22.610053" elapsed="0.000325"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.611046" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=4968'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-08-22T23:18:22.610704" elapsed="0.000390"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:22.610444" elapsed="0.000684"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.610427" elapsed="0.000727"/>
</if>
<arg>4968</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:18:22.605252" elapsed="0.005949"/>
</kw>
<doc>Send a request to change the sample test data and check that the request went OK.</doc>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=4968</tag>
<status status="FAIL" start="2026-08-22T23:18:22.197673" elapsed="0.413573">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968

HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</test>
<test id="s1-s1-t16" name="Check_Device_Data_Is_Modified" 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-08-22T23:18:22.615043" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:18:22.614780" 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-08-22T23:18:22.616310" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:22.616197" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.616178" 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-08-22T23:18:22.621341" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:22.621233" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.621215" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.622421" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:18:22.622037" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.622929" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:18:22.622625" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:18:22.623000" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:18:22.623157" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:18:22.621648" elapsed="0.001533"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:18:22.628988" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:22.628872" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.628853" 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-08-22T23:18:22.630273" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:22.630166" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.630148" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:18:22.630839" 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-08-22T23:18:22.630488" elapsed="0.000377"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:18:22.631251" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:18:22.631023" elapsed="0.000254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:18:22.667712" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:18:22.631782" elapsed="0.036040"/>
</kw>
<msg time="2026-08-22T23:18:22.668025" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:18:22.668073" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.631432" elapsed="0.036677"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:18:22.699512" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:18:22.668660" elapsed="0.031125"/>
</kw>
<msg time="2026-08-22T23:18:22.700164" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:18:22.700214" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.668286" elapsed="0.031969"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.700825" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.700403" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.700353" elapsed="0.000570"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.701544" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:22.701074" elapsed="0.000558"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.701922" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.701704" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.701685" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:18:22.702041" 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-08-22T23:18:22.704999" elapsed="0.000157"/>
</kw>
<msg time="2026-08-22T23:18:22.705221" 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-08-22T23:18:22.703806" elapsed="0.001569"/>
</kw>
<kw name="Open 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-08-22T23:18:22.705704" elapsed="0.000093"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.706083" 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-08-22T23:18:22.703058" elapsed="0.003241"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:18:22.702396" 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-08-22T23:18:22.629839" elapsed="0.076633"/>
</kw>
<msg time="2026-08-22T23:18:22.706572" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:18:22.706650" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.629213" elapsed="0.077503"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:18:22.706909" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:18:22.706801" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.706782" 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-08-22T23:18:22.707416" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.707789" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:18:22.707862" 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-08-22T23:18:22.628482" elapsed="0.079495"/>
</kw>
<msg time="2026-08-22T23:18:22.708078" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:18:22.708122" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.623555" elapsed="0.084609"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.708499" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.708242" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.708224" elapsed="0.000357"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:18:22.623415" elapsed="0.085213"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:18:22.714412" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:22.714296" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.714275" 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-08-22T23:18:22.715741" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:22.715628" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.715608" elapsed="0.000200"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:18:22.716276" 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-08-22T23:18:22.715953" elapsed="0.000349"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:18:22.716698" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:18:22.716457" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:18:22.758343" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:18:22.717211" elapsed="0.041234"/>
</kw>
<msg time="2026-08-22T23:18:22.758650" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:18:22.758699" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.716880" elapsed="0.041856"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:18:22.781435" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:18:22.759265" elapsed="0.022273"/>
</kw>
<msg time="2026-08-22T23:18:22.781746" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:18:22.781793" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.758906" elapsed="0.022925"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.782127" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.781910" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.781890" elapsed="0.000315"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.782667" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:22.782344" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.783011" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.782798" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.782780" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:18:22.783122" 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-08-22T23:18:22.785810" elapsed="0.000144"/>
</kw>
<msg time="2026-08-22T23:18:22.786016" 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-08-22T23:18:22.784654" elapsed="0.001506"/>
</kw>
<kw name="Open 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-08-22T23:18:22.786454" elapsed="0.000091"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.786870" 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-08-22T23:18:22.783953" elapsed="0.003120"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:18:22.783397" elapsed="0.003742"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:18:22.715296" elapsed="0.071941"/>
</kw>
<msg time="2026-08-22T23:18:22.787361" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:18:22.787410" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.714688" elapsed="0.072763"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:18:22.787783" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:18:22.787528" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.787509" elapsed="0.000357"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.788262" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.788685" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:18:22.788758" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:18:22.713885" elapsed="0.074982"/>
</kw>
<msg time="2026-08-22T23:18:22.788959" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:18:22.789003" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.708916" elapsed="0.080125"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.789363" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.789116" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.789099" elapsed="0.000341"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:18:22.708773" elapsed="0.080690"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:18:22.794876" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:22.794767" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.794748" 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-08-22T23:18:22.796137" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:22.796028" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.796010" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:18:22.796675" 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-08-22T23:18:22.796345" elapsed="0.000357"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:18:22.797077" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:18:22.796858" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:18:22.831189" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:18:22.797609" elapsed="0.033697"/>
</kw>
<msg time="2026-08-22T23:18:22.831488" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:18:22.831535" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.797258" elapsed="0.034314"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:18:22.851011" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:18:22.832150" elapsed="0.019188"/>
</kw>
<msg time="2026-08-22T23:18:22.851512" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:18:22.851559" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.831797" elapsed="0.019824"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.851964" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.851706" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.851683" elapsed="0.000363"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.852501" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:22.852186" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.852869" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.852654" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.852636" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:18:22.852983" 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-08-22T23:18:22.855702" elapsed="0.000159"/>
</kw>
<msg time="2026-08-22T23:18:22.855926" 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-08-22T23:18:22.854547" 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="NOT RUN" start="2026-08-22T23:18:22.856366" elapsed="0.000086"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.856752" 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-08-22T23:18:22.853878" 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-08-22T23:18:22.853261" elapsed="0.003763"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:18:22.795725" elapsed="0.061404"/>
</kw>
<msg time="2026-08-22T23:18:22.857221" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:18:22.857266" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.795092" elapsed="0.062213"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:18:22.857488" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:18:22.857381" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.857363" 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-08-22T23:18:22.857990" 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-08-22T23:18:22.858320" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:18:22.858391" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:18:22.794410" elapsed="0.064088"/>
</kw>
<msg time="2026-08-22T23:18:22.858755" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:18:22.858804" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.789764" elapsed="0.069078"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.859164" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.858919" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.858902" elapsed="0.000338"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:18:22.789623" elapsed="0.069641"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:18:22.623235" elapsed="0.236059"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:18:22.620876" elapsed="0.238481"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:18:22.615908" elapsed="0.243508"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.615462" elapsed="0.244001"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:18:22.612348" elapsed="0.247173"/>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.860596" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:22.860193" elapsed="0.000433"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.868867" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:22.868610" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.869317" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:22.869067" 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-08-22T23:18:22.879732" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:22.880001" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:22.880182" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:22.871489" elapsed="0.009239">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:22.869432" elapsed="0.011411">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.881102" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.880889" elapsed="0.000302"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:22.869411" elapsed="0.011814">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.881768" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:22.881954" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:22.881902" elapsed="0.000110"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:22.881879" elapsed="0.000163"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.882239" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:22.882335" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:22.863299" elapsed="0.019180">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:22.882574" elapsed="0.000044"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:22.860836" elapsed="0.021895">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.883040" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.882840" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:22.882816" elapsed="0.000332"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.883418" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.883224" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:22.883201" elapsed="0.000326"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:22.859769" elapsed="0.023889">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.885384" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:22.884791" elapsed="0.000633"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-08-22T23:18:22.885860" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:22.885529" elapsed="0.000396"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.885504" elapsed="0.000452"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:18:22.886182" elapsed="0.000298"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.887813" level="FAIL">'4968' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:18:22.887295" elapsed="0.000605">'4968' does not contain '-'</status>
</kw>
<msg time="2026-08-22T23:18:22.888035" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:18:22.886792" elapsed="0.001303"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.888857" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:18:22.888329" elapsed="0.000566"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.889519" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:22.889117" elapsed="0.000438"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.890200" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:18:22.889793" elapsed="0.000443"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.890988" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968

HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-08-22T23:18:22.890447" elapsed="0.000609"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.891630" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:22.891267" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.892621" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=4968'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-08-22T23:18:22.892153" elapsed="0.000516"/>
</kw>
<status status="PASS" start="2026-08-22T23:18:22.891787" elapsed="0.000917"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.891762" elapsed="0.000966"/>
</if>
<arg>4968</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:18:22.884279" elapsed="0.008496"/>
</kw>
<doc>Get the device data and make sure it contains the modified content.</doc>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=4968</tag>
<status status="FAIL" start="2026-08-22T23:18:22.611796" elapsed="0.281025">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968

HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</test>
<test id="s1-s1-t17" name="Check_Modified_Device_Data_Is_Visible_On_Checker" line="190">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:18:22.896287" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:18:22.896001" 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-08-22T23:18:22.897531" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:22.897423" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.897404" elapsed="0.000215"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:18:22.902503" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:22.902396" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.902379" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.903558" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:18:22.903183" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.904186" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:18:22.903873" elapsed="0.000358"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:18:22.904276" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:18:22.904437" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:18:22.902811" elapsed="0.001651"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:18:22.909946" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:22.909830" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.909811" 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-08-22T23:18:22.911205" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:22.911064" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.911046" elapsed="0.000230"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:18:22.911760" 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-08-22T23:18:22.911420" elapsed="0.000367"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:18:22.912164" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:18:22.911941" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:18:22.945700" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:18:22.912724" elapsed="0.033087"/>
</kw>
<msg time="2026-08-22T23:18:22.945991" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:18:22.946037" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.912367" elapsed="0.033707"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:18:22.967375" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:18:22.946610" elapsed="0.020882"/>
</kw>
<msg time="2026-08-22T23:18:22.967693" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:18:22.967741" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.946250" elapsed="0.021529"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.968081" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.967858" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.967836" elapsed="0.000323"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:22.968622" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:22.968297" 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-08-22T23:18:22.968991" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.968778" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.968760" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:18:22.969102" 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-08-22T23:18:22.971758" elapsed="0.000143"/>
</kw>
<msg time="2026-08-22T23:18:22.971965" 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-08-22T23:18:22.970615" elapsed="0.001491"/>
</kw>
<kw name="Open 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-08-22T23:18:22.972400" elapsed="0.000087"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.972819" 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-08-22T23:18:22.969909" 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-08-22T23:18:22.969356" elapsed="0.003742"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:18:22.910763" elapsed="0.062431"/>
</kw>
<msg time="2026-08-22T23:18:22.973285" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:18:22.973328" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.910164" elapsed="0.063201"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:18:22.973546" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:18:22.973441" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.973422" 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-08-22T23:18:22.974050" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.974418" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:18:22.974493" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:18:22.909477" elapsed="0.065152"/>
</kw>
<msg time="2026-08-22T23:18:22.974724" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:18:22.974767" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.904855" elapsed="0.069948"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:22.975122" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:22.974877" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.974860" elapsed="0.000339"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:18:22.904715" elapsed="0.070506"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:18:22.980925" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:22.980784" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.980766" 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-08-22T23:18:22.982145" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:22.982038" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:22.982020" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:18:22.982686" 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-08-22T23:18:22.982353" elapsed="0.000359"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:18:22.983088" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:18:22.982867" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:18:23.025756" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:18:22.983624" elapsed="0.042237"/>
</kw>
<msg time="2026-08-22T23:18:23.026031" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:18:23.026078" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.983270" elapsed="0.042844"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:18:23.056729" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:18:23.026672" elapsed="0.030181"/>
</kw>
<msg time="2026-08-22T23:18:23.057032" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:18:23.057078" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:23.026288" elapsed="0.030828"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:23.057473" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:23.057205" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:23.057180" elapsed="0.000374"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:23.058045" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:23.057722" 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-08-22T23:18:23.058685" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:23.058444" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:23.058169" elapsed="0.000596"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:18:23.058801" 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-08-22T23:18:23.061537" elapsed="0.000174"/>
</kw>
<msg time="2026-08-22T23:18:23.061821" 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-08-22T23:18:23.060348" elapsed="0.001622"/>
</kw>
<kw name="Open 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-08-22T23:18:23.062269" elapsed="0.000090"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:23.062659" 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-08-22T23:18:23.059668" elapsed="0.003199"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:18:23.059086" elapsed="0.003850"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:18:22.981737" elapsed="0.081297"/>
</kw>
<msg time="2026-08-22T23:18:23.063125" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:18:23.063170" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.981143" elapsed="0.082065"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:18:23.063390" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:18:23.063284" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:23.063265" 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-08-22T23:18:23.063901" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:23.064238" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:18:23.064308" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:18:22.980427" elapsed="0.083992"/>
</kw>
<msg time="2026-08-22T23:18:23.064513" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:18:23.064556" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.975478" elapsed="0.089285"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:23.065089" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:23.064842" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:23.064824" elapsed="0.000343"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:18:22.975343" elapsed="0.089848"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:18:23.070678" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:23.070552" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:23.070534" 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-08-22T23:18:23.072050" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:23.071941" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:23.071923" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:18:23.072574" 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-08-22T23:18:23.072257" elapsed="0.000364"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:18:23.073000" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:18:23.072776" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:18:23.109422" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:18:23.073530" elapsed="0.036012"/>
</kw>
<msg time="2026-08-22T23:18:23.109786" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:18:23.109835" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:23.073182" elapsed="0.036690"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:18:23.146841" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:18:23.110392" elapsed="0.037007"/>
</kw>
<msg time="2026-08-22T23:18:23.147793" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:18:23.147844" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:23.110045" elapsed="0.037839"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:23.148613" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:23.148081" elapsed="0.000603"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:23.148011" elapsed="0.000711"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:23.149455" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:23.148882" elapsed="0.000649"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:23.149851" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:23.149629" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:23.149608" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:18:23.149977" 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">
<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-08-22T23:18:23.153877" elapsed="0.000178"/>
</kw>
<msg time="2026-08-22T23:18:23.154125" 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-08-22T23:18:23.152354" elapsed="0.001938"/>
</kw>
<kw name="Open 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-08-22T23:18:23.154635" elapsed="0.000091"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:23.155056" 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-08-22T23:18:23.151597" elapsed="0.003682"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:18:23.150428" elapsed="0.004926"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:18:23.071470" elapsed="0.083984"/>
</kw>
<msg time="2026-08-22T23:18:23.155550" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:18:23.155790" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:23.070895" elapsed="0.084941"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:18:23.156031" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:18:23.155919" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:23.155900" 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-08-22T23:18:23.156545" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:23.156930" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:18:23.157002" 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-08-22T23:18:23.070206" elapsed="0.086907"/>
</kw>
<msg time="2026-08-22T23:18:23.157215" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:18:23.157260" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:23.065489" elapsed="0.091808"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:23.157677" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:23.157374" elapsed="0.000361"/>
</branch>
<status status="PASS" start="2026-08-22T23:18:23.157357" elapsed="0.000402"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:18:23.065321" elapsed="0.092463"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:18:22.904517" elapsed="0.253307"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:18:22.902038" elapsed="0.255859"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:18:22.897138" elapsed="0.260881"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:18:22.896717" elapsed="0.261381"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:18:22.893673" elapsed="0.264488"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:23.159885" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:23.159464" elapsed="0.000449"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:23.167756" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:23.167474" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:23.168206" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:23.167957" 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-08-22T23:18:23.179134" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:23.179340" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:23.179499" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:23.170670" elapsed="0.009332">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:23.168331" elapsed="0.011765">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:23.180305" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:23.180134" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:23.168311" elapsed="0.012087">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:23.180846" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:23.180988" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:23.180948" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:23.180930" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:23.181203" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:23.181273" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:23.162901" elapsed="0.018483">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:23.181454" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:23.160129" elapsed="0.021429">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:23.183022" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:23.182371" elapsed="0.000834"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:23.182147" elapsed="0.001123"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:23.183761" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:23.183399" elapsed="0.000492"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:23.183363" elapsed="0.000583"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:23.159061" elapsed="0.025156">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:24.187494" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:24.186414" elapsed="0.001155"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:24.198395" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:24.198128" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:24.198869" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:24.198616" 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-08-22T23:18:24.209798" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:24.210151" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:24.210420" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:24.201130" elapsed="0.010185">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:24.199001" elapsed="0.012515">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:24.212028" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:24.211641" elapsed="0.000547"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:24.198974" elapsed="0.013271">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:24.213220" elapsed="0.000066"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:24.213557" elapsed="0.000067"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:24.213461" elapsed="0.000236"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:24.213419" 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-08-22T23:18:24.214095" elapsed="0.000051"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:24.214261" elapsed="0.000035"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:24.193758" elapsed="0.020760">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:24.214831" elapsed="0.000040"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:24.188110" elapsed="0.026954">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:24.215640" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:24.215255" elapsed="0.000522"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:24.215215" elapsed="0.000618"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:24.216300" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:24.215963" elapsed="0.000468"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:24.215925" elapsed="0.000560"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:24.185228" elapsed="0.031477">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:25.220511" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:25.219495" elapsed="0.001119"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:25.231831" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:25.231551" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:25.232280" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:25.232031" 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-08-22T23:18:25.242893" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:25.243081" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:25.243237" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:25.234490" elapsed="0.009474">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:25.232404" elapsed="0.011756">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:25.244672" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:25.244243" elapsed="0.000587"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:25.232380" elapsed="0.012504">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:25.245813" elapsed="0.000062"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:25.246132" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:25.246044" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:25.246002" 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-08-22T23:18:25.246636" elapsed="0.000051"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:25.246799" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:25.226665" elapsed="0.020374">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:25.247375" elapsed="0.000042"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:25.221116" elapsed="0.026535">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:25.248175" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:25.247842" elapsed="0.000461"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:25.247805" elapsed="0.000551"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:25.248765" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:25.248488" elapsed="0.000357"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:25.248447" elapsed="0.000431"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:25.217696" elapsed="0.031295">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:26.252003" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:26.251013" elapsed="0.001063"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:26.263057" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:26.262795" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:26.263507" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:26.263258" 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-08-22T23:18:26.273752" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:26.273970" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:26.274156" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:26.265787" elapsed="0.008930">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:26.263648" elapsed="0.011187">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:26.275130" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:26.274889" elapsed="0.000333"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:26.263624" elapsed="0.011632">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:26.275822" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:26.276019" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:26.275963" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:26.275937" 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-08-22T23:18:26.276311" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:26.276486" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:26.256949" elapsed="0.019712">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:26.276816" elapsed="0.000028"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:26.252669" elapsed="0.024310">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:26.277307" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:26.277101" elapsed="0.000284"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:26.277077" elapsed="0.000342"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:26.277718" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:26.277496" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:26.277473" elapsed="0.000358"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:26.249895" elapsed="0.028046">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:27.281000" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:27.279994" elapsed="0.001079"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:27.293872" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:27.293485" elapsed="0.000456"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:27.294504" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:27.294156" 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-08-22T23:18:27.304747" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:27.304908" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:27.305023" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:27.296782" elapsed="0.008630">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:27.294706" elapsed="0.010833">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:27.305830" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:27.305614" elapsed="0.000311"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:27.294679" elapsed="0.011280">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:27.306479" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:27.306773" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:27.306716" elapsed="0.000121"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:27.306690" elapsed="0.000178"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:27.307071" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:27.307172" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:27.287056" elapsed="0.020265">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:27.307420" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:27.281675" elapsed="0.025878">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:27.307891" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:27.307689" elapsed="0.000283"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:27.307665" elapsed="0.000341"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:27.308279" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:27.308083" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:27.308061" elapsed="0.000330"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:27.278846" elapsed="0.029655">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:28.311455" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:28.310464" elapsed="0.001059"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:28.323268" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:28.323007" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:28.323740" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:28.323472" 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-08-22T23:18:28.334888" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:28.335048" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:28.335162" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:28.325955" elapsed="0.009610">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:28.323862" elapsed="0.011848">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:28.335988" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:28.335760" elapsed="0.000325"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:28.323839" elapsed="0.012281">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:28.336801" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:28.337003" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:28.336945" elapsed="0.000121"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:28.336920" elapsed="0.000177"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:28.337305" elapsed="0.000038"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:28.337431" elapsed="0.000028"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:28.316568" elapsed="0.021077">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:28.337780" elapsed="0.000025"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:28.312055" elapsed="0.025870">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:28.338262" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:28.338046" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:28.338021" elapsed="0.000360"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:28.338689" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:28.338460" elapsed="0.000308"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:28.338437" elapsed="0.000363"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:28.309339" elapsed="0.029569">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:29.341993" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:29.340950" elapsed="0.001114"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:29.354312" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:29.354047" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:29.354785" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:29.354515" 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-08-22T23:18:29.364322" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:29.364476" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:29.364612" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:29.357000" elapsed="0.008000">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:29.354909" elapsed="0.010172">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:29.365272" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:29.365117" elapsed="0.000286"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:29.354885" elapsed="0.010543">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:29.365880" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:29.366021" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:29.365980" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:29.365963" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:29.366231" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:29.366302" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:29.348080" elapsed="0.018327">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:29.366477" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:29.342556" elapsed="0.024045">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:29.366959" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:29.366743" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:29.366714" elapsed="0.000356"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:29.367383" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:29.367145" elapsed="0.000326"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:29.367123" elapsed="0.000382"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:29.339832" elapsed="0.027810">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:30.371103" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:30.369982" elapsed="0.001199"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:30.382514" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:30.382212" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:30.383004" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:30.382755" 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-08-22T23:18:30.393022" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:30.393190" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:30.393316" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:30.385338" elapsed="0.008471">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:30.383129" elapsed="0.010888">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:30.394287" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:30.394070" elapsed="0.000310"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:30.383104" elapsed="0.011310">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:30.394965" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:30.395159" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:30.395104" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:30.395080" 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-08-22T23:18:30.395453" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:30.395553" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:30.376033" elapsed="0.019690">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:30.395823" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:30.371752" elapsed="0.024205">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:30.396272" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:30.396069" elapsed="0.000282"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:30.396046" elapsed="0.000338"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:30.396680" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:30.396459" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:30.396438" elapsed="0.000372"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:30.368747" elapsed="0.028174">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:31.399319" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:31.398515" elapsed="0.000862"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:31.409319" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:31.408955" elapsed="0.000437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:31.409962" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:31.409630" 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-08-22T23:18:31.420734" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:31.420932" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:31.421077" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:31.412777" elapsed="0.008861">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:31.410110" elapsed="0.011634">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:31.422011" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:31.421789" elapsed="0.000302"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:31.410084" elapsed="0.012037">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:31.422636" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:31.422811" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:31.422763" elapsed="0.000100"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:31.422741" elapsed="0.000148"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:31.423066" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:31.423147" elapsed="0.000018"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:31.403172" elapsed="0.020102">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:31.423359" elapsed="0.000020"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:31.399839" elapsed="0.023635">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:31.423762" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:31.423567" elapsed="0.000290"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:31.423547" elapsed="0.000339"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:31.424122" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:31.423950" elapsed="0.000237"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:31.423931" elapsed="0.000284"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:31.397684" elapsed="0.026622">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:32.427503" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:32.426455" elapsed="0.001154"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:32.439296" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:32.439032" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:32.439766" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:32.439499" 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-08-22T23:18:32.449779" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:32.449993" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:32.450229" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:32.441968" elapsed="0.008846">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:32.439894" elapsed="0.011035">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:32.451200" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:32.450980" elapsed="0.000313"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:32.439868" elapsed="0.011459">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:32.451877" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:32.452070" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:32.452014" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:32.451990" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:32.452360" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:32.452458" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:32.432674" elapsed="0.019949">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:32.452720" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:32.428154" elapsed="0.024697">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:32.453156" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:32.452959" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:32.452937" elapsed="0.000330"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:32.453530" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:32.453339" elapsed="0.000288"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:32.453319" elapsed="0.000341"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:32.425220" elapsed="0.028548">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:33.456876" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:33.455835" elapsed="0.001117"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:33.471147" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:33.470874" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:33.471623" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:33.471358" 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-08-22T23:18:33.481710" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:33.481879" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:33.482066" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:33.473847" elapsed="0.008606">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:33.471749" elapsed="0.010787">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:33.482744" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:33.482570" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:33.471725" elapsed="0.011111">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:33.483223" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:33.483363" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:33.483323" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:33.483305" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:33.483573" elapsed="0.000037"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:33.483661" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:33.462978" elapsed="0.020792">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:33.483841" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:33.457449" elapsed="0.026488">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:33.484159" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:33.484017" elapsed="0.000253"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:33.484000" elapsed="0.000299"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:33.484499" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:33.484356" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:33.484340" elapsed="0.000256"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:33.454699" elapsed="0.029978">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:34.487626" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:34.486613" elapsed="0.001086"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:34.499656" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:34.499278" elapsed="0.000541"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:34.500227" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:34.499977" 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-08-22T23:18:34.509799" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:34.510009" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:34.510231" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:34.502641" elapsed="0.008123">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:34.500350" elapsed="0.010528">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:34.511170" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:34.510928" elapsed="0.000337"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:34.500327" elapsed="0.010972">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:34.511848" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:34.512038" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:34.511983" elapsed="0.000115"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:34.511959" elapsed="0.000170"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:34.512327" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:34.512424" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:34.493235" elapsed="0.019334">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:34.512687" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:34.488195" elapsed="0.024626">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:34.513130" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:34.512931" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:34.512908" elapsed="0.000332"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:34.513506" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:34.513314" elapsed="0.000289"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:34.513293" elapsed="0.000345"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:34.485487" elapsed="0.028258">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:35.516702" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:35.515698" elapsed="0.001076"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:35.526937" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:35.526675" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:35.527390" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:35.527139" 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-08-22T23:18:35.537290" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:35.537446" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:35.537639" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:35.529834" elapsed="0.008278">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:35.527515" elapsed="0.010711">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:35.538491" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:35.538276" elapsed="0.000330"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:35.527492" elapsed="0.011150">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:35.539164" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:35.539354" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:35.539299" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:35.539275" elapsed="0.000170"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:35.539664" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:35.539762" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:35.520950" elapsed="0.018956">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:35.540002" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:35.517328" elapsed="0.022806">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:35.540443" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:35.540244" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:35.540220" elapsed="0.000334"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:35.540856" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:35.540653" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:35.540630" elapsed="0.000355"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:35.514549" elapsed="0.026546">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:36.544151" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:36.543132" elapsed="0.001092"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:36.556119" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:36.555856" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:36.556566" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:36.556317" 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-08-22T23:18:36.566339" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:36.566500" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:36.566727" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:36.559008" elapsed="0.008237">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:36.556710" elapsed="0.010650">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:36.567660" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:36.567412" elapsed="0.000340"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:36.556685" elapsed="0.011100">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:36.568323" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:36.568513" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:36.568458" elapsed="0.000133"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:36.568433" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:36.568822" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:36.568918" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:36.549688" elapsed="0.019375">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:36.569157" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:36.544757" elapsed="0.024530">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:36.569614" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:36.569396" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:36.569374" elapsed="0.000352"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:36.569993" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:36.569800" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:36.569779" elapsed="0.000323"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:36.541973" elapsed="0.028237">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:37.573223" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:37.572203" elapsed="0.001089"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:37.584930" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:37.584602" elapsed="0.000377"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:37.585376" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:37.585130" 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-08-22T23:18:37.595715" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:37.595917" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:37.596143" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:37.587769" elapsed="0.008949">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:37.585496" elapsed="0.011336">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:37.597098" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:37.596883" elapsed="0.000307"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:37.585474" elapsed="0.011750">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:37.597771" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:37.597961" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:37.597907" elapsed="0.000113"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:37.597884" elapsed="0.000166"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:37.598249" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:37.598347" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:37.578403" elapsed="0.020089">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:37.598609" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:37.573817" elapsed="0.024925">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:37.599053" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:37.598852" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:37.598829" elapsed="0.000336"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:37.599433" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:37.599239" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:37.599217" elapsed="0.000326"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:37.571107" elapsed="0.028578">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:38.603338" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:38.602321" elapsed="0.001089"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:38.615352" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:38.615091" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:38.615815" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:38.615549" 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-08-22T23:18:38.626126" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:38.626330" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:38.626569" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:38.618248" elapsed="0.008866">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:38.615943" elapsed="0.011287">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:38.627500" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:38.627281" elapsed="0.000338"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:38.615917" elapsed="0.011739">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:38.628179" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:38.628373" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:38.628316" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:38.628291" elapsed="0.000176"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:38.628699" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:38.628800" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:38.608851" elapsed="0.020098">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:38.629044" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:38.603966" elapsed="0.025209">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:38.629482" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:38.629284" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:38.629261" elapsed="0.000355"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:38.629916" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:38.629693" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:38.629671" elapsed="0.000357"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:38.601135" elapsed="0.029000">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:39.633376" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:39.632371" elapsed="0.001079"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:39.644643" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:39.644363" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:39.645094" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:39.644846" 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-08-22T23:18:39.654697" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:39.654902" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:39.655194" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:39.647526" elapsed="0.008209">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:39.645223" elapsed="0.010629">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:39.656119" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:39.655901" elapsed="0.000309"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:39.645197" elapsed="0.011046">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:39.656796" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:39.656987" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:39.656931" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:39.656907" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:39.657273" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:39.657370" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:39.638280" elapsed="0.019237">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:39.657635" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:39.633985" elapsed="0.023783">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:39.658077" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:39.657878" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:39.657855" elapsed="0.000332"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:39.658453" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:39.658262" elapsed="0.000267"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:39.658240" elapsed="0.000321"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:39.631074" elapsed="0.027614">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:40.662612" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:40.661306" elapsed="0.001400"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:40.674111" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:40.673844" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:40.674563" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:40.674315" 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-08-22T23:18:40.684244" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:40.684449" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:40.684671" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:40.677088" elapsed="0.008067">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:40.674707" elapsed="0.010565">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:40.685549" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:40.685323" elapsed="0.000347"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:40.674682" elapsed="0.011023">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:40.686260" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:40.686458" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:40.686402" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:40.686377" elapsed="0.000172"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:40.686772" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:40.686873" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:40.669479" elapsed="0.017542">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:40.687119" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:40.663375" elapsed="0.023875">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:40.687565" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:40.687363" elapsed="0.000309"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:40.687339" elapsed="0.000380"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:40.688003" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:40.687804" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:40.687782" elapsed="0.000333"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:40.659801" elapsed="0.028423">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:41.691631" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:41.690450" elapsed="0.001263"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:41.702817" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:41.702529" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:41.703273" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:41.703019" 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-08-22T23:18:41.712982" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:41.713171" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:41.713401" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:41.705784" elapsed="0.008102">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:41.703412" elapsed="0.010612">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:41.714372" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:41.714081" elapsed="0.000387"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:41.703384" elapsed="0.011122">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:41.715143" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:41.715352" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:41.715292" elapsed="0.000124"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:41.715264" elapsed="0.000182"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:41.715692" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:41.715798" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:41.698167" elapsed="0.017788">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:41.716053" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:41.692347" elapsed="0.023838">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:41.716500" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:41.716295" elapsed="0.000312"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:41.716272" elapsed="0.000373"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:41.716921" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:41.716724" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:41.716701" elapsed="0.000333"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:41.689196" elapsed="0.027948">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:42.720513" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:42.719290" elapsed="0.001329"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:42.732181" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:42.731903" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:42.732655" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:42.732387" 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-08-22T23:18:42.741795" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:42.741964" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:42.742169" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:42.734900" elapsed="0.007694">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:42.732783" elapsed="0.009937">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:42.742928" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:42.742760" elapsed="0.000272"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:42.732758" elapsed="0.010309">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:42.743627" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:42.743838" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:42.743770" elapsed="0.000136"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:42.743745" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:42.744142" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:42.744243" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:42.727326" elapsed="0.017065">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:42.744490" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:42.721167" elapsed="0.023482">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:42.744967" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:42.744764" elapsed="0.000282"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:42.744740" elapsed="0.000339"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:42.745351" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:42.745155" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:42.745133" elapsed="0.000331"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:42.718086" elapsed="0.027486">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:43.748725" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:43.747669" elapsed="0.001129"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:43.761039" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:43.760769" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:43.761498" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:43.761245" 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-08-22T23:18:43.771248" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:43.771420" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:43.771641" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:43.763719" elapsed="0.008323">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:43.761638" elapsed="0.010491">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:43.772410" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:43.772167" elapsed="0.000324"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:43.761614" elapsed="0.010906">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:43.772965" elapsed="0.000047"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:43.773193" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:43.773137" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:43.773108" elapsed="0.000177"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:43.773485" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:43.773602" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:43.754969" elapsed="0.018786">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:43.773851" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:43.749305" elapsed="0.024675">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:43.774289" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:43.774088" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:43.774065" elapsed="0.000334"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:43.774685" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:43.774472" elapsed="0.000291"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:43.774451" elapsed="0.000345"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:43.746504" elapsed="0.028399">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:44.777934" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:44.776933" elapsed="0.001077"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:44.790631" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:44.790345" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:44.791093" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:44.790840" 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-08-22T23:18:44.800983" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:44.801139" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:44.801313" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:44.793284" elapsed="0.008438">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:44.791218" elapsed="0.010591">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:44.802003" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:44.801845" elapsed="0.000260"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:44.791193" elapsed="0.010939">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:44.802508" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:44.802663" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:44.802621" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:44.802602" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:44.802873" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:44.802943" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:44.784143" elapsed="0.018939">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:44.803255" elapsed="0.000034"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:44.778622" elapsed="0.024839">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:44.803991" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:44.803668" elapsed="0.000449"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:44.803630" elapsed="0.000540"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:44.804627" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:44.804289" elapsed="0.000467"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:44.804254" elapsed="0.000554"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:44.775804" elapsed="0.029207">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:45.808652" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:45.807150" elapsed="0.001586"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:45.822536" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:45.822257" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:45.823009" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:45.822758" 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-08-22T23:18:45.832685" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:45.832862" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:45.833082" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:45.825259" elapsed="0.008247">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:45.823145" elapsed="0.010462">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:45.833803" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:45.833647" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:45.823111" elapsed="0.010780">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:45.834266" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:45.834404" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:45.834362" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:45.834345" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:45.834629" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:45.834700" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:45.814845" elapsed="0.019959">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:45.834873" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:45.809273" elapsed="0.025692">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:45.835183" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:45.835042" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:45.835026" elapsed="0.000236"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:45.835453" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:45.835314" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:45.835298" elapsed="0.000232"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:45.806010" elapsed="0.029612">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:46.838920" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:46.837863" elapsed="0.001131"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:46.852621" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:46.852338" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:46.853076" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:46.852826" 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-08-22T23:18:46.862612" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:46.862827" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:46.863068" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:46.855530" elapsed="0.008079">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:46.853206" elapsed="0.010520">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:46.864000" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:46.863778" elapsed="0.000315"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:46.853179" elapsed="0.010948">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:46.864669" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:46.864864" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:46.864808" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:46.864783" 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-08-22T23:18:46.865155" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:46.865253" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:46.845165" elapsed="0.020234">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:46.865496" elapsed="0.000051"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:46.839507" elapsed="0.026184">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:46.866007" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:46.865804" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:46.865780" elapsed="0.000338"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:46.866388" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:46.866194" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:46.866172" elapsed="0.000326"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:46.836483" elapsed="0.030143">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:47.870035" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:47.868913" elapsed="0.001215"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:47.881358" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:47.881067" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:47.881843" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:47.881566" 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-08-22T23:18:47.891107" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:47.891319" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:47.891518" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:47.884375" elapsed="0.007589">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:47.881976" elapsed="0.010076">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:47.892254" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:47.892094" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:47.881949" elapsed="0.010397">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:47.892750" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:47.892908" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:47.892852" elapsed="0.000107"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:47.892833" elapsed="0.000149"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:47.893129" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:47.893202" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:47.876525" elapsed="0.016787">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:47.893382" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:47.870740" elapsed="0.022739">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:47.893725" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:47.893560" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:47.893543" elapsed="0.000263"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:47.894018" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:47.893860" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:47.893844" elapsed="0.000258"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:47.867636" elapsed="0.026545">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:48.897675" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:48.896545" elapsed="0.001207"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:48.909384" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:48.909029" elapsed="0.000403"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:48.909855" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:48.909604" 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-08-22T23:18:48.919658" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:48.919836" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:48.920046" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:48.912261" elapsed="0.008361">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:48.909985" elapsed="0.010789">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:48.921045" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:48.920826" elapsed="0.000311"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:48.909960" elapsed="0.011211">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:48.921718" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:48.921911" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:48.921856" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:48.921831" elapsed="0.000172"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:48.922205" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:48.922302" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:48.902843" elapsed="0.019609">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:48.922549" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:48.898275" elapsed="0.024428">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:48.923014" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:48.922813" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:48.922790" elapsed="0.000334"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:48.923392" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:48.923199" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:48.923177" elapsed="0.000324"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:48.895291" elapsed="0.028340">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:49.926792" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:49.925730" elapsed="0.001137"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:49.938951" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:49.938684" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:49.939406" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:49.939153" 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-08-22T23:18:49.949354" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:49.949527" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:49.949744" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:49.941862" elapsed="0.008315">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:49.939536" elapsed="0.010727">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:49.950458" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:49.950300" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:49.939510" elapsed="0.011038">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:49.950950" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:49.951093" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:49.951050" elapsed="0.000098"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:49.951032" elapsed="0.000143"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:49.951407" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:49.951506" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:49.933089" elapsed="0.018586">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:49.951772" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:49.927375" elapsed="0.024527">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:49.952208" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:49.952010" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:49.951988" elapsed="0.000331"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:49.952603" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:49.952392" elapsed="0.000291"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:49.952371" elapsed="0.000344"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:49.924502" elapsed="0.028321">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:50.955939" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:50.954921" elapsed="0.001090"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:50.967867" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:50.967449" elapsed="0.000487"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:50.968477" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:50.968162" 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-08-22T23:18:50.978159" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:50.978413" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:50.978714" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:50.970894" elapsed="0.008388">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:50.968618" elapsed="0.010786">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:50.979718" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:50.979454" elapsed="0.000360"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:50.968592" elapsed="0.011256">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:50.980387" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:50.980616" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:50.980534" elapsed="0.000153"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:50.980503" 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-08-22T23:18:50.980941" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:50.981048" elapsed="0.000024"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:50.961401" elapsed="0.019809">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:50.981316" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:50.956515" elapsed="0.024940">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:50.981805" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:50.981596" elapsed="0.000287"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:50.981552" elapsed="0.000364"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:50.982185" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:50.981991" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:50.981969" elapsed="0.000329"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:50.953766" elapsed="0.028640">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:51.985652" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:51.984529" elapsed="0.001203"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:51.997534" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:51.997258" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:51.998003" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:51.997754" 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-08-22T23:18:52.007941" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:52.008148" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:52.008383" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:52.000420" elapsed="0.008514">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:51.998126" elapsed="0.010929">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:52.009341" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:52.009106" elapsed="0.000336"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:51.998102" elapsed="0.011374">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:52.010032" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:52.010233" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:52.010174" elapsed="0.000122"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:52.010147" elapsed="0.000180"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:52.010525" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:52.010648" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:51.991006" elapsed="0.019793">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:52.010897" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:51.986263" elapsed="0.024765">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:52.011339" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:52.011139" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:52.011117" elapsed="0.000334"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:52.011739" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:52.011525" elapsed="0.000292"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:52.011504" elapsed="0.000346"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:51.983320" elapsed="0.028637">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:53.015549" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:53.014388" elapsed="0.001281"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:53.027944" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:53.027672" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:53.028408" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:53.028149" 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-08-22T23:18:53.036525" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:53.036720" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:53.036913" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:53.030944" elapsed="0.006404">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:53.028539" elapsed="0.008897">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:53.037654" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:53.037475" elapsed="0.000251"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:53.028513" elapsed="0.009238">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:53.038136" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:53.038343" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:53.038294" elapsed="0.000096"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:53.038268" elapsed="0.000144"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:53.038560" elapsed="0.000038"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:53.038650" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:53.023206" elapsed="0.015553">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:53.038828" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:53.016235" elapsed="0.022688">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:53.039168" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:53.039002" elapsed="0.000253"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:53.038986" elapsed="0.000303"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:53.039614" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:53.039377" elapsed="0.000320"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:53.039348" elapsed="0.000382"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:53.013002" elapsed="0.026840">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:54.042869" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:54.041873" elapsed="0.001068"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:54.055888" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:54.055614" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:54.056359" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:54.056094" 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-08-22T23:18:54.066426" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:54.066620" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:54.066826" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:54.058992" elapsed="0.008276">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:54.056494" elapsed="0.010863">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:54.067604" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:54.067393" elapsed="0.000280"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:54.056469" elapsed="0.011228">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:54.068077" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:54.068243" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:54.068180" elapsed="0.000150"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:54.068161" 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-08-22T23:18:54.068611" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:54.068714" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:54.049464" elapsed="0.019401">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:54.068963" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:54.043548" elapsed="0.025548">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:54.069440" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:54.069206" elapsed="0.000320"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:54.069183" elapsed="0.000377"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:54.069862" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:54.069663" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:54.069639" elapsed="0.000333"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:54.040757" elapsed="0.029327">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:55.073133" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:55.072129" elapsed="0.001075"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:55.085020" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:55.084758" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:55.085466" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:55.085222" 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-08-22T23:18:55.094238" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:55.094401" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:55.094604" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:55.087849" elapsed="0.007147">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:55.085603" elapsed="0.009476">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:55.095270" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:55.095115" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:55.085565" elapsed="0.009795">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:55.095752" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:55.095891" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:55.095850" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:55.095833" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:55.096099" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:55.096170" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:55.079211" elapsed="0.017064">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:55.096344" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:55.073735" elapsed="0.022703">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:55.096704" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:55.096516" elapsed="0.000247"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:55.096500" elapsed="0.000289"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:55.096982" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:55.096843" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:55.096827" elapsed="0.000235"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:55.070997" elapsed="0.026143">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:56.100543" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:56.099538" elapsed="0.001108"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:56.111291" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:56.111030" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:56.111760" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:56.111496" 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-08-22T23:18:56.121724" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:56.121930" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:56.122119" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:56.114170" elapsed="0.008477">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:56.111885" elapsed="0.010879">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:56.123029" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:56.122814" elapsed="0.000306"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:56.111859" elapsed="0.011294">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:56.123702" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:56.123892" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:56.123838" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:56.123814" elapsed="0.000169"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:56.124182" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:56.124279" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:56.106601" elapsed="0.017822">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:56.124516" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:56.101147" elapsed="0.023522">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:56.124974" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:56.124778" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:56.124756" elapsed="0.000327"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:56.125347" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:56.125156" elapsed="0.000266"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:56.125134" elapsed="0.000320"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:56.098361" elapsed="0.027198">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:57.128807" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:57.127797" elapsed="0.001084"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:57.140484" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:57.140223" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:57.140947" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:57.140700" 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-08-22T23:18:57.149780" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:57.149961" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:57.150171" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:57.143359" elapsed="0.007240">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:57.141069" elapsed="0.009624">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:57.150962" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:57.150734" elapsed="0.000303"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:57.141046" elapsed="0.010016">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:57.151545" elapsed="0.000058"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:57.151764" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:57.151709" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:57.151684" elapsed="0.000175"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:57.152060" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:57.152159" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:57.135917" elapsed="0.016393">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:57.152407" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:57.129393" elapsed="0.023145">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:57.152872" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:57.152670" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:57.152646" elapsed="0.000339"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:57.153252" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:57.153059" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:57.153038" elapsed="0.000323"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:57.126480" elapsed="0.026989">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:58.156607" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:58.155496" elapsed="0.001199"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:58.170237" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:58.169970" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:58.170704" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:58.170439" 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-08-22T23:18:58.180225" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:58.180414" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:58.180640" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:58.172938" elapsed="0.008103">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:58.170826" elapsed="0.010302">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:58.181352" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:58.181167" elapsed="0.000260"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:58.170802" elapsed="0.010649">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:58.181871" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:58.182012" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:58.181972" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:58.181954" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:58.182222" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:58.182293" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:58.161860" elapsed="0.020539">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:58.182467" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:58.157210" elapsed="0.025349">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:58.182799" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:58.182655" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:58.182639" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:58.183075" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:58.182934" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:58.182919" elapsed="0.000237"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:58.154346" elapsed="0.028884">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:18:59.186318" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:18:59.185322" elapsed="0.001071"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:59.197676" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:59.197363" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:18:59.198135" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:18:59.197887" 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-08-22T23:18:59.206025" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:18:59.206204" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:18:59.206401" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:18:59.200529" elapsed="0.006295">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:18:59.198258" elapsed="0.008655">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:59.207145" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:59.206953" elapsed="0.000259"/>
</branch>
<status status="FAIL" start="2026-08-22T23:18:59.198234" elapsed="0.009002">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:59.207675" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:59.207817" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:18:59.207775" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:59.207757" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:59.208026" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:18:59.208096" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:18:59.192400" elapsed="0.015804">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:18:59.208273" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:18:59.186918" elapsed="0.021449">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:59.208604" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:59.208446" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:59.208428" elapsed="0.000258"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:18:59.208879" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:18:59.208739" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:18:59.208724" elapsed="0.000233"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:18:59.184141" elapsed="0.024894">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:00.212241" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:00.211238" elapsed="0.001079"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:00.223341" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:00.223077" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:00.223810" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:00.223544" 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-08-22T23:19:00.233263" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:00.233505" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:19:00.233810" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:19:00.226264" elapsed="0.008109">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:00.223940" elapsed="0.010567">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:00.234861" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:00.234563" elapsed="0.000394"/>
</branch>
<status status="FAIL" start="2026-08-22T23:19:00.223913" elapsed="0.011078">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:00.235595" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:00.235802" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:00.235744" elapsed="0.000121"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:00.235716" elapsed="0.000179"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:00.236096" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:00.236193" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:19:00.217029" elapsed="0.019317">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:00.236445" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:19:00.212874" elapsed="0.023722">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:00.236915" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:00.236712" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:00.236687" elapsed="0.000339"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:00.237296" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:00.237101" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:00.237079" elapsed="0.000327"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:00.210021" elapsed="0.027495">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:01.240781" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:01.239616" elapsed="0.001238"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:01.251132" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:01.250845" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:01.251612" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:01.251338" 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-08-22T23:19:01.266947" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:01.267425" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:19:01.267879" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:19:01.254036" elapsed="0.014742">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:01.251742" elapsed="0.017242">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:01.269503" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:01.269073" elapsed="0.000624"/>
</branch>
<status status="FAIL" start="2026-08-22T23:19:01.251717" elapsed="0.018041">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:01.270750" elapsed="0.000065"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:01.271116" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:01.270992" elapsed="0.000233"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:01.270948" 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-08-22T23:19:01.271690" elapsed="0.000054"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:01.271863" elapsed="0.000036"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:19:01.245792" elapsed="0.026327">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:01.272286" elapsed="0.000039"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:19:01.241375" elapsed="0.031141">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:01.273100" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:01.272750" elapsed="0.000483"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:01.272708" elapsed="0.000583"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:01.273790" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:01.273424" elapsed="0.000501"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:01.273383" elapsed="0.000599"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:01.238408" elapsed="0.035765">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:02.277237" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:02.276416" elapsed="0.000878"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:02.287363" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:02.287071" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:02.287855" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:02.287600" 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-08-22T23:19:02.297573" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:02.297755" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:19:02.297948" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:19:02.290320" elapsed="0.008030">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:02.287985" elapsed="0.010452">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:02.298663" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:02.298475" elapsed="0.000259"/>
</branch>
<status status="FAIL" start="2026-08-22T23:19:02.287958" elapsed="0.010802">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:02.299169" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:02.299317" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:02.299275" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:02.299256" elapsed="0.000131"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:02.299535" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:02.299625" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:19:02.281622" elapsed="0.018115">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:02.299811" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:19:02.277722" elapsed="0.022189">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:02.300188" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:02.299994" elapsed="0.000255"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:02.299976" elapsed="0.000299"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:02.300530" elapsed="0.000081"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:02.300331" elapsed="0.000365"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:02.300314" elapsed="0.000436"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:02.275133" elapsed="0.025793">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:03.304195" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:03.303182" elapsed="0.001085"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:03.317316" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:03.317044" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:03.317844" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:03.317518" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:19:03.327819" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:03.327996" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:19:03.328220" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:19:03.320281" elapsed="0.008379">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:03.317977" elapsed="0.010771">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:03.329008" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:03.328789" elapsed="0.000300"/>
</branch>
<status status="FAIL" start="2026-08-22T23:19:03.317951" elapsed="0.011168">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:03.329570" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:03.329736" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:03.329693" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:03.329673" elapsed="0.000130"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:03.329951" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:03.330022" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:19:03.310696" elapsed="0.019438">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:03.330206" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:19:03.304808" elapsed="0.025495">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:03.330544" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:03.330394" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:03.330376" elapsed="0.000265"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:03.330841" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:03.330698" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:03.330681" elapsed="0.000238"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:03.301935" elapsed="0.029065">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:04.334167" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:04.333012" elapsed="0.001232"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:04.344155" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:04.343889" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:04.344621" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:04.344357" 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-08-22T23:19:04.354443" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:04.354684" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:19:04.354929" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:19:04.347052" elapsed="0.008316">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:04.344749" elapsed="0.010720">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:04.355745" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:04.355511" elapsed="0.000306"/>
</branch>
<status status="FAIL" start="2026-08-22T23:19:04.344723" elapsed="0.011119">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:04.356292" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:04.356444" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:04.356400" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:04.356380" elapsed="0.000132"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:04.356677" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:04.356750" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:19:04.338339" elapsed="0.018524">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:04.356934" elapsed="0.000018"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:19:04.334688" elapsed="0.022346">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:04.357279" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:04.357130" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:04.357110" elapsed="0.000250"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:04.357556" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:04.357413" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:04.357398" elapsed="0.000254"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:04.331894" elapsed="0.025839">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:05.361027" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:05.359965" elapsed="0.001134"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:05.372153" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:05.371892" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:05.372622" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:05.372355" 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-08-22T23:19:05.381973" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:05.382136" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:19:05.382314" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:19:05.375024" elapsed="0.007711">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:05.372747" elapsed="0.010072">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:05.383012" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:05.382855" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:19:05.372724" elapsed="0.010379">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:05.383481" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:05.383638" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:05.383596" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:05.383563" elapsed="0.000142"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:05.383850" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:05.383919" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:19:05.367445" elapsed="0.016579">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:05.384094" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:19:05.361629" elapsed="0.022559">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:05.384409" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:05.384267" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:05.384251" elapsed="0.000238"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:05.384697" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:05.384542" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:05.384526" elapsed="0.000251"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:05.358655" elapsed="0.026199">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:06.387993" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:06.386882" elapsed="0.001185"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:06.398643" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:06.398342" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:06.399101" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:06.398854" 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-08-22T23:19:06.408231" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:06.408416" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:19:06.408658" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:19:06.401539" elapsed="0.007532">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:06.399228" elapsed="0.009937">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:06.409397" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:06.409206" elapsed="0.000258"/>
</branch>
<status status="FAIL" start="2026-08-22T23:19:06.399203" elapsed="0.010286">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:06.409932" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:06.410077" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:06.410035" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:06.410016" elapsed="0.000128"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:06.410288" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:06.410359" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:19:06.392331" elapsed="0.018136">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:06.410537" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:19:06.388563" elapsed="0.022090">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:06.410880" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:06.410733" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:06.410717" elapsed="0.000243"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:06.411154" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:06.411014" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:06.410998" elapsed="0.000235"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:06.385758" elapsed="0.025553">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:07.414277" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:07.413277" elapsed="0.001073"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:07.426306" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:07.425984" elapsed="0.000384"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:07.426807" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:07.426531" 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-08-22T23:19:07.435448" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:07.435660" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:19:07.435878" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:19:07.429293" elapsed="0.007001">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:07.426941" elapsed="0.009446">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:07.436704" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:07.436477" elapsed="0.000298"/>
</branch>
<status status="FAIL" start="2026-08-22T23:19:07.426915" elapsed="0.009886">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:07.437257" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:07.437410" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:07.437365" elapsed="0.000093"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:07.437345" elapsed="0.000134"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:07.437644" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:07.437719" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:19:07.419564" elapsed="0.018270">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:07.437908" elapsed="0.000018"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:19:07.414888" elapsed="0.023124">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:07.438254" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:07.438099" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:07.438080" elapsed="0.000257"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:07.438542" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:07.438396" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:07.438379" elapsed="0.000264"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:07.412159" elapsed="0.026566">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:08.441926" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:08.440788" elapsed="0.001212"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:08.453611" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:08.453327" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:08.454059" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:08.453813" 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-08-22T23:19:08.463520" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:08.463697" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:19:08.463878" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:19:08.456444" elapsed="0.007819">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:08.454185" elapsed="0.010160">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:08.464537" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:08.464380" elapsed="0.000239"/>
</branch>
<status status="FAIL" start="2026-08-22T23:19:08.454161" elapsed="0.010483">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:08.465017" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:08.465155" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:08.465115" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:08.465097" elapsed="0.000155"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:08.465401" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:08.465471" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:19:08.448053" elapsed="0.017537">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:08.465692" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:19:08.442500" elapsed="0.023325">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:08.466135" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:08.465935" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:08.465912" elapsed="0.000334"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:08.466513" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:08.466320" elapsed="0.000289"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:08.466299" elapsed="0.000344"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:08.439661" elapsed="0.027089">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:09.469877" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:09.468854" elapsed="0.001096"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:09.482291" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:09.481981" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:09.482783" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:09.482499" 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-08-22T23:19:09.491833" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:09.492043" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:19:09.492290" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:19:09.485166" elapsed="0.007667">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:09.482912" elapsed="0.010049">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:09.493239" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:09.493013" elapsed="0.000321"/>
</branch>
<status status="FAIL" start="2026-08-22T23:19:09.482887" elapsed="0.010481">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:09.493924" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:09.494181" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:09.494123" elapsed="0.000122"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:09.494095" elapsed="0.000181"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:09.494479" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:09.494601" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:19:09.476159" elapsed="0.018595">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:09.494851" elapsed="0.000024"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:19:09.470495" elapsed="0.024503">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:09.495319" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:09.495114" elapsed="0.000286"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:09.495090" elapsed="0.000343"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:09.495729" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:09.495510" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:09.495488" elapsed="0.000355"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:09.467673" elapsed="0.028297">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:10.499055" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:10.498035" elapsed="0.001092"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:10.513297" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:10.513033" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:10.513763" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:10.513498" 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-08-22T23:19:10.522598" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:10.522755" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:19:10.522977" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:19:10.516016" elapsed="0.007351">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:10.513895" elapsed="0.009555">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:10.523678" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:10.523486" elapsed="0.000293"/>
</branch>
<status status="FAIL" start="2026-08-22T23:19:10.513865" elapsed="0.009956">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:10.524352" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:10.524544" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:10.524489" elapsed="0.000139"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:10.524465" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:10.524859" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:10.524959" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:19:10.505195" elapsed="0.019914">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:10.525208" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:19:10.499661" elapsed="0.025679">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:10.525678" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:10.525451" elapsed="0.000307"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:10.525428" elapsed="0.000364"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:10.526072" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:10.525868" elapsed="0.000291"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:10.525846" elapsed="0.000348"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:10.496909" elapsed="0.029394">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:11.528975" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:11.528151" elapsed="0.000883"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:11.538146" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:11.537880" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:11.538614" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:11.538349" 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-08-22T23:19:11.547882" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:11.548063" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:19:11.548245" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:19:11.541161" elapsed="0.007501">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:11.538742" elapsed="0.010016">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:11.549050" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:11.548812" elapsed="0.000337"/>
</branch>
<status status="FAIL" start="2026-08-22T23:19:11.538717" elapsed="0.010466">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:11.549753" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:11.549970" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:11.549916" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:11.549890" elapsed="0.000172"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:11.550269" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:11.550368" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:19:11.533490" elapsed="0.017023">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:11.550631" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:19:11.529435" elapsed="0.021329">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:11.551075" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:11.550873" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:11.550850" elapsed="0.000336"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:11.551458" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:11.551261" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:11.551239" elapsed="0.000366"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:11.527154" elapsed="0.024591">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:12.554817" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:12.553821" elapsed="0.001068"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:12.565422" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:12.565163" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:12.565954" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:12.565706" 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-08-22T23:19:12.574910" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:12.575072" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:19:12.575258" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:19:12.568367" elapsed="0.007298">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:12.566079" elapsed="0.009670">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:12.575939" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:12.575783" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:19:12.566056" elapsed="0.009974">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:12.576446" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:12.576601" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:12.576545" elapsed="0.000104"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:12.576528" elapsed="0.000142"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:12.576867" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:12.576964" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:19:12.560864" elapsed="0.016245">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:12.577203" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:19:12.555382" elapsed="0.021952">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:12.577663" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:12.577444" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:12.577421" elapsed="0.000355"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:12.578043" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:12.577850" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:12.577829" elapsed="0.000324"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:12.552693" elapsed="0.025567">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:13.581422" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:13.580336" elapsed="0.001162"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:13.593492" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:13.593223" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:13.593968" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:13.593711" 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-08-22T23:19:13.603878" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:13.604056" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:19:13.604258" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:19:13.596413" elapsed="0.008280">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:13.594102" elapsed="0.010685">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:13.604983" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:13.604827" elapsed="0.000260"/>
</branch>
<status status="FAIL" start="2026-08-22T23:19:13.594074" elapsed="0.011040">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:13.605502" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:13.605659" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:13.605617" elapsed="0.000091"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:13.605599" 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-08-22T23:19:13.605941" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:13.606040" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:19:13.587703" elapsed="0.018484">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:13.606284" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:19:13.582046" elapsed="0.024369">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:13.606747" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:13.606524" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:13.606501" elapsed="0.000359"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:13.607128" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:13.606936" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:13.606914" elapsed="0.000324"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:13.579164" elapsed="0.028181">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:14.610615" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:14.609467" elapsed="0.001226"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:14.622960" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:14.622650" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:14.623433" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:14.623187" 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-08-22T23:19:14.632873" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:14.633040" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:19:14.633235" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:19:14.626071" elapsed="0.007571">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:14.623565" elapsed="0.010166">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:14.634019" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:14.633816" elapsed="0.000282"/>
</branch>
<status status="FAIL" start="2026-08-22T23:19:14.623538" elapsed="0.010589">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:14.634573" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:14.634752" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:14.634696" elapsed="0.000137"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:14.634676" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:14.635093" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:14.635193" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:19:14.616913" elapsed="0.018433">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:14.635442" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:19:14.611205" elapsed="0.024368">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:14.635908" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:14.635707" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:14.635683" elapsed="0.000337"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:14.636289" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:14.636095" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:14.636074" elapsed="0.000324"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:14.608290" elapsed="0.028216">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:15.639983" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:15.639001" elapsed="0.001054"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:15.651335" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:15.650974" elapsed="0.000430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:15.651988" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:15.651638" 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-08-22T23:19:15.661965" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:15.662119" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:19:15.662292" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:19:15.655192" elapsed="0.007546">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:15.652154" elapsed="0.010689">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:15.663106" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:15.662890" elapsed="0.000308"/>
</branch>
<status status="FAIL" start="2026-08-22T23:19:15.652125" elapsed="0.011106">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:15.663780" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:15.663971" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:15.663916" elapsed="0.000115"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:15.663892" elapsed="0.000169"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:15.664259" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:15.664357" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:19:15.644902" elapsed="0.019599">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:15.664617" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:19:15.640550" elapsed="0.024200">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:15.665060" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:15.664861" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:15.664837" elapsed="0.000334"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:15.665439" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:15.665247" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:15.665225" elapsed="0.000323"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:15.637850" elapsed="0.027826">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:16.669132" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:16.668057" elapsed="0.001162"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:16.680720" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:16.680437" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:16.681169" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:16.680922" 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-08-22T23:19:16.690841" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:16.691067" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:19:16.691377" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:19:16.683717" elapsed="0.008258">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:16.681301" elapsed="0.010796">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:16.692372" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:16.692151" elapsed="0.000315"/>
</branch>
<status status="FAIL" start="2026-08-22T23:19:16.681273" elapsed="0.011227">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:16.693066" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:16.693265" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:16.693207" elapsed="0.000123"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:16.693182" elapsed="0.000178"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:16.693563" elapsed="0.000051"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:16.693685" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:19:16.674141" elapsed="0.019696">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:16.693935" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:19:16.669766" elapsed="0.024300">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:16.694376" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:16.694176" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:16.694154" elapsed="0.000335"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:16.694782" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:16.694565" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:16.694543" elapsed="0.000352"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:16.666624" elapsed="0.028385">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:17.698616" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:17.697332" elapsed="0.001392"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:17.710515" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:17.710147" elapsed="0.000456"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:17.711168" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:17.710821" 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-08-22T23:19:17.722154" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:17.722371" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:19:17.722661" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:19:17.714606" elapsed="0.008609">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:17.711347" elapsed="0.011988">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:17.723939" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:17.723388" elapsed="0.000655"/>
</branch>
<status status="FAIL" start="2026-08-22T23:19:17.711311" elapsed="0.012768">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:17.724632" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:17.724829" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:17.724772" elapsed="0.000121"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:17.724747" elapsed="0.000177"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:17.725124" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:17.725223" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:19:17.703987" elapsed="0.021386">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:17.725471" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:19:17.699425" elapsed="0.026197">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:17.725937" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:17.725734" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:17.725711" elapsed="0.000337"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:17.726313" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:17.726122" elapsed="0.000268"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:17.726101" elapsed="0.000321"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:17.696105" elapsed="0.030425">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:18.729475" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:18.728762" elapsed="0.000763"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:18.740330" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:18.739933" elapsed="0.000476"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:18.741051" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:18.740713" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:19:18.753506" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:18.753899" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:19:18.754289" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:19:18.743506" elapsed="0.011672">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:18.741194" elapsed="0.014185">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:18.755879" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:18.755463" elapsed="0.000577"/>
</branch>
<status status="FAIL" start="2026-08-22T23:19:18.741166" elapsed="0.015011">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:18.757322" elapsed="0.000080"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:18.757774" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:18.757656" elapsed="0.000238"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:18.757557" elapsed="0.000398"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:18.758355" elapsed="0.000058"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:18.758543" elapsed="0.000086"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:19:18.733523" elapsed="0.025361">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:18.759072" elapsed="0.000042"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:19:18.729899" elapsed="0.029439">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:18.759945" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:18.759555" elapsed="0.000524"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:18.759508" elapsed="0.000627"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:18.760727" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:18.760295" elapsed="0.000549"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:18.760256" elapsed="0.000621"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:18.727437" elapsed="0.033548">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:19.764092" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:19.763090" elapsed="0.001075"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:19.775011" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:19.774652" elapsed="0.000426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:19.775645" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:19.775286" 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-08-22T23:19:19.785749" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:19.785921" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:19:19.786173" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:19:19.778726" elapsed="0.007984">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:19.775812" elapsed="0.011012">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:19.787090" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:19.786875" elapsed="0.000308"/>
</branch>
<status status="FAIL" start="2026-08-22T23:19:19.775781" elapsed="0.011435">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:19.787765" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:19.787956" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:19.787901" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:19.787877" elapsed="0.000170"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:19.788243" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:19.788340" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:19:19.768665" elapsed="0.019820">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:19.788600" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:19:19.764693" elapsed="0.024041">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:19.789040" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:19.788843" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:19.788820" elapsed="0.000330"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:19.789442" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:19.789243" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:19.789219" elapsed="0.000333"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:19.761948" elapsed="0.027732">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:20.792922" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:20.791879" elapsed="0.001119"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:20.804163" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:20.803783" elapsed="0.000449"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:20.804816" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:20.804442" 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-08-22T23:19:20.815079" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:20.815303" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:19:20.815555" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:19:20.807921" elapsed="0.008207">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:20.804993" elapsed="0.011256">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:20.816520" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:20.816301" elapsed="0.000333"/>
</branch>
<status status="FAIL" start="2026-08-22T23:19:20.804957" elapsed="0.011712">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:20.817191" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:20.817383" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:20.817326" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:20.817302" 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-08-22T23:19:20.817721" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:20.817827" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:19:20.797746" elapsed="0.020262">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:20.818106" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:19:20.793506" elapsed="0.024730">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:20.818611" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:20.818352" elapsed="0.000344"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:20.818323" elapsed="0.000406"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:20.819014" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:20.818806" elapsed="0.000287"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:20.818784" elapsed="0.000341"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:20.790660" elapsed="0.028573">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:21.822272" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:21.821273" elapsed="0.001071"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:21.832332" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:21.832074" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:21.832795" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:21.832532" 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-08-22T23:19:21.841983" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:21.842230" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:19:21.842470" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:19:21.835216" elapsed="0.007831">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:21.832923" elapsed="0.010241">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:21.843428" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:21.843214" elapsed="0.000305"/>
</branch>
<status status="FAIL" start="2026-08-22T23:19:21.832896" elapsed="0.010656">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:21.844091" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:21.844282" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:21.844227" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:21.844203" elapsed="0.000170"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:21.844613" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:21.844714" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:19:21.826382" elapsed="0.018477">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:21.844955" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:19:21.822929" elapsed="0.022155">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:21.845389" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:21.845192" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:21.845169" elapsed="0.000332"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:21.845793" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:21.845596" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:21.845554" elapsed="0.000348"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:21.820124" elapsed="0.025883">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:22.849057" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:22.848057" elapsed="0.001071"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:22.862723" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:22.862392" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:22.863227" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:22.862940" 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-08-22T23:19:22.871064" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:22.871259" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:19:22.871461" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:19:22.865425" elapsed="0.006457">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:22.863355" elapsed="0.008619">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:22.872178" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:22.872012" elapsed="0.000233"/>
</branch>
<status status="FAIL" start="2026-08-22T23:19:22.863329" elapsed="0.008941">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:22.872696" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:22.872840" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:22.872798" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:22.872780" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:22.873048" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:22.873117" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:19:22.854285" elapsed="0.018939">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:22.873293" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:19:22.849653" elapsed="0.023740">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:22.873630" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:22.873472" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:22.873455" elapsed="0.000254"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:22.873900" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:22.873762" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:22.873746" elapsed="0.000232"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:22.846884" elapsed="0.027169">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:23.877475" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:23.876451" elapsed="0.001095"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:23.888625" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:23.888352" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:23.889074" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:23.888827" 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-08-22T23:19:23.897551" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:23.897756" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:19:23.897969" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:19:23.891449" elapsed="0.006954">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:23.889196" elapsed="0.009299">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:23.898762" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:23.898536" elapsed="0.000294"/>
</branch>
<status status="FAIL" start="2026-08-22T23:19:23.889174" elapsed="0.009681">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:23.899276" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:23.899417" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:23.899378" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:23.899359" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:23.899640" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:23.899712" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:19:23.883514" elapsed="0.016359">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:19:23.899946" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:19:23.878078" elapsed="0.021961">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:23.900264" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:23.900119" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:23.900102" elapsed="0.000242"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:23.900534" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:23.900396" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:23.900381" elapsed="0.000247"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:23.874935" elapsed="0.025770">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<msg time="2026-08-22T23:19:23.900803" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>60s</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:18:23.158353" elapsed="60.742545">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:23.902788" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:23.902052" elapsed="0.000776"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-08-22T23:19:23.903140" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:23.902935" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:23.902909" elapsed="0.000319"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:19:23.903466" elapsed="0.000349"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:19:23.905073" level="FAIL">'4968' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:19:23.904555" elapsed="0.000604">'4968' does not contain '-'</status>
</kw>
<msg time="2026-08-22T23:19:23.905290" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:19:23.904048" elapsed="0.001340"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:19:23.906121" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:19:23.905646" elapsed="0.000512"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:23.906877" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:23.906423" elapsed="0.000491"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:23.907549" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:23.907136" elapsed="0.000471"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-08-22T23:19:23.908375" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968

Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-08-22T23:19:23.907854" elapsed="0.000590"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:23.909036" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:23.908685" elapsed="0.000422"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-08-22T23:19:23.909785" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=4968'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-08-22T23:19:23.909424" elapsed="0.000408"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:23.909185" elapsed="0.000683"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:23.909167" elapsed="0.000725"/>
</if>
<arg>4968</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:19:23.901511" elapsed="0.008427"/>
</kw>
<doc>Check that the modified device data make their way into the checker node.</doc>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=4968</tag>
<status status="FAIL" start="2026-08-22T23:18:22.893092" elapsed="61.016892">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968

Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</test>
<test id="s1-s1-t18" name="Check_Modified_Device_Data_Is_Visible_On_Configurer" line="195">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:19:23.913483" elapsed="0.000230"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:19:23.913220" elapsed="0.000549"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:19:23.914780" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:23.914669" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:23.914650" 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-08-22T23:19:23.919839" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:23.919721" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:23.919703" elapsed="0.000204"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:19:23.920912" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:19:23.920508" elapsed="0.000432"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:19:23.921409" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:19:23.921101" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:19:23.921480" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:19:23.921660" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:19:23.920132" elapsed="0.001554"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:19:23.927448" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:23.927339" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:23.927320" 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-08-22T23:19:23.928746" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:23.928637" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:23.928618" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:19:23.929312" 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-08-22T23:19:23.928991" elapsed="0.000348"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:19:23.929762" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:19:23.929496" elapsed="0.000292"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:19:23.967607" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:19:23.930281" elapsed="0.037433"/>
</kw>
<msg time="2026-08-22T23:19:23.967927" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:19:23.967974" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:19:23.929947" elapsed="0.038065"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:19:23.990936" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:19:23.968522" elapsed="0.022565"/>
</kw>
<msg time="2026-08-22T23:19:23.991279" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:19:23.991327" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:19:23.968183" elapsed="0.023183"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:23.991726" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:23.991458" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:23.991433" elapsed="0.000376"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:23.992317" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:23.991981" 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-08-22T23:19:23.992692" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:23.992460" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:23.992441" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:19:23.992804" 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-08-22T23:19:23.995541" elapsed="0.000167"/>
</kw>
<msg time="2026-08-22T23:19:23.995773" 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-08-22T23:19:23.994334" elapsed="0.001601"/>
</kw>
<kw name="Open 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-08-22T23:19:23.996242" elapsed="0.000091"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:23.996637" elapsed="0.000087"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:19:23.993639" 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-08-22T23:19:23.993084" elapsed="0.003833"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:19:23.928313" elapsed="0.068702"/>
</kw>
<msg time="2026-08-22T23:19:23.997114" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:19:23.997159" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:19:23.927680" elapsed="0.069517"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:19:23.997378" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:19:23.997272" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:23.997254" 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-08-22T23:19:23.997897" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:23.998268" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:19:23.998341" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:19:23.927000" elapsed="0.071449"/>
</kw>
<msg time="2026-08-22T23:19:23.998544" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:19:23.998614" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:19:23.922063" elapsed="0.076591"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:23.998987" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:23.998730" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:23.998713" elapsed="0.000353"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:19:23.921921" elapsed="0.077168"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:19:24.004647" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:24.004524" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:24.004504" 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-08-22T23:19:24.005874" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:24.005765" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:24.005746" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:19:24.006435" 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-08-22T23:19:24.006084" elapsed="0.000379"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:19:24.006865" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:19:24.006639" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:19:24.046294" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:19:24.007379" elapsed="0.039026"/>
</kw>
<msg time="2026-08-22T23:19:24.046609" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:19:24.046661" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:19:24.007048" elapsed="0.039650"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:19:24.083641" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:19:24.047213" elapsed="0.036544"/>
</kw>
<msg time="2026-08-22T23:19:24.083953" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:19:24.084004" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:19:24.046872" elapsed="0.037177"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:24.084350" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:24.084129" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:24.084108" elapsed="0.000321"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:24.085107" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:24.084573" 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-08-22T23:19:24.085467" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:24.085249" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:24.085230" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:19:24.085595" 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-08-22T23:19:24.088295" elapsed="0.000143"/>
</kw>
<msg time="2026-08-22T23:19:24.088542" 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-08-22T23:19:24.087093" elapsed="0.001618"/>
</kw>
<kw name="Open 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-08-22T23:19:24.089024" elapsed="0.000107"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:24.089412" 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-08-22T23:19:24.086395" elapsed="0.003238"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:19:24.085866" elapsed="0.003837"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:19:24.005435" elapsed="0.084367"/>
</kw>
<msg time="2026-08-22T23:19:24.089894" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:19:24.089938" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:19:24.004864" elapsed="0.085112"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:19:24.090159" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:19:24.090052" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:24.090033" 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-08-22T23:19:24.090657" 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-08-22T23:19:24.090989" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:19:24.091061" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:19:24.004181" elapsed="0.086989"/>
</kw>
<msg time="2026-08-22T23:19:24.091262" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:19:24.091306" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:19:23.999353" elapsed="0.091989"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:24.091686" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:24.091417" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:24.091400" elapsed="0.000365"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:19:23.999216" elapsed="0.092573"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:19:24.097630" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:24.097504" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:24.097480" 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-08-22T23:19:24.098865" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:19:24.098757" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:24.098738" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:19:24.099386" 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-08-22T23:19:24.099073" elapsed="0.000340"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:19:24.099808" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:19:24.099567" elapsed="0.000267"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:19:24.135003" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:19:24.100377" elapsed="0.034820"/>
</kw>
<msg time="2026-08-22T23:19:24.135422" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:19:24.135470" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:19:24.100017" elapsed="0.035491"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:19:24.164272" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:19:24.136213" elapsed="0.028687"/>
</kw>
<msg time="2026-08-22T23:19:24.165380" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:19:24.165492" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:19:24.135759" elapsed="0.029852"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:24.166499" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:24.165848" elapsed="0.000828"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:24.165777" elapsed="0.000965"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:24.167930" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:24.167069" elapsed="0.001053"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:24.168807" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:24.168276" elapsed="0.000656"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:24.168234" elapsed="0.000753"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:19:24.169074" elapsed="0.000078"/>
</return>
<kw name="Run Keyword 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-08-22T23:19:24.174371" elapsed="0.000151"/>
</kw>
<msg time="2026-08-22T23:19:24.174605" 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-08-22T23:19:24.173196" elapsed="0.001567"/>
</kw>
<kw name="Open 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-08-22T23:19:24.175069" elapsed="0.000090"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:24.175443" 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-08-22T23:19:24.171759" elapsed="0.003920"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:19:24.169784" elapsed="0.005965"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:19:24.098431" elapsed="0.077417"/>
</kw>
<msg time="2026-08-22T23:19:24.175941" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:19:24.176001" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:19:24.097851" elapsed="0.078189"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:19:24.176229" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:19:24.176122" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:24.176103" 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-08-22T23:19:24.176744" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:24.177082" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:19:24.177153" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:19:24.097136" elapsed="0.080125"/>
</kw>
<msg time="2026-08-22T23:19:24.177358" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:19:24.177403" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:19:24.092074" elapsed="0.085366"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:24.177936" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:24.177515" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:24.177498" elapsed="0.000516"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:19:24.091925" elapsed="0.086117"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:19:23.921742" elapsed="0.256339"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:19:23.919345" elapsed="0.258801"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:19:23.914349" elapsed="0.263909"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:19:23.913917" elapsed="0.264391"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:19:23.910832" elapsed="0.267533"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:24.179944" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:24.179535" elapsed="0.000462"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:24.187520" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:24.187270" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:24.188093" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:24.187809" 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-08-22T23:19:24.256381" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:24.256731" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:24.256956" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:24.190455" elapsed="0.066560"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:24.188205" elapsed="0.068909"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:24.257516" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:24.257175" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:24.188186" elapsed="0.069574"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:24.265382" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:24.260059" elapsed="0.005371"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:24.259518" elapsed="0.005947"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:24.259477" elapsed="0.006013"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:24.268440" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:24.265782" elapsed="0.002712"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:24.265546" elapsed="0.002987"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:24.265529" elapsed="0.003029"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:24.269169" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:24.268758" 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-08-22T23:19:24.269502" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:24.269267" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:24.270062" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:24.269760" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:24.269600" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:24.269249" elapsed="0.000898"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:24.270683" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:24.270303" 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-08-22T23:19:24.271021" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:24.270780" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:24.271556" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:24.271261" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:24.271103" elapsed="0.000588"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:24.270762" 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-08-22T23:19:24.271870" elapsed="0.000375"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:24.272735" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:24.272411" 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-08-22T23:19:24.272915" elapsed="0.002362"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:19:24.258543" elapsed="0.016798"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:24.275518" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:19:24.275410" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:24.275392" 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-08-22T23:19:24.275772" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:24.275844" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:19:24.278218" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:24.182778" elapsed="0.095469"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:24.278307" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:19:24.278458" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:24.180211" elapsed="0.098273"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:24.279163" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:24.278780" elapsed="0.000467">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:24.278552" elapsed="0.000772">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:24.278536" elapsed="0.000822">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:24.279593" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:24.279429" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:24.279412" elapsed="0.000265"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:24.179134" elapsed="0.100627">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:25.282895" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:25.281901" elapsed="0.001067"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:25.294032" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:25.293768" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:25.294487" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:25.294239" 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-08-22T23:19:25.319927" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:25.320157" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:25.320258" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:25.296826" elapsed="0.023459"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:25.294627" elapsed="0.025702"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:25.320515" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:25.320359" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:25.294600" elapsed="0.026022"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:25.324491" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:25.321685" elapsed="0.002856"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:25.321445" elapsed="0.003147"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:25.321426" elapsed="0.003193"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:25.327259" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:25.324913" elapsed="0.002393"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:25.324689" elapsed="0.002653"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:25.324672" elapsed="0.002697"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:25.327966" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:25.327544" 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-08-22T23:19:25.328304" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:25.328066" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:25.328896" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:25.328549" elapsed="0.000375"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:25.328388" elapsed="0.000573"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:25.328048" elapsed="0.000935"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:25.329516" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:25.329149" 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-08-22T23:19:25.329867" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:25.329632" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:25.330407" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:25.330108" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:25.329950" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:25.329613" 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-08-22T23:19:25.330659" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:25.331465" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:25.331173" 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-08-22T23:19:25.331660" 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-08-22T23:19:25.321016" elapsed="0.013183"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:25.334379" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:19:25.334269" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:25.334250" 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-08-22T23:19:25.334637" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:25.334710" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:19:25.337095" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:25.289436" elapsed="0.047688"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:25.337223" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:19:25.337380" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:25.283464" elapsed="0.053943"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:25.338070" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:25.337703" elapsed="0.000447">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:25.337478" elapsed="0.000745">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:25.337461" elapsed="0.000797">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:25.338475" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:25.338328" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:25.338312" elapsed="0.000244"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:25.280751" elapsed="0.057904">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:26.341654" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:26.340859" elapsed="0.000848"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:26.352921" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:26.352640" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:26.353501" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:26.353128" 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-08-22T23:19:26.378071" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:26.378286" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:26.378431" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:26.355895" elapsed="0.022575"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:26.353664" elapsed="0.024868"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:26.378831" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:26.378599" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:26.353629" elapsed="0.025332"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:26.383755" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:26.380481" elapsed="0.003335"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:26.380152" elapsed="0.003701"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:26.380123" elapsed="0.003755"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:26.386613" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:26.384176" elapsed="0.002500"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:26.383937" elapsed="0.002785"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:26.383919" elapsed="0.002835"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:26.387417" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:26.386981" 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-08-22T23:19:26.387910" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:26.387528" elapsed="0.000464"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:26.388523" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:26.388202" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:26.388024" elapsed="0.000594"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:26.387506" elapsed="0.001137"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:26.389236" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:26.388826" elapsed="0.000441"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:26.389669" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:26.389401" elapsed="0.000329"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:26.390312" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:26.389923" elapsed="0.000426"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:26.389755" elapsed="0.000645"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:26.389379" elapsed="0.001053"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:19:26.390668" elapsed="0.000481"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:26.391820" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:26.391381" 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-08-22T23:19:26.392065" elapsed="0.002897"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:19:26.379525" elapsed="0.015510"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:26.395225" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-08-22T23:19:26.395109" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:26.395089" 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-08-22T23:19:26.395500" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:26.395613" elapsed="0.000024"/>
</return>
<msg time="2026-08-22T23:19:26.398446" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:26.345994" elapsed="0.052485"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:26.398545" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:19:26.398723" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:26.342052" elapsed="0.056703"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:26.399464" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:26.399071" elapsed="0.000480">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:26.398848" elapsed="0.000798">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:26.398827" elapsed="0.000856">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:26.399927" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:26.399754" elapsed="0.000237"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:26.399737" elapsed="0.000279"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:26.339649" elapsed="0.060454">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:27.403280" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:27.402301" elapsed="0.001050"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:27.416069" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:27.415779" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:27.416528" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:27.416282" 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-08-22T23:19:27.438254" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:27.438425" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:27.438532" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:27.418888" elapsed="0.019670"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:27.416668" elapsed="0.021960"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:27.438821" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:27.438660" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:27.416643" elapsed="0.022265"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:27.442426" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:27.439969" elapsed="0.002506"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:27.439735" elapsed="0.002775"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:27.439716" elapsed="0.002819"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:27.445124" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:27.442831" elapsed="0.002345"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:27.442608" elapsed="0.002604"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:27.442589" elapsed="0.002647"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:27.445845" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:27.445416" 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-08-22T23:19:27.446218" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:27.445975" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:27.446781" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:27.446460" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:27.446300" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:27.445951" elapsed="0.000915"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:27.447382" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:27.447022" 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-08-22T23:19:27.447720" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:27.447477" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:27.448254" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:27.447956" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:27.447802" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:27.447459" 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-08-22T23:19:27.448486" elapsed="0.000463"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:27.449434" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:27.449131" 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-08-22T23:19:27.449725" elapsed="0.002291"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:19:27.439286" elapsed="0.012797"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:27.452264" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:19:27.452153" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:27.452134" 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-08-22T23:19:27.452508" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:27.452594" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:19:27.454983" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:27.409279" elapsed="0.045733"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:27.455073" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:19:27.455226" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:27.403872" elapsed="0.051380"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:27.455910" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:27.455531" elapsed="0.000461">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:27.455323" elapsed="0.000744">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:27.455305" elapsed="0.000796">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:27.456318" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:27.456170" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:27.456153" elapsed="0.000243"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:27.401165" elapsed="0.055316">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:28.459682" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:28.458514" elapsed="0.001244"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:28.473741" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:28.473456" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:28.474193" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:28.473944" 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-08-22T23:19:28.495735" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:28.496039" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:28.496260" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:28.476389" elapsed="0.019930"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:28.474316" elapsed="0.022229"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:28.496998" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:28.496649" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:28.474291" elapsed="0.022930"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:28.502841" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:28.499501" elapsed="0.003410"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:28.499166" elapsed="0.003796"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:28.499135" elapsed="0.003863"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:28.506663" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:28.503383" elapsed="0.003347"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:28.503076" elapsed="0.003704"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:28.503053" elapsed="0.003762"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:28.507637" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:28.507056" 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-08-22T23:19:28.508103" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:28.507776" elapsed="0.000411"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:28.508886" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:28.508441" elapsed="0.000482"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:28.508221" elapsed="0.000754"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:28.507750" elapsed="0.001255"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:28.509750" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:28.509222" 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-08-22T23:19:28.510205" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:28.509885" elapsed="0.000400"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:28.510991" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:28.510536" elapsed="0.000492"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:28.510319" elapsed="0.000760"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:28.509860" 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-08-22T23:19:28.511323" elapsed="0.000511"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:28.512470" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:28.512057" 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-08-22T23:19:28.512748" elapsed="0.004742"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:19:28.498051" elapsed="0.019505"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:28.517758" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:19:28.517645" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:28.517626" 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-08-22T23:19:28.518000" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:28.518072" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:19:28.520448" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:28.466268" elapsed="0.054209"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:28.520538" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:19:28.520708" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:28.460266" elapsed="0.060469"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:28.521385" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:28.521012" elapsed="0.000512">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:28.520805" elapsed="0.000809">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:28.520788" elapsed="0.000863">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:28.521869" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:28.521721" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:28.521704" elapsed="0.000247"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:28.457343" elapsed="0.064692">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:29.525118" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:29.524144" elapsed="0.001044"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:29.536661" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:29.536383" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:29.537115" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:29.536867" 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-08-22T23:19:29.560717" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:29.560870" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:29.560968" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:29.539322" elapsed="0.021672"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:29.537238" elapsed="0.023800"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:29.561218" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:29.561064" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:29.537216" elapsed="0.024088"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:29.564926" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:29.562332" elapsed="0.002644"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:29.562105" elapsed="0.002907"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:29.562086" elapsed="0.002952"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:29.567641" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:29.565323" elapsed="0.002366"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:29.565095" elapsed="0.002630"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:29.565078" elapsed="0.002673"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:29.568329" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:29.567930" 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-08-22T23:19:29.568677" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:29.568426" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:29.569223" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:29.568921" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:29.568760" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:29.568409" elapsed="0.000961"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:29.569910" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:29.569527" 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-08-22T23:19:29.570237" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:29.570006" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:29.570794" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:29.570478" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:29.570319" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:29.569989" 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-08-22T23:19:29.571031" elapsed="0.000384"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:29.571889" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:29.571592" 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-08-22T23:19:29.572068" elapsed="0.002291"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:19:29.561681" elapsed="0.012742"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:29.574619" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:19:29.574492" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:29.574474" 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-08-22T23:19:29.574860" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:29.574932" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:19:29.577242" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:29.530202" elapsed="0.047069"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:29.577331" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:19:29.577481" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:29.525717" elapsed="0.051790"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:29.578157" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:29.577799" elapsed="0.000435">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:29.577590" elapsed="0.000715">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:29.577559" elapsed="0.000780">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:29.578556" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:29.578407" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:29.578391" elapsed="0.000261"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:29.522947" elapsed="0.055788">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:30.581938" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:30.580903" elapsed="0.001113"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:30.593940" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:30.593670" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:30.594394" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:30.594144" 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-08-22T23:19:30.617669" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:30.617995" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:30.618233" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:30.596639" elapsed="0.021662"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:30.594524" elapsed="0.023890"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:30.618865" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:30.618481" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:30.594496" elapsed="0.024570"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:30.628783" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:30.621528" elapsed="0.007306"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:30.621000" elapsed="0.007870"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:30.620959" elapsed="0.007937"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:30.632472" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:30.629183" elapsed="0.003336"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:30.628953" elapsed="0.003603"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:30.628936" elapsed="0.003668"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:30.633194" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:30.632790" 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-08-22T23:19:30.633527" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:30.633291" elapsed="0.000448"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:30.634248" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:30.633939" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:30.633771" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:30.633274" elapsed="0.001058"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:30.634872" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:30.634487" elapsed="0.001185"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:30.636549" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:30.636041" elapsed="0.000605"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:30.637282" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:30.636844" elapsed="0.000467"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:30.636674" elapsed="0.000673"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:30.635973" 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-08-22T23:19:30.637541" elapsed="0.000394"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:30.638410" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:30.638098" 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-08-22T23:19:30.638603" elapsed="0.002558"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:19:30.619977" elapsed="0.021263"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:30.641543" elapsed="0.000073"/>
</return>
<status status="PASS" start="2026-08-22T23:19:30.641419" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:30.641398" 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-08-22T23:19:30.641831" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:30.641904" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:19:30.644335" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:30.588943" elapsed="0.055423"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:30.644431" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:19:30.644607" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:30.582694" elapsed="0.061943"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:30.645318" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:30.644929" elapsed="0.000475">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:30.644711" elapsed="0.000771">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:30.644693" elapsed="0.000828">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:30.645779" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:30.645625" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:30.645603" elapsed="0.000259"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:30.579671" elapsed="0.066280">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:31.649086" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:31.648108" elapsed="0.001042"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:31.661333" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:31.661073" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:31.661799" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:31.661535" 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-08-22T23:19:31.683662" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:31.683806" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:31.683908" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:31.663976" elapsed="0.019958"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:31.661911" elapsed="0.022068"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:31.684162" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:31.684006" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:31.661892" elapsed="0.022362"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:31.687836" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:31.685368" elapsed="0.002519"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:31.685096" elapsed="0.002827"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:31.685078" elapsed="0.002870"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:31.690620" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:31.688227" elapsed="0.002441"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:31.688004" elapsed="0.002700"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:31.687987" elapsed="0.002743"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:31.691326" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:31.690902" 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-08-22T23:19:31.691681" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:31.691425" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:31.692227" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:31.691925" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:31.691765" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:31.691407" elapsed="0.000904"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:31.692877" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:31.692483" 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-08-22T23:19:31.693205" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:31.692974" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:31.693772" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:31.693440" elapsed="0.000359"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:31.693285" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:31.692956" 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-08-22T23:19:31.694009" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:31.694821" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:31.694518" 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-08-22T23:19:31.694998" 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-08-22T23:19:31.684667" elapsed="0.013006"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:31.697852" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-08-22T23:19:31.697742" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:31.697724" 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-08-22T23:19:31.698090" elapsed="0.000036"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:31.698177" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:19:31.700587" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:31.656099" elapsed="0.044519"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:31.700679" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:19:31.700832" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:31.649666" elapsed="0.051192"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:31.701498" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:31.701137" elapsed="0.000452">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:31.700928" elapsed="0.000736">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:31.700911" elapsed="0.000823">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:31.701955" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:31.701808" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:31.701791" elapsed="0.000246"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:31.647085" elapsed="0.055035">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:32.705086" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:32.704066" elapsed="0.001094"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:32.716989" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:32.716727" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:32.717450" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:32.717203" 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-08-22T23:19:32.738347" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:32.738683" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:32.738904" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:32.719659" elapsed="0.019303"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:32.717593" elapsed="0.021468"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:32.739461" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:32.739123" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:32.717552" elapsed="0.022140"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:32.748176" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:32.742076" elapsed="0.006212"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:32.741553" elapsed="0.006816"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:32.741511" elapsed="0.006916"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:32.752290" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:32.749131" elapsed="0.003206"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:32.748555" elapsed="0.003818"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:32.748516" elapsed="0.003883"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:32.753058" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:32.752614" 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-08-22T23:19:32.753396" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:32.753157" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:32.753962" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:32.753658" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:32.753480" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:32.753139" elapsed="0.000907"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:32.754571" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:32.754202" 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-08-22T23:19:32.754927" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:32.754693" elapsed="0.000348"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:32.755525" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:32.755227" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:32.755067" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:32.754666" elapsed="0.000960"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:19:32.755782" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:32.756622" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:32.756297" 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-08-22T23:19:32.756805" elapsed="0.002361"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:19:32.740520" elapsed="0.018712"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:32.759414" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:19:32.759303" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:32.759285" 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-08-22T23:19:32.759675" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:32.759748" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:19:32.762110" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:32.711266" elapsed="0.050874"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:32.762200" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:19:32.762351" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:32.705726" elapsed="0.056652"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:32.763039" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:32.762670" elapsed="0.000454">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:32.762447" elapsed="0.000751">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:32.762430" elapsed="0.000802">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:32.763450" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:32.763301" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:32.763285" elapsed="0.000246"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:32.702931" elapsed="0.060699">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:33.766610" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:33.765546" elapsed="0.001139"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:33.778353" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:33.778086" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:33.778817" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:33.778554" 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-08-22T23:19:33.801118" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:33.801410" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:33.801683" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:33.781072" elapsed="0.020674"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:33.778940" elapsed="0.022908"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:33.802259" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:33.801912" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:33.778915" elapsed="0.023543"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:33.810298" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:33.804818" elapsed="0.005530"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:33.804275" elapsed="0.006108"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:33.804227" elapsed="0.006182"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:33.813005" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:33.810700" elapsed="0.002351"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:33.810465" elapsed="0.002621"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:33.810448" elapsed="0.002663"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:33.813716" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:33.813290" 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-08-22T23:19:33.814048" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:33.813814" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:33.814603" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:33.814289" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:33.814130" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:33.813796" elapsed="0.000894"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:33.815204" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:33.814845" 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-08-22T23:19:33.815528" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:33.815299" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:33.816077" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:33.815783" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:33.815625" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:33.815282" 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-08-22T23:19:33.816311" elapsed="0.000365"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:33.817137" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:33.816836" 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-08-22T23:19:33.817314" 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-08-22T23:19:33.803290" elapsed="0.016454"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:33.819925" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:19:33.819814" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:33.819796" 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-08-22T23:19:33.820167" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:33.820271" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:19:33.822775" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:33.772671" elapsed="0.050134"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:33.822866" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:19:33.823018" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:33.767179" elapsed="0.055866"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:33.823703" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:33.823322" elapsed="0.000465">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:33.823114" elapsed="0.000747">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:33.823097" elapsed="0.000798">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:33.824110" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:33.823964" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:33.823947" elapsed="0.000242"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:33.764447" elapsed="0.059825">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:34.827805" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:34.826752" elapsed="0.001129"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:34.841943" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:34.841676" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:34.842408" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:34.842144" 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-08-22T23:19:34.866712" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:34.867019" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:34.867236" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:34.844617" elapsed="0.022676"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:34.842536" elapsed="0.024852"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:34.867829" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:34.867449" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:34.842508" elapsed="0.025514"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:34.874070" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:34.870382" elapsed="0.003755"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:34.869841" elapsed="0.004345"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:34.869799" elapsed="0.004437"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:34.877810" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:34.874641" elapsed="0.003233"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:34.874316" elapsed="0.003686"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:34.874293" elapsed="0.003745"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:34.878902" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:34.878316" 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-08-22T23:19:34.879387" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:34.879038" elapsed="0.000419"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:34.879957" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:34.879657" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:34.879483" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:34.879013" elapsed="0.001028"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:34.880562" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:34.880196" 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-08-22T23:19:34.880903" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:34.880673" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:34.881432" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:34.881139" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:34.880983" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:34.880655" elapsed="0.000859"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:19:34.881682" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:34.882525" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:34.882199" 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-08-22T23:19:34.882717" elapsed="0.002379"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:19:34.868871" elapsed="0.016291"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:34.885342" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:19:34.885229" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:34.885212" 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-08-22T23:19:34.885602" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:34.885674" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:19:34.887978" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:34.834537" elapsed="0.053469"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:34.888065" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:19:34.888215" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:34.828386" elapsed="0.059855"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:34.888901" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:34.888513" elapsed="0.000476">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:34.888308" elapsed="0.000756">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:34.888292" elapsed="0.000806">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:34.889316" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:34.889166" elapsed="0.000241"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:34.889150" elapsed="0.000281"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:34.825309" elapsed="0.064208">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:35.892728" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:35.891687" elapsed="0.001118"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:35.903716" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:35.903432" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:35.904181" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:35.903934" 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-08-22T23:19:35.936550" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:35.936909" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:35.937132" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:35.906392" elapsed="0.030798"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:35.904310" elapsed="0.032978"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:35.937733" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:35.937351" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:35.904283" elapsed="0.033651"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:35.944709" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:35.940268" elapsed="0.004492"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:35.939777" elapsed="0.005019"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:35.939736" elapsed="0.005085"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:35.948284" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:35.945099" elapsed="0.003233"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:35.944877" elapsed="0.003491"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:35.944860" elapsed="0.003534"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:35.948993" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:35.948590" 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-08-22T23:19:35.949331" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:35.949092" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:35.949901" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:35.949594" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:35.949415" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:35.949074" elapsed="0.000912"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:35.950504" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:35.950143" 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-08-22T23:19:35.950880" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:35.950619" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:35.951418" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:35.951121" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:35.950964" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:35.950600" 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-08-22T23:19:35.951741" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:35.952563" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:35.952259" 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-08-22T23:19:35.952760" elapsed="0.002340"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:19:35.938768" elapsed="0.016398"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:35.955348" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:19:35.955237" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:35.955219" 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-08-22T23:19:35.955605" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:35.955679" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:19:35.958049" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:35.898897" elapsed="0.059181"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:35.958138" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:19:35.958288" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:35.893303" elapsed="0.065012"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:35.959003" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:35.958605" elapsed="0.000485">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:35.958384" elapsed="0.000782">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:35.958367" elapsed="0.000834">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:35.959418" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:35.959271" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:35.959254" elapsed="0.000244"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:35.890421" elapsed="0.069177">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:36.962544" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:36.961570" elapsed="0.001075"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:36.973872" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:36.973484" elapsed="0.000456"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:36.974495" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:36.974153" 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-08-22T23:19:36.995817" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:36.996076" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:36.996216" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:36.977245" elapsed="0.019009"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:36.974682" elapsed="0.021634"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:36.996573" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:36.996356" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:36.974651" elapsed="0.022073"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:37.001696" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:36.998174" elapsed="0.003592"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:36.997857" elapsed="0.003960"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:36.997831" elapsed="0.004020"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:37.005135" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:37.002241" elapsed="0.002940"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:37.001930" elapsed="0.003286"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:37.001907" elapsed="0.003334"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:37.005827" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:37.005420" 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-08-22T23:19:37.006157" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:37.005924" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:37.006720" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:37.006404" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:37.006239" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:37.005907" elapsed="0.000897"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:37.007316" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:37.006958" 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-08-22T23:19:37.007680" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:37.007424" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:37.008212" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:37.007918" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:37.007762" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:37.007394" 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-08-22T23:19:37.008443" elapsed="0.000361"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:37.009260" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:37.008965" 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-08-22T23:19:37.009445" elapsed="0.002315"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:19:36.997230" elapsed="0.014594"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:37.012002" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:19:37.011893" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:37.011875" 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-08-22T23:19:37.012240" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:37.012311" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:19:37.014638" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:36.967135" elapsed="0.047532"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:37.014773" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:19:37.014927" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:36.963141" elapsed="0.051813"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:37.015630" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:37.015231" elapsed="0.000479">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:37.015024" elapsed="0.000759">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:37.015007" elapsed="0.000811">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:37.016034" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:37.015889" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:37.015871" elapsed="0.000244"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:36.960441" elapsed="0.055757">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:38.019169" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:38.018178" elapsed="0.001065"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:38.031895" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:38.031625" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:38.032373" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:38.032122" 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-08-22T23:19:38.058802" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:38.059102" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:38.059323" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:38.034601" elapsed="0.024782"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:38.032494" elapsed="0.026986"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:38.059920" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:38.059540" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:38.032471" elapsed="0.027679"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:38.066731" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:38.062466" elapsed="0.004337"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:38.061951" elapsed="0.004903"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:38.061910" elapsed="0.004981"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:38.070614" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:38.067290" elapsed="0.003398"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:38.066973" elapsed="0.003764"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:38.066949" elapsed="0.003823"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:38.071572" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:38.071026" 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-08-22T23:19:38.072261" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:38.071776" elapsed="0.000573"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:38.072870" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:38.072538" elapsed="0.000359"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:38.072377" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:38.071750" elapsed="0.001207"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:38.073481" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:38.073115" 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-08-22T23:19:38.073836" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:38.073593" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:38.074371" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:38.074075" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:38.073919" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:38.073560" 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-08-22T23:19:38.074624" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:38.075445" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:38.075135" 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-08-22T23:19:38.075642" elapsed="0.004153"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:19:38.060968" elapsed="0.018897"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:38.080086" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:19:38.079938" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:38.079918" 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-08-22T23:19:38.080338" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:38.080414" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:19:38.082807" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:38.025945" elapsed="0.056893"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:38.082902" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:19:38.083062" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:38.019766" elapsed="0.063324"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:38.083774" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:38.083380" elapsed="0.000474">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:38.083164" elapsed="0.000763">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:38.083146" elapsed="0.000818">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:38.084223" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:38.084064" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:38.084042" elapsed="0.000268"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:38.017061" elapsed="0.067335">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:39.087717" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:39.086738" elapsed="0.001050"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:39.100654" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:39.100358" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:39.101105" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:39.100855" 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-08-22T23:19:39.122177" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:39.122339" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:39.122443" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:39.103297" elapsed="0.019171"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:39.101227" elapsed="0.021284"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:39.122730" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:39.122539" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:39.101204" elapsed="0.021616"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:39.126679" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:39.124003" elapsed="0.002728"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:39.123741" elapsed="0.003026"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:39.123719" elapsed="0.003073"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:39.129345" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:39.127074" elapsed="0.002317"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:39.126848" elapsed="0.002578"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:39.126831" elapsed="0.002620"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:39.130040" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:39.129642" 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-08-22T23:19:39.130373" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:39.130138" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:39.130995" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:39.130631" elapsed="0.000392"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:39.130456" elapsed="0.000603"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:39.130120" elapsed="0.000961"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:39.131626" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:39.131239" 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-08-22T23:19:39.131960" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:39.131730" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:39.132497" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:39.132196" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:39.132040" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:39.131712" 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-08-22T23:19:39.132775" elapsed="0.000361"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:39.133612" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:39.133297" 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-08-22T23:19:39.133855" elapsed="0.002284"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:19:39.123233" elapsed="0.012969"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:39.136382" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:19:39.136272" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:39.136253" 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-08-22T23:19:39.136650" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:39.136723" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:19:39.139028" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:39.093822" elapsed="0.045235"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:39.139117" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:19:39.139275" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:39.088281" elapsed="0.051021"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:39.139954" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:39.139593" elapsed="0.000438">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:39.139372" elapsed="0.000730">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:39.139354" elapsed="0.000783">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:39.140354" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:39.140206" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:39.140189" elapsed="0.000245"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:39.085551" elapsed="0.054965">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:40.143735" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:40.142697" elapsed="0.001114"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:40.155172" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:40.154801" elapsed="0.000441"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:40.155832" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:40.155458" elapsed="0.000457"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:19:40.181531" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:40.181884" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:40.182111" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:40.158699" elapsed="0.023470"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:40.156029" elapsed="0.026358"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:40.182844" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:40.182458" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:40.155994" elapsed="0.027047"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:40.188938" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:40.185489" elapsed="0.003518"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:40.184863" elapsed="0.004193"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:40.184820" elapsed="0.004271"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:40.192707" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:40.189522" elapsed="0.003249"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:40.189169" elapsed="0.003651"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:40.189146" elapsed="0.003709"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:40.193707" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:40.193102" 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-08-22T23:19:40.194174" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:40.193842" elapsed="0.000413"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:40.194956" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:40.194512" elapsed="0.000482"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:40.194288" elapsed="0.000756"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:40.193817" elapsed="0.001257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:40.195821" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:40.195292" 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-08-22T23:19:40.196277" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:40.195955" elapsed="0.000401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:40.197044" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:40.196630" elapsed="0.000450"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:40.196390" elapsed="0.000739"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:40.195931" elapsed="0.001228"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:19:40.197423" elapsed="0.000413"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:40.198306" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:40.197998" 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-08-22T23:19:40.198485" elapsed="0.002324"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:19:40.183881" elapsed="0.016997"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:40.201067" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-08-22T23:19:40.200952" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:40.200932" 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-08-22T23:19:40.201334" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:40.201406" elapsed="0.000014"/>
</return>
<msg time="2026-08-22T23:19:40.203928" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:40.148411" elapsed="0.055548"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:40.204021" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:19:40.204177" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:40.144315" elapsed="0.059889"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:40.204906" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:40.204489" elapsed="0.000576">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:40.204276" elapsed="0.000865">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:40.204258" elapsed="0.000918">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:40.205426" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:40.205276" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:40.205258" elapsed="0.000248"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:40.141465" elapsed="0.064141">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:41.208731" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:41.207758" elapsed="0.001042"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:41.220944" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:41.220528" elapsed="0.000494"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:41.221634" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:41.221252" elapsed="0.000449"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:19:41.250534" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:41.250904" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:41.251134" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:41.224977" elapsed="0.026217"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:41.221827" elapsed="0.029465"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:41.251748" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:41.251356" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:41.221792" elapsed="0.030153"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:41.259340" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:41.254300" elapsed="0.005109"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:41.253774" elapsed="0.005685"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:41.253714" elapsed="0.005779"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:41.263221" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:41.259905" elapsed="0.003385"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:41.259571" elapsed="0.003768"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:41.259547" elapsed="0.003827"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:41.264236" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:41.263668" 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-08-22T23:19:41.264727" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:41.264372" elapsed="0.000436"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:41.265487" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:41.265066" elapsed="0.000459"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:41.264842" elapsed="0.000902"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:41.264346" elapsed="0.001458"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:41.266638" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:41.266072" 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-08-22T23:19:41.267109" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:41.266780" elapsed="0.000408"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19: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-08-22T23:19:41.267438" elapsed="0.000477"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:41.267222" elapsed="0.000744"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:41.266755" elapsed="0.001241"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:19:41.268207" elapsed="0.000511"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:41.269361" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:41.268946" elapsed="0.000453"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:19:41.269632" 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-08-22T23:19:41.252774" elapsed="0.019707"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:41.272681" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:19:41.272551" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:41.272533" 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-08-22T23:19:41.272925" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:41.272997" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:19:41.275321" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:41.214020" elapsed="0.061331"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:41.275410" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:19:41.275562" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:41.209292" elapsed="0.066312"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:41.276247" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:41.275885" elapsed="0.000440">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:41.275675" elapsed="0.000722">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:41.275658" elapsed="0.000773">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:41.276671" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:41.276500" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:41.276483" elapsed="0.000270"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:41.206690" elapsed="0.070147">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:42.279950" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:42.278914" elapsed="0.001110"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:42.291890" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:42.291568" elapsed="0.000382"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:42.292360" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:42.292111" 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-08-22T23:19:42.318725" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:42.319090" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:42.319390" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:42.294615" elapsed="0.024839"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:42.292489" elapsed="0.027120"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:42.320149" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:42.319688" elapsed="0.000614"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:42.292461" elapsed="0.027891"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:42.328305" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:42.323176" elapsed="0.005180"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:42.322437" elapsed="0.005955"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:42.322388" elapsed="0.006030"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:42.331036" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:42.328724" elapsed="0.002359"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:42.328474" elapsed="0.002644"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:42.328458" elapsed="0.002685"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:42.331766" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:42.331325" 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-08-22T23:19:42.332102" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:42.331864" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:42.332668" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:42.332346" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:42.332185" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:42.331846" elapsed="0.000906"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:42.333271" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:42.332909" 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-08-22T23:19:42.333618" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:42.333368" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:42.334155" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:42.333859" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:42.333702" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:42.333350" 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-08-22T23:19:42.334421" elapsed="0.000378"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:42.335274" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:42.334963" 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-08-22T23:19:42.335454" elapsed="0.002319"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:19:42.321309" elapsed="0.016532"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:42.338114" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:19:42.337996" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:42.337976" 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-08-22T23:19:42.338375" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:42.338453" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:19:42.340795" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:42.286694" elapsed="0.054130"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:42.340886" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:19:42.341039" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:42.280521" elapsed="0.060544"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:42.341731" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:42.341343" elapsed="0.000475">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:42.341135" elapsed="0.000760">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:42.341118" elapsed="0.000812">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:42.342146" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:42.341999" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:42.341983" elapsed="0.000242"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:42.277758" elapsed="0.064552">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:43.345241" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:43.344413" elapsed="0.000885"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:43.356353" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:43.356085" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:43.356842" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:43.356570" 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-08-22T23:19:43.380772" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:43.381106" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:43.381343" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:43.359103" elapsed="0.022301"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:43.356968" elapsed="0.024546"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:43.382002" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:43.381617" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:43.356943" elapsed="0.025270"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:43.390895" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:43.385101" elapsed="0.005972"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:43.384253" elapsed="0.006903"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:43.384209" elapsed="0.007004"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:43.394045" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:43.391691" elapsed="0.002401"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:43.391339" elapsed="0.002789"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:43.391301" elapsed="0.002852"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:43.394787" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:43.394336" 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-08-22T23:19:43.395144" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:43.394886" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:43.395726" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:43.395392" elapsed="0.000361"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:43.395228" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:43.394867" elapsed="0.000946"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:43.396341" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:43.395972" 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-08-22T23:19:43.396715" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:43.396455" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:43.397257" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:43.396958" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:43.396800" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:43.396429" 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-08-22T23:19:43.397497" elapsed="0.000372"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:43.398347" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:43.398034" 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-08-22T23:19:43.398541" 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-08-22T23:19:43.383187" elapsed="0.017783"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:43.401154" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:19:43.401042" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:43.401023" 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-08-22T23:19:43.401401" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:43.401481" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:19:43.403871" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:43.349686" elapsed="0.054221"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:43.403978" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:19:43.404156" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:43.345728" elapsed="0.058458"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:43.404922" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:43.404518" elapsed="0.000491">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:43.404266" elapsed="0.000819">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:43.404247" elapsed="0.000913">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:43.405386" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:43.405234" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:43.405217" elapsed="0.000261"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:43.343465" elapsed="0.062098">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:44.408839" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:44.407793" elapsed="0.001122"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:44.420971" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:44.420698" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:44.421424" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:44.421177" 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-08-22T23:19:44.442631" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:44.442803" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:44.442909" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:44.423686" elapsed="0.019249"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:44.421553" elapsed="0.021425"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:44.443163" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:44.443006" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:44.421528" elapsed="0.021722"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:44.446767" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:44.444354" elapsed="0.002463"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:44.444131" elapsed="0.002721"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:44.444112" elapsed="0.002765"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:44.449524" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:44.447151" elapsed="0.002419"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:44.446932" elapsed="0.002689"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:44.446916" elapsed="0.002730"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:44.450241" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:44.449823" 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-08-22T23:19:44.450599" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:44.450340" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:44.451158" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:44.450853" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:44.450690" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:44.450321" elapsed="0.000920"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:44.451819" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:44.451398" 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-08-22T23:19:44.452145" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:44.451915" elapsed="0.000356"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:44.452770" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:44.452455" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:44.452296" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:44.451897" 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-08-22T23:19:44.453008" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:44.453840" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:44.453521" 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-08-22T23:19:44.454020" elapsed="0.002430"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:19:44.443697" elapsed="0.012819"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:44.456714" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:19:44.456600" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:44.456567" 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-08-22T23:19:44.456959" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:44.457030" elapsed="0.000014"/>
</return>
<msg time="2026-08-22T23:19:44.459332" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:44.415809" elapsed="0.043552"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:44.459421" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:19:44.459634" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:44.409424" elapsed="0.050243"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:44.460335" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:44.459968" elapsed="0.000451">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:44.459750" elapsed="0.000744">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:44.459730" elapsed="0.000798">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:44.460762" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:44.460614" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:44.460596" elapsed="0.000246"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:44.406446" elapsed="0.054480">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:45.463971" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:45.462973" elapsed="0.001102"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:45.476619" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:45.476339" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:45.477072" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:45.476824" 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-08-22T23:19:45.500986" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:45.501296" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:45.501524" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:45.479495" elapsed="0.022293"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:45.477200" elapsed="0.024692"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:45.502304" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:45.501955" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:45.477174" elapsed="0.025323"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:45.510752" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:45.504920" elapsed="0.005946"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:45.504390" elapsed="0.006556"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:45.504347" elapsed="0.006655"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:45.514476" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:45.511652" elapsed="0.002870"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:45.511126" elapsed="0.003432"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:45.511088" elapsed="0.003509"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:45.515182" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:45.514778" 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-08-22T23:19:45.515518" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:45.515280" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:45.516101" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:45.515780" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:45.515617" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:45.515261" elapsed="0.000933"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:45.516740" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:45.516352" 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-08-22T23:19:45.517069" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:45.516838" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:45.517616" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:45.517307" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:45.517151" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:45.516819" 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-08-22T23:19:45.517852" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:45.518679" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:45.518361" 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-08-22T23:19:45.518859" elapsed="0.002285"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:19:45.503339" elapsed="0.017871"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:45.521391" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:19:45.521280" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:45.521262" 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-08-22T23:19:45.521648" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:45.521761" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:19:45.524105" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:45.470832" elapsed="0.053305"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:45.524198" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:19:45.524350" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:45.464668" elapsed="0.059709"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:45.525039" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:45.524672" elapsed="0.000448">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:45.524447" elapsed="0.000746">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:45.524430" elapsed="0.000798">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:45.525444" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:45.525298" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:45.525281" elapsed="0.000244"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:45.461857" elapsed="0.063768">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:46.528767" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:46.527719" elapsed="0.001122"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:46.541295" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:46.541031" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:46.541763" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:46.541498" 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-08-22T23:19:46.564044" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:46.564347" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:46.564567" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:46.543983" elapsed="0.020730"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:46.541886" elapsed="0.022950"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:46.565271" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:46.564912" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:46.541862" elapsed="0.023607"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:46.573529" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:46.567830" elapsed="0.005824"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:46.567287" elapsed="0.006411"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:46.567245" elapsed="0.006478"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:46.576271" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:46.574005" elapsed="0.002312"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:46.573780" elapsed="0.002656"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:46.573763" elapsed="0.002700"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:46.577083" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:46.576673" 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-08-22T23:19:46.577415" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:46.577180" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:46.577978" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:46.577675" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:46.577497" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:46.577162" elapsed="0.000900"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:46.578601" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:46.578219" 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-08-22T23:19:46.578929" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:46.578700" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:46.579463" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:46.579166" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:46.579010" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:46.578681" 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-08-22T23:19:46.579715" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:46.580522" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:46.580228" 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-08-22T23:19:46.580742" elapsed="0.002971"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:19:46.566282" elapsed="0.017521"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:46.584052" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-08-22T23:19:46.583900" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:46.583875" 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-08-22T23:19:46.584380" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:46.584479" elapsed="0.000021"/>
</return>
<msg time="2026-08-22T23:19:46.587934" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:46.534917" elapsed="0.053058"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:46.588057" elapsed="0.000039"/>
</return>
<msg time="2026-08-22T23:19:46.588266" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:46.529342" elapsed="0.058961"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:46.589355" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:46.588811" elapsed="0.000651">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:46.588398" elapsed="0.001178">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:46.588374" elapsed="0.001269">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:46.589866" elapsed="0.000079"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:46.589719" elapsed="0.000266"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:46.589703" elapsed="0.000306"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:46.526479" elapsed="0.063614">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:47.593049" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:47.592047" elapsed="0.001075"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:47.605515" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:47.605257" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:47.605975" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:47.605731" 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-08-22T23:19:47.632795" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:47.632956" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:47.633056" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:47.608178" elapsed="0.024903"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:47.606096" elapsed="0.027029"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:47.633325" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:47.633154" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:47.606072" elapsed="0.027341"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:47.636828" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:47.634441" elapsed="0.002437"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:47.634212" elapsed="0.002701"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:47.634194" elapsed="0.002744"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:47.639481" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:47.637223" elapsed="0.002304"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:47.636993" elapsed="0.002568"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:47.636976" elapsed="0.002624"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:47.640169" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:47.639775" 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-08-22T23:19:47.640498" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:47.640265" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:47.641052" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:47.640754" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:47.640593" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:47.640247" elapsed="0.000888"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:47.641770" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:47.641316" 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-08-22T23:19:47.642236" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:47.641916" elapsed="0.000399"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:47.642998" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:47.642565" elapsed="0.000469"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:47.642348" elapsed="0.000736"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:47.641892" 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-08-22T23:19:47.643406" elapsed="0.000516"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:47.644552" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:47.644148" elapsed="0.000461"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:19:47.644822" elapsed="0.005347"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:19:47.633791" elapsed="0.016444"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:47.650416" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:19:47.650305" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:47.650286" 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-08-22T23:19:47.650674" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:47.650747" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:19:47.653049" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:47.599836" elapsed="0.053291"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:47.653189" elapsed="0.000045"/>
</return>
<msg time="2026-08-22T23:19:47.653361" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:47.593703" elapsed="0.059685"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:47.654051" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:47.653681" elapsed="0.000450">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:47.653457" elapsed="0.000747">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:47.653440" elapsed="0.000799">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:47.654455" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:47.654308" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:47.654291" elapsed="0.000245"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:47.590923" elapsed="0.063715">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:48.657724" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:48.656707" elapsed="0.001129"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:48.668025" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:48.667745" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:48.668476" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:48.668228" 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-08-22T23:19:48.692277" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:48.692738" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:48.692967" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:48.670778" elapsed="0.022248"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:48.668619" elapsed="0.024512"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:48.693644" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:48.693245" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:48.668591" elapsed="0.025295"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:48.747994" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:48.696438" elapsed="0.051632"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:48.695746" elapsed="0.052377"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:48.695701" elapsed="0.052456"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:48.750942" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:48.748517" elapsed="0.002474"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:48.748236" elapsed="0.002792"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:48.748212" elapsed="0.002841"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:48.751676" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:48.751242" 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-08-22T23:19:48.752014" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:48.751776" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:48.752557" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:48.752256" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:48.752096" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:48.751758" elapsed="0.000901"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:48.753178" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:48.752816" 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-08-22T23:19:48.753506" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:48.753275" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:48.754150" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:48.753767" elapsed="0.000411"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:48.753609" elapsed="0.000606"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:48.753257" 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-08-22T23:19:48.754396" elapsed="0.000380"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:48.755243" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:48.754943" 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-08-22T23:19:48.755424" elapsed="0.002409"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:19:48.694729" elapsed="0.063179"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:48.758104" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:19:48.757987" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:48.757966" 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-08-22T23:19:48.758356" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:48.758427" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:19:48.760817" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:48.663368" elapsed="0.097479"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:48.761019" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:19:48.761179" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:48.658344" elapsed="0.102863"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:48.761900" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:48.761491" elapsed="0.000489">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:48.761278" elapsed="0.000774">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:48.761260" elapsed="0.000826">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:48.762303" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:48.762156" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:48.762139" elapsed="0.000243"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:48.655503" elapsed="0.106988">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:49.765611" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:49.764553" elapsed="0.001146"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:49.780683" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:49.780401" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:49.781145" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:49.780894" 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-08-22T23:19:49.807171" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:49.807466" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:49.807727" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:49.783408" elapsed="0.024380"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:49.781277" elapsed="0.026609"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:49.808296" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:49.807948" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:49.781248" elapsed="0.027246"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:49.816507" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:49.810847" elapsed="0.005805"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:49.810290" elapsed="0.006445"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:49.810249" elapsed="0.006545"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:49.820565" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:49.817420" elapsed="0.003207"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:49.816920" elapsed="0.003743"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:49.816882" elapsed="0.003806"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:49.821296" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:49.820866" 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-08-22T23:19:49.821716" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:49.821396" elapsed="0.000382"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:49.822274" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:49.821968" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:49.821803" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:49.821378" elapsed="0.000997"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:49.822931" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:49.822540" 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-08-22T23:19:49.823263" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:49.823029" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:49.823822" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:49.823504" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:49.823345" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:49.823011" 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-08-22T23:19:49.824064" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:49.824907" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:49.824599" 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-08-22T23:19:49.825089" 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-08-22T23:19:49.809310" elapsed="0.018210"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:49.827717" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:19:49.827604" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:49.827571" 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-08-22T23:19:49.827964" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:49.828035" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:19:49.830379" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:49.772158" elapsed="0.058251"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:49.830475" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:19:49.830644" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:49.766200" elapsed="0.064471"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:49.831313" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:49.830951" elapsed="0.000445">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:49.830741" elapsed="0.000730">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:49.830724" elapsed="0.000781">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:49.831740" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:49.831587" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:49.831557" elapsed="0.000264"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:49.763391" elapsed="0.068515">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:50.834971" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:50.833938" elapsed="0.001108"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:50.847592" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:50.847314" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:50.848052" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:50.847803" 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-08-22T23:19:50.875612" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:50.875767" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:50.875867" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:50.850257" elapsed="0.025636"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:50.848173" elapsed="0.027764"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:50.876118" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:50.875964" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:50.848150" elapsed="0.028054"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:50.879646" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:50.877215" elapsed="0.002481"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:50.876992" elapsed="0.002740"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:50.876974" elapsed="0.002784"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:50.882322" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:50.880035" elapsed="0.002334"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:50.879814" elapsed="0.002590"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:50.879797" elapsed="0.002632"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:50.883020" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:50.882615" 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-08-22T23:19:50.883353" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:50.883119" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:50.883916" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:50.883611" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:50.883436" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:50.883101" elapsed="0.000901"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:50.884522" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:50.884159" 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-08-22T23:19:50.884876" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:50.884643" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:50.885412" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:50.885114" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:50.884957" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:50.884624" 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-08-22T23:19:50.885662" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:50.886462" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:50.886172" 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-08-22T23:19:50.886717" elapsed="0.002434"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:19:50.876553" elapsed="0.012663"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:50.889394" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:19:50.889286" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:50.889268" 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-08-22T23:19:50.889648" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:50.889721" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:19:50.892039" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:50.841547" elapsed="0.050522"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:50.892129" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:19:50.892281" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:50.835542" elapsed="0.056766"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:50.892960" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:50.892599" elapsed="0.000437">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:50.892378" elapsed="0.000729">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:50.892361" elapsed="0.000781">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:50.893359" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:50.893213" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:50.893195" elapsed="0.000244"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:50.832844" elapsed="0.060676">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:51.896724" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:51.895656" elapsed="0.001145"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:51.908390" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:51.908119" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:51.908871" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:51.908610" 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-08-22T23:19:51.932388" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:51.932741" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:51.932969" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:51.911124" elapsed="0.021902"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:51.909012" elapsed="0.024247"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:51.933733" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:51.933337" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:51.908986" elapsed="0.025023"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:51.942762" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:51.936833" elapsed="0.006044"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:51.936236" elapsed="0.006725"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:51.936190" elapsed="0.006828"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:51.948230" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:51.943746" elapsed="0.004530"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:51.943145" elapsed="0.005168"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:51.943106" elapsed="0.005232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:51.948959" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:51.948522" 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-08-22T23:19:51.949298" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:51.949058" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:51.949879" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:51.949541" elapsed="0.000364"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:51.949381" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:51.949039" elapsed="0.000925"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:51.950518" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:51.950122" elapsed="0.000423"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:51.950901" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:51.950652" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:51.951467" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:51.951144" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:51.950985" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:51.950624" 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-08-22T23:19:51.951797" elapsed="0.000360"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:51.952688" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:51.952339" 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-08-22T23:19:51.952882" 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-08-22T23:19:51.934993" elapsed="0.020503"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:51.955731" elapsed="0.000049"/>
</return>
<status status="PASS" start="2026-08-22T23:19:51.955596" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:51.955560" 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-08-22T23:19:51.955997" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:51.956071" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:19:51.958447" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:51.903502" elapsed="0.054975"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:51.958538" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:19:51.958712" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:51.897331" elapsed="0.061408"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:51.959476" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:51.959053" elapsed="0.000590">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:51.958834" elapsed="0.000889">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:51.958813" elapsed="0.000945">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:51.960010" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:51.959855" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:51.959834" elapsed="0.000259"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:51.894399" elapsed="0.065782">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:52.963295" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:52.962164" elapsed="0.001228"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:52.976551" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:52.976158" elapsed="0.000492"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:52.977098" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:52.976826" 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-08-22T23:19:53.000372" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:53.000721" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:53.000947" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:52.979345" elapsed="0.021662"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:52.977227" elapsed="0.023895"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:53.001550" elapsed="0.000086"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:53.001187" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:52.977202" elapsed="0.024589"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:53.009921" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:53.004357" elapsed="0.005635"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:53.003755" elapsed="0.006289"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:53.003709" elapsed="0.006370"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:53.013988" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:53.010635" elapsed="0.003421"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:53.010174" elapsed="0.003933"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:53.010145" elapsed="0.003996"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:53.015031" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:53.014401" 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-08-22T23:19:53.015520" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:53.015172" elapsed="0.000454"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:53.016923" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:53.015891" elapsed="0.001090"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:53.015662" elapsed="0.001493"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:53.015146" elapsed="0.002044"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:53.017951" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:53.017478" 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-08-22T23:19:53.018319" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:53.018065" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:53.018880" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:53.018563" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:53.018402" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:53.018040" 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-08-22T23:19:53.019137" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:53.020013" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:53.019670" 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-08-22T23:19:53.020204" 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-08-22T23:19:53.002653" elapsed="0.020118"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:53.022965" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:19:53.022847" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:53.022828" 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-08-22T23:19:53.023216" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:53.023288" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:19:53.025693" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:52.969504" elapsed="0.056219"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:53.025786" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:19:53.025943" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:52.964021" elapsed="0.061948"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:53.026649" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:53.026255" elapsed="0.000483">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:53.026042" elapsed="0.000772">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:53.026025" elapsed="0.000823">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:53.027069" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:53.026918" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:53.026900" elapsed="0.000249"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:52.960879" elapsed="0.066358">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:54.030332" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:54.029314" elapsed="0.001097"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:54.042069" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:54.041801" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:54.042527" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:54.042275" 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-08-22T23:19:54.063519" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:54.063857" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:54.064079" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:54.044783" elapsed="0.019353"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:54.042674" elapsed="0.021561"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:54.064698" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:54.064296" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:54.042645" elapsed="0.022251"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:54.071341" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:54.067189" elapsed="0.004229"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:54.066691" elapsed="0.004779"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:54.066648" elapsed="0.004859"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:54.075369" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:54.071941" elapsed="0.003500"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:54.071610" elapsed="0.003882"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:54.071564" elapsed="0.003964"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:54.076405" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:54.075806" 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-08-22T23:19:54.076918" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:54.076597" elapsed="0.000380"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:54.077465" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:54.077161" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:54.077001" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:54.076550" elapsed="0.001000"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:54.078092" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:54.077722" 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-08-22T23:19:54.078418" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:54.078187" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:54.078972" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:54.078674" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:54.078500" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:54.078169" elapsed="0.000886"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:19:54.079208" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:54.080049" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:54.079740" 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-08-22T23:19:54.080227" 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-08-22T23:19:54.065715" elapsed="0.017045"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:54.083011" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-08-22T23:19:54.082894" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:54.082874" 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-08-22T23:19:54.083263" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:54.083335" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:19:54.085688" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:54.035837" elapsed="0.049881"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:54.085785" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:19:54.085938" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:54.030945" elapsed="0.055020"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:54.086631" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:54.086244" elapsed="0.000475">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:54.086035" elapsed="0.000760">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:54.086018" elapsed="0.000812">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:54.087048" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:54.086901" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:54.086884" elapsed="0.000243"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:54.028138" elapsed="0.059074">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:55.089484" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:55.088783" elapsed="0.000748"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:55.098880" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:55.098613" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:55.099332" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:55.099083" 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-08-22T23:19:55.390292" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:55.390645" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:55.390894" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:55.101568" elapsed="0.289389"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:55.099457" elapsed="0.291610"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:55.391516" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:55.391134" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:55.099433" elapsed="0.292328"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:55.399552" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:55.394415" elapsed="0.005229"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:55.393764" elapsed="0.005933"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:55.393720" elapsed="0.006014"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:55.403509" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:55.400128" elapsed="0.003446"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:55.399814" elapsed="0.003830"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:55.399790" elapsed="0.003891"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:55.404482" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:55.403928" 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-08-22T23:19:55.405029" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:55.404642" elapsed="0.000469"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:55.405883" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:55.405405" elapsed="0.000511"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:55.405146" elapsed="0.000817"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:55.404616" elapsed="0.001372"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:55.406513" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:55.406147" 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-08-22T23:19:55.406860" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:55.406626" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:55.407398" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:55.407101" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:55.406943" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:55.406607" elapsed="0.000875"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:19:55.407650" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:55.408465" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:55.408167" 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-08-22T23:19:55.408660" 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-08-22T23:19:55.392660" elapsed="0.018579"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:55.411418" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:19:55.411309" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:55.411291" 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-08-22T23:19:55.411681" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:55.411753" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:19:55.414079" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:55.093037" elapsed="0.321071"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:55.414169" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:19:55.414320" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:55.089892" elapsed="0.324455"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:55.415008" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:55.414639" elapsed="0.000449">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:55.414416" elapsed="0.000760">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:55.414400" elapsed="0.000850">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:55.415474" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:55.415324" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:55.415307" elapsed="0.000248"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:55.087956" elapsed="0.327701">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:56.419039" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:56.417902" elapsed="0.001217"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:56.431404" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:56.431140" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:56.431872" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:56.431622" 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-08-22T23:19:57.021480" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:57.021867" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:57.022175" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:56.434131" elapsed="0.588109"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:56.432001" elapsed="0.590357"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:57.022900" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:57.022430" elapsed="0.000628"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:56.431974" elapsed="0.591135"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:57.032008" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:57.025623" elapsed="0.006555"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:57.025072" elapsed="0.007222"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:57.025027" elapsed="0.007350"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:57.038820" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:57.033216" elapsed="0.005652"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:57.032552" elapsed="0.006352"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:57.032498" elapsed="0.006431"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:57.039561" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:57.039136" 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-08-22T23:19:57.039918" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:57.039676" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:57.040468" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:57.040165" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:57.040001" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:57.039658" elapsed="0.000895"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:57.041088" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:57.040725" 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-08-22T23:19:57.041415" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:57.041184" elapsed="0.000368"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:57.042080" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:57.041757" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:57.041593" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:57.041166" 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-08-22T23:19:57.042333" elapsed="0.000386"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:57.043195" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:57.042888" 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-08-22T23:19:57.043377" 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-08-22T23:19:57.024015" elapsed="0.021829"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:57.046036" elapsed="0.000087"/>
</return>
<status status="PASS" start="2026-08-22T23:19:57.045920" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:57.045901" 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-08-22T23:19:57.046338" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:57.046411" elapsed="0.000014"/>
</return>
<msg time="2026-08-22T23:19:57.048754" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:56.426246" elapsed="0.622541"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:57.048854" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:19:57.049011" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:56.419718" elapsed="0.629321"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:57.049728" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:57.049338" elapsed="0.000474">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:57.049111" elapsed="0.000777">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:57.049095" elapsed="0.000829">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:57.050163" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:57.049995" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:57.049978" elapsed="0.000267"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:56.416639" elapsed="0.633695">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:58.053337" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:58.052353" elapsed="0.001056"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:58.063923" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:58.063658" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:58.064369" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:58.064125" 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-08-22T23:19:58.090669" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:58.090827" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:58.090937" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:58.066671" elapsed="0.024293"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:58.064492" elapsed="0.026519"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:58.091212" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:58.091042" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:58.064469" elapsed="0.026831"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:58.094807" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:58.092366" elapsed="0.002518"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:58.092136" elapsed="0.002797"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:58.092117" elapsed="0.002853"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:58.098545" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:58.095355" elapsed="0.003288"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:58.095048" elapsed="0.003646"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:58.095024" elapsed="0.003705"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:58.099512" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:58.098970" 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-08-22T23:19:58.099994" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:58.099668" elapsed="0.000407"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:58.100767" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:58.100328" elapsed="0.000477"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:58.100108" elapsed="0.000748"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:58.099643" elapsed="0.001242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:58.101620" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:58.101099" 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-08-22T23:19:58.102076" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:58.101755" elapsed="0.000399"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:58.102873" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:58.102404" elapsed="0.000495"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:58.102188" elapsed="0.000746"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:58.101731" 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-08-22T23:19:58.103105" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:58.103918" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:58.103625" 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-08-22T23:19:58.104094" 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-08-22T23:19:58.091694" elapsed="0.014874"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:58.106800" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:19:58.106682" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:58.106664" 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-08-22T23:19:58.107041" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:58.107191" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:19:58.109498" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:58.059339" elapsed="0.050188"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:58.109602" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:19:58.109756" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:58.053931" elapsed="0.055852"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:58.110417" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:58.110059" elapsed="0.000437">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:58.109852" elapsed="0.000716">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:58.109835" elapsed="0.000808">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:58.110861" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:58.110715" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:58.110698" elapsed="0.000243"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:58.051259" elapsed="0.059764">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:59.113988" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:59.112937" elapsed="0.001126"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:59.125060" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:59.124697" elapsed="0.000432"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:59.125710" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:59.125339" 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-08-22T23:19:59.152015" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:19:59.152177" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:19:59.152278" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:19:59.128533" elapsed="0.023771"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:59.125879" elapsed="0.026469"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:59.152529" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:59.152377" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:59.125849" elapsed="0.026791"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:59.158495" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:59.153665" elapsed="0.004902"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:59.153428" elapsed="0.005210"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:59.153410" elapsed="0.005265"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:19:59.162395" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:19:59.159068" elapsed="0.003393"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:59.158754" elapsed="0.003856"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:59.158731" elapsed="0.003918"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:59.163478" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:59.162889" 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-08-22T23:19:59.163978" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:59.163641" elapsed="0.000396"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:59.164528" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:59.164224" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:59.164062" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:59.163614" elapsed="0.001018"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:19:59.165157" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:59.164793" 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-08-22T23:19:59.165487" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:59.165254" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:19:59.166040" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:19:59.165744" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:19:59.165568" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:59.165237" elapsed="0.000886"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:19:59.166275" elapsed="0.000364"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:19:59.167094" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:19:59.166800" 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-08-22T23:19:59.167289" elapsed="0.002369"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:19:59.153007" elapsed="0.016718"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:19:59.169906" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:19:59.169796" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:19:59.169777" 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-08-22T23:19:59.170147" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:19:59.170219" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:19:59.172636" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:19:59.118603" elapsed="0.054063"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:19:59.172727" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:19:59.172878" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:19:59.114617" elapsed="0.058288"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:19:59.173538" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:19:59.173181" elapsed="0.000452">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:19:59.172974" elapsed="0.000731">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:19:59.172957" elapsed="0.000872">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:19:59.174065" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:19:59.173917" elapsed="0.000241"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:19:59.173899" elapsed="0.000283"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:19:59.111862" elapsed="0.062403">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:00.177233" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:00.176208" elapsed="0.001096"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:00.188621" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:00.188336" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:00.189086" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:00.188829" 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-08-22T23:20:00.208801" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:00.208957" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:20:00.209057" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:20:00.191285" elapsed="0.017798"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:00.189208" elapsed="0.019919"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:00.209312" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:00.209156" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:00.189186" elapsed="0.020213"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:00.214207" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:00.210436" elapsed="0.003884"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:00.210205" elapsed="0.004195"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:00.210187" elapsed="0.004269"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:00.220241" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:00.215112" elapsed="0.005178"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:00.214612" elapsed="0.005714"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:00.214545" elapsed="0.005806"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:00.220936" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:00.220525" 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-08-22T23:20:00.221272" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:00.221035" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:00.221837" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:00.221515" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:00.221355" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:00.221017" elapsed="0.000906"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:00.222447" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:00.222081" 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-08-22T23:20:00.222796" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:00.222545" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:00.223338" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:00.223039" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:00.222879" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:00.222527" 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-08-22T23:20:00.223656" elapsed="0.000384"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:20:00.224503" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:00.224209" 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-08-22T23:20:00.224700" elapsed="0.002300"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:20:00.209778" elapsed="0.017286"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:20:00.227244" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-08-22T23:20:00.227135" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:00.227117" 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-08-22T23:20:00.227482" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:00.227555" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:20:00.229907" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:20:00.183505" elapsed="0.046436"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:20:00.230003" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:20:00.230156" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:20:00.177833" elapsed="0.052349"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:20:00.230840" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:20:00.230462" elapsed="0.000456">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:00.230253" elapsed="0.000735">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:20:00.230236" elapsed="0.000787">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:00.231243" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:00.231093" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:00.231076" elapsed="0.000249"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:00.175095" elapsed="0.056312">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:01.234998" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:01.234071" elapsed="0.000986"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:01.246562" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:01.246220" elapsed="0.000420"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:01.247060" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:01.246809" 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-08-22T23:20:01.268479" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:01.268993" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:20:01.269251" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:20:01.249365" elapsed="0.019946"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:01.247188" elapsed="0.022234"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:01.269912" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:01.269489" elapsed="0.000579"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:01.247162" elapsed="0.022956"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:01.278545" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:01.272691" elapsed="0.006000"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:01.272047" elapsed="0.006728"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:01.272003" elapsed="0.006830"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:01.282725" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:01.279462" elapsed="0.003313"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:01.278961" elapsed="0.003854"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:01.278922" elapsed="0.003919"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:01.283481" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:01.283044" 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-08-22T23:20:01.283843" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:01.283598" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:01.284437" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:01.284089" elapsed="0.000380"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:01.283927" elapsed="0.000586"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:01.283563" elapsed="0.000972"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:01.285081" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:01.284711" 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-08-22T23:20:01.285410" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:01.285179" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:01.285960" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:01.285664" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:01.285490" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:01.285160" 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-08-22T23:20:01.286199" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:20:01.287063" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:01.286750" 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-08-22T23:20:01.287245" 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-08-22T23:20:01.271000" elapsed="0.018944"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:20:01.290129" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:20:01.290016" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:01.289997" 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-08-22T23:20:01.290377" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:01.290462" elapsed="0.000019"/>
</return>
<msg time="2026-08-22T23:20:01.292912" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:20:01.239769" elapsed="0.053173"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:20:01.293078" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:20:01.293236" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:20:01.235499" elapsed="0.057765"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:20:01.293941" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:20:01.293546" elapsed="0.000476">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:01.293335" elapsed="0.000760">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:20:01.293318" elapsed="0.000811">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:01.294345" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:01.294198" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:01.294181" elapsed="0.000243"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:01.232557" elapsed="0.061951">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:02.297537" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:02.296476" elapsed="0.001168"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:02.312205" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:02.311922" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:02.312682" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:02.312419" 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-08-22T23:20:02.332518" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:02.332943" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:20:02.333176" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:20:02.315034" elapsed="0.018200"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:02.312929" elapsed="0.020404"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:02.333819" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:02.333396" elapsed="0.000581"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:02.312900" elapsed="0.021127"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:02.341815" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:02.336989" elapsed="0.004898"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:02.336194" elapsed="0.005744"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:02.336136" elapsed="0.005837"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:02.346327" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:02.342370" elapsed="0.004045"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:02.342051" elapsed="0.004422"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:02.342027" elapsed="0.004482"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:02.347485" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:02.346807" elapsed="0.000732"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:02.348409" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:02.347709" elapsed="0.000820"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:02.349467" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:02.348995" elapsed="0.000508"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:02.348612" elapsed="0.000939"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:02.347671" elapsed="0.001926"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:02.350146" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:02.349768" 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-08-22T23:20:02.350479" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:02.350243" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:02.351063" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:02.350761" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:02.350594" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:02.350225" 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-08-22T23:20:02.351316" elapsed="0.000444"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:20:02.352249" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:02.351933" 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-08-22T23:20:02.352430" elapsed="0.002408"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:20:02.334933" elapsed="0.019988"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:20:02.355119" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-08-22T23:20:02.355002" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:02.354982" 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-08-22T23:20:02.355369" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:02.355443" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:20:02.357874" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:20:02.303917" elapsed="0.053987"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:20:02.357966" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:20:02.358136" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:20:02.298150" elapsed="0.060015"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:20:02.358843" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:20:02.358453" elapsed="0.000472">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:02.358240" elapsed="0.000759">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:20:02.358222" elapsed="0.000811">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:02.359268" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:02.359102" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:02.359085" elapsed="0.000269"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:02.295351" elapsed="0.064089">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:03.363208" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:03.361983" elapsed="0.001305"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:03.374823" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:03.374527" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:03.375288" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:03.375035" 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-08-22T23:20:03.397063" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:03.397409" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:20:03.397672" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:20:03.377513" elapsed="0.020221"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:03.375413" elapsed="0.022421"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:03.398299" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:03.397896" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:03.375389" elapsed="0.023109"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:03.406218" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:03.400911" elapsed="0.005358"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:03.400372" elapsed="0.005933"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:03.400330" elapsed="0.006000"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:03.408927" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:03.406622" elapsed="0.002352"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:03.406385" elapsed="0.002625"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:03.406369" elapsed="0.002665"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:03.409644" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:03.409211" 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-08-22T23:20:03.409998" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:03.409744" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:03.410548" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:03.410243" elapsed="0.000367"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:03.410081" elapsed="0.000572"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:03.409725" elapsed="0.000950"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:03.411208" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:03.410836" 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-08-22T23:20:03.411538" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:03.411305" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:03.412103" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:03.411802" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:03.411637" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:03.411287" 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-08-22T23:20:03.412340" elapsed="0.000369"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:20:03.413173" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:03.412873" 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-08-22T23:20:03.413457" 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-08-22T23:20:03.399359" elapsed="0.016485"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:20:03.416029" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:20:03.415915" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:03.415897" 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-08-22T23:20:03.416275" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:03.416347" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:20:03.418706" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:20:03.369786" elapsed="0.048950"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:20:03.418799" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:20:03.418957" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:20:03.363899" elapsed="0.055085"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:20:03.419649" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:20:03.419266" elapsed="0.000464">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:03.419056" elapsed="0.000750">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:20:03.419039" elapsed="0.000803">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:03.420061" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:03.419913" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:03.419895" elapsed="0.000248"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:03.360340" elapsed="0.059886">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:04.423515" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:04.422404" elapsed="0.001239"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:04.436006" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:04.435707" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:04.436472" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:04.436226" 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-08-22T23:20:04.457925" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:04.458253" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:20:04.458513" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:20:04.438786" elapsed="0.019823"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:04.436613" elapsed="0.022230"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:04.459329" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:04.458918" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:04.436572" elapsed="0.022971"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:04.466343" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:04.462281" elapsed="0.004140"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:04.461615" elapsed="0.004860"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:04.461542" elapsed="0.004971"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:04.470463" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:04.466965" elapsed="0.003568"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:04.466624" elapsed="0.003984"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:04.466572" elapsed="0.004077"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:04.471357" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:04.470912" 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-08-22T23:20:04.471713" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:04.471455" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:04.472277" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:04.471959" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:04.471798" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:04.471437" elapsed="0.000927"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:04.472904" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:04.472521" 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-08-22T23:20:04.473234" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:04.473002" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:04.473811" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:04.473491" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:04.473329" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:04.472983" 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-08-22T23:20:04.474069" elapsed="0.000360"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:20:04.474918" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:04.474609" 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-08-22T23:20:04.475100" elapsed="0.002504"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:20:04.460481" elapsed="0.017195"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:20:04.477870" elapsed="0.000091"/>
</return>
<status status="PASS" start="2026-08-22T23:20:04.477753" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:04.477733" 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-08-22T23:20:04.478174" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:04.478248" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:20:04.480642" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:20:04.431220" elapsed="0.049453"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:20:04.480734" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:20:04.480894" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:20:04.424377" elapsed="0.056544"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:20:04.481618" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:20:04.481206" elapsed="0.000584">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:04.480993" elapsed="0.000875">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:20:04.480975" elapsed="0.000954">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:04.482176" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:04.482006" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:04.481987" elapsed="0.000273"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:04.421155" elapsed="0.061191">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:05.485386" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:05.484391" elapsed="0.001067"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:05.498336" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:05.498041" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:05.498836" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:05.498573" 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-08-22T23:20:05.519816" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:05.519983" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:20:05.520089" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:20:05.501038" elapsed="0.019077"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:05.498962" elapsed="0.021197"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:05.520348" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:05.520190" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:05.498936" elapsed="0.021498"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:05.524142" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:05.521500" elapsed="0.002692"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:05.521274" elapsed="0.002954"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:05.521255" elapsed="0.002999"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:05.526867" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:05.524535" elapsed="0.002380"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:05.524311" elapsed="0.002640"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:05.524294" elapsed="0.002683"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:05.527559" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:05.527155" 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-08-22T23:20:05.527915" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:05.527676" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:05.528459" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:05.528158" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:05.527997" elapsed="0.000613"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:05.527658" elapsed="0.000976"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:05.529163" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:05.528794" 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-08-22T23:20:05.529494" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:05.529261" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:05.530067" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:05.529770" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:05.529606" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:05.529242" 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-08-22T23:20:05.530306" elapsed="0.000386"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:20:05.531153" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:05.530856" 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-08-22T23:20:05.531334" elapsed="0.002313"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:20:05.520841" elapsed="0.012872"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:20:05.533897" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:20:05.533784" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:05.533765" 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-08-22T23:20:05.534145" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:05.534216" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:20:05.536556" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:20:05.491952" elapsed="0.044650"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:20:05.536664" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:20:05.536817" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:20:05.486035" elapsed="0.050809"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:20:05.537484" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:20:05.537122" elapsed="0.000445">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:05.536914" elapsed="0.000745">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:20:05.536897" elapsed="0.000797">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:05.537912" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:05.537763" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:05.537746" elapsed="0.000245"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:05.483254" elapsed="0.054819">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:06.541023" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:06.540061" elapsed="0.001032"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:06.552643" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:06.552341" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:06.553108" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:06.552858" 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-08-22T23:20:06.571264" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:06.571636" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:20:06.571900" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:20:06.555345" elapsed="0.016620"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:06.553229" elapsed="0.018854"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:06.572534" elapsed="0.000079"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:06.572148" elapsed="0.000569"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:06.553207" elapsed="0.019558"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:06.580359" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:06.575163" elapsed="0.005247"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:06.574635" elapsed="0.005811"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:06.574564" elapsed="0.005907"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:06.583065" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:06.580764" elapsed="0.002348"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:06.580526" elapsed="0.002621"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:06.580510" elapsed="0.002662"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:06.583781" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:06.583350" 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-08-22T23:20:06.584119" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:06.583879" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:06.584685" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:06.584367" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:06.584208" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:06.583861" elapsed="0.000909"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:06.585286" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:06.584927" 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-08-22T23:20:06.585625" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:06.585380" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:06.586158" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:06.585864" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:06.585708" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:06.585363" 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-08-22T23:20:06.586390" elapsed="0.000368"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:20:06.587245" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:06.586921" 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-08-22T23:20:06.587423" elapsed="0.002310"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:20:06.573618" elapsed="0.016183"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:20:06.590055" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-08-22T23:20:06.589941" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:06.589922" 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-08-22T23:20:06.590304" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:06.590374" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:20:06.592767" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:20:06.547440" elapsed="0.045357"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:20:06.592859" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:20:06.593015" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:20:06.541607" elapsed="0.051436"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:20:06.593711" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:20:06.593327" elapsed="0.000463">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:06.593118" elapsed="0.000746">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:20:06.593102" elapsed="0.000797">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:06.594117" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:06.593969" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:06.593952" elapsed="0.000247"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:06.538983" elapsed="0.055300">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:07.597829" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:07.596697" elapsed="0.001229"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:07.608206" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:07.607935" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:07.608683" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:07.608412" 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-08-22T23:20:07.630050" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:07.630361" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:20:07.630634" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:20:07.610904" elapsed="0.019796"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:07.608805" elapsed="0.022003"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:07.631249" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:07.630871" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:07.608783" elapsed="0.022674"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:07.639560" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:07.634089" elapsed="0.005623"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:07.633411" elapsed="0.006384"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:07.633368" elapsed="0.006486"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:07.642645" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:07.640298" elapsed="0.002395"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:07.639982" elapsed="0.002747"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:07.639944" elapsed="0.002810"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:07.643338" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:07.642930" 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-08-22T23:20:07.643725" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:07.643437" elapsed="0.000349"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:07.644274" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:07.643970" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:07.643811" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:07.643419" elapsed="0.000941"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:07.644899" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:07.644516" 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-08-22T23:20:07.645227" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:07.644997" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:07.645779" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:07.645465" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:07.645309" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:07.644979" 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-08-22T23:20:07.646015" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:20:07.646850" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:07.646533" 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-08-22T23:20:07.647065" 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-08-22T23:20:07.632359" elapsed="0.017268"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:20:07.649809" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:20:07.649698" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:07.649680" 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-08-22T23:20:07.650052" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:07.650125" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:20:07.652499" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:20:07.603292" elapsed="0.049236"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:20:07.652605" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:20:07.652759" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:20:07.598664" elapsed="0.054122"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:20:07.653428" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:20:07.653063" elapsed="0.000449">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:07.652855" elapsed="0.000748">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:20:07.652838" elapsed="0.000842">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:07.653903" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:07.653755" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:07.653737" elapsed="0.000247"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:07.595424" elapsed="0.058644">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:08.656969" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:08.655973" elapsed="0.001067"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:08.668945" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:08.668671" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:08.669405" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:08.669158" 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-08-22T23:20:08.688698" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:08.688867" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:20:08.688980" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:20:08.671611" elapsed="0.017395"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:08.669531" elapsed="0.019523"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:08.689395" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:08.689086" elapsed="0.000465"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:08.669506" elapsed="0.020132"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:08.701197" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:08.692238" elapsed="0.009019"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:08.691628" elapsed="0.009671"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:08.691554" elapsed="0.009774"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:08.704012" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:08.701658" elapsed="0.002413"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:08.701394" elapsed="0.002718"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:08.701374" elapsed="0.002764"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:08.704754" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:08.704324" 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-08-22T23:20:08.705091" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:08.704853" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:08.705671" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:08.705346" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:08.705182" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:08.704835" elapsed="0.000924"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:08.706289" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:08.705918" 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-08-22T23:20:08.706638" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:08.706388" elapsed="0.000375"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:08.707252" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:08.706951" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:08.706789" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:08.706370" 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-08-22T23:20:08.707488" elapsed="0.000372"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:20:08.708350" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:08.708023" 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-08-22T23:20:08.708530" 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-08-22T23:20:08.690531" elapsed="0.020420"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:20:08.711132" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:20:08.711021" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:08.711003" 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-08-22T23:20:08.711374" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:08.711447" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:20:08.713847" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:20:08.663123" elapsed="0.050753"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:20:08.713937" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:20:08.714093" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:20:08.657531" elapsed="0.056590"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:20:08.714770" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:20:08.714397" elapsed="0.000452">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:08.714190" elapsed="0.000731">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:20:08.714173" elapsed="0.000782">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:08.715169" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:08.715022" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:08.715006" elapsed="0.000242"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:08.654912" elapsed="0.060419">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:09.718423" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:09.717439" elapsed="0.001054"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:09.729808" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:09.729526" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:09.730260" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:09.730011" 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-08-22T23:20:09.749166" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:09.749319" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:20:09.749421" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:20:09.732538" elapsed="0.016910"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:09.730383" elapsed="0.019109"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:09.749699" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:09.749520" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:09.730361" elapsed="0.019429"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:09.753494" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:09.750858" elapsed="0.002781"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:09.750626" elapsed="0.003094"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:09.750565" elapsed="0.003213"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:09.759724" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:09.754393" elapsed="0.005444"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:09.753904" elapsed="0.006020"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:09.753867" elapsed="0.006117"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:09.761218" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:09.760367" elapsed="0.000879"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:09.761552" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:09.761317" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:09.762116" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:09.761812" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:09.761652" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:09.761299" elapsed="0.000901"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:09.762734" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:09.762356" 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-08-22T23:20:09.763064" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:09.762832" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:09.763619" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:09.763304" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:09.763146" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:09.762814" 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-08-22T23:20:09.763853" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:20:09.764703" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:09.764366" 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-08-22T23:20:09.764882" elapsed="0.002303"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:20:09.750156" elapsed="0.017093"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:20:09.767428" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:20:09.767319" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:09.767300" 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-08-22T23:20:09.767685" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:09.767819" elapsed="0.000018"/>
</return>
<msg time="2026-08-22T23:20:09.770163" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:20:09.724734" elapsed="0.045459"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:20:09.770254" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:20:09.770404" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:20:09.719021" elapsed="0.051410"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:20:09.771087" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:20:09.770728" elapsed="0.000435">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:09.770501" elapsed="0.000734">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:20:09.770484" elapsed="0.000786">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:09.771488" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:09.771341" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:09.771324" elapsed="0.000246"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:09.716262" elapsed="0.055406">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:10.774116" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:10.773336" elapsed="0.000840"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:10.785569" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:10.785183" elapsed="0.000482"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:10.786219" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:10.785886" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:20:10.806276" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:10.806434" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:20:10.806539" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:20:10.788468" elapsed="0.018098"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:10.786355" elapsed="0.020280"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:10.806830" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:10.806666" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:10.786328" elapsed="0.020596"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:10.810877" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:10.808035" elapsed="0.002913"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:10.807803" elapsed="0.003195"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:10.807783" elapsed="0.003253"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:10.815045" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:10.811483" elapsed="0.003636"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:10.811134" elapsed="0.004135"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:10.811104" elapsed="0.004202"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:10.816156" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:10.815565" 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-08-22T23:20:10.816645" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:10.816294" elapsed="0.000434"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:10.817461" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:10.816984" elapsed="0.000515"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:10.816762" elapsed="0.000789"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:10.816268" elapsed="0.001333"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:10.818314" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:10.817839" 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-08-22T23:20:10.818675" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:10.818414" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:10.819242" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:10.818929" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:10.818767" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:10.818394" 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-08-22T23:20:10.819502" elapsed="0.000376"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:20:10.820338" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:10.820042" 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-08-22T23:20:10.820517" 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-08-22T23:20:10.807345" elapsed="0.015715"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:20:10.823240" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:20:10.823130" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:10.823111" 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-08-22T23:20:10.823482" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:10.823553" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:20:10.826041" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:20:10.778738" elapsed="0.047333"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:20:10.826133" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:20:10.826293" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:20:10.774513" elapsed="0.051807"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:20:10.827025" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:20:10.826628" elapsed="0.000493">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:10.826393" elapsed="0.000835">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:20:10.826375" elapsed="0.000895">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:10.827500" elapsed="0.000069"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:10.827345" elapsed="0.000283"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:10.827327" elapsed="0.000328"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:10.772341" elapsed="0.055403">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:11.830683" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:11.829648" elapsed="0.001106"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:11.842335" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:11.842030" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:11.842808" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:11.842539" 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-08-22T23:20:11.862365" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:11.862513" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:20:11.862634" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:20:11.845004" elapsed="0.017658"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:11.842929" elapsed="0.019777"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:11.862889" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:11.862735" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:11.842907" elapsed="0.020071"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:11.866915" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:11.864020" elapsed="0.002966"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:11.863790" elapsed="0.003247"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:11.863771" elapsed="0.003309"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:11.870787" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:11.867467" elapsed="0.003385"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:11.867159" elapsed="0.003744"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:11.867135" elapsed="0.003803"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:11.871776" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:11.871178" 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-08-22T23:20:11.872248" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:11.871916" elapsed="0.000414"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:11.873037" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:11.872610" elapsed="0.000465"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:11.872365" elapsed="0.000764"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:11.871890" elapsed="0.001270"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:11.873964" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:11.873382" 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-08-22T23:20:11.874368" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:11.874101" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:11.874921" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:11.874625" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:11.874451" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:11.874076" elapsed="0.000999"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:20:11.875236" elapsed="0.000376"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:20:11.876079" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:11.875778" 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-08-22T23:20:11.876261" 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-08-22T23:20:11.863345" elapsed="0.015378"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:20:11.878905" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:20:11.878793" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:11.878774" 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-08-22T23:20:11.879147" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:11.879219" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:20:11.881676" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:20:11.835892" elapsed="0.045840"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:20:11.881794" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:20:11.881949" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:20:11.831247" elapsed="0.050729"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:20:11.882640" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:20:11.882261" elapsed="0.000459">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:11.882053" elapsed="0.000738">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:20:11.882035" elapsed="0.000791">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:11.883044" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:11.882896" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:11.882879" elapsed="0.000246"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:11.828532" elapsed="0.054675">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:12.886074" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:12.885112" elapsed="0.001032"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:12.898887" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:12.898622" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:12.899344" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:12.899091" 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-08-22T23:20:12.923356" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:12.923563" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:20:12.923686" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:20:12.901535" elapsed="0.022179"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:12.899464" elapsed="0.024295"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:12.923943" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:12.923787" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:12.899441" elapsed="0.024594"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:12.927592" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:12.925080" elapsed="0.002565"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:12.924857" elapsed="0.002825"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:12.924838" elapsed="0.002869"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:12.930323" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:12.927987" elapsed="0.002384"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:12.927765" elapsed="0.002642"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:12.927748" elapsed="0.002684"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:12.931017" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:12.930620" 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-08-22T23:20:12.931359" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:12.931117" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:12.931921" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:12.931617" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:12.931442" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:12.931099" elapsed="0.000908"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:12.932526" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:12.932164" 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-08-22T23:20:12.932873" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:12.932640" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:12.933408" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:12.933113" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:12.932955" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:12.932622" elapsed="0.000870"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:20:12.933659" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:20:12.934488" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:12.934170" 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-08-22T23:20:12.934684" elapsed="0.002342"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:20:12.924410" elapsed="0.012679"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:20:12.937272" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:20:12.937158" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:12.937140" 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-08-22T23:20:12.937511" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:12.937599" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:20:12.939954" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:20:12.892411" elapsed="0.047572"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:20:12.940090" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:20:12.940251" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:20:12.886879" elapsed="0.053399"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:20:12.940935" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:20:12.940556" elapsed="0.000456">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:12.940349" elapsed="0.000734">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:20:12.940331" elapsed="0.000787">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:12.941334" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:12.941189" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:12.941172" elapsed="0.000243"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:12.884055" elapsed="0.057443">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:13.944619" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:13.943565" elapsed="0.001134"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:13.956106" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:13.955845" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:13.956557" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:13.956312" 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-08-22T23:20:13.974184" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:13.974462" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:20:13.974734" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:20:13.958792" elapsed="0.016028"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:13.956702" elapsed="0.018216"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:13.975330" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:13.974984" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:13.956675" elapsed="0.018851"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:13.983425" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:13.977941" elapsed="0.005534"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:13.977377" elapsed="0.006133"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:13.977333" elapsed="0.006207"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:13.986203" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:13.983845" elapsed="0.002404"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:13.983614" elapsed="0.002670"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:13.983596" elapsed="0.002713"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:13.986986" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:13.986504" 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-08-22T23:20:13.987415" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:13.987090" elapsed="0.000387"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:13.987991" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:13.987684" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:13.987503" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:13.987072" elapsed="0.001005"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:13.988623" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:13.988240" 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-08-22T23:20:13.988955" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:13.988722" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:13.989492" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:13.989194" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:13.989037" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:13.988704" 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-08-22T23:20:13.989754" elapsed="0.000365"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:20:13.990611" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:13.990283" 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-08-22T23:20:13.990816" 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-08-22T23:20:13.976356" elapsed="0.017084"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:20:13.993639" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-08-22T23:20:13.993509" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:13.993491" 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-08-22T23:20:13.993909" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:13.993985" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:20:13.996410" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:20:13.951496" elapsed="0.044944"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:20:13.996502" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:20:13.996671" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:20:13.945249" elapsed="0.051450"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:20:13.997361" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:20:13.996980" elapsed="0.000471">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:13.996770" elapsed="0.000759">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:20:13.996752" elapsed="0.000812">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:13.997924" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:13.997653" elapsed="0.000334"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:13.997635" elapsed="0.000375"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:13.942352" elapsed="0.055745">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:15.001313" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:15.000312" elapsed="0.001074"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:15.012675" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:15.012397" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:15.013124" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:15.012877" 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-08-22T23:20:15.033518" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:15.033872" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:20:15.034092" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:20:15.015334" elapsed="0.018815"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:15.013253" elapsed="0.020994"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:15.034691" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:15.034310" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:15.013225" elapsed="0.021666"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:15.043872" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:15.037934" elapsed="0.006067"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:15.037382" elapsed="0.006703"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:15.037340" elapsed="0.006803"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:15.046940" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:15.044614" elapsed="0.002372"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:15.044282" elapsed="0.002740"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:15.044239" elapsed="0.002808"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:15.047658" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:15.047227" 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-08-22T23:20:15.047995" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:15.047757" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:15.048541" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:15.048240" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:15.048079" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:15.047739" elapsed="0.000906"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:15.049168" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:15.048804" 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-08-22T23:20:15.049497" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:15.049266" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:15.050048" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:15.049754" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:15.049594" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:15.049249" 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-08-22T23:20:15.050287" elapsed="0.000363"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:20:15.051132" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:15.050814" 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-08-22T23:20:15.051421" elapsed="0.002359"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:20:15.036310" elapsed="0.017537"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:20:15.054030" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:20:15.053917" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:15.053899" 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-08-22T23:20:15.054276" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:15.054348" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:20:15.056724" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:20:15.007676" elapsed="0.049077"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:20:15.056814" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:20:15.056966" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:20:15.001931" elapsed="0.055062"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:20:15.057734" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:20:15.057345" elapsed="0.000477">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:15.057062" elapsed="0.000837">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:20:15.057046" elapsed="0.000888">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:15.058150" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:15.058003" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:15.057986" elapsed="0.000245"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:14.999074" elapsed="0.059242">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:16.061530" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:16.060487" elapsed="0.001150"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:16.073142" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:16.072859" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:16.073614" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:16.073347" 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-08-22T23:20:16.094416" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:16.094792" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:20:16.095021" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:20:16.075885" elapsed="0.019194"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:16.073748" elapsed="0.021531"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:16.095746" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:16.095355" elapsed="0.000629"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:16.073720" elapsed="0.022338"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:16.103799" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:16.098500" elapsed="0.005349"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:16.097985" elapsed="0.005929"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:16.097943" elapsed="0.005997"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:16.106522" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:16.104233" elapsed="0.002337"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:16.104000" elapsed="0.002621"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:16.103980" elapsed="0.002667"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:16.107244" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:16.106826" 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-08-22T23:20:16.107623" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:16.107348" elapsed="0.000337"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:16.108194" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:16.107889" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:16.107710" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:16.107330" elapsed="0.000951"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:16.108838" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:16.108435" 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-08-22T23:20:16.109172" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:16.108937" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:16.109740" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:16.109412" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:16.109254" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:16.108919" 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-08-22T23:20:16.109979" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:20:16.110833" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:16.110496" 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-08-22T23:20:16.111014" 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-08-22T23:20:16.096973" elapsed="0.016641"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:20:16.113802" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-08-22T23:20:16.113688" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:16.113669" 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-08-22T23:20:16.114050" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:16.114122" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:20:16.116476" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:20:16.068015" elapsed="0.048490"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:20:16.116565" elapsed="0.000045"/>
</return>
<msg time="2026-08-22T23:20:16.116738" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:20:16.062163" elapsed="0.054601"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:20:16.117423" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:20:16.117055" elapsed="0.000490">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:16.116834" elapsed="0.000805">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:20:16.116818" elapsed="0.000856">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:16.117891" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:16.117743" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:16.117726" elapsed="0.000244"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:16.059237" elapsed="0.058816">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:17.121340" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:17.120240" elapsed="0.001179"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:17.133603" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:17.133326" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:17.134054" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:17.133807" 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-08-22T23:20:17.154105" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:17.154270" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:20:17.154373" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:20:17.136255" elapsed="0.018144"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:17.134185" elapsed="0.020257"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:17.154648" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:17.154472" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:17.134160" elapsed="0.020577"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:17.158173" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:17.155760" elapsed="0.002462"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:17.155513" elapsed="0.002743"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:17.155495" elapsed="0.002786"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:17.160856" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:17.158553" elapsed="0.002350"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:17.158336" elapsed="0.002602"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:17.158319" elapsed="0.002643"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:17.161529" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:17.161135" 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-08-22T23:20:17.161878" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:17.161644" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:17.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-08-22T23:20:17.162117" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:17.161959" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:17.161626" elapsed="0.000943"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:17.163108" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:17.162742" 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-08-22T23:20:17.163435" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:17.163205" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:17.163984" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:17.163688" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:17.163515" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:17.163187" 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-08-22T23:20:17.164220" elapsed="0.000400"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:20:17.165086" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:17.164784" 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-08-22T23:20:17.165265" 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-08-22T23:20:17.155092" elapsed="0.012637"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:20:17.167910" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:20:17.167799" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:17.167780" 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-08-22T23:20:17.168152" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:17.168222" elapsed="0.000014"/>
</return>
<msg time="2026-08-22T23:20:17.170538" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:20:17.128238" elapsed="0.042329"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:20:17.170643" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:20:17.170795" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:20:17.121994" elapsed="0.048827"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:20:17.171467" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:20:17.171104" elapsed="0.000446">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:17.170895" elapsed="0.000745">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:20:17.170874" elapsed="0.000801">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:17.171891" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:17.171745" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:17.171728" elapsed="0.000242"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:17.119014" elapsed="0.053037">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:18.175235" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:18.174232" elapsed="0.001076"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:18.186220" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:18.185956" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:18.186689" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:18.186425" 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-08-22T23:20:18.207644" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:18.207805" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:20:18.207904" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:20:18.188877" elapsed="0.019053"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:18.186813" elapsed="0.021162"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:18.208160" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:18.208004" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:18.186790" elapsed="0.021459"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:18.213628" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:18.209301" elapsed="0.004377"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:18.209079" elapsed="0.004636"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:18.209059" elapsed="0.004682"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:18.216353" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:18.214022" elapsed="0.002378"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:18.213797" elapsed="0.002638"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:18.213780" elapsed="0.002680"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:18.217088" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:18.216651" 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-08-22T23:20:18.217423" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:18.217187" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:18.217993" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:18.217687" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:18.217507" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:18.217169" elapsed="0.000910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:18.218615" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:18.218236" 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-08-22T23:20:18.218946" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:18.218714" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:18.219481" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:18.219185" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:18.219028" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:18.218696" 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-08-22T23:20:18.219733" elapsed="0.000361"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:20:18.220552" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:18.220256" 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-08-22T23:20:18.220747" 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-08-22T23:20:18.208633" elapsed="0.014649"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:20:18.223519" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:20:18.223406" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:18.223385" 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-08-22T23:20:18.223780" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:18.223852" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:20:18.226253" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:20:18.181623" elapsed="0.044660"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:20:18.226345" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:20:18.226497" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:20:18.175852" elapsed="0.050672"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:20:18.227181" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:20:18.226819" elapsed="0.000442">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:18.226609" elapsed="0.000726">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:20:18.226591" elapsed="0.000779">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:18.227601" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:18.227440" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:18.227423" elapsed="0.000262"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:18.173054" elapsed="0.054714">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:19.231169" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:19.230062" elapsed="0.001183"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:19.243199" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:19.242934" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:19.243666" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:19.243401" 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-08-22T23:20:19.266166" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:19.266527" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:20:19.266870" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:20:19.245977" elapsed="0.020957"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:19.243792" elapsed="0.023271"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:19.267646" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:19.267142" elapsed="0.000665"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:19.243767" elapsed="0.024092"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:19.275454" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:19.270642" elapsed="0.004863"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:19.269926" elapsed="0.005615"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:19.269880" elapsed="0.005686"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:19.278234" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:19.275868" elapsed="0.002413"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:19.275643" elapsed="0.002674"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:19.275626" elapsed="0.002716"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:19.278953" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:19.278524" 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-08-22T23:20:19.279292" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:19.279051" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:19.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-08-22T23:20:19.279546" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:19.279376" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:19.279033" elapsed="0.000925"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:19.280485" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:19.280116" 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-08-22T23:20:19.280845" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:19.280598" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:19.281387" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:19.281088" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:19.280928" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:19.280565" 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-08-22T23:20:19.281671" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:20:19.282497" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:19.282192" 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-08-22T23:20:19.282695" elapsed="0.002444"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:20:19.268796" elapsed="0.016411"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:20:19.285394" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-08-22T23:20:19.285279" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:19.285260" 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-08-22T23:20:19.285681" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:19.285756" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:20:19.288158" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:20:19.238182" elapsed="0.050006"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:20:19.288252" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:20:19.288408" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:20:19.231815" elapsed="0.056621"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:20:19.289110" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:20:19.288736" elapsed="0.000461">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:19.288508" elapsed="0.000767">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:20:19.288491" elapsed="0.000863">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:19.289628" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:19.289434" elapsed="0.000255"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:19.289417" elapsed="0.000296"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:19.228678" elapsed="0.061125">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:20.293071" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:20.291891" elapsed="0.001257"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:20.309380" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:20.309109" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:20.309871" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:20.309605" 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-08-22T23:20:20.331445" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:20.331677" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:20:20.331822" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:20:20.312118" elapsed="0.019764"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:20.310002" elapsed="0.021990"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:20.332294" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:20.332061" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:20.309975" elapsed="0.022456"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:20.340647" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:20.335121" elapsed="0.005642"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:20.334613" elapsed="0.006231"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:20.334536" elapsed="0.006367"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:20.345090" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:20.341526" elapsed="0.003611"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:20.341029" elapsed="0.004143"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:20.340991" elapsed="0.004205"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:20.345839" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:20.345387" 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-08-22T23:20:20.346188" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:20.345939" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:20.346790" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:20.346452" elapsed="0.000366"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:20.346272" elapsed="0.000584"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:20.345921" elapsed="0.000957"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:20.347415" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:20.347037" 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-08-22T23:20:20.347768" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:20.347513" elapsed="0.000398"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:20.348410" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:20.348100" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:20.347937" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:20.347495" 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-08-22T23:20:20.348670" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:20:20.349503" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:20.349190" 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-08-22T23:20:20.349700" 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-08-22T23:20:20.333529" elapsed="0.018726"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:20:20.352445" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:20:20.352327" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:20.352308" elapsed="0.000256"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:20.352734" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:20.352807" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:20:20.355115" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:20:20.299832" elapsed="0.055313"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:20:20.355206" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:20:20.355361" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:20:20.293688" elapsed="0.061701"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:20:20.356088" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:20:20.355685" elapsed="0.000484">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:20.355458" elapsed="0.000787">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:20:20.355441" elapsed="0.000840">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:20.356507" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:20.356352" elapsed="0.000238"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:20.356334" elapsed="0.000283"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:20.290694" elapsed="0.066010">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:21.359854" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:21.358803" elapsed="0.001127"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:21.370836" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:21.370450" elapsed="0.000455"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:21.371468" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:21.371121" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:20:21.391805" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:21.392094" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:20:21.392318" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:20:21.374372" elapsed="0.018005"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:21.371658" elapsed="0.020819"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:21.392941" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:21.392538" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:21.371626" elapsed="0.021527"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:21.400005" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:21.395471" elapsed="0.004606"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:21.394977" elapsed="0.005152"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:21.394935" elapsed="0.005231"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:21.404278" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:21.400556" elapsed="0.003790"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:21.400245" elapsed="0.004268"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:21.400221" elapsed="0.004333"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:21.405609" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:21.404965" elapsed="0.000686"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:21.406082" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:21.405751" elapsed="0.000413"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:21.406873" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:21.406421" elapsed="0.000491"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:21.406198" elapsed="0.000765"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:21.405725" elapsed="0.001268"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:21.407740" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:21.407212" 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-08-22T23:20:21.408191" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:21.407874" elapsed="0.000396"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:21.409006" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:21.408531" elapsed="0.000512"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:21.408303" elapsed="0.000790"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:21.407849" 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-08-22T23:20:21.409331" elapsed="0.000385"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:20:21.410170" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:21.409878" 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-08-22T23:20:21.410348" elapsed="0.002317"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:20:21.393984" elapsed="0.018746"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:20:21.412909" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:20:21.412799" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:21.412781" 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-08-22T23:20:21.413150" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:21.413257" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:20:21.415610" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:20:21.364343" elapsed="0.051297"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:20:21.415701" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:20:21.415854" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:20:21.360461" elapsed="0.055420"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:20:21.416524" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:20:21.416161" elapsed="0.000470">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:21.415952" elapsed="0.000754">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:20:21.415935" elapsed="0.000806">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:21.416958" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:21.416811" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:21.416794" elapsed="0.000245"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:21.357624" elapsed="0.059497">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:22.420273" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:22.419269" elapsed="0.001077"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:22.432125" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:22.431862" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:22.432571" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:22.432324" 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-08-22T23:20:22.463395" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:22.463750" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:20:22.463992" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:20:22.434898" elapsed="0.029156"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:22.432712" elapsed="0.031449"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:22.464712" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:22.464229" elapsed="0.000653"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:22.432687" elapsed="0.032249"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:22.473072" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:22.467462" elapsed="0.005721"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:22.466930" elapsed="0.006334"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:22.466885" elapsed="0.006436"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:22.477189" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:22.473978" elapsed="0.003257"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:22.473448" elapsed="0.003898"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:22.473410" elapsed="0.003963"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:22.477978" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:22.477553" 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-08-22T23:20:22.478315" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:22.478077" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:22.479069" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:22.478762" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:22.478399" elapsed="0.000735"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:22.478059" elapsed="0.001097"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:22.479713" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:22.479316" 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-08-22T23:20:22.480043" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:22.479811" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:22.480597" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:22.480285" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:22.480127" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:22.479793" 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-08-22T23:20:22.480840" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:20:22.481673" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:22.481356" 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-08-22T23:20:22.481853" elapsed="0.002357"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:20:22.465850" elapsed="0.018426"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:20:22.484460" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:20:22.484347" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:22.484329" 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-08-22T23:20:22.484725" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:22.484798" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:20:22.487196" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:20:22.426884" elapsed="0.060341"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:20:22.487287" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:20:22.487439" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:20:22.420880" elapsed="0.066586"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:20:22.488131" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:20:22.487763" elapsed="0.000452">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:22.487536" elapsed="0.000754">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:20:22.487519" elapsed="0.000806">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:22.488542" elapsed="0.000073"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:22.488394" elapsed="0.000262"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:22.488377" elapsed="0.000304"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:22.418029" elapsed="0.070739">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:23.492075" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:23.490968" elapsed="0.001181"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:23.502650" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:23.502360" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:23.503113" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:23.502858" 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-08-22T23:20:23.531007" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:23.531319" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:20:23.531608" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:20:23.506466" elapsed="0.025210"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:23.503245" elapsed="0.028539"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:23.532234" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:23.531852" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:23.503215" elapsed="0.029213"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:23.539931" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:23.534991" elapsed="0.005016"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:23.534387" elapsed="0.005674"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:23.534343" elapsed="0.005756"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:23.544083" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:23.540512" elapsed="0.003639"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:23.540182" elapsed="0.004022"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:23.540158" elapsed="0.004083"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:23.545154" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:23.544517" 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-08-22T23:20:23.545700" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:23.545322" elapsed="0.000464"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:23.546523" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:23.546062" elapsed="0.000507"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:23.545823" elapsed="0.000829"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:23.545294" elapsed="0.001391"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:23.547516" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:23.546916" 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-08-22T23:20:23.548058" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:23.547711" elapsed="0.000432"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:23.548880" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:23.548411" elapsed="0.000526"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:23.548178" elapsed="0.000816"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:23.547683" elapsed="0.001440"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:20:23.549412" elapsed="0.000512"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:20:23.550412" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:23.550089" 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-08-22T23:20:23.550616" 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-08-22T23:20:23.533305" elapsed="0.020058"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:20:23.553566" elapsed="0.000061"/>
</return>
<status status="PASS" start="2026-08-22T23:20:23.553442" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:23.553422" 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-08-22T23:20:23.553844" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:23.553917" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:20:23.556461" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:20:23.498003" elapsed="0.058488"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:20:23.556555" elapsed="0.000043"/>
</return>
<msg time="2026-08-22T23:20:23.556734" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:20:23.492692" elapsed="0.064070"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:20:23.557520" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:20:23.557055" elapsed="0.000580">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:23.556837" elapsed="0.000879">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:20:23.556819" elapsed="0.000933">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:23.557978" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:23.557823" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:23.557805" elapsed="0.000253"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:23.489767" elapsed="0.068381">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.560457" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:24.559740" elapsed="0.000772"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.571016" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:24.570614" elapsed="0.000480"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.571687" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:24.571317" 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-08-22T23:20:24.594250" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:24.594781" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:20:24.595077" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:20:24.574595" elapsed="0.020545"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:24.571868" elapsed="0.023396"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:24.595838" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:24.595341" elapsed="0.000650"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.571831" elapsed="0.024211"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.604791" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:24.598635" elapsed="0.006318"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:24.598088" elapsed="0.006949"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.598040" elapsed="0.007054"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.607885" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:24.605604" elapsed="0.002328"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:24.605222" elapsed="0.002745"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.605183" elapsed="0.002810"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.608637" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:24.608189" 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-08-22T23:20:24.608993" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:24.608738" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.609542" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:24.609238" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:24.609076" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.608719" elapsed="0.000926"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.610165" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:24.609801" 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-08-22T23:20:24.610492" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:24.610260" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.611042" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:24.610748" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:24.610572" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.610243" 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-08-22T23:20:24.611279" elapsed="0.000364"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:20:24.612120" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:24.611806" 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-08-22T23:20:24.612299" 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-08-22T23:20:24.597004" elapsed="0.017690"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:20:24.614882" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-08-22T23:20:24.614766" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.614748" 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-08-22T23:20:24.615134" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:24.615205" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:20:24.617547" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:20:24.564552" elapsed="0.053038"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:20:24.617712" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:20:24.617869" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:20:24.560879" elapsed="0.057017"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.618555" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:20:24.618177" elapsed="0.000485">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:24.617966" elapsed="0.000776">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:20:24.617949" elapsed="0.000828">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:24.618995" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:24.618848" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:24.618831" elapsed="0.000244"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:24.558863" elapsed="0.060299">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<msg time="2026-08-22T23:20:24.619261" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>60s</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:19:24.178546" elapsed="60.440818">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.620658" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:24.620225" elapsed="0.000461"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-08-22T23:20:24.620917" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:24.620760" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.620742" elapsed="0.000237"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:20:24.621141" elapsed="0.000211"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.622228" level="FAIL">'4968' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:20:24.621890" elapsed="0.000397">'4968' does not contain '-'</status>
</kw>
<msg time="2026-08-22T23:20:24.622381" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:20:24.621514" elapsed="0.000890"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.622920" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:20:24.622571" elapsed="0.000375"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.623388" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:24.623102" elapsed="0.000312"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.623871" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:24.623565" elapsed="0.000333"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.624415" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968

Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-08-22T23:20:24.624049" elapsed="0.000418"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.624888" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:24.624637" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.625635" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=4968'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-08-22T23:20:24.625269" elapsed="0.000415"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:24.624997" elapsed="0.000722"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.624979" elapsed="0.000764"/>
</if>
<arg>4968</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:20:24.619861" elapsed="0.005927"/>
</kw>
<doc>Check that the modified device data make their way into the configurer node.</doc>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=4968</tag>
<status status="FAIL" start="2026-08-22T23:19:23.910232" elapsed="60.715603">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968

Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</test>
<test id="s1-s1-t19" name="Delete_Device_Data" line="200">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:20:24.629359" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:20:24.629098" 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-08-22T23:20:24.630658" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:24.630509" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.630491" 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-08-22T23:20:24.635561" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:24.635455" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.635437" elapsed="0.000206"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.636693" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:20:24.636300" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.637189" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:20:24.636887" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:20:24.637258" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:20:24.637411" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:20:24.635927" elapsed="0.001508"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:20:24.642873" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:24.642764" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.642746" 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-08-22T23:20:24.644134" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:24.644028" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.644010" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:20:24.644687" 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-08-22T23:20:24.644345" elapsed="0.000380"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:20:24.645118" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:20:24.644882" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:20:24.678533" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:20:24.645656" elapsed="0.033266"/>
</kw>
<msg time="2026-08-22T23:20:24.679133" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:20:24.679182" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:24.645301" elapsed="0.033918"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:20:24.700072" level="INFO">"t "x "t ". "C "R "U "D ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:20:24.679847" elapsed="0.020329"/>
</kw>
<msg time="2026-08-22T23:20:24.700349" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:20:24.700396" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:24.679425" elapsed="0.021068"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:24.700935" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:24.700685" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.700656" elapsed="0.000363"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.701478" level="INFO"> "t "x "t ". "C "R "U "D ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:24.701161" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:24.701843" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:24.701627" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.701607" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:20:24.701960" 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-08-22T23:20:24.704895" elapsed="0.000156"/>
</kw>
<msg time="2026-08-22T23:20:24.705116" 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-08-22T23:20:24.703560" elapsed="0.001706"/>
</kw>
<kw name="Open 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-08-22T23:20:24.705567" elapsed="0.000110"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:24.705960" 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-08-22T23:20:24.702853" 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-08-22T23:20:24.702264" elapsed="0.003978"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:20:24.643730" elapsed="0.062611"/>
</kw>
<msg time="2026-08-22T23:20:24.706433" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:20:24.706478" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:24.643092" elapsed="0.063429"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:20:24.706729" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:20:24.706620" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.706600" 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-08-22T23:20:24.707220" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:24.707556" elapsed="0.000186"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:20:24.707793" 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-08-22T23:20:24.642414" elapsed="0.065491"/>
</kw>
<msg time="2026-08-22T23:20:24.708001" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:20:24.708045" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:24.637846" elapsed="0.070237"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:24.708408" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:24.708160" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.708142" elapsed="0.000374"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:20:24.637703" elapsed="0.070838"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:20:24.713997" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:24.713888" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.713869" 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-08-22T23:20:24.715288" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:24.715136" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.715118" elapsed="0.000240"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:20:24.715856" 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-08-22T23:20:24.715503" elapsed="0.000380"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:20:24.716259" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:20:24.716038" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:20:24.758612" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:20:24.716814" elapsed="0.042184"/>
</kw>
<msg time="2026-08-22T23:20:24.759201" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:20:24.759251" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:24.716454" elapsed="0.042835"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:20:24.779842" level="INFO">"t "x "t ". "C "R "U "D ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:20:24.759975" elapsed="0.019976"/>
</kw>
<msg time="2026-08-22T23:20:24.780128" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:20:24.780176" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:24.759484" elapsed="0.020783"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:24.780661" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:24.780378" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.780350" elapsed="0.000396"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.781212" level="INFO"> "t "x "t ". "C "R "U "D ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:24.780891" 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-08-22T23:20:24.781561" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:24.781343" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.781325" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:20:24.781695" 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-08-22T23:20:24.784565" elapsed="0.000174"/>
</kw>
<msg time="2026-08-22T23:20:24.784805" 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-08-22T23:20:24.783289" elapsed="0.001667"/>
</kw>
<kw name="Open 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-08-22T23:20:24.785253" elapsed="0.000089"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:24.785647" elapsed="0.000087"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:20:24.782604" elapsed="0.003255"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:20:24.781992" elapsed="0.003935"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:20:24.714835" elapsed="0.071189"/>
</kw>
<msg time="2026-08-22T23:20:24.786119" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:20:24.786163" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:24.714246" elapsed="0.071954"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:20:24.786385" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:20:24.786277" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.786258" 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-08-22T23:20:24.786898" 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-08-22T23:20:24.787283" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:20:24.787354" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:20:24.713519" elapsed="0.073944"/>
</kw>
<msg time="2026-08-22T23:20:24.787559" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:20:24.787768" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:24.708837" elapsed="0.078970"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:24.788136" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:24.787885" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.787867" elapsed="0.000363"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:20:24.708697" elapsed="0.079557"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:20:24.793686" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:24.793562" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.793544" 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-08-22T23:20:24.795181" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:24.795023" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.794996" elapsed="0.000283"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:20:24.796010" 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-08-22T23:20:24.795513" elapsed="0.000535"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:20:24.796628" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:20:24.796313" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:20:24.824803" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:20:24.797155" elapsed="0.027909"/>
</kw>
<msg time="2026-08-22T23:20:24.825335" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:20:24.825385" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:24.796816" elapsed="0.028608"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:20:24.841521" level="INFO">"t "x "t ". "C "R "U "D ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:20:24.828563" elapsed="0.013096"/>
</kw>
<msg time="2026-08-22T23:20:24.841849" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:20:24.841896" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:24.825733" elapsed="0.016201"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:24.842319" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:24.842045" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.842012" elapsed="0.000396"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.842940" level="INFO"> "t "x "t ". "C "R "U "D ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:24.842555" elapsed="0.000447"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:24.843293" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:24.843072" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.843053" elapsed="0.000320"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:20:24.843413" 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-08-22T23:20:24.846495" elapsed="0.000188"/>
</kw>
<msg time="2026-08-22T23:20:24.846804" 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-08-22T23:20:24.845184" elapsed="0.001774"/>
</kw>
<kw name="Open 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-08-22T23:20:24.847260" elapsed="0.000093"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:24.847662" 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-08-22T23:20:24.844421" elapsed="0.003460"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:20:24.843783" 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-08-22T23:20:24.794515" elapsed="0.053621"/>
</kw>
<msg time="2026-08-22T23:20:24.848234" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:20:24.848280" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:24.793904" elapsed="0.054413"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:20:24.848509" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:20:24.848397" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.848377" elapsed="0.000305"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:24.849104" 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-08-22T23:20:24.849454" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:20:24.849530" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:20:24.793214" elapsed="0.056550"/>
</kw>
<msg time="2026-08-22T23:20:24.849863" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:20:24.849907" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:24.788529" elapsed="0.061414"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:24.850277" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:24.850021" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.850003" elapsed="0.000353"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:20:24.788387" elapsed="0.061994"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:20:24.637498" elapsed="0.212919"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:20:24.635098" elapsed="0.215381"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:20:24.630223" elapsed="0.220314"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:24.629788" elapsed="0.220813"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:20:24.626777" elapsed="0.223882"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.851298" level="INFO">${template_as_string} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${template_as_string}</var>
<arg>DEVICE_NAME=${device_name}</arg>
<arg>RESTCONF_ROOT=${RESTCONF_ROOT}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:20:24.850838" elapsed="0.000488"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.897999" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:24.897509" elapsed="0.000528"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:20:24.898913" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:20:24.898598" elapsed="0.000397">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:20:24.899182" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:20:24.898225" elapsed="0.000982"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.899798" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:20:24.899373" elapsed="0.000453"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:20:24.900137" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:20:24.900403" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:20:24.899986" elapsed="0.000444"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.900867" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:24.900612" 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-08-22T23:20:24.902005" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:24.901740" elapsed="0.000311"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.902485" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:20:24.902209" elapsed="0.000302"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.903221" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:20:24.902913" elapsed="0.000334"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:20:24.904043" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:20:24.903804" elapsed="0.000266"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:20:24.904126" elapsed="0.000044"/>
</return>
<msg time="2026-08-22T23:20:24.904306" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:20:24.903435" elapsed="0.000896"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:20:24.904485" elapsed="0.000270"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:20:24.902775" elapsed="0.002022"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.905345" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:20:24.905045" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:20:24.906104" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:20:24.905888" elapsed="0.000241"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:20:24.906180" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:20:24.906331" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:20:24.905553" elapsed="0.000803"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:20:24.906504" elapsed="0.000241"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:20:24.904915" elapsed="0.001873"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:20:24.902569" elapsed="0.004254"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:20:24.906870" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:20:24.907031" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:20:24.901385" elapsed="0.005672"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:24.901005" elapsed="0.006085"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:24.907276" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:24.907120" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.900976" elapsed="0.006378"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.908181" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:24.907505" elapsed="0.000704"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:20:24.908257" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:20:24.896713" elapsed="0.011673"/>
</kw>
<msg time="2026-08-22T23:20:24.908602" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:20:24.883675" elapsed="0.024988"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:24.921573" elapsed="0.000089"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:24.935754" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:24.948449" 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-08-22T23:20:24.948705" 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-08-22T23:20:24.948902" 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-08-22T23:20:24.949359" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:24.949202" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:24.949181" 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-08-22T23:20:24.949611" 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-08-22T23:20:24.949781" 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-08-22T23:20:24.949944" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:20:24.949134" elapsed="0.000863"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:20:24.948998" elapsed="0.001028"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:24.950174" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:24.950259" elapsed="0.000022"/>
</return>
<msg time="2026-08-22T23:20:24.950448" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:20:24.879229" elapsed="0.071250"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.951814" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:24.951428" elapsed="0.000441"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:20:24.965125" level="INFO">DELETE Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:24.965376" level="INFO">DELETE Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/yang-data+xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:24.965571" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:24.954038" elapsed="0.012481">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:24.951936" elapsed="0.014796">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:24.967156" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:24.966810" elapsed="0.000486"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:24.951919" elapsed="0.015432">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:24.968256" elapsed="0.000060"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:24.968425" elapsed="0.000037"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="FAIL" start="2026-08-22T23:20:24.950768" elapsed="0.017923">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:24.968835" elapsed="0.000035"/>
</return>
<arg>${directory_with_template_folders}${/}datamod1</arg>
<arg>${template_as_string}</arg>
<arg>session=${NODE_SETTER}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-08-22T23:20:24.851552" elapsed="0.117526">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.972023" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:24.970999" elapsed="0.001087"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-08-22T23:20:24.972570" elapsed="0.000066"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:24.972254" elapsed="0.000444"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.972213" elapsed="0.000534"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:20:24.973122" elapsed="0.000506"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.975701" level="FAIL">'4968' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:20:24.974821" elapsed="0.001028">'4968' does not contain '-'</status>
</kw>
<msg time="2026-08-22T23:20:24.976065" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:20:24.973991" elapsed="0.002131"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.976984" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:20:24.976505" elapsed="0.000506"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.977474" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:24.977174" elapsed="0.000328"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.977977" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:24.977673" elapsed="0.000331"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.978539" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968

HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-08-22T23:20:24.978156" elapsed="0.000452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.979015" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:24.978765" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.980038" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=4968'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-08-22T23:20:24.979418" elapsed="0.000669"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:24.979170" elapsed="0.000953"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.979150" elapsed="0.000998"/>
</if>
<arg>4968</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:20:24.970135" elapsed="0.010061"/>
</kw>
<doc>Send a request to delete the sample test data on the device and check that the request went OK.</doc>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=4968</tag>
<status status="FAIL" start="2026-08-22T23:20:24.626079" elapsed="0.354165">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968

HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</test>
<test id="s1-s1-t20" name="Check_Device_Data_Is_Deleted" line="211">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:20:24.983673" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:20:24.983364" 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-08-22T23:20:24.984948" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:24.984835" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.984816" 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-08-22T23:20:24.989963" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:24.989854" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.989835" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.991056" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:20:24.990657" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:20:24.991649" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:20:24.991301" elapsed="0.000375"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:20:24.991723" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:20:24.991891" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:20:24.990263" 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-08-22T23:20:24.997564" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:24.997454" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.997434" 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-08-22T23:20:24.998865" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:24.998757" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:24.998738" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:20:24.999401" 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-08-22T23:20:24.999077" elapsed="0.000378"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:20:24.999876" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:20:24.999637" elapsed="0.000264"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:20:25.036935" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:20:25.000393" elapsed="0.036795"/>
</kw>
<msg time="2026-08-22T23:20:25.037447" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:20:25.037498" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:25.000059" elapsed="0.037476"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:20:25.055036" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:20:25.038366" elapsed="0.016776"/>
</kw>
<msg time="2026-08-22T23:20:25.055411" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:20:25.055458" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:25.037851" elapsed="0.017645"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.055897" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:25.055632" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.055570" elapsed="0.000414"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:25.056443" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:25.056128" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.056812" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:25.056594" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.056559" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:20:25.056933" 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-08-22T23:20:25.059909" elapsed="0.000157"/>
</kw>
<msg time="2026-08-22T23:20:25.060132" 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-08-22T23:20:25.058612" elapsed="0.001680"/>
</kw>
<kw name="Open 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-08-22T23:20:25.060631" elapsed="0.000090"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.061008" 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-08-22T23:20:25.057869" elapsed="0.003358"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:20:25.057266" elapsed="0.004033"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:20:24.998422" elapsed="0.062980"/>
</kw>
<msg time="2026-08-22T23:20:25.061502" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:20:25.061548" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:24.997801" elapsed="0.063811"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:20:25.061803" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:20:25.061694" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.061674" 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-08-22T23:20:25.062302" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.062811" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:20:25.062886" 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-08-22T23:20:24.997113" elapsed="0.065887"/>
</kw>
<msg time="2026-08-22T23:20:25.063102" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:20:25.063148" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:24.992309" elapsed="0.070890"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.063527" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:25.063277" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.063260" elapsed="0.000369"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:20:24.992165" elapsed="0.071489"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:20:25.069505" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:25.069381" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.069356" elapsed="0.000242"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:20:25.070866" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:25.070740" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.070720" elapsed="0.000216"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:20:25.071445" 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-08-22T23:20:25.071083" elapsed="0.000390"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:20:25.071910" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:20:25.071666" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:20:25.108239" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:20:25.072437" elapsed="0.035929"/>
</kw>
<msg time="2026-08-22T23:20:25.108568" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:20:25.108638" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:25.072101" elapsed="0.036576"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:20:25.131122" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:20:25.109301" elapsed="0.021939"/>
</kw>
<msg time="2026-08-22T23:20:25.131419" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:20:25.131483" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:25.108885" elapsed="0.022641"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.131902" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:25.131639" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.131613" elapsed="0.000392"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:25.132475" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:25.132156" 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-08-22T23:20:25.132879" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:25.132648" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.132628" elapsed="0.000339"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:20:25.133002" 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-08-22T23:20:25.135901" elapsed="0.000151"/>
</kw>
<msg time="2026-08-22T23:20:25.136119" 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-08-22T23:20:25.134626" elapsed="0.001676"/>
</kw>
<kw name="Open 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-08-22T23:20:25.136637" elapsed="0.000091"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.137046" 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-08-22T23:20:25.133884" elapsed="0.003395"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:20:25.133288" elapsed="0.004065"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:20:25.070390" elapsed="0.067067"/>
</kw>
<msg time="2026-08-22T23:20:25.137553" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:20:25.137624" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:25.069809" elapsed="0.067857"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:20:25.137857" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:20:25.137747" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.137727" 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-08-22T23:20:25.138377" 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-08-22T23:20:25.138967" elapsed="0.000034"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:20:25.139066" 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-08-22T23:20:25.068980" elapsed="0.070220"/>
</kw>
<msg time="2026-08-22T23:20:25.139299" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:20:25.139345" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:25.063939" elapsed="0.075445"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.139735" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:25.139462" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.139445" elapsed="0.000370"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:20:25.063797" elapsed="0.076042"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:20:25.145892" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:25.145779" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.145759" 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-08-22T23:20:25.147283" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:25.147172" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.147153" elapsed="0.000200"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:20:25.147872" 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-08-22T23:20:25.147496" elapsed="0.000404"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:20:25.148323" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:20:25.148090" elapsed="0.000259"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:20:25.182550" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:20:25.148896" elapsed="0.034083"/>
</kw>
<msg time="2026-08-22T23:20:25.183464" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:20:25.183614" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:25.148509" elapsed="0.035196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:20:25.200355" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:20:25.185165" elapsed="0.015345"/>
</kw>
<msg time="2026-08-22T23:20:25.200790" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:20:25.200857" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:25.184194" elapsed="0.016723"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.201448" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:25.201064" elapsed="0.000466"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.201022" elapsed="0.000572"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:25.202263" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:25.201813" 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-08-22T23:20:25.202791" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:25.202457" elapsed="0.000411"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.202431" elapsed="0.000471"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:20:25.202961" 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">
<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-08-22T23:20:25.206942" elapsed="0.000205"/>
</kw>
<msg time="2026-08-22T23:20:25.207233" 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-08-22T23:20:25.205350" 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-08-22T23:20:25.207867" elapsed="0.000124"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.208378" elapsed="0.000117"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:20:25.204347" elapsed="0.004336"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:20:25.203420" elapsed="0.005359"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:20:25.146792" elapsed="0.062122"/>
</kw>
<msg time="2026-08-22T23:20:25.209046" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:20:25.209107" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:25.146116" elapsed="0.063049"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:20:25.209407" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:20:25.209267" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.209242" 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-08-22T23:20:25.210136" 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-08-22T23:20:25.210497" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:20:25.210572" elapsed="0.000069"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:20:25.145351" elapsed="0.065423"/>
</kw>
<msg time="2026-08-22T23:20:25.210880" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:20:25.210940" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:25.140130" elapsed="0.070858"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.211330" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:25.211072" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.211053" elapsed="0.000356"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:20:25.139971" elapsed="0.071463"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:20:24.991978" elapsed="0.219493"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:20:24.989473" elapsed="0.222067"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:20:24.984515" elapsed="0.227255"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:24.984091" elapsed="0.227732"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:20:24.981179" elapsed="0.230705"/>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:25.212954" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:25.212527" elapsed="0.000455"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:25.220754" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:25.220455" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:25.221208" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:25.220958" 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-08-22T23:20:25.235664" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:25.236100" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:25.236343" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:25.223483" elapsed="0.013695">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:25.221320" elapsed="0.016045">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.237826" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:25.237442" elapsed="0.000534"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:25.221302" elapsed="0.016731">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.238931" elapsed="0.000062"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:25.239241" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:25.239155" elapsed="0.000179"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:25.239116" 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-08-22T23:20:25.239738" elapsed="0.000049"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:25.239900" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:25.216072" elapsed="0.024058">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:25.240286" elapsed="0.000036"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:25.213196" elapsed="0.027301">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.241032" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:25.240709" elapsed="0.000448"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:25.240670" elapsed="0.000539"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.241707" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:25.241358" elapsed="0.000476"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:25.241323" elapsed="0.000562"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:25.212121" elapsed="0.029936">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:25.244876" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:25.243904" elapsed="0.001032"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-08-22T23:20:25.245422" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:25.245103" elapsed="0.000412"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.245063" elapsed="0.000501"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:20:25.245969" elapsed="0.000474"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:20:25.248009" level="FAIL">'4968' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:20:25.247640" elapsed="0.000432">'4968' does not contain '-'</status>
</kw>
<msg time="2026-08-22T23:20:25.248166" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:20:25.246966" elapsed="0.001225"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:20:25.248709" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:20:25.248356" elapsed="0.000379"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:25.249185" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:25.248895" elapsed="0.000316"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:20:25.249673" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:20:25.249364" elapsed="0.000335"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-08-22T23:20:25.250219" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968

HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-08-22T23:20:25.249852" elapsed="0.000415"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:25.250693" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:25.250420" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-08-22T23:20:25.251551" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=4968'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-08-22T23:20:25.251043" elapsed="0.000575"/>
</kw>
<status status="PASS" start="2026-08-22T23:20:25.250805" elapsed="0.000849"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.250787" elapsed="0.000892"/>
</if>
<arg>4968</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:20:25.243071" elapsed="0.008655"/>
</kw>
<doc>Get the device data and make sure it is empty again.</doc>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=4968</tag>
<status status="FAIL" start="2026-08-22T23:20:24.980642" elapsed="0.271131">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968

HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</test>
<test id="s1-s1-t21" name="Check_Device_Data_Deletion_Is_Visible_On_Checker" 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-08-22T23:20:25.255119" elapsed="0.000217"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:20:25.254828" 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-08-22T23:20:25.256393" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:25.256282" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.256263" 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-08-22T23:20:25.261480" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:25.261372" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.261354" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:20:25.262566" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:20:25.262169" elapsed="0.000444"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:20:25.263078" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:20:25.262773" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:20:25.263148" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:20:25.263302" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:20:25.261795" 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-08-22T23:20:25.268868" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:25.268759" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.268740" 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-08-22T23:20:25.270096" elapsed="0.000047"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:25.269989" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.269971" elapsed="0.000228"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:20:25.270715" 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-08-22T23:20:25.270344" elapsed="0.000398"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:20:25.271138" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:20:25.270898" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:20:25.304894" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:20:25.271680" elapsed="0.033319"/>
</kw>
<msg time="2026-08-22T23:20:25.305193" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:20:25.305240" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:25.271319" elapsed="0.033959"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:20:25.330185" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:20:25.305810" elapsed="0.024505"/>
</kw>
<msg time="2026-08-22T23:20:25.330483" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:20:25.330529" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:25.305448" elapsed="0.025117"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.330899" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:25.330679" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.330658" elapsed="0.000319"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:25.331418" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:25.331118" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.331791" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:25.331560" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.331542" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:20:25.331901" 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-08-22T23:20:25.334563" elapsed="0.000168"/>
</kw>
<msg time="2026-08-22T23:20:25.334797" 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-08-22T23:20:25.333376" elapsed="0.001564"/>
</kw>
<kw name="Open 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-08-22T23:20:25.335234" elapsed="0.000090"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.335633" 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-08-22T23:20:25.332706" elapsed="0.003136"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:20:25.332159" elapsed="0.003750"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:20:25.269688" elapsed="0.066317"/>
</kw>
<msg time="2026-08-22T23:20:25.336097" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:20:25.336141" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:25.269086" elapsed="0.067092"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:20:25.336359" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:20:25.336253" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.336235" 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-08-22T23:20:25.336860" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.337230" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:20:25.337303" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:20:25.268404" elapsed="0.069007"/>
</kw>
<msg time="2026-08-22T23:20:25.337503" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:20:25.337547" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:25.263721" elapsed="0.073910"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.337958" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:25.337710" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.337692" elapsed="0.000343"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:20:25.263564" elapsed="0.074494"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:20:25.343951" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:25.343837" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.343817" 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-08-22T23:20:25.345187" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:25.345081" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.345063" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:20:25.345743" 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-08-22T23:20:25.345395" elapsed="0.000374"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:20:25.346196" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:20:25.345927" elapsed="0.000297"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:20:25.392111" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:20:25.346768" elapsed="0.045462"/>
</kw>
<msg time="2026-08-22T23:20:25.392447" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:20:25.392506" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:25.346384" elapsed="0.046162"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:20:25.422461" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:20:25.393209" elapsed="0.029366"/>
</kw>
<msg time="2026-08-22T23:20:25.422770" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:20:25.422817" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:25.392781" elapsed="0.030073"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.423166" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:25.422938" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.422916" elapsed="0.000329"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:25.423715" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:25.423388" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.424065" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:25.423852" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.423835" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:20:25.424176" 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-08-22T23:20:25.426913" elapsed="0.000145"/>
</kw>
<msg time="2026-08-22T23:20:25.427175" 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-08-22T23:20:25.425735" elapsed="0.001591"/>
</kw>
<kw name="Open 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-08-22T23:20:25.427655" elapsed="0.000087"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.428027" elapsed="0.000087"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:20:25.425038" elapsed="0.003199"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:20:25.424469" elapsed="0.003835"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:20:25.344780" elapsed="0.083621"/>
</kw>
<msg time="2026-08-22T23:20:25.428493" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:20:25.428537" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:25.344178" elapsed="0.084396"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:20:25.428782" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:20:25.428675" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.428656" 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-08-22T23:20:25.429274" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.429782" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:20:25.429856" 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-08-22T23:20:25.343449" elapsed="0.086538"/>
</kw>
<msg time="2026-08-22T23:20:25.430081" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:20:25.430125" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:25.338330" elapsed="0.091832"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.430483" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:25.430237" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.430220" elapsed="0.000340"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:20:25.338180" elapsed="0.092420"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:20:25.436193" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:25.436084" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.436064" 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-08-22T23:20:25.437399" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:25.437291" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.437273" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:20:25.437955" 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-08-22T23:20:25.437630" elapsed="0.000352"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:20:25.438354" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:20:25.438134" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:20:25.472576" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:20:25.439035" elapsed="0.033658"/>
</kw>
<msg time="2026-08-22T23:20:25.472870" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:20:25.472917" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:25.438539" elapsed="0.034415"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:20:25.497682" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:20:25.473459" elapsed="0.024378"/>
</kw>
<msg time="2026-08-22T23:20:25.498012" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:20:25.498059" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:25.473123" elapsed="0.024975"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.498399" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:25.498177" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.498156" elapsed="0.000322"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:25.498959" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:25.498647" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.499312" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:25.499099" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.499081" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:20:25.499424" 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-08-22T23:20:25.502089" elapsed="0.000144"/>
</kw>
<msg time="2026-08-22T23:20:25.502295" 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-08-22T23:20:25.500938" 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-08-22T23:20:25.502757" elapsed="0.000088"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.503127" elapsed="0.000087"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:20:25.500240" elapsed="0.003091"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:20:25.499708" elapsed="0.003690"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:20:25.436992" elapsed="0.066503"/>
</kw>
<msg time="2026-08-22T23:20:25.503623" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:20:25.503669" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:25.436410" elapsed="0.067296"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:20:25.503888" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:20:25.503784" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.503766" elapsed="0.000204"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.504359" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.504715" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:20:25.504785" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:20:25.435737" elapsed="0.069156"/>
</kw>
<msg time="2026-08-22T23:20:25.504987" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:20:25.505032" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:25.430874" elapsed="0.074195"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.505389" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:25.505144" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-08-22T23:20:25.505127" elapsed="0.000340"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:20:25.430736" elapsed="0.074755"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:20:25.263385" elapsed="0.242136"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:20:25.260885" elapsed="0.244864"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:20:25.255991" elapsed="0.249861"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:20:25.255542" elapsed="0.250360"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:20:25.252608" elapsed="0.253352"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:25.507483" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:25.507096" elapsed="0.000417"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:25.516657" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:25.516387" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:25.517109" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:25.516859" 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-08-22T23:20:25.526895" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:25.527066" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:25.527186" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:25.519303" elapsed="0.008291">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:25.517221" elapsed="0.010459">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.527868" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:25.527713" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:25.517203" elapsed="0.010754">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.528330" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:25.528463" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:25.528426" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:25.528409" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.528685" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:25.528756" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:25.512028" elapsed="0.016832">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:25.528929" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:25.507744" elapsed="0.021278">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.529280" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:25.529137" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:25.529119" elapsed="0.000242"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:25.529591" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:25.529415" elapsed="0.000234"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:25.529399" elapsed="0.000274"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:25.506702" elapsed="0.023049">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:26.531432" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:26.530941" elapsed="0.000529"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:26.539405" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:26.539142" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:26.539870" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:26.539620" 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-08-22T23:20:26.548513" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:26.548702" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:26.548824" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:26.542077" elapsed="0.007144">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:26.539996" elapsed="0.009310">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:26.549495" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:26.549342" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:26.539971" elapsed="0.009631">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:26.549980" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:26.550119" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:26.550078" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:26.550061" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:26.550327" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:26.550410" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:26.534508" elapsed="0.016008">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:26.550660" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:26.531733" elapsed="0.019027">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:26.550984" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:26.550840" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:26.550823" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:26.551256" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:26.551117" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:26.551101" elapsed="0.000233"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:26.530310" elapsed="0.021102">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:27.555865" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:27.554260" elapsed="0.001716"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:27.568026" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:27.567454" elapsed="0.000693"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:27.569117" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:27.568512" 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-08-22T23:20:27.582509" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:27.582750" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:27.582911" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:27.574109" elapsed="0.009334">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:27.569375" elapsed="0.014188">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:27.583886" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:27.583658" elapsed="0.000323"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:27.569330" elapsed="0.014686">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:27.584605" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:27.584810" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:27.584752" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:27.584725" elapsed="0.000179"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:27.585125" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:27.585231" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:27.561398" elapsed="0.023983">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:27.585564" elapsed="0.000047"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:27.556713" elapsed="0.029017">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:27.586052" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:27.585844" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:27.585821" elapsed="0.000360"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:27.586461" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:27.586261" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:27.586238" elapsed="0.000337"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:27.552675" elapsed="0.034036">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:28.589735" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:28.588698" elapsed="0.001112"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:28.604405" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:28.604145" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:28.604875" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:28.604626" 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-08-22T23:20:28.613946" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:28.614108" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:28.614235" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:28.607189" elapsed="0.007463">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:28.604997" elapsed="0.009742">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:28.614949" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:28.614778" elapsed="0.000238"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:28.604974" elapsed="0.010067">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:28.615491" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:28.615653" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:28.615612" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:28.615590" elapsed="0.000131"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:28.615864" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:28.615997" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:28.595882" elapsed="0.020225">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:28.616178" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:28.590310" elapsed="0.025964">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:28.616500" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:28.616356" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:28.616339" elapsed="0.000262"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:28.616799" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:28.616658" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:28.616641" elapsed="0.000237"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:28.587558" elapsed="0.029399">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:29.620166" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:29.619086" elapsed="0.001152"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:29.635021" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:29.634743" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:29.635500" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:29.635226" 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-08-22T23:20:29.645294" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:29.645455" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:29.645570" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:29.637769" elapsed="0.008252">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:29.635645" elapsed="0.010464">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:29.646332" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:29.646146" elapsed="0.000258"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:29.635621" elapsed="0.010808">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:29.646849" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:29.647058" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:29.647016" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:29.646996" elapsed="0.000132"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:29.647277" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:29.647351" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:29.626507" elapsed="0.020975">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:29.647557" elapsed="0.000034"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:29.620775" elapsed="0.026905">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:29.647922" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:29.647762" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:29.647744" elapsed="0.000263"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:29.648205" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:29.648062" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:29.648046" elapsed="0.000240"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:29.617866" elapsed="0.030500">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:30.651323" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:30.650349" elapsed="0.001042"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:30.663157" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:30.662791" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:30.663821" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:30.663442" elapsed="0.000442"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:20:30.672391" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:30.672543" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:30.672676" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:30.666865" elapsed="0.006187">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:30.663988" elapsed="0.009147">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:30.673324" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:30.673170" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:30.663958" elapsed="0.009457">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:30.673865" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:30.674008" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:30.673967" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:30.673949" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:30.674220" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:30.674292" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:30.656392" elapsed="0.018006">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:30.674470" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:30.651920" elapsed="0.022644">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:30.674807" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:30.674662" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:30.674645" elapsed="0.000243"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:30.675086" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:30.674943" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:30.674928" elapsed="0.000238"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:30.649208" elapsed="0.026036">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:31.678446" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:31.677405" elapsed="0.001115"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:31.690256" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:31.689972" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:31.690739" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:31.690470" 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-08-22T23:20:31.699388" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:31.699622" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:31.699779" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:31.692985" elapsed="0.007244">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:31.690873" elapsed="0.009456">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:31.700613" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:31.700373" elapsed="0.000404"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:31.690842" elapsed="0.009963">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:31.701274" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:31.701431" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:31.701384" elapsed="0.000102"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:31.701363" 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-08-22T23:20:31.701693" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:31.701770" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:31.684668" elapsed="0.017240">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:31.701985" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:31.679054" elapsed="0.023029">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:31.702317" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:31.702165" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:31.702148" elapsed="0.000249"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:31.702610" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:31.702451" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:31.702436" elapsed="0.000256"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:31.676190" elapsed="0.026587">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:32.705934" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:32.704925" elapsed="0.001082"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:32.717157" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:32.716787" elapsed="0.000441"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:32.717825" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:32.717447" elapsed="0.000442"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:20:32.727569" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:32.727755" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:32.727872" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:32.720743" elapsed="0.007522">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:32.717997" elapsed="0.010415">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:32.728621" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:32.728449" elapsed="0.000239"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:32.717965" elapsed="0.010747">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:32.729088" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:32.729224" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:32.729184" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:32.729167" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:32.729435" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:32.729505" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:32.710419" elapsed="0.019206">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:32.729696" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:32.706507" elapsed="0.023282">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:32.730008" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:32.729866" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:32.729850" elapsed="0.000235"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:32.730277" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:32.730138" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:32.730122" elapsed="0.000232"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:32.703723" elapsed="0.026706">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:33.733304" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:33.732270" elapsed="0.001105"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:33.744775" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:33.744391" elapsed="0.000452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:33.745405" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:33.745060" 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-08-22T23:20:33.754294" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:33.754446" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:33.754598" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:33.748062" elapsed="0.006971">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:33.745619" elapsed="0.009496">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:33.755307" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:33.755151" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:33.745570" elapsed="0.009830">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:33.755793" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:33.755934" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:33.755893" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:33.755876" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:33.756144" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:33.756216" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:33.738021" elapsed="0.018298">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:33.756390" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:33.733905" elapsed="0.022578">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:33.756722" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:33.756563" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:33.756547" elapsed="0.000265"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:33.757008" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:33.756867" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:33.756852" elapsed="0.000237"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:33.731171" elapsed="0.025996">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:34.760137" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:34.759149" elapsed="0.001059"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:34.771690" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:34.771302" elapsed="0.000457"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:34.772322" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:34.771977" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:20:34.781996" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:34.782152" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:34.782329" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:34.775241" elapsed="0.007493">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:34.772491" elapsed="0.010365">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:34.783123" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:34.782907" elapsed="0.000311"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:34.772461" elapsed="0.010791">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:34.783810" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:34.784004" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:34.783948" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:34.783923" 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-08-22T23:20:34.784298" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:34.784401" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:34.764958" elapsed="0.019589">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:34.784666" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:34.760735" elapsed="0.024065">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:34.785112" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:34.784912" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:34.784888" elapsed="0.000338"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:34.785496" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:34.785302" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:34.785280" elapsed="0.000349"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:34.758060" elapsed="0.027678">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:35.788340" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:35.787397" elapsed="0.001009"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:35.799259" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:35.798901" elapsed="0.000430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:35.799910" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:35.799544" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:20:35.809170" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:35.809361" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:35.809525" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:35.802713" elapsed="0.007296">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:35.800073" elapsed="0.010048">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:35.810390" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:35.810169" elapsed="0.000313"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:35.800046" elapsed="0.010470">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:35.811055" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:35.811246" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:35.811192" elapsed="0.000113"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:35.811168" elapsed="0.000167"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:35.811535" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:35.811654" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:35.792697" elapsed="0.019105">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:35.811900" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:35.788918" elapsed="0.023114">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:35.812343" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:35.812143" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:35.812120" elapsed="0.000333"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:35.812748" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:35.812529" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:35.812507" elapsed="0.000351"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:35.786412" elapsed="0.026553">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:36.816109" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:36.815079" elapsed="0.001104"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:36.829119" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:36.828840" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:36.829570" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:36.829323" 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-08-22T23:20:36.838842" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:36.839002" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:36.839178" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:36.831790" elapsed="0.007778">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:36.829712" elapsed="0.009957">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:36.839872" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:36.839706" elapsed="0.000233"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:36.829689" elapsed="0.010274">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:36.840339" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:36.840478" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:36.840437" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:36.840419" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:36.840703" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:36.840775" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:36.822298" elapsed="0.018601">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:36.840970" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:36.816773" elapsed="0.024289">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:36.841283" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:36.841140" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:36.841124" elapsed="0.000237"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:36.841554" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:36.841415" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:36.841399" elapsed="0.000250"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:36.813903" elapsed="0.027823">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:37.844718" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:37.843696" elapsed="0.001096"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:37.860539" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:37.860272" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:37.861022" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:37.860776" 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-08-22T23:20:37.869916" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:37.870075" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:37.870262" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:37.863215" elapsed="0.007462">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:37.861143" elapsed="0.009618">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:37.870952" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:37.870797" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:37.861120" elapsed="0.009922">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:37.871417" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:37.871559" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:37.871518" elapsed="0.000102"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:37.871500" elapsed="0.000142"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:37.871787" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:37.871859" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:37.850769" elapsed="0.021195">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:37.872034" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:37.845290" elapsed="0.026838">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:37.872351" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:37.872207" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:37.872191" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:37.872656" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:37.872485" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:37.872469" elapsed="0.000269"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:37.842613" elapsed="0.030202">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:38.875849" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:38.874843" elapsed="0.001078"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:38.886208" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:38.885948" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:38.886668" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:38.886409" 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-08-22T23:20:38.895747" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:38.895956" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:38.896185" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:38.889115" elapsed="0.007651">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:38.886792" elapsed="0.010089">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:38.897151" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:38.896932" elapsed="0.000311"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:38.886767" elapsed="0.010510">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:38.897814" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:38.898006" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:38.897950" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:38.897927" elapsed="0.000172"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:38.898297" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:38.898396" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:38.880142" elapsed="0.018401">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:38.898660" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:38.876472" elapsed="0.022320">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:38.899102" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:38.898902" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:38.898879" elapsed="0.000335"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:38.899485" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:38.899289" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:38.899267" elapsed="0.000350"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:38.873707" elapsed="0.026019">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:39.902701" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:39.901721" elapsed="0.001051"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:39.914034" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:39.913671" elapsed="0.000430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:39.914675" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:39.914313" 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-08-22T23:20:39.925662" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:39.925881" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:39.926131" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:39.917735" elapsed="0.008972">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:39.914848" elapsed="0.011982">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:39.927122" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:39.926883" elapsed="0.000337"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:39.914815" elapsed="0.012441">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:39.927857" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:39.928061" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:39.928003" elapsed="0.000123"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:39.927976" elapsed="0.000182"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:39.928391" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:39.928496" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:39.907494" elapsed="0.021178">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:39.928774" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:39.903262" elapsed="0.025654">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:39.929225" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:39.929025" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:39.929003" elapsed="0.000332"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:39.929627" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:39.929409" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:39.929388" elapsed="0.000351"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:39.900628" elapsed="0.029218">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:40.932971" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:40.931927" elapsed="0.001117"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:40.946428" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:40.946067" elapsed="0.000429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:40.947074" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:40.946728" 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-08-22T23:20:40.957987" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:40.958152" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:40.958339" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:40.950462" elapsed="0.008293">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:40.947246" elapsed="0.011595">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:40.959039" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:40.958877" elapsed="0.000229"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:40.947214" elapsed="0.011915">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:40.959503" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:40.959658" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:40.959616" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:40.959598" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:40.959869" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:40.959941" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:40.939471" elapsed="0.020575">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:40.960115" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:40.933546" elapsed="0.026663">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:40.960463" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:40.960316" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:40.960272" elapsed="0.000272"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:40.960755" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:40.960614" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:40.960597" elapsed="0.000237"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:40.930783" elapsed="0.030140">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:41.964292" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:41.963158" elapsed="0.001269"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:41.975630" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:41.975300" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:41.976107" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:41.975853" 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-08-22T23:20:41.986251" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:41.986435" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:41.986670" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:41.978969" elapsed="0.008111">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:41.976238" elapsed="0.010928">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:41.987380" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:41.987204" elapsed="0.000247"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:41.976212" elapsed="0.011263">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:41.987907" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:41.988078" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:41.988034" elapsed="0.000091"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:41.988011" elapsed="0.000135"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:41.988292" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:41.988405" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:41.968771" elapsed="0.019744">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:41.988598" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:41.964983" elapsed="0.023710">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:41.988915" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:41.988771" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:41.988755" elapsed="0.000239"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:41.989183" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:41.989047" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:41.989031" elapsed="0.000229"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:41.961925" elapsed="0.027410">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:42.991319" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:42.990748" elapsed="0.000614"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:43.001080" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:43.000709" elapsed="0.000442"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:43.001741" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:43.001373" 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-08-22T23:20:43.012224" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:43.012403" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:43.012641" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:43.004761" elapsed="0.008308">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:43.001910" elapsed="0.011249">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:43.013359" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:43.013196" elapsed="0.000231"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:43.001878" elapsed="0.011573">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:43.013886" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:43.014039" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:43.013996" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:43.013978" elapsed="0.000130"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:43.014252" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:43.014324" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:42.994847" elapsed="0.019587">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:43.014505" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:42.991671" elapsed="0.022947">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:43.014848" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:43.014703" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:43.014685" elapsed="0.000248"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:43.015173" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:43.014999" elapsed="0.000241"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:43.014979" elapsed="0.000286"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:42.990010" elapsed="0.025334">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:44.018523" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:44.017441" elapsed="0.001191"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:44.031900" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:44.031493" elapsed="0.000478"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:44.032561" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:44.032198" elapsed="0.000528"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:20:44.042416" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:44.042606" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:44.042833" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:44.035227" elapsed="0.008094">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:44.032854" elapsed="0.010587">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:44.043761" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:44.043494" elapsed="0.000369"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:44.032819" elapsed="0.011079">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:44.044442" elapsed="0.000048"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:44.044731" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:44.044671" elapsed="0.000125"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:44.044612" 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-08-22T23:20:44.045031" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:44.045133" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:44.025296" elapsed="0.019985">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:44.045377" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:44.019180" elapsed="0.026327">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:44.045840" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:44.045639" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:44.045614" elapsed="0.000360"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:44.046265" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:44.046052" elapsed="0.000312"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:44.046030" elapsed="0.000377"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:44.016233" elapsed="0.030288">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:45.049872" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:45.048700" elapsed="0.001247"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:45.064141" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:45.063876" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:45.064607" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:45.064341" 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-08-22T23:20:45.073969" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:45.074176" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:45.074414" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:45.067043" elapsed="0.007907">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:45.064736" elapsed="0.010334">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:45.075337" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:45.075120" elapsed="0.000309"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:45.064711" elapsed="0.010752">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:45.076012" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:45.076205" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:45.076151" elapsed="0.000115"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:45.076126" elapsed="0.000170"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:45.076495" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:45.076612" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:45.056059" elapsed="0.020701">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:45.076930" elapsed="0.000033"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:45.050456" elapsed="0.026641">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:45.077418" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:45.077213" elapsed="0.000285"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:45.077189" elapsed="0.000342"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:45.077829" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:45.077634" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:45.077609" elapsed="0.000332"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:45.047457" elapsed="0.030595">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:46.081078" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:46.080061" elapsed="0.001142"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:46.092281" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:46.092012" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:46.092760" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:46.092486" 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-08-22T23:20:46.101834" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:46.102003" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:46.102202" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:46.095234" elapsed="0.007381">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:46.092887" elapsed="0.009813">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:46.102894" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:46.102736" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:46.092863" elapsed="0.010122">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:46.103375" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:46.103517" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:46.103476" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:46.103458" elapsed="0.000140"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:46.103746" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:46.103817" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:46.087620" elapsed="0.016304">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:46.103994" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:46.081791" elapsed="0.022297">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:46.104311" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:46.104167" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:46.104150" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:46.104600" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:46.104445" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:46.104430" elapsed="0.000251"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:46.078956" elapsed="0.025803">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:47.107794" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:47.106793" elapsed="0.001072"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:47.118681" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:47.118405" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:47.119133" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:47.118884" 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-08-22T23:20:47.128405" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:47.128563" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:47.128771" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:47.121535" elapsed="0.007622">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:47.119263" elapsed="0.009978">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:47.129466" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:47.129279" elapsed="0.000257"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:47.119238" elapsed="0.010322">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:47.129958" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:47.130104" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:47.130059" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:47.130041" elapsed="0.000129"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:47.130313" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:47.130385" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:47.114004" elapsed="0.016488">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:47.130563" elapsed="0.000029"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:47.108358" elapsed="0.022316">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:47.130895" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:47.130753" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:47.130737" elapsed="0.000238"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:47.131173" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:47.131029" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:47.131013" elapsed="0.000239"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:47.105655" elapsed="0.025674">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:48.134209" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:48.133173" elapsed="0.001107"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:48.145980" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:48.145718" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:48.146426" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:48.146179" 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-08-22T23:20:48.155397" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:48.155556" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:48.155758" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:48.148813" elapsed="0.007336">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:48.146550" elapsed="0.009683">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:48.156425" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:48.156269" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:48.146527" elapsed="0.009989">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:48.156908" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:48.157048" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:48.157008" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:48.156990" elapsed="0.000130"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:48.157262" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:48.157334" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:48.140323" elapsed="0.017116">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:48.157509" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:48.134804" elapsed="0.022814">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:48.157863" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:48.157700" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:48.157683" elapsed="0.000261"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:48.158143" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:48.157999" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:48.157983" elapsed="0.000238"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:48.132110" elapsed="0.026189">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:49.161252" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:49.160258" elapsed="0.001065"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:49.171855" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:49.171592" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:49.172305" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:49.172056" 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-08-22T23:20:49.181933" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:49.182117" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:49.182303" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:49.174771" elapsed="0.007940">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:49.172431" elapsed="0.010363">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:49.182988" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:49.182831" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:49.172407" elapsed="0.010670">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:49.183453" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:49.183608" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:49.183552" elapsed="0.000102"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:49.183534" elapsed="0.000142"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:49.183820" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:49.183891" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:49.167289" elapsed="0.016706">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:49.184065" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:49.161848" elapsed="0.022315">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:49.184383" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:49.184241" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:49.184225" elapsed="0.000237"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:49.184670" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:49.184516" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:49.184500" elapsed="0.000249"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:49.159139" elapsed="0.025687">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:50.187869" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:50.186877" elapsed="0.001064"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:50.201499" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:50.201230" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:50.201975" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:50.201727" 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-08-22T23:20:50.210529" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:50.210707" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:50.210899" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:50.204170" elapsed="0.007134">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:50.202099" elapsed="0.009288">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:50.211597" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:50.211423" elapsed="0.000242"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:50.202075" elapsed="0.009614">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:50.212074" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:50.212214" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:50.212173" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:50.212156" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:50.212423" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:50.212493" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:50.194240" elapsed="0.018372">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:50.212682" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:50.188434" elapsed="0.024342">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:50.212998" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:50.212854" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:50.212838" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:50.213272" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:50.213132" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:50.213116" elapsed="0.000235"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:50.185743" elapsed="0.027684">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:51.216699" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:51.215676" elapsed="0.001097"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:51.229497" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:51.229133" elapsed="0.000432"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:51.230148" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:51.229801" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:20:51.241309" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:51.241548" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:51.241878" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:51.233007" elapsed="0.009411">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:51.230327" elapsed="0.012218">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:51.242971" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:51.242622" elapsed="0.000453"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:51.230293" elapsed="0.012817">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:51.243727" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:51.243929" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:51.243872" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:51.243846" elapsed="0.000176"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:51.244223" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:51.244322" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:51.222959" elapsed="0.021514">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:51.244568" elapsed="0.000042"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:51.217279" elapsed="0.027445">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:51.245039" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:51.244835" elapsed="0.000284"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:51.244812" elapsed="0.000340"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:51.245429" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:51.245232" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:51.245211" elapsed="0.000328"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:51.214307" elapsed="0.031363">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:52.248871" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:52.247795" elapsed="0.001152"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:52.260486" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:52.260223" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:52.260952" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:52.260704" 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-08-22T23:20:52.270457" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:52.270650" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:52.270842" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:52.263429" elapsed="0.007877">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:52.261082" elapsed="0.010318">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:52.271617" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:52.271438" elapsed="0.000247"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:52.261054" elapsed="0.010655">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:52.272092" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:52.272290" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:52.272223" elapsed="0.000142"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:52.272193" 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-08-22T23:20:52.272620" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:52.272727" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:52.255332" elapsed="0.017540">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:52.272968" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:52.249484" elapsed="0.023613">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:52.273404" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:52.273206" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:52.273183" elapsed="0.000333"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:52.273806" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:52.273609" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:52.273568" elapsed="0.000346"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:52.246517" elapsed="0.027505">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:53.277454" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:53.276380" elapsed="0.001149"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:53.288861" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:53.288575" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:53.289319" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:53.289066" 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-08-22T23:20:53.299941" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:53.300244" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:53.300571" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:53.291900" elapsed="0.009482">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:53.289514" elapsed="0.012045">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:53.302022" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:53.301672" elapsed="0.000497"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:53.289486" elapsed="0.012736">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:53.303077" elapsed="0.000058"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:53.303379" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:53.303292" elapsed="0.000244"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:53.303254" elapsed="0.000381"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:53.303978" elapsed="0.000049"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:53.304134" elapsed="0.000032"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:53.283959" elapsed="0.020347">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:53.304407" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:53.278102" elapsed="0.026441">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:53.304895" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:53.304683" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:53.304658" elapsed="0.000355"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:53.305300" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:53.305092" elapsed="0.000289"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:53.305069" elapsed="0.000347"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:53.275162" elapsed="0.030368">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:54.308892" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:54.307784" elapsed="0.001185"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:54.325045" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:54.324696" elapsed="0.000459"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:54.325586" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:54.325324" 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-08-22T23:20:54.335125" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:54.335310" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:54.335538" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:54.328163" elapsed="0.007828">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:54.325745" elapsed="0.010343">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:54.336332" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:54.336130" elapsed="0.000272"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:54.325717" elapsed="0.010710">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:54.336907" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:54.337063" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:54.337019" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:54.336998" elapsed="0.000132"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:54.337278" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:54.337349" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:54.316114" elapsed="0.021347">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:54.337532" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:54.309509" elapsed="0.028153">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:54.337901" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:54.337750" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:54.337731" elapsed="0.000252"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:54.338255" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:54.338037" elapsed="0.000284"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:54.338021" elapsed="0.000325"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:54.306558" elapsed="0.031869">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:55.341691" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:55.340627" elapsed="0.001143"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:55.352314" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:55.352040" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:55.352806" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:55.352524" 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-08-22T23:20:55.361852" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:55.362013" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:55.362195" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:55.355339" elapsed="0.007249">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:55.352935" elapsed="0.009750">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:55.362922" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:55.362721" elapsed="0.000269"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:55.352911" elapsed="0.010103">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:55.363395" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:55.363532" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:55.363492" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:55.363475" elapsed="0.000141"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:55.363762" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:55.363833" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:55.347674" elapsed="0.016265">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:55.364008" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:55.342304" elapsed="0.021799">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:55.364331" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:55.364182" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:55.364166" elapsed="0.000244"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:55.364624" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:55.364468" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:55.364452" elapsed="0.000253"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:55.339407" elapsed="0.025374">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:56.367866" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:56.366888" elapsed="0.001049"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:56.378917" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:56.378654" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:56.379366" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:56.379118" 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-08-22T23:20:56.388224" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:56.388394" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:56.388604" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:56.381773" elapsed="0.007233">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:56.379492" elapsed="0.009597">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:56.389287" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:56.389125" elapsed="0.000229"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:56.379468" elapsed="0.009910">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:56.389774" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:56.389950" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:56.389872" elapsed="0.000126"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:56.389854" elapsed="0.000166"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:56.390164" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:56.390234" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:56.374064" elapsed="0.016320">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:56.390480" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:56.368433" elapsed="0.022201">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:56.390948" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:56.390747" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:56.390724" elapsed="0.000334"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:56.391330" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:56.391135" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:56.391113" elapsed="0.000326"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:56.365790" elapsed="0.025756">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:57.394494" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:57.393505" elapsed="0.001059"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:57.407307" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:57.407049" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:57.407787" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:57.407505" 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-08-22T23:20:57.416450" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:57.416625" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:57.416798" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:57.410152" elapsed="0.007027">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:57.407911" elapsed="0.009350">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:57.417451" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:57.417296" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:57.407886" elapsed="0.009655">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:57.417940" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:57.418079" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:57.418039" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:57.418021" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:57.418287" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:57.418358" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:57.400688" elapsed="0.017775">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:57.418532" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:57.395088" elapsed="0.023554">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:57.418866" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:57.418722" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:57.418706" elapsed="0.000239"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:57.419138" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:57.418998" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:57.418983" elapsed="0.000232"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:57.392424" elapsed="0.026867">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:58.422206" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:58.421227" elapsed="0.001048"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:58.433616" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:58.433231" elapsed="0.000442"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:58.434079" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:58.433831" 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-08-22T23:20:58.443559" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:58.443755" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:58.443951" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:58.436531" elapsed="0.007824">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:58.434205" elapsed="0.010283">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:58.444731" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:58.444530" elapsed="0.000270"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:58.434181" elapsed="0.010644">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:58.445250" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:58.445442" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:58.445380" elapsed="0.000130"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:58.445353" elapsed="0.000190"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:58.445779" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:58.445885" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:58.428425" elapsed="0.017619">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:58.446147" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:58.422802" elapsed="0.023482">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:58.446633" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:58.446400" elapsed="0.000318"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:58.446376" elapsed="0.000376"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:58.447035" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:58.446830" elapsed="0.000287"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:58.446808" elapsed="0.000343"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:58.420095" elapsed="0.027170">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:20:59.450483" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:20:59.449405" elapsed="0.001151"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:59.462997" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:59.462633" elapsed="0.000432"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:20:59.463646" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:20:59.463279" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:20:59.472609" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:20:59.472775" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:20:59.472951" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:20:59.466240" elapsed="0.007102">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:20:59.463815" elapsed="0.009611">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:59.473638" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:59.473462" elapsed="0.000245"/>
</branch>
<status status="FAIL" start="2026-08-22T23:20:59.463786" elapsed="0.009946">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:59.474112" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:59.474254" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:20:59.474213" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:59.474195" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:59.474465" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:20:59.474537" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:20:59.456622" elapsed="0.018037">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:20:59.474731" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:20:59.451145" elapsed="0.023682">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:59.475051" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:59.474906" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:59.474890" elapsed="0.000242"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:20:59.475325" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:20:59.475186" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:20:59.475170" elapsed="0.000235"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:20:59.448208" elapsed="0.027274">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:00.478471" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:00.477392" elapsed="0.001152"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:00.490810" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:00.490340" elapsed="0.000548"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:00.491440" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:00.491110" 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-08-22T23:21:00.499799" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:00.500012" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:21:00.500239" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:00.493839" elapsed="0.006949">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:00.491566" elapsed="0.009339">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:00.501181" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:00.500955" elapsed="0.000321"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:00.491543" elapsed="0.009767">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:00.501902" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:00.502099" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:00.502042" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:00.502018" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:00.502388" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:00.502487" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:21:00.484227" elapsed="0.018434">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:00.502781" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:00.479111" elapsed="0.023804">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:00.503225" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:00.503025" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:00.503002" elapsed="0.000334"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:00.503626" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:00.503410" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:00.503389" elapsed="0.000349"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:21:00.476263" elapsed="0.027583">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:01.506791" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:01.505819" elapsed="0.001041"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:01.517838" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:01.517563" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:01.518284" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:01.518039" 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-08-22T23:21:01.527507" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:01.527739" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:21:01.527951" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:01.520678" elapsed="0.007783">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:01.518409" elapsed="0.010165">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:01.529005" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:01.528710" elapsed="0.000443"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:01.518386" elapsed="0.010818">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:01.529790" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:01.529984" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:01.529930" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:01.529904" elapsed="0.000172"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:01.530274" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:01.530373" elapsed="0.000024"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:21:01.511569" elapsed="0.018956">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:01.530643" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:01.507354" elapsed="0.023419">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:01.531082" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:01.530883" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:01.530860" elapsed="0.000334"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:01.531463" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:01.531269" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:01.531247" elapsed="0.000328"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:21:01.504747" elapsed="0.026959">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:02.534720" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:02.533671" elapsed="0.001120"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:02.548827" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:02.548505" elapsed="0.000376"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:02.549295" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:02.549039" 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-08-22T23:21:02.558255" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:02.558451" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:21:02.558736" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:02.551545" elapsed="0.007733">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:02.549420" elapsed="0.009978">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:02.559708" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:02.559450" elapsed="0.000361"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:02.549397" elapsed="0.010451">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:02.560406" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:02.560640" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:02.560554" elapsed="0.000171"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:02.560528" 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-08-22T23:21:02.560977" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:02.561087" elapsed="0.000024"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:21:02.541039" elapsed="0.020209">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:02.561356" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:02.535289" elapsed="0.026209">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:02.561860" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:02.561643" elapsed="0.000341"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:02.561617" elapsed="0.000405"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:02.562319" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:02.562105" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:02.562082" elapsed="0.000358"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:21:02.532544" elapsed="0.030012">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:03.565533" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:03.564560" elapsed="0.001076"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:03.578059" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:03.577697" elapsed="0.000430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:03.578801" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:03.578339" 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-08-22T23:21:03.586942" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:03.587096" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:21:03.587274" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:03.581357" elapsed="0.006328">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:03.578969" elapsed="0.008801">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:03.587966" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:03.587807" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:03.578939" elapsed="0.009119">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:03.588438" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:03.588595" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:03.588539" elapsed="0.000105"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:03.588521" elapsed="0.000145"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:03.588811" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:03.588883" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:21:03.571640" elapsed="0.017348">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:03.589059" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:03.566126" elapsed="0.023027">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:03.589376" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:03.589232" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:03.589216" elapsed="0.000244"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:03.589674" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:03.589517" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:03.589501" elapsed="0.000254"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:21:03.563463" elapsed="0.026369">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:04.592973" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:04.591958" elapsed="0.001087"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:04.603075" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:04.602798" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:04.603539" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:04.603285" 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-08-22T23:21:04.612176" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:04.612342" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:21:04.612535" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:04.606011" elapsed="0.006946">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:04.603701" elapsed="0.009345">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:04.613265" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:04.613084" elapsed="0.000249"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:04.603675" elapsed="0.009682">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:04.613803" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:04.613946" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:04.613905" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:04.613887" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:04.614157" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:04.614227" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:21:04.597849" elapsed="0.016487">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:04.614407" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:04.593548" elapsed="0.020954">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:04.614779" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:04.614627" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:04.614563" elapsed="0.000297"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:04.615056" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:04.614915" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:04.614899" elapsed="0.000235"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:21:04.590777" elapsed="0.024435">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:05.618356" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:05.617271" elapsed="0.001168"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:05.630364" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:05.630083" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:05.630841" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:05.630573" 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-08-22T23:21:05.638329" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:05.638499" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:21:05.638720" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:05.633316" elapsed="0.005817">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:05.630982" elapsed="0.008235">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:05.639417" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:05.639254" elapsed="0.000232"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:05.630957" elapsed="0.008554">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:05.639949" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:05.640098" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:05.640055" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:05.640037" elapsed="0.000130"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:05.640313" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:05.640388" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:21:05.624666" elapsed="0.015831">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:05.640603" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:05.618965" elapsed="0.021744">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:05.640952" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:05.640805" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:05.640787" elapsed="0.000247"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:05.641233" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:05.641089" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:05.641073" elapsed="0.000241"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:21:05.616128" elapsed="0.025265">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:06.644380" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:06.643383" elapsed="0.001070"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:06.655229" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:06.654970" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:06.655702" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:06.655433" 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-08-22T23:21:06.664875" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:06.665046" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:21:06.665239" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:06.658139" elapsed="0.007571">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:06.655826" elapsed="0.009985">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:06.666026" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:06.665851" elapsed="0.000244"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:06.655803" elapsed="0.010317">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:06.666534" elapsed="0.000066"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:06.666766" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:06.666709" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:06.666682" elapsed="0.000177"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:06.667062" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:06.667162" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:21:06.650579" elapsed="0.016732">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:06.667412" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:06.644988" elapsed="0.022555">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:06.667878" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:06.667677" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:06.667653" elapsed="0.000338"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:06.668259" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:06.668065" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:06.668043" elapsed="0.000327"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:21:06.642257" elapsed="0.026222">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:07.671503" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:07.670523" elapsed="0.001051"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:07.681840" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:07.681560" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:07.682292" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:07.682045" 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-08-22T23:21:07.690857" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:07.691032" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:21:07.691241" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:07.684744" elapsed="0.006954">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:07.682416" elapsed="0.009404">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:07.692124" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:07.691873" elapsed="0.000346"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:07.682392" elapsed="0.009860">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:07.692854" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:07.693053" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:07.692996" elapsed="0.000124"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:07.692970" elapsed="0.000180"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:07.693352" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:07.693450" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:21:07.675807" elapsed="0.017813">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:07.693718" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:07.672107" elapsed="0.021746">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:07.694164" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:07.693963" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:07.693939" elapsed="0.000335"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:07.694543" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:07.694349" elapsed="0.000291"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:07.694327" elapsed="0.000348"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:21:07.669385" elapsed="0.025396">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:08.698114" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:08.696984" elapsed="0.001207"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:08.708756" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:08.708475" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:08.709205" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:08.708957" 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-08-22T23:21:08.718012" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:08.718173" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:21:08.718365" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:08.711657" elapsed="0.007197">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:08.709336" elapsed="0.009656">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:08.719263" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:08.719045" elapsed="0.000311"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:08.709310" elapsed="0.010080">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:08.719939" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:08.720132" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:08.720077" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:08.720052" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:08.720423" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:08.720521" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:21:08.702659" elapsed="0.018059">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:08.720834" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:08.698742" elapsed="0.022223">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:08.721271" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:08.721074" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:08.721051" elapsed="0.000330"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:08.721665" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:08.721453" elapsed="0.000290"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:08.721432" elapsed="0.000344"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:21:08.695797" elapsed="0.026084">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:09.725079" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:09.723957" elapsed="0.001210"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:09.735467" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:09.735203" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:09.735937" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:09.735687" 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-08-22T23:21:09.745657" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:09.745823" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:21:09.746014" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:09.738371" elapsed="0.008036">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:09.736066" elapsed="0.010424">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:09.746704" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:09.746526" elapsed="0.000245"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:09.736041" elapsed="0.010754">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:09.747173" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:09.747313" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:09.747273" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:09.747255" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:09.747521" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:09.747612" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:21:09.729490" elapsed="0.018227">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:09.747786" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:09.725722" elapsed="0.022157">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:09.748100" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:09.747957" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:09.747940" elapsed="0.000238"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:09.748368" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:09.748231" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:09.748215" elapsed="0.000231"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:21:09.722836" elapsed="0.025686">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:10.751612" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:10.750521" elapsed="0.001170"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:10.763716" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:10.763432" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:10.764166" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:10.763920" 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-08-22T23:21:10.773698" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:10.773896" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:21:10.774157" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:10.766558" elapsed="0.008034">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:10.764290" elapsed="0.010402">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:10.774948" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:10.774737" elapsed="0.000280"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:10.764265" elapsed="0.010777">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:10.775606" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:10.775800" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:10.775737" elapsed="0.000129"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:10.775706" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:10.776123" elapsed="0.000042"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:10.776261" elapsed="0.000030"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:21:10.758210" elapsed="0.018265">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:10.776640" elapsed="0.000034"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:10.752228" elapsed="0.024602">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:10.777301" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:10.776989" elapsed="0.000436"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:10.776955" elapsed="0.000521"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:10.777918" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:10.777615" elapsed="0.000425"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:10.777556" elapsed="0.000532"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:21:10.749363" elapsed="0.028883">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:11.781200" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:11.780217" elapsed="0.001080"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:11.793209" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:11.792952" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:11.793685" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:11.793423" 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-08-22T23:21:11.802913" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:11.803069" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:21:11.803246" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:11.796056" elapsed="0.007589">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:11.793808" elapsed="0.009920">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:11.803922" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:11.803765" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:11.793785" elapsed="0.010229">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:11.804387" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:11.804526" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:11.804486" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:11.804468" elapsed="0.000141"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:11.804758" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:11.804830" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:21:11.787333" elapsed="0.017601">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:11.805004" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:11.781831" elapsed="0.023268">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:11.805352" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:11.805178" elapsed="0.000233"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:11.805162" elapsed="0.000273"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:11.805652" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:11.805489" elapsed="0.000248"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:11.805473" elapsed="0.000297"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:21:11.779155" elapsed="0.026723">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:12.808965" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:12.807907" elapsed="0.001133"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:12.820344" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:12.819985" elapsed="0.000426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:12.820996" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:12.820648" 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-08-22T23:21:12.830888" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:12.831093" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:21:12.831282" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:12.824222" elapsed="0.007505">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:12.821166" elapsed="0.010707">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:12.832145" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:12.831928" elapsed="0.000310"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:12.821133" elapsed="0.011139">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:12.832820" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:12.833015" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:12.832959" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:12.832934" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:12.833308" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:12.833408" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:21:12.813957" elapsed="0.019596">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:12.833673" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:12.809573" elapsed="0.024234">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:12.834116" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:12.833918" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:12.833895" elapsed="0.000333"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:12.834496" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:12.834304" elapsed="0.000288"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:12.834282" elapsed="0.000346"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:21:12.806749" elapsed="0.027986">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:13.837843" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:13.836817" elapsed="0.001099"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:13.851725" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:13.851445" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:13.852170" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:13.851925" 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-08-22T23:21:13.859496" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:13.859666" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:21:13.859852" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:13.854548" elapsed="0.005685">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:13.852290" elapsed="0.008026">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:13.860505" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:13.860350" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:13.852268" elapsed="0.008359">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:13.861002" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:13.861139" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:13.861099" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:13.861082" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:13.861346" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:13.861416" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:21:13.843939" elapsed="0.017579">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:13.861601" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:13.838423" elapsed="0.023274">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:13.861922" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:13.861779" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:13.861762" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:13.862194" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:13.862056" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:13.862040" elapsed="0.000233"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:21:13.835571" elapsed="0.026780">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:14.865335" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:14.864354" elapsed="0.001051"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:14.877532" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:14.877270" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:14.878004" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:14.877754" 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-08-22T23:21:14.886634" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:14.886791" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:21:14.886974" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:14.880246" elapsed="0.007120">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:14.878155" elapsed="0.009292">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:14.887654" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:14.887482" elapsed="0.000239"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:14.878132" elapsed="0.009614">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:14.888121" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:14.888258" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:14.888217" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:14.888200" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:14.888464" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:14.888534" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:21:14.869665" elapsed="0.018987">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:14.888721" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:14.865931" elapsed="0.022881">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:14.889030" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:14.888889" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:14.888872" elapsed="0.000236"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:14.889298" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:14.889160" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:14.889145" elapsed="0.000230"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:21:14.863246" elapsed="0.026204">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:15.892026" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:15.891050" elapsed="0.001039"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:15.905773" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:15.905505" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:15.906215" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:15.905972" 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-08-22T23:21:15.914791" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:15.914968" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:21:15.915162" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:15.908524" elapsed="0.007149">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:15.906326" elapsed="0.009458">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:15.916046" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:15.915830" elapsed="0.000307"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:15.906307" elapsed="0.009863">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:15.916700" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:15.916889" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:15.916836" elapsed="0.000112"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:15.916812" elapsed="0.000166"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:15.917175" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:15.917272" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:21:15.898005" elapsed="0.019409">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:15.917507" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:15.892559" elapsed="0.025097">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:15.917966" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:15.917766" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:15.917743" elapsed="0.000333"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:15.918345" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:15.918152" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:15.918130" elapsed="0.000323"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:21:15.890096" elapsed="0.028464">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:16.921680" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:16.920685" elapsed="0.001068"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:16.933232" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:16.932972" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:16.933700" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:16.933434" 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-08-22T23:21:16.942437" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:16.942611" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:21:16.942791" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:16.936076" elapsed="0.007226">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:16.933823" elapsed="0.009593">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:16.943707" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:16.943465" elapsed="0.000350"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:16.933800" elapsed="0.010057">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:16.944392" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:16.944625" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:16.944530" elapsed="0.000164"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:16.944505" 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-08-22T23:21:16.944932" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:16.945033" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:21:16.926779" elapsed="0.018398">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:16.945275" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:16.922303" elapsed="0.023105">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:16.945744" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:16.945519" elapsed="0.000324"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:16.945496" elapsed="0.000389"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:16.946173" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:16.945977" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:16.945952" elapsed="0.000333"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:21:16.919414" elapsed="0.026978">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:17.949041" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:17.948078" elapsed="0.001033"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:17.961563" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:17.961209" elapsed="0.000443"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:17.962285" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:17.961931" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:21:17.971658" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:17.971805" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:21:17.972015" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:17.964772" elapsed="0.007724">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:17.962445" elapsed="0.010183">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:17.972894" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:17.972678" elapsed="0.000307"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:17.962419" elapsed="0.010599">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:17.973530" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:17.973758" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:17.973688" elapsed="0.000136"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:17.973663" elapsed="0.000198"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:17.974088" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:17.974185" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:21:17.955126" elapsed="0.019201">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:17.974422" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:17.949619" elapsed="0.024931">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:17.974877" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:17.974680" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:17.974657" elapsed="0.000330"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:17.975253" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:17.975061" elapsed="0.000268"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:17.975040" elapsed="0.000321"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:21:17.947092" elapsed="0.028374">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:18.978608" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:18.977541" elapsed="0.001149"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:18.989631" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:18.989248" elapsed="0.000453"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:18.990262" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:18.989915" 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-08-22T23:21:18.999745" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:18.999954" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:21:19.000228" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:18.993059" elapsed="0.007739">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:18.990465" elapsed="0.010458">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:19.001193" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:19.000975" elapsed="0.000310"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:18.990429" elapsed="0.010890">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:19.001869" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:19.002065" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:19.002007" elapsed="0.000122"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:19.001983" elapsed="0.000176"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:19.002359" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:19.002457" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:21:18.983189" elapsed="0.019434">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:19.002722" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:18.979275" elapsed="0.023596">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:19.003181" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:19.002981" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:19.002958" elapsed="0.000334"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:19.003558" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:19.003365" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:19.003344" elapsed="0.000348"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:21:18.976349" elapsed="0.027450">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:20.006670" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:20.005679" elapsed="0.001064"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:20.017620" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:20.017345" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:20.018072" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:20.017822" 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-08-22T23:21:20.026831" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:20.027037" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:21:20.027273" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:20.020462" elapsed="0.007373">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:20.018193" elapsed="0.009763">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:20.028225" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:20.028007" elapsed="0.000309"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:20.018169" elapsed="0.010181">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:20.028893" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:20.029084" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:20.029030" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:20.029005" elapsed="0.000172"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:20.029378" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:20.029476" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:21:20.011373" elapsed="0.018268">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:20.029737" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:20.007233" elapsed="0.022633">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:20.030171" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:20.029973" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:20.029951" elapsed="0.000329"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:20.030544" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:20.030353" elapsed="0.000289"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:20.030332" elapsed="0.000343"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:21:20.004549" elapsed="0.026232">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:21.033433" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:21.032458" elapsed="0.001040"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:21.045073" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:21.044648" elapsed="0.000476"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:21.045518" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:21.045274" 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-08-22T23:21:21.054346" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:21.054499" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:21:21.054685" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:21.047850" elapsed="0.007297">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:21.045653" elapsed="0.009607">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:21.055521" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:21.055307" elapsed="0.000329"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:21.045630" elapsed="0.010040">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:21.056181" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:21.056368" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:21.056315" elapsed="0.000111"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:21.056292" elapsed="0.000164"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:21.056707" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:21.056810" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:21:21.038607" elapsed="0.018348">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:21.057051" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:21.034012" elapsed="0.023168">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:21.057485" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:21.057287" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:21.057265" elapsed="0.000349"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:21.057885" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:21.057690" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:21.057668" elapsed="0.000332"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:21:21.031475" elapsed="0.026632">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:22.061226" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:22.060214" elapsed="0.001085"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:22.071792" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:22.071512" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:22.072248" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:22.071998" 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-08-22T23:21:22.081851" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:22.082028" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:21:22.082248" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:22.074706" elapsed="0.008013">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:22.072379" elapsed="0.010433">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:22.083015" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:22.082853" elapsed="0.000229"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:22.072352" elapsed="0.010755">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:22.083500" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:22.083671" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:22.083627" elapsed="0.000094"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:22.083607" elapsed="0.000136"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:22.083890" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:22.083967" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:21:22.065736" elapsed="0.018344">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:22.084150" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:22.061871" elapsed="0.022373">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:22.084468" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:22.084324" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:22.084308" elapsed="0.000245"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:22.084772" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:22.084629" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:22.084612" elapsed="0.000240"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:21:22.059038" elapsed="0.025893">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:23.087930" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:23.086910" elapsed="0.001095"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:23.099166" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:23.098908" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:23.099632" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:23.099364" 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-08-22T23:21:23.108127" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:23.108293" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:21:23.108477" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:23.102002" elapsed="0.006893">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:23.099757" elapsed="0.009227">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:23.109178" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:23.109022" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:23.099733" elapsed="0.009537">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:23.109663" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:23.109802" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:23.109762" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:23.109745" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:23.110013" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:23.110084" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:21:23.094056" elapsed="0.016133">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:23.110259" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:23.088496" elapsed="0.021856">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:23.110626" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:23.110466" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:23.110447" elapsed="0.000262"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:23.110904" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:23.110764" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:23.110748" elapsed="0.000235"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:21:23.085765" elapsed="0.025295">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:24.114045" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:24.113052" elapsed="0.001066"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:24.124972" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:24.124606" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:24.125616" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:24.125251" 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-08-22T23:21:24.135910" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:24.136144" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:21:24.136381" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:24.128809" elapsed="0.008119">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:24.125786" elapsed="0.011283">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:24.137357" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:24.137131" elapsed="0.000318"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:24.125755" elapsed="0.011728">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:24.138028" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:24.138221" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:24.138165" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:24.138141" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:24.138508" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:24.138626" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:21:24.118628" elapsed="0.020147">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:24.138870" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:24.114637" elapsed="0.024363">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:24.139324" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:24.139108" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:24.139086" elapsed="0.000349"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:24.139720" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:24.139508" elapsed="0.000290"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:24.139487" elapsed="0.000343"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:21:24.111913" elapsed="0.028023">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:25.143046" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:25.142038" elapsed="0.001080"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:25.153550" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:25.153289" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:25.154012" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:25.153768" 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-08-22T23:21:25.163443" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:25.163640" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:21:25.163835" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:25.156404" elapsed="0.007966">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:25.154138" elapsed="0.010351">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:25.164780" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:25.164539" elapsed="0.000336"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:25.154113" elapsed="0.010796">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:25.165430" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:25.165649" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:25.165567" elapsed="0.000147"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:25.165544" elapsed="0.000200"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:25.165941" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:25.166045" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:21:25.147282" elapsed="0.018910">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:25.166288" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:25.143646" elapsed="0.022771">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:25.166750" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:25.166525" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:25.166503" elapsed="0.000360"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:25.167129" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:25.166937" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:25.166916" elapsed="0.000322"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:21:25.140876" elapsed="0.026469">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.170463" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:26.169478" elapsed="0.001055"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.181569" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:26.181298" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.182027" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:26.181784" 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-08-22T23:21:26.191218" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:26.191428" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:21:26.191688" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:26.184397" elapsed="0.007800">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:26.182150" elapsed="0.010160">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.192627" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:26.192358" elapsed="0.000364"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:26.182127" elapsed="0.010628">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.193271" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:26.193459" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:26.193404" elapsed="0.000115"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:26.193380" elapsed="0.000169"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.193767" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:26.193865" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:21:26.175289" elapsed="0.018720">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:26.194103" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:26.171059" elapsed="0.023171">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.194532" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:26.194337" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:26.194314" elapsed="0.000350"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.194932" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:26.194739" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:26.194717" elapsed="0.000323"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:21:26.168303" elapsed="0.026842">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<msg time="2026-08-22T23:21:26.195273" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>60s</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:20:25.506136" elapsed="60.689265">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.197207" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:26.196551" elapsed="0.000694"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-08-22T23:21:26.197546" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:26.197348" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.197323" elapsed="0.000338"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:21:26.197904" elapsed="0.000300"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.199429" level="FAIL">'4968' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:21:26.198946" elapsed="0.000567">'4968' does not contain '-'</status>
</kw>
<msg time="2026-08-22T23:21:26.199666" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:21:26.198426" elapsed="0.001320"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.200443" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:26.199978" elapsed="0.000501"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.201142" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:26.200737" elapsed="0.000442"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.201819" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:26.201391" elapsed="0.000464"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.202619" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968

Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-08-22T23:21:26.202066" elapsed="0.000623"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.203231" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:26.202899" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.204204" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=4968'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-08-22T23:21:26.203732" elapsed="0.000537"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:26.203383" elapsed="0.000935"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.203359" elapsed="0.000993"/>
</if>
<arg>4968</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:21:26.196029" elapsed="0.008386"/>
</kw>
<doc>Check that the device data deletion makes its way into the checker node.</doc>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=4968</tag>
<status status="FAIL" start="2026-08-22T23:20:25.252015" elapsed="60.952463">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968

Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</test>
<test id="s1-s1-t22" name="Check_Device_Data_Deletion_Is_Visible_On_Configurer" line="221">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:21:26.209821" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:21:26.209539" elapsed="0.000549"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:26.211090" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:26.210978" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.210959" 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-08-22T23:21:26.216076" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:26.215970" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.215952" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.217200" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:26.216751" elapsed="0.000476"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.217725" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:21:26.217393" elapsed="0.000358"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:21:26.217796" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:21:26.217954" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:21:26.216365" elapsed="0.001614"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:26.223481" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:26.223372" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.223353" 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-08-22T23:21:26.224755" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:26.224645" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.224626" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:26.225373" 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-08-22T23:21:26.225032" elapsed="0.000368"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:26.225820" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:26.225557" elapsed="0.000289"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:26.261608" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:26.226335" elapsed="0.035405"/>
</kw>
<msg time="2026-08-22T23:21:26.261931" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:26.261979" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:26.226003" elapsed="0.036014"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:26.286493" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:21:26.262539" elapsed="0.024154"/>
</kw>
<msg time="2026-08-22T23:21:26.286943" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:26.287008" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:26.262191" elapsed="0.024870"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.287490" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:26.287172" elapsed="0.000395"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.287143" elapsed="0.000484"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.288305" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:26.287827" elapsed="0.000582"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.288833" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:26.288504" elapsed="0.000405"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.288479" elapsed="0.000463"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:26.288989" 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-08-22T23:21:26.292376" elapsed="0.000143"/>
</kw>
<msg time="2026-08-22T23:21:26.292585" 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-08-22T23:21:26.291166" 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-08-22T23:21:26.293048" elapsed="0.000092"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.293425" 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-08-22T23:21:26.290169" elapsed="0.003498"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:21:26.289354" elapsed="0.004384"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:21:26.224324" elapsed="0.069511"/>
</kw>
<msg time="2026-08-22T23:21:26.293950" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:26.293996" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:26.223716" elapsed="0.070319"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:26.294217" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:21:26.294111" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.294092" 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-08-22T23:21:26.294783" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.295156" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:26.295228" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:21:26.223036" elapsed="0.072300"/>
</kw>
<msg time="2026-08-22T23:21:26.295429" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:26.295473" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:26.218355" elapsed="0.077155"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.295850" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:26.295602" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.295568" elapsed="0.000360"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:21:26.218215" elapsed="0.077737"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:26.301446" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:26.301337" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.301318" 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-08-22T23:21:26.302729" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:26.302617" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.302585" elapsed="0.000212"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:26.303258" 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-08-22T23:21:26.302939" elapsed="0.000346"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:26.303681" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:26.303439" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:26.341730" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:26.304196" elapsed="0.037638"/>
</kw>
<msg time="2026-08-22T23:21:26.342020" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:26.342066" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:26.303864" elapsed="0.038239"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:26.376763" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:21:26.342637" elapsed="0.034239"/>
</kw>
<msg time="2026-08-22T23:21:26.377047" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:26.377093" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:26.342271" elapsed="0.034859"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.377426" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:26.377207" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.377187" elapsed="0.000317"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.378161" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:26.377678" elapsed="0.000557"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.378521" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:26.378303" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.378285" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:26.378653" 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-08-22T23:21:26.381291" elapsed="0.000142"/>
</kw>
<msg time="2026-08-22T23:21:26.381531" 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-08-22T23:21:26.380167" elapsed="0.001529"/>
</kw>
<kw name="Open 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-08-22T23:21:26.381993" elapsed="0.000087"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.382356" 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-08-22T23:21:26.379481" elapsed="0.003080"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:21:26.378913" elapsed="0.003733"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:21:26.302294" elapsed="0.080450"/>
</kw>
<msg time="2026-08-22T23:21:26.382836" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:26.382880" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:26.301688" elapsed="0.081229"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:26.383101" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:21:26.382993" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.382974" 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-08-22T23:21:26.383632" 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-08-22T23:21:26.383964" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:26.384036" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:21:26.300996" elapsed="0.083147"/>
</kw>
<msg time="2026-08-22T23:21:26.384236" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:26.384279" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:26.296213" elapsed="0.088102"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.384657" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:26.384389" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.384372" elapsed="0.000364"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:21:26.296076" elapsed="0.088683"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:26.390496" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:26.390370" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.390348" 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-08-22T23:21:26.391934" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:26.391817" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.391798" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:26.392513" 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-08-22T23:21:26.392190" elapsed="0.000351"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:26.392949" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:26.392722" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:26.426079" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:26.393468" elapsed="0.032720"/>
</kw>
<msg time="2026-08-22T23:21:26.426375" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:26.426421" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:26.393136" elapsed="0.033322"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:26.454005" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:21:26.426982" elapsed="0.027182"/>
</kw>
<msg time="2026-08-22T23:21:26.454337" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:26.454383" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:26.426648" elapsed="0.027773"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.454745" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:26.454499" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.454478" elapsed="0.000346"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.455265" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:26.454963" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.455636" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:26.455405" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.455386" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:26.455748" 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-08-22T23:21:26.458564" elapsed="0.000164"/>
</kw>
<msg time="2026-08-22T23:21:26.458792" 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-08-22T23:21:26.457428" 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-08-22T23:21:26.459227" elapsed="0.000087"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.459616" elapsed="0.000087"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:21:26.456763" elapsed="0.003062"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:21:26.456001" elapsed="0.003892"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:21:26.391465" elapsed="0.068525"/>
</kw>
<msg time="2026-08-22T23:21:26.460082" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:26.460125" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:26.390773" elapsed="0.069388"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:26.460343" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:21:26.460238" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.460219" elapsed="0.000241"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.460869" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.461201" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:26.461272" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:21:26.389895" elapsed="0.071484"/>
</kw>
<msg time="2026-08-22T23:21:26.461471" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:26.461514" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:26.385018" elapsed="0.076534"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.462041" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:26.461794" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.461775" elapsed="0.000344"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:21:26.384880" elapsed="0.077263"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:21:26.218036" elapsed="0.244136"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:21:26.215610" elapsed="0.246617"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:21:26.210673" elapsed="0.251646"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:26.210235" elapsed="0.252130"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:21:26.205543" elapsed="0.256875"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.463940" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:26.463538" elapsed="0.000429"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.471234" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:26.470979" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.471697" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:26.471432" 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-08-22T23:21:26.495349" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:26.495698" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:21:26.495921" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:21:26.474043" elapsed="0.021937"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:26.471808" elapsed="0.024269"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.496479" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:26.496136" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.471790" elapsed="0.024921"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.504513" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:26.499029" elapsed="0.005630"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:26.498508" elapsed="0.006232"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.498466" elapsed="0.006330"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.508228" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:26.505485" elapsed="0.002789"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:26.504920" elapsed="0.003388"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.504882" elapsed="0.003451"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.508911" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:26.508492" 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-08-22T23:21:26.509256" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:26.509008" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.509819" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:26.509498" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:26.509339" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.508990" elapsed="0.000913"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.510420" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:26.510058" 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-08-22T23:21:26.510767" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:26.510516" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.511297" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:26.511003" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:26.510848" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.510498" elapsed="0.000920"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:26.511568" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:21:26.512399" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:26.512105" 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-08-22T23:21:26.512582" 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-08-22T23:21:26.497534" elapsed="0.017434"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:21:26.515143" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:21:26.515036" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.515018" 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-08-22T23:21:26.515371" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:26.515443" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:21:26.517823" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:21:26.466630" elapsed="0.051223"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:21:26.517914" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:21:26.518068" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:21:26.464181" elapsed="0.053913"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:21:26.518387" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:26.518164" elapsed="0.000617"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.518147" elapsed="0.000659"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.519065" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:26.518862" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.518845" elapsed="0.000301"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${empty_data}</arg>
<status status="PASS" start="2026-08-22T23:21:26.463150" elapsed="0.056043"/>
</kw>
<arg>60s</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${NODE_CONFIGURER}</arg>
<arg>${empty_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:21:26.462608" elapsed="0.056631"/>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.520425" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:26.520021" elapsed="0.000438"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-08-22T23:21:26.520698" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:21:26.520534" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.520516" elapsed="0.000263"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.520941" elapsed="0.000023"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.521121" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.521306" elapsed="0.000056"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.521529" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.521723" elapsed="0.000021"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.521888" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.522055" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.522298" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:26.522138" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:26.522121" elapsed="0.000252"/>
</if>
<arg>4968</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:21:26.519664" elapsed="0.002798"/>
</kw>
<doc>Check that the device data deletion makes its way into the checker node.</doc>
<status status="PASS" start="2026-08-22T23:21:26.204863" elapsed="0.317651"/>
</test>
<test id="s1-s1-t23" name="Deconfigure_Device_In_Netconf" line="226">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:21:26.525970" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:21:26.525698" elapsed="0.000541"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:26.527249" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:26.527140" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.527120" 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-08-22T23:21:26.532357" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:26.532248" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.532230" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.533437" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:26.533052" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.533990" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:21:26.533664" elapsed="0.000353"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:21:26.534062" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:21:26.534217" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:21:26.532667" 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-08-22T23:21:26.539726" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:26.539615" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.539582" 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-08-22T23:21:26.541028" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:26.540913" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.540895" elapsed="0.000203"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:26.541556" 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-08-22T23:21:26.541240" elapsed="0.000346"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:26.542018" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:26.541789" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:26.584989" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:26.542544" elapsed="0.042554"/>
</kw>
<msg time="2026-08-22T23:21:26.585274" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:26.585324" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:26.542211" elapsed="0.043161"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:26.603429" level="INFO">"t "x "t ". "C "R "U "D ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:21:26.585915" elapsed="0.017624"/>
</kw>
<msg time="2026-08-22T23:21:26.603738" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:26.603785" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:26.585545" elapsed="0.018278"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.604128" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:26.603904" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.603882" elapsed="0.000326"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.604727" level="INFO"> "t "x "t ". "C "R "U "D ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:26.604397" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.605074" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:26.604859" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.604841" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:26.605185" 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-08-22T23:21:26.607913" elapsed="0.000143"/>
</kw>
<msg time="2026-08-22T23:21:26.608119" 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-08-22T23:21:26.606758" elapsed="0.001504"/>
</kw>
<kw name="Open 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-08-22T23:21:26.608561" elapsed="0.000114"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.608957" 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-08-22T23:21:26.606011" 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-08-22T23:21:26.605449" 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-08-22T23:21:26.540600" elapsed="0.068730"/>
</kw>
<msg time="2026-08-22T23:21:26.609422" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:26.609465" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:26.539942" elapsed="0.069561"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:26.609709" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:21:26.609583" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.609561" 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-08-22T23:21:26.610187" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.610516" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:26.610769" 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-08-22T23:21:26.539257" elapsed="0.071629"/>
</kw>
<msg time="2026-08-22T23:21:26.610978" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:26.611021" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:26.534630" elapsed="0.076429"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.611382" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:26.611134" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.611117" elapsed="0.000342"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:21:26.534473" elapsed="0.077010"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:26.616869" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:26.616760" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.616741" 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-08-22T23:21:26.618101" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:26.617988" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.617969" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:26.618638" 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-08-22T23:21:26.618309" elapsed="0.000356"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:26.619075" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:26.618847" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:26.656516" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:26.619656" elapsed="0.036986"/>
</kw>
<msg time="2026-08-22T23:21:26.656825" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:26.656872" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:26.619296" elapsed="0.037613"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:26.678788" level="INFO">"t "x "t ". "C "R "U "D ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:21:26.657413" elapsed="0.021484"/>
</kw>
<msg time="2026-08-22T23:21:26.679070" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:26.679116" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:26.657076" elapsed="0.022078"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.679460" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:26.679232" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.679212" elapsed="0.000327"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.680215" level="INFO"> "t "x "t ". "C "R "U "D ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:26.679728" elapsed="0.000553"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.680565" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:26.680349" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.680331" elapsed="0.000341"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:26.680705" 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-08-22T23:21:26.683314" elapsed="0.000141"/>
</kw>
<msg time="2026-08-22T23:21:26.683519" 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-08-22T23:21:26.682190" elapsed="0.001496"/>
</kw>
<kw name="Open 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-08-22T23:21:26.683999" elapsed="0.000086"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.684361" 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-08-22T23:21:26.681480" elapsed="0.003086"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:21:26.680954" elapsed="0.003709"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:21:26.617686" elapsed="0.067075"/>
</kw>
<msg time="2026-08-22T23:21:26.684852" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:26.684896" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:26.617086" elapsed="0.067848"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:26.685115" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:21:26.685010" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.684991" 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-08-22T23:21:26.685612" 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-08-22T23:21:26.685944" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:26.686018" 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-08-22T23:21:26.616404" elapsed="0.069724"/>
</kw>
<msg time="2026-08-22T23:21:26.686258" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:26.686303" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:26.611770" elapsed="0.074571"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.686819" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:26.686417" elapsed="0.000458"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.686400" elapsed="0.000499"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:21:26.611626" elapsed="0.075296"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:26.692448" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:26.692339" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.692320" 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-08-22T23:21:26.693694" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:26.693556" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.693538" elapsed="0.000224"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:26.694213" 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-08-22T23:21:26.693904" elapsed="0.000336"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:26.694642" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:26.694393" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:26.732649" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:26.695154" elapsed="0.037602"/>
</kw>
<msg time="2026-08-22T23:21:26.732928" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:26.732974" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:26.694825" elapsed="0.038186"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:26.750465" level="INFO">"t "x "t ". "C "R "U "D ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:21:26.733508" elapsed="0.017097"/>
</kw>
<msg time="2026-08-22T23:21:26.750786" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:26.750832" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:26.733175" elapsed="0.017694"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.751192" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:26.750955" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.750930" elapsed="0.000341"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.751741" level="INFO"> "t "x "t ". "C "R "U "D ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:26.751408" 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-08-22T23:21:26.752081" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:26.751871" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.751853" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:26.752192" 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-08-22T23:21:26.755156" elapsed="0.000142"/>
</kw>
<msg time="2026-08-22T23:21:26.755360" 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-08-22T23:21:26.754001" 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-08-22T23:21:26.755825" elapsed="0.000087"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.756189" elapsed="0.000087"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:21:26.753302" elapsed="0.003095"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:21:26.752459" elapsed="0.004048"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:21:26.693256" elapsed="0.063373"/>
</kw>
<msg time="2026-08-22T23:21:26.756755" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:26.756801" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:26.692681" elapsed="0.064159"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:26.757023" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:21:26.756917" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.756899" 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-08-22T23:21:26.757494" 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-08-22T23:21:26.757991" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:26.758064" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:21:26.691834" elapsed="0.066339"/>
</kw>
<msg time="2026-08-22T23:21:26.758268" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:26.758312" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:26.687181" elapsed="0.071170"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.758691" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:26.758426" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.758409" elapsed="0.000361"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:21:26.687045" elapsed="0.071749"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:21:26.534297" elapsed="0.224528"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:21:26.531885" elapsed="0.226999"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:21:26.526847" elapsed="0.232096"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:26.526387" elapsed="0.232605"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:21:26.523280" elapsed="0.235769"/>
</kw>
<kw name="Remove_Device_From_Netconf" owner="NetconfKeywords">
<kw name="Pop From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:26.759998" level="INFO">${device_type} = configure-via-topology</msg>
<var>${device_type}</var>
<arg>${NetconfKeywords__mounted_device_types}</arg>
<arg>${device_name}</arg>
<doc>Pops the given ``key`` from the ``dictionary`` and returns its value.</doc>
<status status="PASS" start="2026-08-22T23:21:26.759732" elapsed="0.000294"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.760632" level="INFO">${mapping} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping}</var>
<arg>DEVICE_NAME=${device_name}</arg>
<arg>RESTCONF_ROOT=${RESTCONF_ROOT}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:21:26.760188" elapsed="0.000472"/>
</kw>
<kw name="Set_Variable_If_At_Least_Scandium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Set_Variable_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Set Variable If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:26.778830" elapsed="0.000429"/>
</kw>
<msg time="2026-08-22T23:21:26.779313" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>BuiltIn.Set_Variable_If</arg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:26.778454" elapsed="0.000907"/>
</kw>
<arg>scandium</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Compare ${lower_bound} to titanium and return scandium if titanium is at least ${lower_bound},
return calcium otherwise.</doc>
<status status="PASS" start="2026-08-22T23:21:26.778069" elapsed="0.001366"/>
</kw>
<msg time="2026-08-22T23:21:26.779477" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Set_Variable_If_At_Least</arg>
<arg>scandium</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:26.769484" elapsed="0.010036"/>
</kw>
<msg time="2026-08-22T23:21:26.779640" level="INFO">${version} = scandium</msg>
<var>${version}</var>
<arg>scandium</arg>
<arg>calcium</arg>
<doc>Compare scandium to titanium and return ${value_if_true} if titanium is at least scandium, return ${value_if_false} otherwise.</doc>
<status status="PASS" start="2026-08-22T23:21:26.769163" elapsed="0.010503"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.822223" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:26.821845" elapsed="0.000406"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:21:26.823039" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:21:26.822762" elapsed="0.000358">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:21:26.823214" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:21:26.822409" elapsed="0.000830"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.823800" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:26.823396" elapsed="0.000431"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:21:26.824133" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:21:26.824295" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:21:26.823986" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.824739" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:26.824472" 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-08-22T23:21:26.825768" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:26.825463" elapsed="0.000349"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.826227" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:21:26.825967" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.826929" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:21:26.826629" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:21:26.827706" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:21:26.827455" elapsed="0.000277"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:21:26.827789" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:21:26.827942" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:21:26.827139" elapsed="0.000828"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:21:26.828116" elapsed="0.000235"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:21:26.826478" elapsed="0.001914"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.828950" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:21:26.828652" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:21:26.829870" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:21:26.829471" elapsed="0.000426"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:21:26.829947" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:21:26.830104" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:21:26.829158" elapsed="0.000970"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:21:26.830276" elapsed="0.000222"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:21:26.828506" elapsed="0.002032"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:21:26.826302" elapsed="0.004271"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:21:26.830637" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:21:26.830796" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:21:26.825144" elapsed="0.005719"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:26.824851" elapsed="0.006047"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.831071" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:26.830923" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.824832" elapsed="0.006316"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.831889" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:26.831288" elapsed="0.000629"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:21:26.831966" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:21:26.821193" elapsed="0.010898"/>
</kw>
<msg time="2026-08-22T23:21:26.832144" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:26.808630" elapsed="0.023568"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.844465" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.856744" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.868944" 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-08-22T23:21:26.869135" 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-08-22T23:21:26.869305" 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-08-22T23:21:26.869695" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:26.869534" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:26.869520" 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-08-22T23:21:26.869914" 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-08-22T23:21:26.870077" 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-08-22T23:21:26.870265" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:21:26.869490" elapsed="0.000830"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:21:26.869381" 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-08-22T23:21:26.870493" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:26.870569" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:21:26.870706" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:21:26.804286" elapsed="0.066481"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.871874" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:26.871621" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:21:26.889039" level="INFO">DELETE Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:26.889142" level="INFO">DELETE Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:26.889341" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:21:26.874026" elapsed="0.015373"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:26.871987" elapsed="0.017500"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:26.889922" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:26.889545" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.871969" elapsed="0.018138"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.897033" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:26.892385" elapsed="0.004711"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:26.891890" elapsed="0.005257"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.891848" elapsed="0.005335"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.901052" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:26.897573" elapsed="0.003545"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:26.897262" elapsed="0.003906"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.897239" elapsed="0.003964"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.901997" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:26.901430" 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-08-22T23:21:26.902461" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:26.902136" elapsed="0.000406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.903446" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:26.902861" elapsed="0.000644"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:26.902582" elapsed="0.001039"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.902111" elapsed="0.001563"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.904877" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:26.904025" 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-08-22T23:21:26.905641" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:26.905096" elapsed="0.000676"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.906926" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:26.906177" elapsed="0.000808"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:26.905825" elapsed="0.001251"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.905056" elapsed="0.002074"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:26.907300" elapsed="0.000359"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:21:26.908103" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:26.907824" 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-08-22T23:21:26.908280" elapsed="0.002318"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_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-08-22T23:21:26.890946" elapsed="0.019777"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:21:26.910772" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:21:26.913010" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-08-22T23:21:26.871034" elapsed="0.042004"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:21:26.913093" elapsed="0.000027"/>
</return>
<arg>${DIRECTORY_WITH_DEVICE_TEMPLATES}${/}${version}${/}${device_type}</arg>
<arg>${mapping}</arg>
<arg>session=${session}</arg>
<arg>location=${location}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-08-22T23:21:26.779934" elapsed="0.133283"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${NODE_CONFIGURER}</arg>
<doc>Tell Netconf to deconfigure the specified device</doc>
<status status="PASS" start="2026-08-22T23:21:26.759275" elapsed="0.154005"/>
</kw>
<doc>Make request to deconfigure the device on Netconf connector.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-08-22T23:21:26.522753" elapsed="0.390642"/>
</test>
<test id="s1-s1-t24" name="Check_Device_Deconfigured_On_Configurer" line="232">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:21:26.917196" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:21:26.916934" elapsed="0.000524"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:26.918449" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:26.918342" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.918323" 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-08-22T23:21:26.923442" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:26.923336" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.923318" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.924500" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:26.924123" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:21:26.925005" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:21:26.924702" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:21:26.925076" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:21:26.925228" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:21:26.923754" elapsed="0.001499"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:26.932323" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:26.932214" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.932195" 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-08-22T23:21:26.933560" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:26.933453" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.933435" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:26.934117" 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-08-22T23:21:26.933796" elapsed="0.000348"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:26.934528" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:26.934299" elapsed="0.000255"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:26.971927" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:26.935107" elapsed="0.036935"/>
</kw>
<msg time="2026-08-22T23:21:26.972231" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:26.972277" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:26.934728" elapsed="0.037587"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:26.999017" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:21:26.972867" elapsed="0.026381"/>
</kw>
<msg time="2026-08-22T23:21:26.999500" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:26.999566" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:26.972489" elapsed="0.027160"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.000137" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:26.999771" elapsed="0.000446"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:26.999739" elapsed="0.000515"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.000814" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:27.000470" 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-08-22T23:21:27.001168" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.000951" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.000933" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:27.001281" 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-08-22T23:21:27.004052" elapsed="0.000146"/>
</kw>
<msg time="2026-08-22T23:21:27.004262" 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-08-22T23:21:27.002867" 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-08-22T23:21:27.004738" elapsed="0.000089"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.005111" elapsed="0.000087"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:21:27.002152" 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-08-22T23:21:27.001571" elapsed="0.003818"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:21:26.933149" elapsed="0.072338"/>
</kw>
<msg time="2026-08-22T23:21:27.005605" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:27.005655" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:26.932542" elapsed="0.073153"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:27.005883" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:21:27.005774" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.005755" 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-08-22T23:21:27.006373" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.006755" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:27.006827" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:21:26.931870" elapsed="0.075067"/>
</kw>
<msg time="2026-08-22T23:21:27.007033" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:27.007077" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:26.925630" elapsed="0.081486"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.007438" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.007191" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.007174" elapsed="0.000341"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:21:26.925475" elapsed="0.082064"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:27.063496" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:27.063344" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.063313" elapsed="0.000381"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:27.065141" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:27.065028" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.065007" elapsed="0.000204"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:27.065733" 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-08-22T23:21:27.065359" elapsed="0.000403"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:27.066163" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:27.065925" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:27.103826" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:27.066718" elapsed="0.037257"/>
</kw>
<msg time="2026-08-22T23:21:27.104184" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:27.104232" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.066350" elapsed="0.037920"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:27.131363" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:21:27.104845" elapsed="0.026671"/>
</kw>
<msg time="2026-08-22T23:21:27.131792" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:27.131857" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.104457" elapsed="0.027452"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.132339" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.132023" elapsed="0.000394"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.131993" elapsed="0.000458"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.133108" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:27.132678" 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-08-22T23:21:27.133695" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.133300" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.133275" elapsed="0.000550"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:27.133873" 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-08-22T23:21:27.136806" elapsed="0.000147"/>
</kw>
<msg time="2026-08-22T23:21:27.137016" 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-08-22T23:21:27.135617" elapsed="0.001565"/>
</kw>
<kw name="Open 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-08-22T23:21:27.137488" elapsed="0.000093"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.137923" 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-08-22T23:21:27.134904" 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-08-22T23:21:27.134303" 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-08-22T23:21:27.064679" elapsed="0.073625"/>
</kw>
<msg time="2026-08-22T23:21:27.138398" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:27.138443" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.063898" elapsed="0.074584"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:27.138734" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:21:27.138560" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.138541" elapsed="0.000326"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.139278" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.139755" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:27.139830" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:21:27.062783" elapsed="0.077159"/>
</kw>
<msg time="2026-08-22T23:21:27.140041" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:27.140086" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.007958" elapsed="0.132167"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.140455" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.140203" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.140185" elapsed="0.000347"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:21:27.007815" elapsed="0.132744"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:27.148573" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:27.148462" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.148442" 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-08-22T23:21:27.149852" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:27.149716" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.149697" elapsed="0.000227"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:27.150385" 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-08-22T23:21:27.150067" elapsed="0.000345"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:27.150812" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:27.150568" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:27.195140" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:27.151328" elapsed="0.044068"/>
</kw>
<msg time="2026-08-22T23:21:27.195681" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:27.195733" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.150995" elapsed="0.044778"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:27.215134" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:21:27.196517" elapsed="0.018739"/>
</kw>
<msg time="2026-08-22T23:21:27.215437" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:27.215482" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.196043" elapsed="0.019477"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.215930" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.215655" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.215621" elapsed="0.000396"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.216493" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:27.216165" 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-08-22T23:21:27.216868" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.216652" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.216633" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:27.217071" 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-08-22T23:21:27.220450" elapsed="0.000241"/>
</kw>
<msg time="2026-08-22T23:21:27.220781" 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-08-22T23:21:27.218829" elapsed="0.002161"/>
</kw>
<kw name="Open 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-08-22T23:21:27.221404" elapsed="0.000121"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.221950" elapsed="0.000126"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:21:27.218037" elapsed="0.004208"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:21:27.217420" elapsed="0.004924"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:21:27.149386" elapsed="0.073098"/>
</kw>
<msg time="2026-08-22T23:21:27.222839" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:27.222905" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.148811" elapsed="0.074146"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:27.223225" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:21:27.223072" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.223042" elapsed="0.000300"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.223937" 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-08-22T23:21:27.224412" elapsed="0.000033"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:27.224511" 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-08-22T23:21:27.148110" elapsed="0.076615"/>
</kw>
<msg time="2026-08-22T23:21:27.224862" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:27.224926" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.140856" elapsed="0.084124"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.225439" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.225094" elapsed="0.000420"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.225069" elapsed="0.000478"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:21:27.140715" elapsed="0.084890"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:21:26.925304" elapsed="0.300352"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:21:26.922978" elapsed="0.302762"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:21:26.918054" elapsed="0.307767"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:26.917628" elapsed="0.308260"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:21:26.914811" elapsed="0.311156"/>
</kw>
<kw name="Wait_Device_Fully_Removed" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Completely_Gone" owner="NetconfKeywords">
<kw name="Check_Device_Has_No_Netconf_Connector" owner="NetconfKeywords">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.239750" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:27.237651" elapsed="0.002127"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.240121" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-22T23:21:27.239967" elapsed="0.000211"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-22T23:21:27.239838" elapsed="0.000365"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.240547" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.240265" elapsed="0.000359"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.241358" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:27.240886" elapsed="0.000499"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:27.240650" elapsed="0.000771"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.241625" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.241446" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.240249" elapsed="0.001455"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:27.241740" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:21:27.241889" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:21:27.237173" elapsed="0.004742"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:27.241962" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:21:27.242103" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:21:27.236683" elapsed="0.005445"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.249355" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:27.249104" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.249813" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:27.249551" 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-08-22T23:21:27.261150" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:27.261396" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1011'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}} 
 </msg>
<msg time="2026-08-22T23:21:27.261565" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:21:27.252112" elapsed="0.009522"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:27.249923" elapsed="0.011774"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.261952" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.261735" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.249905" elapsed="0.012170"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.267303" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:27.263531" elapsed="0.003871"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:27.263194" elapsed="0.004257"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.263168" elapsed="0.004317"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.271200" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:27.267899" elapsed="0.003365"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:27.267564" elapsed="0.003790"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.267540" elapsed="0.003853"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.272259" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:27.271708" 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-08-22T23:21:27.272619" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.272358" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.273164" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:27.272859" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:27.272703" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.272340" elapsed="0.000907"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.273785" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:27.273401" 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-08-22T23:21:27.274111" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.273882" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.274669" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:27.274347" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:27.274193" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.273864" 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-08-22T23:21:27.274899" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:21:27.275744" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:27.275406" 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-08-22T23:21:27.275923" elapsed="0.002298"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:21:27.262581" elapsed="0.015703"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:27.278457" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:27.278353" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.278334" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:21:27.281732" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:21:27.278685" elapsed="0.003076"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:21:27.281813" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:21:27.281970" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:21:27.244799" elapsed="0.037197"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:21:27.282053" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:21:27.282199" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:21:27.242347" elapsed="0.039878"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.282653" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:27.282383" elapsed="0.000363"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.283291" level="INFO">${actual_count} = 0</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:27.282900" elapsed="0.000417"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-22T23:21:27.283363" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:21:27.283512" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-22T23:21:27.229174" elapsed="0.054362"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.283988" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:21:27.283729" elapsed="0.000314"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="PASS" start="2026-08-22T23:21:27.228714" elapsed="0.055388"/>
</kw>
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.294510" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:27.292438" elapsed="0.002098"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.295213" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:27.294888" elapsed="0.000351"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:21:27.294738" elapsed="0.000538"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.295867" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:27.295501" elapsed="0.000393"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:21:27.295354" elapsed="0.000576"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:21:27.294606" elapsed="0.001352"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.296740" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:27.296258" elapsed="0.000509"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:27.296022" elapsed="0.000782"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.296997" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.296829" elapsed="0.000224"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.297232" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.297076" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.296004" elapsed="0.001304"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:27.297342" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:21:27.297488" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:21:27.291986" elapsed="0.005528"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:27.297560" elapsed="0.000042"/>
</return>
<msg time="2026-08-22T23:21:27.297722" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>config</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:21:27.291405" elapsed="0.006343"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:21:27.308047" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01j33eaw19vdlp1wvcrvxffewb80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:27.308250" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:21:27.308389" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:21:27.298505" elapsed="0.009920"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} == 404 or ${resp.status_code} == 409">
<return>
<status status="PASS" start="2026-08-22T23:21:27.314847" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:21:27.308538" elapsed="0.006390"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.308511" elapsed="0.006451"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.315171" elapsed="0.000137"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The request failed with code ${resp.status_code}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.315525" elapsed="0.000030"/>
</kw>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config in node1 using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="PASS" start="2026-08-22T23:21:27.298107" elapsed="0.017557"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device has no Netconf connectors nor associated data.</doc>
<status status="PASS" start="2026-08-22T23:21:27.227828" elapsed="0.087916"/>
</kw>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Completely_Gone</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:21:27.227004" elapsed="0.088810"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${NODE_CONFIGURER}</arg>
<doc>Wait until all netconf connectors for the device with the given name disappear.
Call of Remove_Device_From_Netconf returns before netconf gets
around deleting the device's connector. To ensure the device is
really gone from netconf, use this keyword to make sure all
connectors disappear. If a call to Remove_Device_From_Netconf
is not made before using this keyword, the wait will fail.
Using this keyword is more readable than putting the WUKS below
into a test case.</doc>
<status status="PASS" start="2026-08-22T23:21:27.226261" elapsed="0.089640"/>
</kw>
<doc>Check that the device is really going to be gone. Fail if still there after one minute.
This is an expected behavior as the unmount request is sent to the config subsystem which
then triggers asynchronous disconnection of the device which is reflected in the operational
data once completed. This test makes sure this asynchronous operation does not take
unreasonable amount of time.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-08-22T23:21:26.913704" elapsed="0.402398"/>
</test>
<test id="s1-s1-t25" name="Check_Device_Deconfigured_On_Checker" line="241">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:21:27.319651" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:21:27.319367" elapsed="0.000552"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:27.320927" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:27.320816" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.320798" 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-08-22T23:21:27.326196" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:27.326089" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.326070" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.327273" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:27.326889" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.327781" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:21:27.327456" elapsed="0.000352"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:21:27.327853" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:21:27.328007" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:21:27.326487" 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-08-22T23:21:27.333538" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:27.333431" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.333413" 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-08-22T23:21:27.334777" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:27.334669" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.334651" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:27.335299" 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-08-22T23:21:27.334987" elapsed="0.000339"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:27.335730" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:27.335482" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:27.366545" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:27.336244" elapsed="0.030560"/>
</kw>
<msg time="2026-08-22T23:21:27.367201" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:27.367306" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.335915" elapsed="0.031716"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:27.385718" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:21:27.368865" elapsed="0.016973"/>
</kw>
<msg time="2026-08-22T23:21:27.386026" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:27.386074" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.368031" elapsed="0.018081"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.386422" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.386193" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.386172" elapsed="0.000332"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.386991" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:27.386672" 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-08-22T23:21:27.387357" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.387136" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.387117" elapsed="0.000321"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:27.387472" 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-08-22T23:21:27.390186" elapsed="0.000274"/>
</kw>
<msg time="2026-08-22T23:21:27.390527" 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-08-22T23:21:27.389037" elapsed="0.001663"/>
</kw>
<kw name="Open 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-08-22T23:21:27.391003" elapsed="0.000088"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.391376" 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-08-22T23:21:27.388301" 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-08-22T23:21:27.387756" elapsed="0.003922"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:21:27.334344" elapsed="0.057433"/>
</kw>
<msg time="2026-08-22T23:21:27.391870" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:27.391914" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.333774" elapsed="0.058177"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:27.392139" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:21:27.392027" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.392009" 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-08-22T23:21:27.392776" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.393161" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:27.393237" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:21:27.333097" elapsed="0.060249"/>
</kw>
<msg time="2026-08-22T23:21:27.393439" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:27.393483" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.328406" elapsed="0.065114"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.393868" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.393613" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.393578" elapsed="0.000405"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:21:27.328266" elapsed="0.065741"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:27.399370" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:27.399262" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.399243" 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-08-22T23:21:27.400605" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:27.400476" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.400459" elapsed="0.000216"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:27.401141" 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-08-22T23:21:27.400814" elapsed="0.000354"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:27.401542" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:27.401322" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:27.436841" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:27.402070" elapsed="0.034878"/>
</kw>
<msg time="2026-08-22T23:21:27.437122" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:27.437168" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.401742" elapsed="0.035462"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:27.457883" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:21:27.437747" elapsed="0.020241"/>
</kw>
<msg time="2026-08-22T23:21:27.458159" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:27.458204" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.437370" elapsed="0.020871"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.458534" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.458317" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.458297" elapsed="0.000342"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.459084" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:27.458779" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.459429" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.459217" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.459199" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:27.459538" 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-08-22T23:21:27.462184" elapsed="0.000290"/>
</kw>
<msg time="2026-08-22T23:21:27.462538" 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-08-22T23:21:27.461024" elapsed="0.001678"/>
</kw>
<kw name="Open 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-08-22T23:21:27.463013" elapsed="0.000093"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.463381" 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-08-22T23:21:27.460333" elapsed="0.003287"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:21:27.459811" 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-08-22T23:21:27.400176" elapsed="0.063612"/>
</kw>
<msg time="2026-08-22T23:21:27.463879" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:27.463922" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.399601" elapsed="0.064390"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:27.464177" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:21:27.464070" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.464051" 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-08-22T23:21:27.464671" 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-08-22T23:21:27.464999" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:27.465070" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:21:27.398920" elapsed="0.066258"/>
</kw>
<msg time="2026-08-22T23:21:27.465271" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:27.465314" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.394268" elapsed="0.071082"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.465822" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.465425" elapsed="0.000454"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.465407" elapsed="0.000496"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:21:27.394130" elapsed="0.071797"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:27.471261" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:27.471154" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.471135" 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-08-22T23:21:27.472462" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:27.472356" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.472338" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:27.473003" 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-08-22T23:21:27.472693" elapsed="0.000336"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:27.473403" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:27.473185" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:27.507507" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:27.473934" elapsed="0.033697"/>
</kw>
<msg time="2026-08-22T23:21:27.507811" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:27.507858" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.473603" elapsed="0.034291"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:27.527030" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:21:27.508397" elapsed="0.018754"/>
</kw>
<msg time="2026-08-22T23:21:27.527333" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:27.527381" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.508061" elapsed="0.019358"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.527767" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.527506" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.527478" elapsed="0.000369"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.528294" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:27.527986" 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-08-22T23:21:27.528712" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.528478" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.528459" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:27.528827" 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-08-22T23:21:27.531484" elapsed="0.000167"/>
</kw>
<msg time="2026-08-22T23:21:27.531715" 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-08-22T23:21:27.530323" 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-08-22T23:21:27.532154" elapsed="0.000270"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.532734" 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-08-22T23:21:27.529653" 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-08-22T23:21:27.529097" elapsed="0.003912"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:21:27.472059" elapsed="0.061047"/>
</kw>
<msg time="2026-08-22T23:21:27.533198" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:27.533243" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.471475" elapsed="0.061806"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:27.533465" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:21:27.533358" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.533339" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.533962" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.534294" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:27.534364" 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-08-22T23:21:27.470820" elapsed="0.063654"/>
</kw>
<msg time="2026-08-22T23:21:27.534567" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:27.534784" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.466206" elapsed="0.068617"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.535188" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.534934" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.534916" elapsed="0.000349"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:21:27.466066" elapsed="0.069223"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:21:27.328083" elapsed="0.207237"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:21:27.325722" elapsed="0.209657"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:21:27.320510" elapsed="0.214927"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.320086" elapsed="0.215397"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:21:27.317196" elapsed="0.218343"/>
</kw>
<kw name="Wait_Device_Fully_Removed" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Completely_Gone" owner="NetconfKeywords">
<kw name="Check_Device_Has_No_Netconf_Connector" owner="NetconfKeywords">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.548248" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:27.546046" elapsed="0.002230"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.548678" elapsed="0.000023"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-22T23:21:27.548509" elapsed="0.000229"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-22T23:21:27.548382" elapsed="0.000383"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.549073" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.548830" elapsed="0.000301"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.549875" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:27.549383" elapsed="0.000519"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:27.549155" elapsed="0.000784"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.550126" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.549965" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.548813" elapsed="0.001392"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:27.550240" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:21:27.550392" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:21:27.545578" elapsed="0.004839"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:27.550464" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:21:27.550623" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:21:27.545090" elapsed="0.005560"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.557858" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:27.557604" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.558297" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:27.558055" 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-08-22T23:21:27.587417" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:27.587836" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1011'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}} 
 </msg>
<msg time="2026-08-22T23:21:27.588134" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:21:27.560624" elapsed="0.027571"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:27.558409" elapsed="0.029897"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.588811" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.588374" elapsed="0.000585"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.558390" elapsed="0.030619"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.596786" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:27.591401" elapsed="0.005442"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:27.590898" elapsed="0.006047"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.590856" elapsed="0.006115"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.599790" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:27.597253" elapsed="0.002585"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:27.597029" elapsed="0.002845"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.597012" elapsed="0.002887"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.600504" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:27.600076" 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-08-22T23:21:27.600881" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.600644" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.601433" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:27.601131" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:27.600965" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.600624" elapsed="0.000894"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.602063" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:27.601696" 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-08-22T23:21:27.602390" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.602160" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.602956" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:27.602654" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:27.602472" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.602142" 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-08-22T23:21:27.603193" elapsed="0.000416"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:21:27.604107" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:27.603803" 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-08-22T23:21:27.604284" elapsed="0.002296"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:21:27.589881" elapsed="0.016776"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:27.606836" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:27.606727" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.606709" elapsed="0.000197"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:21:27.610065" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:21:27.607047" elapsed="0.003047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:21:27.610145" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:21:27.610310" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:21:27.553269" elapsed="0.057067"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:21:27.610394" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:21:27.610542" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:21:27.550864" elapsed="0.059704"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.611002" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:27.610752" elapsed="0.000340"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.611654" level="INFO">${actual_count} = 0</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:27.611246" elapsed="0.000435"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-22T23:21:27.611727" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:21:27.611909" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-22T23:21:27.537789" elapsed="0.074146"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.612347" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:21:27.612090" elapsed="0.000311"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="PASS" start="2026-08-22T23:21:27.537328" elapsed="0.075130"/>
</kw>
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.622695" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:27.620616" elapsed="0.002106"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.623391" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:27.623068" elapsed="0.000349"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:21:27.622917" elapsed="0.000536"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.624032" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:27.623699" elapsed="0.000361"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:21:27.623535" elapsed="0.000560"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:21:27.622781" elapsed="0.001344"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.624903" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:27.624423" elapsed="0.000507"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:27.624190" elapsed="0.000776"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.625158" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.624992" elapsed="0.000222"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.625392" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.625237" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.624172" elapsed="0.001296"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:27.625502" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:21:27.625665" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:21:27.620150" elapsed="0.005541"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:27.625737" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:21:27.625877" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>config</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:21:27.619556" elapsed="0.006346"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:21:27.642348" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01n9y7ckv1avp31pg1hzkyziske0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:27.642674" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:21:27.642908" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:21:27.626676" elapsed="0.016292"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} == 404 or ${resp.status_code} == 409">
<return>
<status status="PASS" start="2026-08-22T23:21:27.651930" elapsed="0.000047"/>
</return>
<status status="PASS" start="2026-08-22T23:21:27.643167" elapsed="0.008857"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.643119" elapsed="0.008942"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.652308" elapsed="0.000118"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The request failed with code ${resp.status_code}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.652677" elapsed="0.000032"/>
</kw>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config in node3 using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="PASS" start="2026-08-22T23:21:27.626258" elapsed="0.026544"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device has no Netconf connectors nor associated data.</doc>
<status status="PASS" start="2026-08-22T23:21:27.536833" elapsed="0.116055"/>
</kw>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Completely_Gone</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:21:27.536248" elapsed="0.116716"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${NODE_CHECKER}</arg>
<doc>Wait until all netconf connectors for the device with the given name disappear.
Call of Remove_Device_From_Netconf returns before netconf gets
around deleting the device's connector. To ensure the device is
really gone from netconf, use this keyword to make sure all
connectors disappear. If a call to Remove_Device_From_Netconf
is not made before using this keyword, the wait will fail.
Using this keyword is more readable than putting the WUKS below
into a test case.</doc>
<status status="PASS" start="2026-08-22T23:21:27.535770" elapsed="0.117293"/>
</kw>
<doc>Check that the device is going to be gone from the checker node. Fail if still there after one minute.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-08-22T23:21:27.316398" elapsed="0.336849"/>
</test>
<test id="s1-s1-t26" name="Check_Device_Deconfigured_On_Setter" line="246">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:21:27.657808" elapsed="0.000238"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:21:27.657530" 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-08-22T23:21:27.659115" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:27.659002" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.658984" 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-08-22T23:21:27.664039" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:27.663933" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.663915" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.665130" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:27.664743" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.665742" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:21:27.665413" elapsed="0.000356"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:21:27.665813" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:21:27.665967" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:21:27.664327" elapsed="0.001665"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:27.673190" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:27.673081" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.673061" 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-08-22T23:21:27.674437" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:27.674330" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.674312" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:27.674994" 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-08-22T23:21:27.674671" elapsed="0.000349"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:27.675403" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:27.675175" elapsed="0.000254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:27.708718" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:27.675934" elapsed="0.032891"/>
</kw>
<msg time="2026-08-22T23:21:27.709003" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:27.709049" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.675601" elapsed="0.033485"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:27.727398" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e "t "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-08-22T23:21:27.709670" elapsed="0.017835"/>
</kw>
<msg time="2026-08-22T23:21:27.727700" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:27.727746" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.709312" elapsed="0.018471"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.728076" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.727859" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.727839" elapsed="0.000315"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.728608" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e "t "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-08-22T23:21:27.728291" 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-08-22T23:21:27.728954" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.728744" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.728726" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:27.729064" 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-08-22T23:21:27.731782" elapsed="0.000142"/>
</kw>
<msg time="2026-08-22T23:21:27.731987" 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-08-22T23:21:27.730620" elapsed="0.001516"/>
</kw>
<kw name="Open 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-08-22T23:21:27.732435" elapsed="0.000089"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.732830" 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-08-22T23:21:27.729922" 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-08-22T23:21:27.729327" elapsed="0.003777"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:21:27.674024" elapsed="0.059177"/>
</kw>
<msg time="2026-08-22T23:21:27.733291" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:27.733335" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.673409" elapsed="0.059962"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:27.733575" elapsed="0.000049"/>
</return>
<status status="PASS" start="2026-08-22T23:21:27.733469" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.733451" 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-08-22T23:21:27.734075" 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-08-22T23:21:27.734403" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:27.734475" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:21:27.672736" elapsed="0.062007"/>
</kw>
<msg time="2026-08-22T23:21:27.734842" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:27.734887" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.666362" elapsed="0.068561"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.735243" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.734998" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.734981" elapsed="0.000338"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:21:27.666221" elapsed="0.069188"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:27.740974" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:27.740867" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.740848" 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-08-22T23:21:27.742199" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:27.742092" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.742074" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:27.742744" 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-08-22T23:21:27.742406" elapsed="0.000364"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:27.743148" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:27.742924" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:27.788647" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:27.743677" elapsed="0.045073"/>
</kw>
<msg time="2026-08-22T23:21:27.788920" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:27.788966" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.743330" elapsed="0.045673"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:27.810757" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e "t "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-08-22T23:21:27.789500" elapsed="0.021361"/>
</kw>
<msg time="2026-08-22T23:21:27.811030" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:27.811074" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.789167" elapsed="0.021944"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.811402" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.811187" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.811168" elapsed="0.000313"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.811942" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e "t "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-08-22T23:21:27.811642" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.812283" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.812073" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.812056" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:27.812393" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<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-08-22T23:21:27.815021" elapsed="0.000141"/>
</kw>
<msg time="2026-08-22T23:21:27.815224" 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-08-22T23:21:27.813873" elapsed="0.001490"/>
</kw>
<kw name="Open 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-08-22T23:21:27.815681" elapsed="0.000088"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.816045" 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-08-22T23:21:27.813186" elapsed="0.003063"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:21:27.812662" 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-08-22T23:21:27.741792" elapsed="0.074620"/>
</kw>
<msg time="2026-08-22T23:21:27.816504" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:27.816547" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.741188" elapsed="0.075435"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:27.816842" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:21:27.816736" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.816717" 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-08-22T23:21:27.817305" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.817658" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:27.817731" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:21:27.740503" elapsed="0.077337"/>
</kw>
<msg time="2026-08-22T23:21:27.817932" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:27.817974" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.735700" elapsed="0.082311"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.818329" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.818085" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.818068" elapsed="0.000365"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:21:27.735543" elapsed="0.082914"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:27.824093" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:27.823985" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.823966" 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-08-22T23:21:27.825298" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:27.825192" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.825174" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:27.825839" 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-08-22T23:21:27.825507" elapsed="0.000359"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:27.826241" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:27.826021" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:27.859660" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:27.826800" elapsed="0.033094"/>
</kw>
<msg time="2026-08-22T23:21:27.860288" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:27.860393" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.826424" elapsed="0.034052"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:27.878250" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e "t "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-08-22T23:21:27.861702" elapsed="0.016656"/>
</kw>
<msg time="2026-08-22T23:21:27.878532" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:27.878584" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.860901" elapsed="0.017740"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.878944" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.878720" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.878700" elapsed="0.000324"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.879496" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e "t "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-08-22T23:21:27.879187" 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-08-22T23:21:27.879904" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.879687" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.879667" elapsed="0.000316"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:27.880017" 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-08-22T23:21:27.882651" elapsed="0.000143"/>
</kw>
<msg time="2026-08-22T23:21:27.882857" 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-08-22T23:21:27.881494" 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-08-22T23:21:27.883326" elapsed="0.000089"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.883717" elapsed="0.000087"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:21:27.880829" 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-08-22T23:21:27.880271" 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-08-22T23:21:27.824894" elapsed="0.059193"/>
</kw>
<msg time="2026-08-22T23:21:27.884178" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:27.884222" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.824311" elapsed="0.059948"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:27.884442" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:21:27.884335" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.884317" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.884932" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.885258" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:27.885329" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:21:27.823646" elapsed="0.061790"/>
</kw>
<msg time="2026-08-22T23:21:27.885529" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:27.885573" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.818760" elapsed="0.067015"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.886102" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.885853" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.885835" elapsed="0.000344"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:21:27.818577" elapsed="0.067625"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:21:27.666047" elapsed="0.220183"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:21:27.663566" elapsed="0.222719"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:21:27.658710" elapsed="0.227629"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:27.658255" elapsed="0.228128"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:21:27.654513" elapsed="0.231921"/>
</kw>
<kw name="Wait_Device_Fully_Removed" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Completely_Gone" owner="NetconfKeywords">
<kw name="Check_Device_Has_No_Netconf_Connector" owner="NetconfKeywords">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.899214" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:27.897149" elapsed="0.002092"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.899599" elapsed="0.000024"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-22T23:21:27.899434" elapsed="0.000260"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-22T23:21:27.899294" elapsed="0.000427"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.900025" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.899785" elapsed="0.000298"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.900825" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:27.900336" elapsed="0.000516"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:27.900108" elapsed="0.000781"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.901081" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.900914" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.899768" elapsed="0.001390"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:27.901192" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:21:27.901340" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:21:27.896703" elapsed="0.004662"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:27.901411" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:21:27.901553" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:21:27.896219" elapsed="0.005364"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.908838" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:27.908571" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.909412" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:27.909034" 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-08-22T23:21:27.936278" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:27.936583" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1011'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}} 
 </msg>
<msg time="2026-08-22T23:21:27.936856" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:21:27.911575" elapsed="0.025340"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:27.909522" elapsed="0.027488"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.937405" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.937069" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.909504" elapsed="0.028125"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.945089" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:27.939910" elapsed="0.005235"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:27.939380" elapsed="0.005831"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.939340" elapsed="0.005899"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.947947" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:27.945523" elapsed="0.002472"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:27.945298" elapsed="0.002733"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.945281" elapsed="0.002776"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.948630" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:27.948219" 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-08-22T23:21:27.948966" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.948730" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.949515" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:27.949209" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:27.949050" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.948711" elapsed="0.000933"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.950171" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:27.949803" 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-08-22T23:21:27.950500" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.950268" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.951063" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:27.950767" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:27.950605" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.950250" 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-08-22T23:21:27.951296" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:21:27.952199" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:27.951826" 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-08-22T23:21:27.952383" elapsed="0.002312"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:21:27.938419" elapsed="0.016340"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:27.954935" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:27.954828" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.954810" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:21:27.958132" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:21:27.955146" elapsed="0.003016"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:21:27.958213" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:21:27.958371" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:21:27.904236" elapsed="0.054162"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:21:27.958454" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:21:27.958624" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:21:27.901809" elapsed="0.056843"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.959059" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:27.958809" elapsed="0.000340"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.959711" level="INFO">${actual_count} = 0</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:27.959304" elapsed="0.000433"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-22T23:21:27.959784" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:21:27.959935" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-22T23:21:27.888884" elapsed="0.071075"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.960396" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:21:27.960139" elapsed="0.000312"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="PASS" start="2026-08-22T23:21:27.888222" elapsed="0.072288"/>
</kw>
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.970820" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:27.968635" elapsed="0.002212"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.971511" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:27.971188" elapsed="0.000349"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:21:27.971032" elapsed="0.000546"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.972143" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:27.971822" elapsed="0.000371"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:21:27.971673" elapsed="0.000558"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:21:27.970902" elapsed="0.001358"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.973043" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:27.972560" elapsed="0.000512"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:27.972325" elapsed="0.000784"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.973300" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.973134" elapsed="0.000222"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.973535" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:27.973380" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.972307" elapsed="0.001322"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:27.973663" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:21:27.973810" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:21:27.968169" elapsed="0.005667"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:27.973882" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:21:27.974022" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>config</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:21:27.967601" elapsed="0.006445"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:21:27.990379" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0foun1aanwb4o8ttbcfvz5330.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:27.990492" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:21:27.990612" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:21:27.974818" elapsed="0.015822"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} == 404 or ${resp.status_code} == 409">
<return>
<status status="PASS" start="2026-08-22T23:21:27.995185" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:21:27.990722" elapsed="0.004521"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:27.990702" elapsed="0.004565"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.995415" elapsed="0.000053"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The request failed with code ${resp.status_code}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:27.995636" elapsed="0.000022"/>
</kw>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config in node2 using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="PASS" start="2026-08-22T23:21:27.974399" elapsed="0.021318"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device has no Netconf connectors nor associated data.</doc>
<status status="PASS" start="2026-08-22T23:21:27.887725" elapsed="0.108048"/>
</kw>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Completely_Gone</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:21:27.887119" elapsed="0.108704"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${NODE_SETTER}</arg>
<doc>Wait until all netconf connectors for the device with the given name disappear.
Call of Remove_Device_From_Netconf returns before netconf gets
around deleting the device's connector. To ensure the device is
really gone from netconf, use this keyword to make sure all
connectors disappear. If a call to Remove_Device_From_Netconf
is not made before using this keyword, the wait will fail.
Using this keyword is more readable than putting the WUKS below
into a test case.</doc>
<status status="PASS" start="2026-08-22T23:21:27.886652" elapsed="0.109231"/>
</kw>
<doc>Check that the device is going to be gone from the setter node. Fail if still there after one minute.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-08-22T23:21:27.653617" elapsed="0.342376"/>
</test>
<kw name="Teardown_Everything" type="TEARDOWN">
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-08-22T23:21:27.997266" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-08-22T23:21:27.997192" elapsed="0.000367"/>
</kw>
<kw name="Stop_Testtool" owner="NetconfKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:27.998647" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:27.998255" elapsed="0.000421"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:27.998826" elapsed="0.000255"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-08-22T23:21:27.998045" elapsed="0.001103"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-08-22T23:21:28.334508" level="INFO">[?2004l^C[?2004h[jenkins@releng-63244-201-1-mininet-ovs-217-0 ~]&gt;</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-08-22T23:21:27.999292" elapsed="0.335288"/>
</kw>
<kw name="Get File" owner="SSHLibrary">
<msg time="2026-08-22T23:21:28.351910" level="INFO">'testtool--netconf-clustering-txt-CRUD.1787440595.654.log' -&gt; '/w/workspace/netconf-csit-3node-clustering-only-titanium/testtool--netconf-clustering-txt-CRUD.1787440595.654.log'</msg>
<arg>${testtool_log}</arg>
<doc>Downloads file(s) from the remote machine to the local machine.</doc>
<status status="PASS" start="2026-08-22T23:21:28.334752" elapsed="0.017245"/>
</kw>
<doc>Stop testtool and download its log.</doc>
<status status="PASS" start="2026-08-22T23:21:27.997790" elapsed="0.354291"/>
</kw>
<doc>Teardown the test infrastructure, perform cleanup and release all resources.</doc>
<status status="PASS" start="2026-08-22T23:21:27.996966" elapsed="0.355181"/>
</kw>
<doc>netconf clustered CRUD test suite.

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

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


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

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

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

The suite checks the integrity of the presence of the device and the data
seen on the device only for nodes that have at least one of the roles
("CONFIGURER", "SETTER" and "CHECKER") assigned. A better design would have
a "checker list" of sorts and have only one checking test case that runs
through the check list and performs the test on each node listed. However
this currently has fairly low priority due to Beryllium delivery date so
it was left out.</doc>
<status status="FAIL" start="2026-08-22T23:16:28.225760" elapsed="300.126431"/>
</suite>
<suite id="s1-s2" name="Bug8086" source="/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/bug8086.robot">
<kw name="Setup_Everything" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:28.442894" 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-08-22T23:21:28.438652" elapsed="0.004291"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-08-22T23:21:28.438415" elapsed="0.004600"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-08-22T23:21:28.447806" 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-08-22T23:21:28.444097" elapsed="0.003738"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-08-22T23:21:28.448026" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:28.447918" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:28.447895" elapsed="0.000198"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:28.448615" 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-08-22T23:21:28.448244" elapsed="0.000478"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-08-22T23:21:28.449212" 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-08-22T23:21:28.448890" elapsed="0.000349"/>
</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-08-22T23:21:28.449780" elapsed="0.000285"/>
</kw>
<msg time="2026-08-22T23:21:28.450164" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:28.450211" 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-08-22T23:21:28.449403" elapsed="0.000832"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:28.450787" 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-08-22T23:21:28.450400" elapsed="0.000414"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:21:28.451788" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:21:28.451503" elapsed="0.000312"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:21:28.452214" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:21:28.451960" elapsed="0.000280"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:21:28.452704" 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-08-22T23:21:28.452396" elapsed="0.000335"/>
</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-08-22T23:21:28.455875" elapsed="0.000205"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:28.456558" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:21:28.456236" elapsed="0.000364"/>
</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-08-22T23:21:28.456752" elapsed="0.000228"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:28.457860" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:28.457519" elapsed="0.000367"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:21:28.457932" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:21:28.458088" 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-08-22T23:21:28.457223" elapsed="0.000891"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:21:28.458860" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.200:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396b8503410&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-08-22T23:21:28.458264" elapsed="0.000735"/>
</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-08-22T23:21:28.459160" elapsed="0.000193"/>
</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-08-22T23:21:28.455305" elapsed="0.004108"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:21:28.455118" elapsed="0.004339"/>
</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-08-22T23:21:28.460281" elapsed="0.000187"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:28.460961" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:21:28.460638" elapsed="0.000349"/>
</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-08-22T23:21:28.461133" elapsed="0.000219"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:28.462179" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:28.461860" elapsed="0.000352"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:21:28.462263" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:21:28.462411" 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-08-22T23:21:28.461538" elapsed="0.000898"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:21:28.463009" level="INFO">Creating Session using : alias=ClusterManagement__session_2, url=http://10.30.170.12:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396bb962fd0&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-08-22T23:21:28.462601" elapsed="0.000558"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-08-22T23:21:28.463319" elapsed="0.000191"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-08-22T23:21:28.459735" elapsed="0.003835"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:21:28.459541" elapsed="0.004090"/>
</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-08-22T23:21:28.464431" elapsed="0.000204"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:28.465111" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:21:28.464788" elapsed="0.000349"/>
</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-08-22T23:21:28.465286" elapsed="0.000220"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:28.466324" 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-08-22T23:21:28.466030" elapsed="0.000321"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:21:28.466396" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:21:28.466546" 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-08-22T23:21:28.465710" elapsed="0.000861"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:21:28.467142" level="INFO">Creating Session using : alias=ClusterManagement__session_3, url=http://10.30.170.79:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396bb961590&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-08-22T23:21:28.466739" elapsed="0.000506"/>
</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-08-22T23:21:28.467404" elapsed="0.000205"/>
</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-08-22T23:21:28.463889" elapsed="0.003781"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:21:28.463714" elapsed="0.004000"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-08-22T23:21:28.452786" elapsed="0.014957"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:28.468300" 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-08-22T23:21:28.467904" elapsed="0.000439"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:28.468916" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.200', 2: '10.30.170.12', 3: '10.30.170.79'}</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-08-22T23:21:28.468501" elapsed="0.000457"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:28.469496" 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-08-22T23:21:28.469115" elapsed="0.000424"/>
</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-08-22T23:21:28.451056" elapsed="0.018558"/>
</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-08-22T23:21:28.443755" elapsed="0.025917"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:28.469849" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:28.469737" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:28.469719" elapsed="0.000220"/>
</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-08-22T23:21:28.473208" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:28.472832" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:21:28.473711" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:21:28.473390" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:21:28.473781" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:21:28.473967" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:21:28.472480" 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-08-22T23:21:28.475017" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:21:28.474755" elapsed="0.000288"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:28.475856" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:21:28.475959" 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-08-22T23:21:28.475697" 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-08-22T23:21:28.479510" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:28.478875" elapsed="0.000752"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:28.478855" elapsed="0.000817"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:28.480395" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:21:28.479884" elapsed="0.000859"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:28.481783" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.200" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:28.481032" elapsed="0.000870"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:28.483436" 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-08-22T23:21:28.482227" elapsed="0.001265"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:21:28.485459" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:21:28.485679" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:21:28.485090" elapsed="0.000639"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:21:28.486122" elapsed="0.000614"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:21:28.488062" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:21:29.070754" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:21:28 UTC 2026

  System load:  0.03               Processes:             122
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:16:34 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:21:28.487733" elapsed="0.583167"/>
</kw>
<msg time="2026-08-22T23:21:29.070981" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:28.487126" elapsed="0.584025"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:21:28.483996" elapsed="0.587318"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:29.072480" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-08-22T23:21:29.085238" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-08-22T23:21:29.085496" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:21:29.085695" 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-08-22T23:21:29.071742" elapsed="0.014032"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:21:29.086303" elapsed="0.001368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:29.090850" 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-08-22T23:21:29.089248" elapsed="0.001997"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:21:29.092563" elapsed="0.000193"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:29.091900" elapsed="0.001057"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:29.091839" elapsed="0.001213"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:21:29.093933" elapsed="0.000155"/>
</return>
<status status="PASS" start="2026-08-22T23:21:29.093273" elapsed="0.001052"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:29.093225" elapsed="0.001227"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:21:29.094675" 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">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:29.099638" elapsed="0.000493"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:21:29.100430" elapsed="0.000368"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:21:29.101084" elapsed="0.000251"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:21:29.096010" elapsed="0.005398"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:21:28.477794" elapsed="0.623832"/>
</kw>
<msg time="2026-08-22T23:21:29.101684" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:28.477137" elapsed="0.624601"/>
</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-08-22T23:21:28.476660" elapsed="0.625161"/>
</kw>
<msg time="2026-08-22T23:21:29.101863" 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-08-22T23:21:28.476141" elapsed="0.625769"/>
</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-08-22T23:21:29.104584" 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-08-22T23:21:29.105182" elapsed="0.000145"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:21:29.105470" 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-08-22T23:21:29.102204" elapsed="0.003432"/>
</kw>
<msg time="2026-08-22T23:21:29.105729" 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-08-22T23:21:28.475256" elapsed="0.630499"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:29.106172" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:29.105929" elapsed="0.000285"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:21:29.106256" 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-08-22T23:21:28.474387" elapsed="0.631992"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:21:28.474214" elapsed="0.632203"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:29.107336" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:21:29.107067" elapsed="0.000294"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:29.108079" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:21:29.108180" 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-08-22T23:21:29.107943" 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-08-22T23:21:29.113135" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:29.112476" elapsed="0.000750"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:29.112455" elapsed="0.000813"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:29.114032" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:21:29.113476" elapsed="0.000874"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:29.115373" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.12" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:29.114656" elapsed="0.000835"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:29.116837" 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-08-22T23:21:29.115807" elapsed="0.001085"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:21:29.119018" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:21:29.119216" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:21:29.118637" elapsed="0.000627"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:21:29.119686" elapsed="0.000480"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:21:29.121509" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:21:29.724062" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:21:29 UTC 2026

  System load:  0.04               Processes:             123
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:16:29 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:21:29.121182" elapsed="0.602972"/>
</kw>
<msg time="2026-08-22T23:21:29.724218" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:29.120547" elapsed="0.603793"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:21:29.117368" elapsed="0.607100"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:29.725268" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-08-22T23:21:29.738285" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-08-22T23:21:29.738717" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:21:29.738966" 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-08-22T23:21:29.724808" elapsed="0.014299"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:21:29.739876" elapsed="0.001230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:29.744177" 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-08-22T23:21:29.742498" elapsed="0.001852"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:21:29.744973" elapsed="0.000076"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:29.744614" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:29.744559" elapsed="0.000657"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:21:29.745730" elapsed="0.000094"/>
</return>
<status status="PASS" start="2026-08-22T23:21:29.745333" elapsed="0.000611"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:29.745309" elapsed="0.000691"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:21:29.746088" 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-08-22T23:21:29.751027" elapsed="0.000739"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:21:29.752208" elapsed="0.000319"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:21:29.752826" elapsed="0.000241"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:21:29.746780" elapsed="0.006359"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:21:29.111428" elapsed="0.641898"/>
</kw>
<msg time="2026-08-22T23:21:29.753434" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:29.110808" elapsed="0.642679"/>
</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-08-22T23:21:29.110291" elapsed="0.643276"/>
</kw>
<msg time="2026-08-22T23:21:29.753640" 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-08-22T23:21:29.108358" elapsed="0.645328"/>
</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-08-22T23:21:29.756431" elapsed="0.000383"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:21:29.756976" elapsed="0.000148"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:21:29.757268" 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-08-22T23:21:29.753975" elapsed="0.003442"/>
</kw>
<msg time="2026-08-22T23:21:29.757509" 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-08-22T23:21:29.107571" elapsed="0.649963"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:29.757982" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:29.757732" elapsed="0.000292"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:21:29.758067" 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-08-22T23:21:29.106713" elapsed="0.651485"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:21:29.106514" elapsed="0.651720"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:29.759182" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:21:29.758911" elapsed="0.000297"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:29.760008" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:21:29.760109" 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-08-22T23:21:29.759869" 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-08-22T23:21:29.763646" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:29.763012" elapsed="0.000725"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:29.762990" elapsed="0.000789"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:29.764475" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:21:29.763989" elapsed="0.000818"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:29.765851" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.79" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:29.765083" elapsed="0.000882"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:29.767398" 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-08-22T23:21:29.766245" elapsed="0.001207"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:21:29.769337" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:21:29.769529" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:21:29.768955" elapsed="0.000627"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:21:29.770006" elapsed="0.000796"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:21:29.772000" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:21:30.354166" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:21:29 UTC 2026

  System load:  0.01               Processes:             122
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:16:30 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:21:29.771670" elapsed="0.582586"/>
</kw>
<msg time="2026-08-22T23:21:30.354319" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:29.771179" elapsed="0.583270"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:21:29.767927" elapsed="0.586678"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:30.355555" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-08-22T23:21:30.368186" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-08-22T23:21:30.368435" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:21:30.368631" 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-08-22T23:21:30.354934" elapsed="0.013813"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:21:30.369251" elapsed="0.000823"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:30.371852" 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-08-22T23:21:30.370980" 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-08-22T23:21:30.372674" elapsed="0.000097"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:30.372273" elapsed="0.000622"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:30.372241" elapsed="0.000711"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:21:30.373420" elapsed="0.000094"/>
</return>
<status status="PASS" start="2026-08-22T23:21:30.373072" elapsed="0.000810"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:30.373048" elapsed="0.000894"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:21:30.374033" 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-08-22T23:21:30.378294" elapsed="0.000508"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:21:30.379102" elapsed="0.000315"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:21:30.379745" 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-08-22T23:21:30.374751" elapsed="0.005322"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:21:29.761984" elapsed="0.618280"/>
</kw>
<msg time="2026-08-22T23:21:30.380321" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:29.761281" elapsed="0.619093"/>
</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-08-22T23:21:29.760805" elapsed="0.619647"/>
</kw>
<msg time="2026-08-22T23:21:30.380491" 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-08-22T23:21:29.760287" elapsed="0.620250"/>
</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-08-22T23:21:30.383274" elapsed="0.000386"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:21:30.383825" elapsed="0.000188"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:21:30.384162" 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-08-22T23:21:30.380865" elapsed="0.003447"/>
</kw>
<msg time="2026-08-22T23:21:30.384402" 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-08-22T23:21:29.759454" elapsed="0.624974"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:30.384902" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:30.384617" elapsed="0.000328"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:21:30.384989" 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-08-22T23:21:29.758532" elapsed="0.626582"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:21:29.758331" elapsed="0.626824"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:21:28.474085" elapsed="1.911105"/>
</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-08-22T23:21:28.470156" elapsed="1.915095"/>
</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-08-22T23:21:30.385404" elapsed="0.000232"/>
</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-08-22T23:21:30.399374" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:30.399264" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:30.399244" elapsed="0.000200"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:30.399743" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:21:30.399848" 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-08-22T23:21:30.399608" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:30.400285" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:30.400025" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:30.400737" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:30.400477" elapsed="0.000303"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:30.401548" 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-08-22T23:21:30.401325" elapsed="0.000350">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-08-22T23:21:30.401782" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:21:30.401829" 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-08-22T23:21:30.400934" elapsed="0.000918"/>
</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-08-22T23:21:30.402150" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:30.401929" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:30.401910" elapsed="0.000341"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:30.403004" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:21:30.402736" elapsed="0.000294"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:21:30.403078" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:21:30.403234" level="INFO">${odl_ip} = 10.30.170.200</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:21:30.402449" elapsed="0.000811"/>
</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-08-22T23:21:30.403412" elapsed="0.000418"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:30.404106" level="INFO">index=10
host=10.30.170.200
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-08-22T23:21:30.404206" level="INFO">${karaf_connection_object} = index=10
host=10.30.170.200
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-08-22T23:21:30.403999" elapsed="0.000233"/>
</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-08-22T23:21:30.404378" elapsed="0.002169"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:21:30.407026" level="INFO">Logging into '10.30.170.200:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:21:30.587220" 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-08-22T23:21:30.406762" elapsed="0.180546"/>
</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-08-22T23:21:30.590489" 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-08-22T23:21:30.591024" elapsed="0.000150"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:21:30.591320" 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-08-22T23:21:30.588116" elapsed="0.003355"/>
</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-08-22T23:21:30.587565" elapsed="0.003953"/>
</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-08-22T23:21:30.398984" elapsed="0.192586"/>
</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-08-22T23:21:30.386353" elapsed="0.205289"/>
</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-08-22T23:21:30.385983" elapsed="0.205712"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:21:30.385845" elapsed="0.205890"/>
</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-08-22T23:21:30.605040" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:30.604927" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:30.604906" elapsed="0.000203"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:30.605388" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:21:30.605493" 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-08-22T23:21:30.605258" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:30.605947" 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-08-22T23:21:30.605687" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:30.606386" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:30.606141" elapsed="0.000289"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:30.607189" 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-08-22T23:21:30.606975" elapsed="0.000303">Dictionary does not contain key '2'.</status>
</kw>
<msg time="2026-08-22T23:21:30.607385" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:21:30.607430" 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-08-22T23:21:30.606603" elapsed="0.000851"/>
</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-08-22T23:21:30.607770" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:30.607529" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:30.607510" elapsed="0.000358"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:30.608614" level="INFO">${ip_address} = 10.30.170.12</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:21:30.608331" elapsed="0.000310"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:21:30.608727" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:21:30.608885" level="INFO">${odl_ip} = 10.30.170.12</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:21:30.608062" elapsed="0.000848"/>
</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-08-22T23:21:30.609061" elapsed="0.000396"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:30.609747" level="INFO">index=12
host=10.30.170.12
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-08-22T23:21:30.609848" level="INFO">${karaf_connection_object} = index=12
host=10.30.170.12
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:21:30.609640" elapsed="0.000234"/>
</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-08-22T23:21:30.610017" elapsed="0.002320"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:21:30.612777" level="INFO">Logging into '10.30.170.12:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:21:30.813965" 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-08-22T23:21:30.612500" elapsed="0.201554"/>
</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-08-22T23:21:30.817123" 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-08-22T23:21:30.817644" elapsed="0.000154"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:21:30.817943" 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-08-22T23:21:30.814901" 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-08-22T23:21:30.814329" elapsed="0.003807"/>
</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-08-22T23:21:30.604648" elapsed="0.213538"/>
</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-08-22T23:21:30.592329" elapsed="0.225903"/>
</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-08-22T23:21:30.591963" elapsed="0.226318"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:21:30.591827" elapsed="0.226493"/>
</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-08-22T23:21:30.831646" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:30.831516" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:30.831494" elapsed="0.000224"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:30.832003" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:21:30.832109" 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-08-22T23:21:30.831870" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:30.833021" 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-08-22T23:21:30.832752" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:30.833455" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:30.833215" elapsed="0.000283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:30.834241" 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-08-22T23:21:30.834025" elapsed="0.000307">Dictionary does not contain key '3'.</status>
</kw>
<msg time="2026-08-22T23:21:30.834483" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:21:30.834530" 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-08-22T23:21:30.833670" elapsed="0.000883"/>
</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-08-22T23:21:30.834873" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:30.834650" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:30.834631" elapsed="0.000340"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:30.835906" level="INFO">${ip_address} = 10.30.170.79</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:21:30.835629" elapsed="0.000304"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:21:30.835984" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:21:30.836139" level="INFO">${odl_ip} = 10.30.170.79</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:21:30.835168" elapsed="0.000996"/>
</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-08-22T23:21:30.836317" elapsed="0.000437"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:30.837029" level="INFO">index=14
host=10.30.170.79
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-08-22T23:21:30.837128" level="INFO">${karaf_connection_object} = index=14
host=10.30.170.79
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:21:30.836923" elapsed="0.000231"/>
</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-08-22T23:21:30.837300" elapsed="0.002135"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:21:30.839876" level="INFO">Logging into '10.30.170.79:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:21:31.026498" 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-08-22T23:21:30.839617" elapsed="0.186984"/>
</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-08-22T23:21:31.029572" elapsed="0.000347"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:21:31.030079" elapsed="0.000146"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:21:31.030396" 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-08-22T23:21:31.027379" elapsed="0.003165"/>
</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-08-22T23:21:31.026857" elapsed="0.003754"/>
</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-08-22T23:21:30.831234" elapsed="0.199431"/>
</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-08-22T23:21:30.818935" elapsed="0.211777"/>
</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-08-22T23:21:30.818549" elapsed="0.212212"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:21:30.818413" elapsed="0.212388"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-08-22T23:21:30.385694" elapsed="0.645141"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-08-22T23:21:28.443301" elapsed="2.587591"/>
</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-08-22T23:21:31.033756" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:31.033642" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:31.033621" 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-08-22T23:21:31.038780" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:31.038672" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:31.038653" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:31.039791" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:31.039392" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:21:31.040279" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:21:31.039975" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:21:31.040349" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:21:31.040503" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:21:31.039067" elapsed="0.001460"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:31.045811" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:31.045703" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:31.045684" 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-08-22T23:21:31.047100" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:31.046972" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:31.046954" elapsed="0.000213"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:31.047644" 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-08-22T23:21:31.047307" elapsed="0.000364"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:31.048051" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:31.047826" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:31.085764" 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 "/ "n "e "t "[78Cc "[A[78Co</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:31.048749" elapsed="0.037150"/>
</kw>
<msg time="2026-08-22T23:21:31.086026" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:31.086072" 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-08-22T23:21:31.048232" elapsed="0.037877"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:31.137554" level="INFO">"n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "b "u "g "[78C8 "[A[78C0
 "8 "6 ". "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-08-22T23:21:31.086819" elapsed="0.050902"/>
</kw>
<msg time="2026-08-22T23:21:31.137848" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:31.137894" level="INFO">${message_wait} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:21:31.086275" elapsed="0.051657"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:31.138246" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:31.138007" elapsed="0.000423"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:31.137987" elapsed="0.000471"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:31.139081" level="INFO"> "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "b "u "g "[78C8 "[A[78C0
 "8 "6 ". "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-08-22T23:21:31.138725" elapsed="0.000456"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:31.139482" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:31.139249" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:31.139231" elapsed="0.000549"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:31.139815" 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-08-22T23:21:31.141811" elapsed="0.000579"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:21:31.142791" elapsed="0.000287"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:21:31.143434" elapsed="0.000252"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:21:31.141044" elapsed="0.002731"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:21:31.140070" elapsed="0.003837"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:21:31.046682" elapsed="0.097327"/>
</kw>
<msg time="2026-08-22T23:21:31.144102" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:31.144147" level="INFO">${message} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:21:31.046027" elapsed="0.098156"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:31.144365" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:21:31.144260" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:31.144241" 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-08-22T23:21:31.144911" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:31.145235" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:31.145306" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:21:31.045398" elapsed="0.100015"/>
</kw>
<msg time="2026-08-22T23:21:31.145506" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:31.145550" level="INFO">${output} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:21:31.040928" elapsed="0.104677"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:31.145973" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:31.145681" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:31.145664" elapsed="0.000387"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:21:31.040789" elapsed="0.105285"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:31.151302" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:31.151168" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:31.151150" 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-08-22T23:21:31.152531" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:31.152405" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:31.152388" elapsed="0.000236"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:31.153086" 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-08-22T23:21:31.152765" elapsed="0.000348"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:31.153488" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:31.153266" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:31.194712" 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 "/ "n "e "t "[78Cc "[A[78Co</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:31.154174" elapsed="0.040691"/>
</kw>
<msg time="2026-08-22T23:21:31.194995" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:31.195041" 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-08-22T23:21:31.153689" elapsed="0.041389"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:31.238677" level="INFO">"n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "b "u "g "[78C8 "[A[78C0
 "8 "6 ". "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-08-22T23:21:31.195914" elapsed="0.042912"/>
</kw>
<msg time="2026-08-22T23:21:31.238954" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:31.239000" level="INFO">${message_wait} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:21:31.195291" elapsed="0.043747"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:31.239357" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:31.239117" elapsed="0.000386"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:31.239096" elapsed="0.000434"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:31.240091" level="INFO"> "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "b "u "g "[78C8 "[A[78C0
 "8 "6 ". "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-08-22T23:21:31.239692" 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-08-22T23:21:31.240474" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:31.240241" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:31.240223" elapsed="0.000559"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:31.240818" 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-08-22T23:21:31.242747" elapsed="0.000444"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:21:31.243527" elapsed="0.000302"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:21:31.244171" elapsed="0.000230"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:21:31.241955" elapsed="0.002534"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:21:31.241082" 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-08-22T23:21:31.152123" elapsed="0.092624"/>
</kw>
<msg time="2026-08-22T23:21:31.244839" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:31.244957" level="INFO">${message} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:21:31.151517" elapsed="0.093480"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:31.245179" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:21:31.245073" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:31.245054" 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-08-22T23:21:31.245693" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:31.246269" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:31.246344" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:21:31.150878" elapsed="0.095575"/>
</kw>
<msg time="2026-08-22T23:21:31.246545" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:31.246675" level="INFO">${output} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:21:31.146331" elapsed="0.100384"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:31.247039" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:31.246791" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:31.246773" elapsed="0.000401"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:21:31.146195" elapsed="0.101008"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:31.252381" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:31.252273" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:31.252255" 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-08-22T23:21:31.253635" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:31.253487" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:31.253469" elapsed="0.000234"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:31.254158" 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-08-22T23:21:31.253843" elapsed="0.000342"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:31.254561" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:31.254339" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:31.291788" 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 "/ "n "e "t "[78Cc "[A[78Co</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:31.255248" elapsed="0.036667"/>
</kw>
<msg time="2026-08-22T23:21:31.292039" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:31.292084" 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-08-22T23:21:31.254762" elapsed="0.037359"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:31.336186" level="INFO">"n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "b "u "g "[78C8 "[A[78C0
 "8 "6 ". "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-08-22T23:21:31.292817" elapsed="0.043526"/>
</kw>
<msg time="2026-08-22T23:21:31.336477" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:31.336525" level="INFO">${message_wait} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:21:31.292283" elapsed="0.044280"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:31.336928" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:31.336673" elapsed="0.000407"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:31.336640" elapsed="0.000469"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:31.337649" level="INFO"> "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "b "u "g "[78C8 "[A[78C0
 "8 "6 ". "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-08-22T23:21:31.337259" 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-08-22T23:21:31.338130" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:31.337875" elapsed="0.000407"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:31.337848" elapsed="0.000462"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:31.338346" 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-08-22T23:21:31.340319" elapsed="0.000518"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:21:31.341187" elapsed="0.000292"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:21:31.341833" elapsed="0.000239"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:21:31.339530" elapsed="0.002633"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:21:31.338644" elapsed="0.003656"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:21:31.253205" elapsed="0.089198"/>
</kw>
<msg time="2026-08-22T23:21:31.342495" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:31.342541" level="INFO">${message} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:21:31.252610" elapsed="0.089972"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:31.342836" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:21:31.342723" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:31.342703" 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-08-22T23:21:31.343320" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:31.343793" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:31.343868" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:21:31.251960" elapsed="0.092019"/>
</kw>
<msg time="2026-08-22T23:21:31.344074" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:31.344118" level="INFO">${output} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:21:31.247467" elapsed="0.096689"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:31.344488" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:31.344232" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:31.344215" elapsed="0.000353"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:21:31.247329" elapsed="0.097281"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:21:31.040610" elapsed="0.304037"/>
</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-08-22T23:21:31.038358" elapsed="0.306361"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-08-22T23:21:31.031515" elapsed="0.313282"/>
</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-08-22T23:21:31.031088" elapsed="0.313755"/>
</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-08-22T23:21:28.438105" elapsed="2.906794"/>
</kw>
<kw name="Setup_NetconfKeywords" owner="NetconfKeywords">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:21:31.345806" level="INFO">${tmp} = {}</msg>
<var>${tmp}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:21:31.345469" elapsed="0.000364"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:31.350322" level="INFO">${NetconfKeywords__mounted_device_types} = {}</msg>
<arg>${NetconfKeywords__mounted_device_types}</arg>
<arg>${tmp}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:21:31.345995" elapsed="0.004380"/>
</kw>
<if>
<branch type="IF" condition="${create_session_for_templated_requests}">
<kw name="Create_Default_Session" owner="TemplatedRequests">
<arg>timeout=2</arg>
<doc>Create "default" session to ${url} with authentication and connection parameters.
This Keyword is in this Resource only so that user do not need to call RequestsLibrary directly.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:31.353878" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:31.350451" elapsed="0.003491"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:31.350431" elapsed="0.003536"/>
</if>
<kw name="Initialize_Artifact_Deployment_And_Usage" owner="NexusKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:31.359113" level="INFO">${odl_connection} = 19</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:21:31.358726" elapsed="0.000418"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:21:31.360789" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:21:31.360895" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:21:31.360491" elapsed="0.000431"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:21:31.361079" elapsed="0.000317"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:21:31.362253" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:21:31.678605" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:21:28 UTC 2026

  System load:  0.03               Processes:             122
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:21:29 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:21:31.361933" elapsed="0.316794"/>
</kw>
<msg time="2026-08-22T23:21:31.678787" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:31.361560" elapsed="0.317282"/>
</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-08-22T23:21:31.360057" elapsed="0.318867"/>
</kw>
<msg time="2026-08-22T23:21:31.678973" 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-08-22T23:21:31.359671" elapsed="0.319346"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:21:31.359325" elapsed="0.319763"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:21:31.679127" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:21:31.679283" level="INFO">${odl} = 19</msg>
<var>${odl}</var>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:21:31.358393" elapsed="0.320915"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-08-22T23:21:31.689430" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-08-22T23:21:31.697991" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../../tools/deployment/search.sh' -&gt; '/home/jenkins//search.sh'</msg>
<arg>/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../../tools/deployment/search.sh</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-08-22T23:21:31.679488" elapsed="0.018636"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:21:31.698471" elapsed="0.000529"/>
</kw>
<if>
<branch type="IF" condition="not (${tools_system_connect})">
<return>
<status status="NOT RUN" start="2026-08-22T23:21:31.699425" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:31.699156" elapsed="0.000413"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:31.699114" elapsed="0.000538"/>
</if>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:31.706516" level="INFO">${tools_connection} = 20</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-08-22T23:21:31.706006" elapsed="0.000548"/>
</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-08-22T23:21:31.708703" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:21:31.708781" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:21:31.708420" 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-08-22T23:21:31.708958" elapsed="0.000319"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:21:31.710154" level="INFO">Logging into '10.30.171.196:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:21:32.342847" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:21:31 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:16:34 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:21:31.709825" elapsed="0.633132"/>
</kw>
<msg time="2026-08-22T23:21:32.343028" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:31.709439" elapsed="0.633653"/>
</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-08-22T23:21:31.707883" elapsed="0.635303"/>
</kw>
<msg time="2026-08-22T23:21:32.343235" 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-08-22T23:21:31.707286" elapsed="0.635993"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-08-22T23:21:31.706830" elapsed="0.636519"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-08-22T23:21:32.343393" elapsed="0.000038"/>
</return>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:21:31.705511" elapsed="0.638036"/>
</kw>
<doc>Places search utility to ODL system, which will be needed for version detection.
By default also initialize a SSH connection to Tools system,
as following Keywords assume a working connection towards target system.</doc>
<status status="PASS" start="2026-08-22T23:21:31.354216" elapsed="0.989400"/>
</kw>
<arg>create_session_for_templated_requests=False</arg>
<doc>Setup the environment for the other keywords of this Resource to work properly.</doc>
<status status="PASS" start="2026-08-22T23:21:31.345172" elapsed="0.998496"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:21:32.344270" level="INFO">Creating Session using : alias=node1, url=http://10.30.170.200:8181, headers={'Content-Type': 'application/xml'},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396b845d950&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>node1</arg>
<arg>http://${ODL_SYSTEM_1_IP}:${RESTCONFPORT}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-08-22T23:21:32.343860" elapsed="0.000653"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:21:32.345000" level="INFO">Creating Session using : alias=node2, url=http://10.30.170.12:8181, headers={'Content-Type': 'application/xml'},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396b844a9d0&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>node2</arg>
<arg>http://${ODL_SYSTEM_2_IP}:${RESTCONFPORT}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-08-22T23:21:32.344693" elapsed="0.000434"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:21:32.345604" level="INFO">Creating Session using : alias=node3, url=http://10.30.170.79:8181, headers={'Content-Type': 'application/xml'},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396b8829210&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>node3</arg>
<arg>http://${ODL_SYSTEM_3_IP}:${RESTCONFPORT}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-08-22T23:21:32.345288" elapsed="0.000446"/>
</kw>
<kw name="List_All_Indices" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:32.350791" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:32.350365" elapsed="0.000455"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:21:32.351287" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:21:32.350979" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:21:32.351358" elapsed="0.000029"/>
</return>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:21:32.348329" elapsed="0.003154"/>
</kw>
<msg time="2026-08-22T23:21:32.351521" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>List_Indices_Or_All</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:32.346193" elapsed="0.005374"/>
</kw>
<msg time="2026-08-22T23:21:32.351685" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<doc>Create a new list of all indices.</doc>
<status status="PASS" start="2026-08-22T23:21:32.345957" elapsed="0.005753"/>
</kw>
<kw name="Safe_With_Ssh_To_List_Or_All_Run_Keyword" owner="ClusterManagement">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:32.352896" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:21:32.352777" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="With_Ssh_To_List_Or_All_Run_Keyword" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>This keyword is experimental and there is high risk of being replaced by another approach.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:21:32.354062" elapsed="0.000215"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:32.355196" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:32.354824" elapsed="0.000399"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:21:32.355698" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:21:32.355378" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:21:32.355769" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:21:32.355922" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:21:32.354481" elapsed="0.001465"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:32.356895" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:21:32.356624" elapsed="0.000297"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:21:32.356970" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:21:32.357118" level="INFO">${member_ip} = 10.30.170.200</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:21:32.356335" elapsed="0.000807"/>
</kw>
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:32.358625" level="INFO">${odl_connection} = 21</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:21:32.358228" elapsed="0.000424"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:21:32.361290" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:21:32.361527" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:21:32.360661" elapsed="0.000974"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:21:32.361952" elapsed="0.000706"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:21:32.364320" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:21:32.704010" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:21:28 UTC 2026

  System load:  0.03               Processes:             122
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:21:31 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:21:32.363896" elapsed="0.340251"/>
</kw>
<msg time="2026-08-22T23:21:32.704242" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:32.363025" elapsed="0.341392"/>
</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-08-22T23:21:32.359719" elapsed="0.344997"/>
</kw>
<msg time="2026-08-22T23:21:32.704772" 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-08-22T23:21:32.359314" elapsed="0.345509"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:21:32.358829" elapsed="0.346072"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:21:32.704944" elapsed="0.000034"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.200 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:21:32.357918" elapsed="0.347171"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Populate_Schema_Directory_Over_Active_Connection">
<kw name="Deploy_Artifact" owner="NexusKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_url}""" != ""</arg>
<arg>Deploy_From_Url</arg>
<arg>${explicit_url}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:32.724640" elapsed="0.000672"/>
</kw>
<kw name="Fetch From Left" owner="String">
<msg time="2026-08-22T23:21:32.725973" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot</msg>
<var>${urlbase}</var>
<arg>${BUNDLE_URL}</arg>
<arg>/org/opendaylight</arg>
<doc>Returns contents of the ``string`` before the first occurrence of ``marker``.</doc>
<status status="PASS" start="2026-08-22T23:21:32.725481" elapsed="0.000522"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:32.727048" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot</msg>
<var>${urlbase}</var>
<arg>'${urlbase}' != '${BUNDLE_URL}'</arg>
<arg>${urlbase}</arg>
<arg>${fallback_url}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:32.726174" elapsed="0.000903"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Magnesium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_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-08-22T23:21:32.763392" elapsed="0.000464"/>
</kw>
<arg>magnesium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to titanium and in case titanium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'carpeople'] {} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:21:32.762787" elapsed="0.001181"/>
</kw>
<msg time="2026-08-22T23:21:32.764043" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>magnesium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:32.753505" elapsed="0.010682"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>carpeople</arg>
<doc>Compare magnesium to titanium and in case titanium is at most magnesium,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:21:32.753042" elapsed="0.011382"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Aluminium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_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-08-22T23:21:32.799939" elapsed="0.000430"/>
</kw>
<arg>aluminium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to titanium and in case titanium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'netconf'] {} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:21:32.799344" elapsed="0.001143"/>
</kw>
<msg time="2026-08-22T23:21:32.800564" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>aluminium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:32.790178" elapsed="0.010563"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>netconf</arg>
<doc>Compare aluminium to titanium and in case titanium is at most aluminium,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:21:32.789533" elapsed="0.011449"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Silicon" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_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-08-22T23:21:32.836982" elapsed="0.000410"/>
</kw>
<arg>silicon</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to titanium and in case titanium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'bgpcep'] {} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:21:32.836388" elapsed="0.001145"/>
</kw>
<msg time="2026-08-22T23:21:32.837630" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>silicon</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:32.826961" elapsed="0.010820"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>bgpcep</arg>
<doc>Compare silicon to titanium and in case titanium is at most silicon,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:21:32.826487" elapsed="0.011536"/>
</kw>
<if>
<branch type="IF" condition="'${build_version}'=='${EMPTY}'">
<kw name="NexusKeywords__Detect_Version_To_Pull" owner="NexusKeywords">
<kw name="NexusKeywords__Get_Items_To_Look_At" owner="NexusKeywords">
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<arg>Component not supported by NexusKeywords version detection: ${component}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:21:32.847012" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:21:32.847980" elapsed="0.000189"/>
</kw>
<msg time="2026-08-22T23:21:32.848216" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Collections.Get_From_Dictionary</arg>
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:32.847489" elapsed="0.000779"/>
</kw>
<msg time="2026-08-22T23:21:32.848560" level="INFO">${itemlist} = clustering-it-model</msg>
<var>${itemlist}</var>
<arg>${component}</arg>
<doc>Get a list of items that might contain the version number that we are looking for.</doc>
<status status="PASS" start="2026-08-22T23:21:32.846492" elapsed="0.002137"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:32.850118" level="INFO">index=21
host=10.30.170.200
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:21:32.849834" elapsed="0.000577"/>
</kw>
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:32.856983" level="INFO">${odl_connection} = 22</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:21:32.856555" elapsed="0.000455"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:21:32.858690" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:21:32.858769" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:21:32.858390" 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-08-22T23:21:32.858946" elapsed="0.000318"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:21:32.860193" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:21:33.190026" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:21:28 UTC 2026

  System load:  0.03               Processes:             122
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:21:32 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:21:32.859869" elapsed="0.330242"/>
</kw>
<msg time="2026-08-22T23:21:33.190171" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:32.859427" elapsed="0.330807"/>
</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-08-22T23:21:32.857957" elapsed="0.332358"/>
</kw>
<msg time="2026-08-22T23:21:33.190362" 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-08-22T23:21:32.857544" elapsed="0.332864"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:21:32.857215" elapsed="0.333315"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:21:33.190620" elapsed="0.000039"/>
</return>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:21:32.855976" elapsed="0.334917"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:33.192505" level="INFO">Executing command 'sh search.sh /tmp/netconf-karaf-9.0.4-SNAPSHOT/system clustering-it-model'.</msg>
<msg time="2026-08-22T23:21:33.225296" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:21:33.226019" level="INFO">${version} = 11.0.5
org/opendaylight/controller/samples</msg>
<msg time="2026-08-22T23:21:33.226234" level="INFO">${result} = 0</msg>
<var>${version}</var>
<var>${result}</var>
<arg>sh search.sh ${WORKSPACE}/${BUNDLEFOLDER}/system ${itemlist}</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:21:33.192106" elapsed="0.034251"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:21:33.229158" elapsed="0.001060"/>
</kw>
<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-08-22T23:21:33.237064" elapsed="0.000204"/>
</kw>
<msg time="2026-08-22T23:21:33.237327" 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-08-22T23:21:33.236173" 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-08-22T23:21:33.237707" elapsed="0.000034"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:33.238002" elapsed="0.000032"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:21:33.232413" elapsed="0.005865"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:33.240169" level="INFO">11.0.5
org/opendaylight/controller/samples</msg>
<arg>${version}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:33.239722" elapsed="0.000550"/>
</kw>
<if>
<branch type="IF" condition="${result}!=0">
<kw name="Fail" owner="BuiltIn">
<arg>Component "${component}": searching for "${itemlist}" found no version, cannot locate test tool.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:33.240825" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:33.240438" elapsed="0.000454"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:33.240361" elapsed="0.000575"/>
</if>
<kw name="Split String" owner="String">
<msg time="2026-08-22T23:21:33.242951" level="INFO">${version} = 11.0.5</msg>
<msg time="2026-08-22T23:21:33.243045" level="INFO">${location} = org/opendaylight/controller/samples</msg>
<var>${version}</var>
<var>${location}</var>
<arg>${version}</arg>
<arg>max_split=1</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-08-22T23:21:33.242166" elapsed="0.000927"/>
</kw>
<return>
<value>${version}</value>
<value>${location}</value>
<status status="PASS" start="2026-08-22T23:21:33.243177" elapsed="0.000072"/>
</return>
<msg time="2026-08-22T23:21:33.243650" level="INFO">${version} = 11.0.5</msg>
<msg time="2026-08-22T23:21:33.243819" level="INFO">${location} = org/opendaylight/controller/samples</msg>
<var>${version}</var>
<var>${location}</var>
<arg>${component}</arg>
<doc>Determine the exact Nexus directory to be used as a source for a particular test tool
Figure out what version of the tool needs to be pulled out of the
Nexus by looking at the version directory of the subsystem from
which the tool is being pulled. This code is REALLY UGLY but there
is no way around it until the bug
https://bugs.opendaylight.org/show_bug.cgi?id=5206 gets fixed.
I also don't want to depend on maven-metadata-local.xml and other
bits and pieces of ODL distribution which are not required for ODL
to function properly.</doc>
<status status="PASS" start="2026-08-22T23:21:32.845696" elapsed="0.398251"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:32.838117" elapsed="0.406101"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${version}</var>
<var>${location}</var>
<arg>${build_version}</arg>
<arg>${build_location}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:33.244401" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:33.244247" elapsed="0.000591"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:32.838089" elapsed="0.406776"/>
</if>
<if>
<branch type="IF" condition="'SNAPSHOT' in '${version}'">
<kw name="Remove Values From List" owner="Collections">
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>netconf</arg>
<arg>bgpcep</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:33.245169" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:33.244925" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:33.244908" elapsed="0.000579"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:33.246420" level="INFO">${is_staged} = "FALSE"</msg>
<var>${is_staged}</var>
<arg>"opendaylight.release" not in '${urlbase}' and "opendaylight.snapshot" not in '${urlbase}'</arg>
<arg>"TRUE"</arg>
<arg>"FALSE"</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:33.245656" elapsed="0.000791"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:33.247489" level="INFO">${is_mri_component} = "TRUE"</msg>
<var>${is_mri_component}</var>
<arg>'${component}' in ${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>"TRUE"</arg>
<arg>"FALSE"</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:33.246734" elapsed="0.000781"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:33.248478" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.release</msg>
<var>${urlbase}</var>
<arg>${is_mri_component} == "TRUE" and ${is_staged} == "FALSE"</arg>
<arg>${NEXUS_RELEASE_BASE_URL}</arg>
<arg>${urlbase}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:33.247698" elapsed="0.000807"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:33.249602" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories/opendaylight.release/org/opendaylight/controller/samples/clustering-it-model/11.0.5</msg>
<var>${url}</var>
<arg>${urlbase}/${location}/${artifact}/${version}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:33.248758" elapsed="0.000872"/>
</kw>
<kw name="Execute_Command_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:33.252403" level="INFO">Executing command 'curl -L https://nexus.opendaylight.org/content/repositories/opendaylight.release/org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml'.</msg>
<msg time="2026-08-22T23:21:33.336910" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:21:33.337164" level="INFO">${stdout} = &lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml not found in local storage of repository &amp;quot;opendaylight.release&amp;quot; [id=o...</msg>
<msg time="2026-08-22T23:21:33.337271" level="INFO">${stderr} =   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0   ...</msg>
<msg time="2026-08-22T23:21:33.337365" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:21:33.252215" elapsed="0.085200"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:21:33.339280" level="INFO">Length is 316.</msg>
<msg time="2026-08-22T23:21:33.339469" level="FAIL">'  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  1125    0  1125    0     0  19141      0 --:--:-- --:--:-- --:--:-- 19396' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-08-22T23:21:33.338685" elapsed="0.000969">'  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  1125    0  1125    0     0  19141      0 --:--:-- --:--:-- --:--:-- 19396' should be empty.</status>
</kw>
<msg time="2026-08-22T23:21:33.339897" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-08-22T23:21:33.339995" level="INFO">${result} = '  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0  ...</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:33.337863" elapsed="0.002185"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:33.341376" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:33.340413" elapsed="0.001021"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:33.343799" level="INFO">&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml not found in local storage of repository &amp;quot;opendaylight.release&amp;quot; [id=opendaylight.release]&lt;/title&gt;
    &lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"/&gt;

    &lt;link rel="icon" type="image/png" href="https://nexus.opendaylight.org/favicon.png"&gt;
    &lt;!--[if IE]&gt;
    &lt;link rel="SHORTCUT ICON" href="https://nexus.opendaylight.org/favicon.ico"/&gt;
    &lt;![endif]--&gt;

    &lt;link rel="stylesheet" href="https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02" type="text/css" media="screen" title="no title" charset="utf-8"&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;404 - Path /org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml not found in local storage of repository &amp;quot;opendaylight.release&amp;quot; [id=opendaylight.release]&lt;/h1&gt;
    &lt;p&gt;Path /org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml not found in local storage of repository &amp;quot;opendaylight.release&amp;quot; [id=opendaylight.release]&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:33.343217" elapsed="0.000713"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:33.345242" level="INFO">  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  1125    0  1125    0     0  19141      0 --:--:-- --:--:-- --:--:-- 19396</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:33.344261" elapsed="0.001087"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:33.346269" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:33.345722" elapsed="0.000645"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:21:33.342388" elapsed="0.004104"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:33.341639" elapsed="0.005039"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:33.341562" elapsed="0.005182"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:21:33.347106" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:33.346878" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:33.346838" elapsed="0.000391"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:21:33.347368" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:21:33.347280" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:33.347265" elapsed="0.000305"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:33.347730" elapsed="0.000023"/>
</kw>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:21:33.251448" elapsed="0.096444"/>
</kw>
<msg time="2026-08-22T23:21:33.347980" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:33.250322" elapsed="0.097809"/>
</kw>
<msg time="2026-08-22T23:21:33.348499" level="INFO">${metadata} = &lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml not found in local storage of repository &amp;quot;opendaylight.release&amp;quot; [id=o...</msg>
<var>${metadata}</var>
<arg>curl -L ${url}/maven-metadata.xml</arg>
<doc>A wrapper for Execute_Command_Passes with return_success_only=False
Also, log_on_success defaults to True (but is customizable, unlike return_success_only)..</doc>
<status status="PASS" start="2026-08-22T23:21:33.249835" elapsed="0.098693"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:33.352047" level="INFO">Executing command 'echo "&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml not found in local storage of repository &amp;quot;opendaylight.release&amp;quot; [id=opendaylight.release]&lt;/title&gt;
    &lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"/&gt;

    &lt;link rel="icon" type="image/png" href="https://nexus.opendaylight.org/favicon.png"&gt;
    &lt;!--[if IE]&gt;
    &lt;link rel="SHORTCUT ICON" href="https://nexus.opendaylight.org/favicon.ico"/&gt;
    &lt;![endif]--&gt;

    &lt;link rel="stylesheet" href="https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02" type="text/css" media="screen" title="no title" charset="utf-8"&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;404 - Path /org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml not found in local storage of repository &amp;quot;opendaylight.release&amp;quot; [id=opendaylight.release]&lt;/h1&gt;
    &lt;p&gt;Path /org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml not found in local storage of repository &amp;quot;opendaylight.release&amp;quot; [id=opendaylight.release]&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1'.</msg>
<msg time="2026-08-22T23:21:33.394094" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:21:33.394350" level="INFO">${stdout} = &lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml not found in local storage of repository &amp;quot;opendaylight.release&amp;quot; [id=o...</msg>
<msg time="2026-08-22T23:21:33.394456" level="INFO">${stderr} = bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text...</msg>
<msg time="2026-08-22T23:21:33.394550" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:21:33.351867" elapsed="0.042774"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:21:33.396454" level="INFO">Length is 253.</msg>
<msg time="2026-08-22T23:21:33.396667" level="FAIL">'bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-08-22T23:21:33.395875" elapsed="0.000934">'bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory' should be empty.</status>
</kw>
<msg time="2026-08-22T23:21:33.397043" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-08-22T23:21:33.397140" level="INFO">${result} = 'bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=tex...</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:33.395078" elapsed="0.002119"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:33.398517" level="INFO">${success} = False</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:33.397563" elapsed="0.001011"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:33.400951" level="INFO">&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml not found in local storage of repository &amp;quot;opendaylight.release&amp;quot; [id=opendaylight.release]&lt;/title&gt;
    &lt;meta http-equiv=Content-Type content=text/html</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:33.400355" elapsed="0.000705"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:33.401999" level="INFO">bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:33.401390" elapsed="0.000713"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:33.403043" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:33.402426" elapsed="0.000714"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:21:33.399543" elapsed="0.003671"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:33.398782" elapsed="0.004467"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:33.398738" elapsed="0.004535"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:21:33.403429" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:33.403328" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:33.403311" elapsed="0.000183"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-08-22T23:21:33.403651" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:33.403544" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:33.403529" elapsed="0.000186"/>
</if>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-08-22T23:21:33.404202" level="FAIL">Got rc: 0 or stderr was not empty: bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory</msg>
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-08-22T23:21:33.403855" elapsed="0.000446">Got rc: 0 or stderr was not empty: bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory</status>
</kw>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="FAIL" start="2026-08-22T23:21:33.351307" elapsed="0.053128">Got rc: 0 or stderr was not empty: bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory</status>
</kw>
<msg time="2026-08-22T23:21:33.404494" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-08-22T23:21:33.350690" elapsed="0.053913"/>
</kw>
<arg>echo "${metadata}" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1</arg>
<arg>stderr_must_be_empty=${True}</arg>
<doc>A wrapper for Execute_Command_Passes with return_success_only=False
Also, log_on_success defaults to True (but is customizable, unlike return_success_only)..</doc>
<status status="FAIL" start="2026-08-22T23:21:33.349486" elapsed="0.055352">Got rc: 0 or stderr was not empty: bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory</status>
</kw>
<msg time="2026-08-22T23:21:33.405063" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:21:33.405108" level="INFO">${namepart} = Got rc: 0 or stderr was not empty: bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonaty...</msg>
<var>${status}</var>
<var>${namepart}</var>
<arg>SSHKeywords.Execute_Command_Should_Pass</arg>
<arg>echo "${metadata}" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1</arg>
<arg>stderr_must_be_empty=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:33.348718" elapsed="0.056415"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:21:33.405858" level="INFO">Length is 288.</msg>
<msg time="2026-08-22T23:21:33.405942" level="INFO">${length} = 288</msg>
<var>${length}</var>
<arg>${namepart}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:21:33.405300" elapsed="0.000665"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:33.406951" level="INFO">${namepart} = 11.0.5</msg>
<var>${namepart}</var>
<arg>"${status}" != "PASS" or ${length} == 0</arg>
<arg>${version}</arg>
<arg>${namepart}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:33.406126" elapsed="0.000855"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:33.407902" level="INFO">${filename} = clustering-it-model-11.0.5-sources.jar</msg>
<var>${filename}</var>
<arg>${name_prefix}${namepart}${name_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:33.407142" elapsed="0.000786"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:33.408606" level="INFO">clustering-it-model-11.0.5-sources.jar</msg>
<arg>${filename}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:33.408086" elapsed="0.000567"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:33.409446" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories/opendaylight.release/org/opendaylight/controller/samples/clustering-it-model/11.0.5/clustering-it-model-11.0.5-sources.jar</msg>
<var>${url}</var>
<arg>${url}/${filename}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:33.408802" elapsed="0.000671"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:33.409908" level="INFO">Executing command 'wget -q -N 'https://nexus.opendaylight.org/content/repositories/opendaylight.release/org/opendaylight/controller/samples/clustering-it-model/11.0.5/clustering-it-model-11.0.5-sources.jar' 2&gt;&amp;1'.</msg>
<msg time="2026-08-22T23:21:33.476652" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:21:33.477086" level="INFO">${response} = </msg>
<msg time="2026-08-22T23:21:33.477197" level="INFO">${result} = 0</msg>
<var>${response}</var>
<var>${result}</var>
<arg>wget -q -N '${url}' 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:21:33.409658" elapsed="0.067595"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:33.479170" level="INFO"/>
<arg>${response}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:33.477765" elapsed="0.001514"/>
</kw>
<if>
<branch type="IF" condition="${result} == 0">
<return>
<value>${filename}</value>
<status status="PASS" start="2026-08-22T23:21:33.479899" elapsed="0.000633"/>
</return>
<status status="PASS" start="2026-08-22T23:21:33.479516" elapsed="0.001152"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:33.479460" elapsed="0.001271"/>
</if>
<kw name="Replace String Using Regexp" owner="String">
<var>${release_url}</var>
<arg>${url}</arg>
<arg>autorelease-[0-9]{4}</arg>
<arg>opendaylight.release</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:33.481102" elapsed="0.000061"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${response}</var>
<var>${result}</var>
<arg>wget -q -N '${release_url}' 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:33.481798" elapsed="0.000065"/>
</kw>
<if>
<branch type="IF" condition="${result} != 0">
<kw name="Fail" owner="BuiltIn">
<arg>Artifact "${artifact}" in component "${component}" could not be downloaded from ${release_url} nor ${url}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:33.482397" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:33.482048" elapsed="0.000919"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:33.482005" elapsed="0.001123"/>
</if>
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-08-22T23:21:33.483225" elapsed="0.000047"/>
</return>
<msg time="2026-08-22T23:21:33.483830" level="INFO">${filename} = clustering-it-model-11.0.5-sources.jar</msg>
<var>${filename}</var>
<arg>component=carpeople</arg>
<arg>artifact=clustering-it-model</arg>
<arg>name_suffix=-sources.jar</arg>
<doc>Deploy the specified artifact from Nexus to the cwd of the machine to which the active SSHLibrary connection points.
${component} is a name part of an artifact present in system/ of ODl installation with the same version as ${artifact} should have.
Must have https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-karaf/9.0.4-SNAPSHOT/netconf-karaf-9.0.4-20260822.052751-14.zip variable set to the URL from which the
tested ODL distribution was downloaded and this place must be
inside a repository created by a standard distribution
construction job. If this is detected to ne be the case, fallback URL is used.
If ${explicit_url} is non-empty, Deploy_From_Utrl is called instead.
TODO: Allow deploying to a specific directory, we have SSHKeywords.Execute_Command_At_Cwd_Should_Pass now.</doc>
<status status="PASS" start="2026-08-22T23:21:32.718463" elapsed="0.765471"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:33.485227" level="INFO">${dir} = '/tmp/schema'</msg>
<var>${dir}</var>
<arg>'${SCHEMA_DIRECTORY}'</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:33.484355" elapsed="0.000937"/>
</kw>
<kw name="Execute_Command_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:33.491323" level="INFO">Executing command 'mkdir -p '/tmp/schema' &amp;&amp; unzip -j 'clustering-it-model-11.0.5-sources.jar' META-INF/yang/car@2014-08-18.yang -d '/tmp/schema/' &amp;&amp; rm 'clustering-it-model-11.0.5-sources.jar''.</msg>
<msg time="2026-08-22T23:21:33.530189" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:21:33.530565" level="INFO">${stdout} = Archive:  clustering-it-model-11.0.5-sources.jar
  inflating: /tmp/schema/car@2014-08-18.yang  </msg>
<msg time="2026-08-22T23:21:33.530732" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:21:33.530833" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:21:33.491023" elapsed="0.039916"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:21:33.533670" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:21:33.532909" elapsed="0.000899"/>
</kw>
<msg time="2026-08-22T23:21:33.534175" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:21:33.534287" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:33.531794" elapsed="0.002591"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:33.536637" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:33.535253" elapsed="0.001458"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:33.538834" level="INFO">Archive:  clustering-it-model-11.0.5-sources.jar
  inflating: /tmp/schema/car@2014-08-18.yang  </msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:33.538450" elapsed="0.000448"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:33.539457" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:33.539106" elapsed="0.000408"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:33.540126" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:33.539786" elapsed="0.000401"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:21:33.537942" elapsed="0.002320"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:33.537041" elapsed="0.003307"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:33.536964" elapsed="0.003457"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:21:33.541012" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:33.540765" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:33.540697" elapsed="0.000472"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:21:33.541679" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:21:33.541419" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:33.541357" elapsed="0.000506"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:33.542251" elapsed="0.000118"/>
</kw>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:21:33.489431" elapsed="0.053167"/>
</kw>
<msg time="2026-08-22T23:21:33.542833" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:33.486970" elapsed="0.055966"/>
</kw>
<arg>mkdir -p '${SCHEMA_DIRECTORY}' &amp;&amp; unzip -j '${filename}' META-INF/yang/car@2014-08-18.yang -d '${SCHEMA_DIRECTORY}/' &amp;&amp; rm '${filename}'</arg>
<doc>A wrapper for Execute_Command_Passes with return_success_only=False
Also, log_on_success defaults to True (but is customizable, unlike return_success_only)..</doc>
<status status="PASS" start="2026-08-22T23:21:33.485844" elapsed="0.057207"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Create /tmp/schema, unpack car.yang there from temporarily downloaded sources jar.
TODO: Make this configurable and move to NexusKeywords.</doc>
<status status="PASS" start="2026-08-22T23:21:32.705833" elapsed="0.837297"/>
</kw>
<msg time="2026-08-22T23:21:33.543315" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:33.543379" level="INFO">${result} = None</msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:32.705264" elapsed="0.838147"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:21:33.543672" elapsed="0.000353"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:21:33.544257" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:21:33.544119" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:33.544094" elapsed="0.000245"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:33.544481" elapsed="0.000022"/>
</kw>
<arg>${member_ip}</arg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:21:32.357401" elapsed="1.187242"/>
</kw>
<var name="${member_index}">1</var>
<status status="PASS" start="2026-08-22T23:21:32.356169" elapsed="1.188521"/>
</iter>
<iter>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:33.545519" level="INFO">${ip_address} = 10.30.170.12</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:21:33.545246" elapsed="0.000299"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:21:33.545609" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:21:33.545761" level="INFO">${member_ip} = 10.30.170.12</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:21:33.544972" elapsed="0.000813"/>
</kw>
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:33.547288" level="INFO">${odl_connection} = 23</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:21:33.546866" elapsed="0.000448"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:21:33.550118" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:21:33.550363" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:21:33.549471" 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-08-22T23:21:33.550753" elapsed="0.000683"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:21:33.553147" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:21:33.880794" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:21:29 UTC 2026

  System load:  0.04               Processes:             123
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:21:29 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:21:33.552733" elapsed="0.328199"/>
</kw>
<msg time="2026-08-22T23:21:33.881024" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:33.551854" elapsed="0.329337"/>
</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-08-22T23:21:33.548510" elapsed="0.332928"/>
</kw>
<msg time="2026-08-22T23:21:33.881491" 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-08-22T23:21:33.547888" elapsed="0.333653"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:21:33.547494" elapsed="0.334146"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:21:33.881683" elapsed="0.000034"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.12 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:21:33.546541" elapsed="0.335317"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Populate_Schema_Directory_Over_Active_Connection">
<kw name="Deploy_Artifact" owner="NexusKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_url}""" != ""</arg>
<arg>Deploy_From_Url</arg>
<arg>${explicit_url}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:33.900844" elapsed="0.000642"/>
</kw>
<kw name="Fetch From Left" owner="String">
<msg time="2026-08-22T23:21:33.902107" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot</msg>
<var>${urlbase}</var>
<arg>${BUNDLE_URL}</arg>
<arg>/org/opendaylight</arg>
<doc>Returns contents of the ``string`` before the first occurrence of ``marker``.</doc>
<status status="PASS" start="2026-08-22T23:21:33.901680" elapsed="0.000456"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:33.903086" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot</msg>
<var>${urlbase}</var>
<arg>'${urlbase}' != '${BUNDLE_URL}'</arg>
<arg>${urlbase}</arg>
<arg>${fallback_url}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:33.902304" elapsed="0.000857"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Magnesium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_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-08-22T23:21:33.938417" elapsed="0.000443"/>
</kw>
<arg>magnesium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to titanium and in case titanium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'carpeople'] {} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:21:33.937829" elapsed="0.001139"/>
</kw>
<msg time="2026-08-22T23:21:33.939040" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>magnesium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:33.928455" elapsed="0.010730"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>carpeople</arg>
<doc>Compare magnesium to titanium and in case titanium is at most magnesium,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:21:33.927991" elapsed="0.011422"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Aluminium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_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-08-22T23:21:33.973845" elapsed="0.000433"/>
</kw>
<arg>aluminium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to titanium and in case titanium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'netconf'] {} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:21:33.973256" elapsed="0.001127"/>
</kw>
<msg time="2026-08-22T23:21:33.974455" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>aluminium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:33.964051" elapsed="0.010562"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>netconf</arg>
<doc>Compare aluminium to titanium and in case titanium is at most aluminium,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:21:33.963325" elapsed="0.011518"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Silicon" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_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-08-22T23:21:34.009794" elapsed="0.000422"/>
</kw>
<arg>silicon</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to titanium and in case titanium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'bgpcep'] {} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:21:34.009203" elapsed="0.001121"/>
</kw>
<msg time="2026-08-22T23:21:34.010395" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>silicon</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:33.999836" elapsed="0.010737"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>bgpcep</arg>
<doc>Compare silicon to titanium and in case titanium is at most silicon,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:21:33.999147" elapsed="0.011676"/>
</kw>
<if>
<branch type="IF" condition="'${build_version}'=='${EMPTY}'">
<kw name="NexusKeywords__Detect_Version_To_Pull" owner="NexusKeywords">
<kw name="NexusKeywords__Get_Items_To_Look_At" owner="NexusKeywords">
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<arg>Component not supported by NexusKeywords version detection: ${component}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:21:34.019438" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:21:34.020255" elapsed="0.000213"/>
</kw>
<msg time="2026-08-22T23:21:34.020514" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Collections.Get_From_Dictionary</arg>
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:34.019894" elapsed="0.000671"/>
</kw>
<msg time="2026-08-22T23:21:34.020862" level="INFO">${itemlist} = clustering-it-model</msg>
<var>${itemlist}</var>
<arg>${component}</arg>
<doc>Get a list of items that might contain the version number that we are looking for.</doc>
<status status="PASS" start="2026-08-22T23:21:34.018955" elapsed="0.001956"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:34.022570" level="INFO">index=23
host=10.30.170.12
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:21:34.022818" level="INFO">${current_ssh_connection} = index=23
host=10.30.170.12
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:21:34.022282" elapsed="0.000588"/>
</kw>
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:34.029417" level="INFO">${odl_connection} = 24</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:21:34.029019" elapsed="0.000425"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:21:34.031416" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:21:34.031495" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:21:34.031149" elapsed="0.000370"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:34.031792" elapsed="0.000322"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:21:34.032992" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:21:34.353485" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:21:28 UTC 2026

  System load:  0.03               Processes:             122
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:21:33 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:21:34.032671" elapsed="0.320944"/>
</kw>
<msg time="2026-08-22T23:21:34.353687" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:34.032287" elapsed="0.321484"/>
</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-08-22T23:21:34.030699" elapsed="0.323172"/>
</kw>
<msg time="2026-08-22T23:21:34.353921" 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-08-22T23:21:34.030278" elapsed="0.323694"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:21:34.029947" elapsed="0.324101"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:21:34.354130" elapsed="0.000049"/>
</return>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:21:34.028408" elapsed="0.326023"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:34.356101" level="INFO">Executing command 'sh search.sh /tmp/netconf-karaf-9.0.4-SNAPSHOT/system clustering-it-model'.</msg>
<msg time="2026-08-22T23:21:34.388847" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:21:34.389152" level="INFO">${version} = 11.0.5
org/opendaylight/controller/samples</msg>
<msg time="2026-08-22T23:21:34.389248" level="INFO">${result} = 0</msg>
<var>${version}</var>
<var>${result}</var>
<arg>sh search.sh ${WORKSPACE}/${BUNDLEFOLDER}/system ${itemlist}</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:21:34.355685" elapsed="0.033611"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:21:34.390518" elapsed="0.000508"/>
</kw>
<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-08-22T23:21:34.395902" elapsed="0.000145"/>
</kw>
<msg time="2026-08-22T23:21:34.396090" 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-08-22T23:21:34.395250" elapsed="0.000893"/>
</kw>
<kw name="Open 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-08-22T23:21:34.396342" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:34.396538" elapsed="0.000023"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:21:34.392470" elapsed="0.004276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:34.398381" level="INFO">11.0.5
org/opendaylight/controller/samples</msg>
<arg>${version}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:34.397943" elapsed="0.000540"/>
</kw>
<if>
<branch type="IF" condition="${result}!=0">
<kw name="Fail" owner="BuiltIn">
<arg>Component "${component}": searching for "${itemlist}" found no version, cannot locate test tool.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:34.399133" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:34.398798" elapsed="0.000402"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:34.398568" elapsed="0.000674"/>
</if>
<kw name="Split String" owner="String">
<msg time="2026-08-22T23:21:34.401027" level="INFO">${version} = 11.0.5</msg>
<msg time="2026-08-22T23:21:34.401121" level="INFO">${location} = org/opendaylight/controller/samples</msg>
<var>${version}</var>
<var>${location}</var>
<arg>${version}</arg>
<arg>max_split=1</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-08-22T23:21:34.400431" elapsed="0.000737"/>
</kw>
<return>
<value>${version}</value>
<value>${location}</value>
<status status="PASS" start="2026-08-22T23:21:34.401250" elapsed="0.000072"/>
</return>
<msg time="2026-08-22T23:21:34.401732" level="INFO">${version} = 11.0.5</msg>
<msg time="2026-08-22T23:21:34.401896" level="INFO">${location} = org/opendaylight/controller/samples</msg>
<var>${version}</var>
<var>${location}</var>
<arg>${component}</arg>
<doc>Determine the exact Nexus directory to be used as a source for a particular test tool
Figure out what version of the tool needs to be pulled out of the
Nexus by looking at the version directory of the subsystem from
which the tool is being pulled. This code is REALLY UGLY but there
is no way around it until the bug
https://bugs.opendaylight.org/show_bug.cgi?id=5206 gets fixed.
I also don't want to depend on maven-metadata-local.xml and other
bits and pieces of ODL distribution which are not required for ODL
to function properly.</doc>
<status status="PASS" start="2026-08-22T23:21:34.017865" elapsed="0.384157"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:34.010907" elapsed="0.391448"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${version}</var>
<var>${location}</var>
<arg>${build_version}</arg>
<arg>${build_location}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:34.402542" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:34.402387" elapsed="0.000616"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:34.010884" elapsed="0.392147"/>
</if>
<if>
<branch type="IF" condition="'SNAPSHOT' in '${version}'">
<kw name="Remove Values From List" owner="Collections">
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>netconf</arg>
<arg>bgpcep</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:34.403333" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:34.403093" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:34.403075" elapsed="0.000598"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:34.404553" level="INFO">${is_staged} = "FALSE"</msg>
<var>${is_staged}</var>
<arg>"opendaylight.release" not in '${urlbase}' and "opendaylight.snapshot" not in '${urlbase}'</arg>
<arg>"TRUE"</arg>
<arg>"FALSE"</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:34.403826" elapsed="0.000783"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:34.405522" level="INFO">${is_mri_component} = "TRUE"</msg>
<var>${is_mri_component}</var>
<arg>'${component}' in ${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>"TRUE"</arg>
<arg>"FALSE"</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:34.404780" elapsed="0.000768"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:34.406514" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.release</msg>
<var>${urlbase}</var>
<arg>${is_mri_component} == "TRUE" and ${is_staged} == "FALSE"</arg>
<arg>${NEXUS_RELEASE_BASE_URL}</arg>
<arg>${urlbase}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:34.405744" elapsed="0.000798"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:34.407778" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories/opendaylight.release/org/opendaylight/controller/samples/clustering-it-model/11.0.5</msg>
<var>${url}</var>
<arg>${urlbase}/${location}/${artifact}/${version}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:34.406939" elapsed="0.000867"/>
</kw>
<kw name="Execute_Command_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:34.410459" level="INFO">Executing command 'curl -L https://nexus.opendaylight.org/content/repositories/opendaylight.release/org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml'.</msg>
<msg time="2026-08-22T23:21:34.504306" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:21:34.504425" level="INFO">${stdout} = &lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml not found in local storage of repository &amp;quot;opendaylight.release&amp;quot; [id=o...</msg>
<msg time="2026-08-22T23:21:34.504474" level="INFO">${stderr} =   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0   ...</msg>
<msg time="2026-08-22T23:21:34.504515" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:21:34.410271" elapsed="0.094267"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:21:34.505376" level="INFO">Length is 316.</msg>
<msg time="2026-08-22T23:21:34.505468" level="FAIL">'  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  1125    0  1125    0     0  17698      0 --:--:-- --:--:-- --:--:-- 17857' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-08-22T23:21:34.505081" elapsed="0.000463">'  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  1125    0  1125    0     0  17698      0 --:--:-- --:--:-- --:--:-- 17857' should be empty.</status>
</kw>
<msg time="2026-08-22T23:21:34.505667" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-08-22T23:21:34.505712" level="INFO">${result} = '  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0  ...</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:34.504740" elapsed="0.000996"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:34.506351" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:34.505919" elapsed="0.000459"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:34.507647" level="INFO">&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml not found in local storage of repository &amp;quot;opendaylight.release&amp;quot; [id=opendaylight.release]&lt;/title&gt;
    &lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"/&gt;

    &lt;link rel="icon" type="image/png" href="https://nexus.opendaylight.org/favicon.png"&gt;
    &lt;!--[if IE]&gt;
    &lt;link rel="SHORTCUT ICON" href="https://nexus.opendaylight.org/favicon.ico"/&gt;
    &lt;![endif]--&gt;

    &lt;link rel="stylesheet" href="https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02" type="text/css" media="screen" title="no title" charset="utf-8"&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;404 - Path /org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml not found in local storage of repository &amp;quot;opendaylight.release&amp;quot; [id=opendaylight.release]&lt;/h1&gt;
    &lt;p&gt;Path /org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml not found in local storage of repository &amp;quot;opendaylight.release&amp;quot; [id=opendaylight.release]&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:34.507163" elapsed="0.000546"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:34.508149" level="INFO">  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  1125    0  1125    0     0  17698      0 --:--:-- --:--:-- --:--:-- 17857</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:34.507901" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:34.508605" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:34.508347" elapsed="0.000304"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:21:34.506815" elapsed="0.001892"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:34.506457" elapsed="0.002286"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:34.506436" elapsed="0.002332"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:21:34.508925" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:34.508824" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:34.508807" elapsed="0.000184"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:21:34.509131" elapsed="0.000052"/>
</return>
<status status="PASS" start="2026-08-22T23:21:34.509043" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:34.509028" elapsed="0.000216"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:34.509392" elapsed="0.000022"/>
</kw>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:21:34.409535" elapsed="0.100019"/>
</kw>
<msg time="2026-08-22T23:21:34.509661" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:34.408464" elapsed="0.101339"/>
</kw>
<msg time="2026-08-22T23:21:34.510117" level="INFO">${metadata} = &lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml not found in local storage of repository &amp;quot;opendaylight.release&amp;quot; [id=o...</msg>
<var>${metadata}</var>
<arg>curl -L ${url}/maven-metadata.xml</arg>
<doc>A wrapper for Execute_Command_Passes with return_success_only=False
Also, log_on_success defaults to True (but is customizable, unlike return_success_only)..</doc>
<status status="PASS" start="2026-08-22T23:21:34.408009" elapsed="0.102137"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:34.513622" level="INFO">Executing command 'echo "&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml not found in local storage of repository &amp;quot;opendaylight.release&amp;quot; [id=opendaylight.release]&lt;/title&gt;
    &lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"/&gt;

    &lt;link rel="icon" type="image/png" href="https://nexus.opendaylight.org/favicon.png"&gt;
    &lt;!--[if IE]&gt;
    &lt;link rel="SHORTCUT ICON" href="https://nexus.opendaylight.org/favicon.ico"/&gt;
    &lt;![endif]--&gt;

    &lt;link rel="stylesheet" href="https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02" type="text/css" media="screen" title="no title" charset="utf-8"&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;404 - Path /org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml not found in local storage of repository &amp;quot;opendaylight.release&amp;quot; [id=opendaylight.release]&lt;/h1&gt;
    &lt;p&gt;Path /org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml not found in local storage of repository &amp;quot;opendaylight.release&amp;quot; [id=opendaylight.release]&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1'.</msg>
<msg time="2026-08-22T23:21:34.555850" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:21:34.556113" level="INFO">${stdout} = &lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml not found in local storage of repository &amp;quot;opendaylight.release&amp;quot; [id=o...</msg>
<msg time="2026-08-22T23:21:34.556223" level="INFO">${stderr} = bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text...</msg>
<msg time="2026-08-22T23:21:34.556320" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:21:34.513428" elapsed="0.042944"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:21:34.558223" level="INFO">Length is 253.</msg>
<msg time="2026-08-22T23:21:34.558402" level="FAIL">'bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-08-22T23:21:34.557638" elapsed="0.000903">'bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory' should be empty.</status>
</kw>
<msg time="2026-08-22T23:21:34.558810" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-08-22T23:21:34.558906" level="INFO">${result} = 'bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=tex...</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:34.556812" elapsed="0.002151"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:34.560389" level="INFO">${success} = False</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:34.559409" elapsed="0.001040"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:34.562831" level="INFO">&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml not found in local storage of repository &amp;quot;opendaylight.release&amp;quot; [id=opendaylight.release]&lt;/title&gt;
    &lt;meta http-equiv=Content-Type content=text/html</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:34.562240" elapsed="0.000702"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:34.563877" level="INFO">bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:34.563287" elapsed="0.000696"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:34.564880" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:34.564315" elapsed="0.000662"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:21:34.561415" elapsed="0.003683"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:34.560661" elapsed="0.004515"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:34.560613" elapsed="0.004625"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:21:34.565701" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:34.565386" elapsed="0.000416"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:34.565341" elapsed="0.000509"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-08-22T23:21:34.566164" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:34.565966" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:34.565932" elapsed="0.000347"/>
</if>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-08-22T23:21:34.566780" level="FAIL">Got rc: 0 or stderr was not empty: bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory</msg>
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-08-22T23:21:34.566417" elapsed="0.000428">Got rc: 0 or stderr was not empty: bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory</status>
</kw>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="FAIL" start="2026-08-22T23:21:34.512853" elapsed="0.054118">Got rc: 0 or stderr was not empty: bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory</status>
</kw>
<msg time="2026-08-22T23:21:34.567029" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-08-22T23:21:34.512213" elapsed="0.054908"/>
</kw>
<arg>echo "${metadata}" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1</arg>
<arg>stderr_must_be_empty=${True}</arg>
<doc>A wrapper for Execute_Command_Passes with return_success_only=False
Also, log_on_success defaults to True (but is customizable, unlike return_success_only)..</doc>
<status status="FAIL" start="2026-08-22T23:21:34.511071" elapsed="0.056284">Got rc: 0 or stderr was not empty: bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory</status>
</kw>
<msg time="2026-08-22T23:21:34.567572" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:21:34.567640" level="INFO">${namepart} = Got rc: 0 or stderr was not empty: bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonaty...</msg>
<var>${status}</var>
<var>${namepart}</var>
<arg>SSHKeywords.Execute_Command_Should_Pass</arg>
<arg>echo "${metadata}" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1</arg>
<arg>stderr_must_be_empty=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:34.510310" elapsed="0.057357"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:21:34.568346" level="INFO">Length is 288.</msg>
<msg time="2026-08-22T23:21:34.568544" level="INFO">${length} = 288</msg>
<var>${length}</var>
<arg>${namepart}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:21:34.567828" elapsed="0.000740"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:34.569526" level="INFO">${namepart} = 11.0.5</msg>
<var>${namepart}</var>
<arg>"${status}" != "PASS" or ${length} == 0</arg>
<arg>${version}</arg>
<arg>${namepart}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:34.568750" elapsed="0.000803"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:34.570454" level="INFO">${filename} = clustering-it-model-11.0.5-sources.jar</msg>
<var>${filename}</var>
<arg>${name_prefix}${namepart}${name_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:34.569729" elapsed="0.000752"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:34.571147" level="INFO">clustering-it-model-11.0.5-sources.jar</msg>
<arg>${filename}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:34.570658" elapsed="0.000534"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:34.572093" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories/opendaylight.release/org/opendaylight/controller/samples/clustering-it-model/11.0.5/clustering-it-model-11.0.5-sources.jar</msg>
<var>${url}</var>
<arg>${url}/${filename}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:34.571382" elapsed="0.000739"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:34.572530" level="INFO">Executing command 'wget -q -N 'https://nexus.opendaylight.org/content/repositories/opendaylight.release/org/opendaylight/controller/samples/clustering-it-model/11.0.5/clustering-it-model-11.0.5-sources.jar' 2&gt;&amp;1'.</msg>
<msg time="2026-08-22T23:21:34.642149" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:21:34.642534" level="INFO">${response} = </msg>
<msg time="2026-08-22T23:21:34.642681" level="INFO">${result} = 0</msg>
<var>${response}</var>
<var>${result}</var>
<arg>wget -q -N '${url}' 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:21:34.572278" elapsed="0.070457"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:34.644276" level="INFO"/>
<arg>${response}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:34.643107" elapsed="0.001266"/>
</kw>
<if>
<branch type="IF" condition="${result} == 0">
<return>
<value>${filename}</value>
<status status="PASS" start="2026-08-22T23:21:34.644880" elapsed="0.000061"/>
</return>
<status status="PASS" start="2026-08-22T23:21:34.644529" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:34.644485" elapsed="0.000587"/>
</if>
<kw name="Replace String Using Regexp" owner="String">
<var>${release_url}</var>
<arg>${url}</arg>
<arg>autorelease-[0-9]{4}</arg>
<arg>opendaylight.release</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:34.645400" elapsed="0.000049"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${response}</var>
<var>${result}</var>
<arg>wget -q -N '${release_url}' 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:34.645850" elapsed="0.000074"/>
</kw>
<if>
<branch type="IF" condition="${result} != 0">
<kw name="Fail" owner="BuiltIn">
<arg>Artifact "${artifact}" in component "${component}" could not be downloaded from ${release_url} nor ${url}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:34.646401" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:34.646091" elapsed="0.000775"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:34.646052" elapsed="0.000878"/>
</if>
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-08-22T23:21:34.647004" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:21:34.647488" level="INFO">${filename} = clustering-it-model-11.0.5-sources.jar</msg>
<var>${filename}</var>
<arg>component=carpeople</arg>
<arg>artifact=clustering-it-model</arg>
<arg>name_suffix=-sources.jar</arg>
<doc>Deploy the specified artifact from Nexus to the cwd of the machine to which the active SSHLibrary connection points.
${component} is a name part of an artifact present in system/ of ODl installation with the same version as ${artifact} should have.
Must have https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-karaf/9.0.4-SNAPSHOT/netconf-karaf-9.0.4-20260822.052751-14.zip variable set to the URL from which the
tested ODL distribution was downloaded and this place must be
inside a repository created by a standard distribution
construction job. If this is detected to ne be the case, fallback URL is used.
If ${explicit_url} is non-empty, Deploy_From_Utrl is called instead.
TODO: Allow deploying to a specific directory, we have SSHKeywords.Execute_Command_At_Cwd_Should_Pass now.</doc>
<status status="PASS" start="2026-08-22T23:21:33.895043" elapsed="0.752505"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:34.648724" level="INFO">${dir} = '/tmp/schema'</msg>
<var>${dir}</var>
<arg>'${SCHEMA_DIRECTORY}'</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:34.648000" elapsed="0.000784"/>
</kw>
<kw name="Execute_Command_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:34.653429" level="INFO">Executing command 'mkdir -p '/tmp/schema' &amp;&amp; unzip -j 'clustering-it-model-11.0.5-sources.jar' META-INF/yang/car@2014-08-18.yang -d '/tmp/schema/' &amp;&amp; rm 'clustering-it-model-11.0.5-sources.jar''.</msg>
<msg time="2026-08-22T23:21:34.695765" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:21:34.696077" level="INFO">${stdout} = Archive:  clustering-it-model-11.0.5-sources.jar
  inflating: /tmp/schema/car@2014-08-18.yang  </msg>
<msg time="2026-08-22T23:21:34.696180" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:21:34.696271" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:21:34.653153" elapsed="0.043208"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:21:34.698730" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:21:34.698064" elapsed="0.000769"/>
</kw>
<msg time="2026-08-22T23:21:34.699104" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:21:34.699204" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:34.697074" elapsed="0.002219"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:34.701209" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:34.699988" elapsed="0.001319"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:34.704035" level="INFO">Archive:  clustering-it-model-11.0.5-sources.jar
  inflating: /tmp/schema/car@2014-08-18.yang  </msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:34.703685" elapsed="0.000413"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:34.704668" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:34.704305" elapsed="0.000420"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:34.705256" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:34.704929" elapsed="0.000385"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:21:34.703061" elapsed="0.002396"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:34.701869" elapsed="0.003670"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:34.701756" elapsed="0.003897"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:21:34.706148" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:34.705900" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:34.705838" elapsed="0.000499"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:21:34.706829" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-08-22T23:21:34.706574" elapsed="0.000365"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:34.706513" elapsed="0.000492"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:34.707383" elapsed="0.000109"/>
</kw>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:21:34.651835" elapsed="0.055883"/>
</kw>
<msg time="2026-08-22T23:21:34.707937" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:34.650261" elapsed="0.057770"/>
</kw>
<arg>mkdir -p '${SCHEMA_DIRECTORY}' &amp;&amp; unzip -j '${filename}' META-INF/yang/car@2014-08-18.yang -d '${SCHEMA_DIRECTORY}/' &amp;&amp; rm '${filename}'</arg>
<doc>A wrapper for Execute_Command_Passes with return_success_only=False
Also, log_on_success defaults to True (but is customizable, unlike return_success_only)..</doc>
<status status="PASS" start="2026-08-22T23:21:34.649221" elapsed="0.058924"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Create /tmp/schema, unpack car.yang there from temporarily downloaded sources jar.
TODO: Make this configurable and move to NexusKeywords.</doc>
<status status="PASS" start="2026-08-22T23:21:33.882549" elapsed="0.825670"/>
</kw>
<msg time="2026-08-22T23:21:34.708347" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:34.708408" level="INFO">${result} = None</msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:33.882034" elapsed="0.826405"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:21:34.708686" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:21:34.709233" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:21:34.709079" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:34.709054" elapsed="0.000294"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:34.709542" elapsed="0.000031"/>
</kw>
<arg>${member_ip}</arg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:21:33.546041" elapsed="1.163763"/>
</kw>
<var name="${member_index}">2</var>
<status status="PASS" start="2026-08-22T23:21:33.544802" elapsed="1.165062"/>
</iter>
<iter>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:34.711137" level="INFO">${ip_address} = 10.30.170.79</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:21:34.710755" elapsed="0.000419"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:21:34.711235" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:21:34.711385" level="INFO">${member_ip} = 10.30.170.79</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:21:34.710282" elapsed="0.001128"/>
</kw>
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:34.712909" level="INFO">${odl_connection} = 25</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:21:34.712500" elapsed="0.000435"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:21:34.715522" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:21:34.715769" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:21:34.714935" elapsed="0.000889"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:21:34.716126" elapsed="0.000681"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:21:34.718459" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:21:35.043680" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:21:29 UTC 2026

  System load:  0.01               Processes:             122
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:21:30 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:21:34.718020" elapsed="0.326026"/>
</kw>
<msg time="2026-08-22T23:21:35.044162" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:34.717157" elapsed="0.327217"/>
</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-08-22T23:21:34.714063" elapsed="0.330628"/>
</kw>
<msg time="2026-08-22T23:21:35.044749" 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-08-22T23:21:34.713673" elapsed="0.331129"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:21:34.713111" elapsed="0.331770"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:21:35.044935" elapsed="0.000045"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.79 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:21:34.712187" elapsed="0.332929"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Populate_Schema_Directory_Over_Active_Connection">
<kw name="Deploy_Artifact" owner="NexusKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_url}""" != ""</arg>
<arg>Deploy_From_Url</arg>
<arg>${explicit_url}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:35.064949" elapsed="0.000702"/>
</kw>
<kw name="Fetch From Left" owner="String">
<msg time="2026-08-22T23:21:35.066239" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot</msg>
<var>${urlbase}</var>
<arg>${BUNDLE_URL}</arg>
<arg>/org/opendaylight</arg>
<doc>Returns contents of the ``string`` before the first occurrence of ``marker``.</doc>
<status status="PASS" start="2026-08-22T23:21:35.065819" elapsed="0.000448"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.067241" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot</msg>
<var>${urlbase}</var>
<arg>'${urlbase}' != '${BUNDLE_URL}'</arg>
<arg>${urlbase}</arg>
<arg>${fallback_url}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:35.066434" elapsed="0.000835"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Magnesium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_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-08-22T23:21:35.103152" elapsed="0.000416"/>
</kw>
<arg>magnesium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to titanium and in case titanium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'carpeople'] {} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:21:35.102558" elapsed="0.001138"/>
</kw>
<msg time="2026-08-22T23:21:35.103770" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>magnesium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:35.093430" elapsed="0.010485"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>carpeople</arg>
<doc>Compare magnesium to titanium and in case titanium is at most magnesium,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:21:35.092969" elapsed="0.011183"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Aluminium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_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-08-22T23:21:35.139495" elapsed="0.000439"/>
</kw>
<arg>aluminium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to titanium and in case titanium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'netconf'] {} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:21:35.138925" elapsed="0.001118"/>
</kw>
<msg time="2026-08-22T23:21:35.140115" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>aluminium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:35.129779" elapsed="0.010479"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>netconf</arg>
<doc>Compare aluminium to titanium and in case titanium is at most aluminium,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:21:35.129304" elapsed="0.011225"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Silicon" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_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-08-22T23:21:35.176176" elapsed="0.000450"/>
</kw>
<arg>silicon</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to titanium and in case titanium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'bgpcep'] {} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:21:35.175600" elapsed="0.001137"/>
</kw>
<msg time="2026-08-22T23:21:35.176816" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>silicon</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:35.166473" elapsed="0.010489"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>bgpcep</arg>
<doc>Compare silicon to titanium and in case titanium is at most silicon,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:21:35.166014" elapsed="0.011189"/>
</kw>
<if>
<branch type="IF" condition="'${build_version}'=='${EMPTY}'">
<kw name="NexusKeywords__Detect_Version_To_Pull" owner="NexusKeywords">
<kw name="NexusKeywords__Get_Items_To_Look_At" owner="NexusKeywords">
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<arg>Component not supported by NexusKeywords version detection: ${component}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:21:35.186529" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:21:35.187339" elapsed="0.000185"/>
</kw>
<msg time="2026-08-22T23:21:35.187569" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Collections.Get_From_Dictionary</arg>
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:35.186992" elapsed="0.000747"/>
</kw>
<msg time="2026-08-22T23:21:35.188029" level="INFO">${itemlist} = clustering-it-model</msg>
<var>${itemlist}</var>
<arg>${component}</arg>
<doc>Get a list of items that might contain the version number that we are looking for.</doc>
<status status="PASS" start="2026-08-22T23:21:35.186034" elapsed="0.002045"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:35.189647" level="INFO">index=25
host=10.30.170.79
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:21:35.189887" level="INFO">${current_ssh_connection} = index=25
host=10.30.170.79
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:21:35.189302" elapsed="0.000638"/>
</kw>
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:35.196441" level="INFO">${odl_connection} = 26</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:21:35.196036" elapsed="0.000432"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.198177" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:21:35.198256" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:21:35.197900" elapsed="0.000380"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:35.198434" elapsed="0.000351"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:21:35.199649" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:21:35.510234" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:21:28 UTC 2026

  System load:  0.03               Processes:             122
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:21:34 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:21:35.199305" elapsed="0.311040"/>
</kw>
<msg time="2026-08-22T23:21:35.510413" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:35.198951" elapsed="0.311532"/>
</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-08-22T23:21:35.197442" elapsed="0.313133"/>
</kw>
<msg time="2026-08-22T23:21:35.510638" 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-08-22T23:21:35.197048" elapsed="0.313639"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:21:35.196715" elapsed="0.314044"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:21:35.510839" elapsed="0.000042"/>
</return>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:21:35.195436" elapsed="0.315689"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:35.512833" level="INFO">Executing command 'sh search.sh /tmp/netconf-karaf-9.0.4-SNAPSHOT/system clustering-it-model'.</msg>
<msg time="2026-08-22T23:21:35.545486" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:21:35.546214" level="INFO">${version} = 11.0.5
org/opendaylight/controller/samples</msg>
<msg time="2026-08-22T23:21:35.546477" level="INFO">${result} = 0</msg>
<var>${version}</var>
<var>${result}</var>
<arg>sh search.sh ${WORKSPACE}/${BUNDLEFOLDER}/system ${itemlist}</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:21:35.512388" elapsed="0.034253"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:21:35.549438" elapsed="0.001207"/>
</kw>
<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-08-22T23:21:35.559698" elapsed="0.000207"/>
</kw>
<msg time="2026-08-22T23:21:35.559965" 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-08-22T23:21:35.558845" elapsed="0.001269"/>
</kw>
<kw name="Open 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-08-22T23:21:35.560393" elapsed="0.000034"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:35.560809" elapsed="0.000032"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:21:35.554500" elapsed="0.006587"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.563624" level="INFO">11.0.5
org/opendaylight/controller/samples</msg>
<arg>${version}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:35.562946" elapsed="0.000780"/>
</kw>
<if>
<branch type="IF" condition="${result}!=0">
<kw name="Fail" owner="BuiltIn">
<arg>Component "${component}": searching for "${itemlist}" found no version, cannot locate test tool.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:35.564260" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:35.563896" elapsed="0.000434"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:35.563816" elapsed="0.000559"/>
</if>
<kw name="Split String" owner="String">
<msg time="2026-08-22T23:21:35.566202" level="INFO">${version} = 11.0.5</msg>
<msg time="2026-08-22T23:21:35.566309" level="INFO">${location} = org/opendaylight/controller/samples</msg>
<var>${version}</var>
<var>${location}</var>
<arg>${version}</arg>
<arg>max_split=1</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-08-22T23:21:35.565573" elapsed="0.000784"/>
</kw>
<return>
<value>${version}</value>
<value>${location}</value>
<status status="PASS" start="2026-08-22T23:21:35.566474" elapsed="0.000075"/>
</return>
<msg time="2026-08-22T23:21:35.567214" level="INFO">${version} = 11.0.5</msg>
<msg time="2026-08-22T23:21:35.567392" level="INFO">${location} = org/opendaylight/controller/samples</msg>
<var>${version}</var>
<var>${location}</var>
<arg>${component}</arg>
<doc>Determine the exact Nexus directory to be used as a source for a particular test tool
Figure out what version of the tool needs to be pulled out of the
Nexus by looking at the version directory of the subsystem from
which the tool is being pulled. This code is REALLY UGLY but there
is no way around it until the bug
https://bugs.opendaylight.org/show_bug.cgi?id=5206 gets fixed.
I also don't want to depend on maven-metadata-local.xml and other
bits and pieces of ODL distribution which are not required for ODL
to function properly.</doc>
<status status="PASS" start="2026-08-22T23:21:35.185141" elapsed="0.382379"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:35.177643" elapsed="0.390164"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${version}</var>
<var>${location}</var>
<arg>${build_version}</arg>
<arg>${build_location}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:35.568003" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:35.567837" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:35.177615" elapsed="0.390767"/>
</if>
<if>
<branch type="IF" condition="'SNAPSHOT' in '${version}'">
<kw name="Remove Values From List" owner="Collections">
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>netconf</arg>
<arg>bgpcep</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:35.568741" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:35.568443" elapsed="0.000588"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:35.568425" elapsed="0.000635"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.570003" level="INFO">${is_staged} = "FALSE"</msg>
<var>${is_staged}</var>
<arg>"opendaylight.release" not in '${urlbase}' and "opendaylight.snapshot" not in '${urlbase}'</arg>
<arg>"TRUE"</arg>
<arg>"FALSE"</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:35.569213" elapsed="0.000817"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.571206" level="INFO">${is_mri_component} = "TRUE"</msg>
<var>${is_mri_component}</var>
<arg>'${component}' in ${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>"TRUE"</arg>
<arg>"FALSE"</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:35.570199" elapsed="0.001036"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.572245" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.release</msg>
<var>${urlbase}</var>
<arg>${is_mri_component} == "TRUE" and ${is_staged} == "FALSE"</arg>
<arg>${NEXUS_RELEASE_BASE_URL}</arg>
<arg>${urlbase}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:35.571424" elapsed="0.000849"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.573356" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories/opendaylight.release/org/opendaylight/controller/samples/clustering-it-model/11.0.5</msg>
<var>${url}</var>
<arg>${urlbase}/${location}/${artifact}/${version}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:35.572450" elapsed="0.000934"/>
</kw>
<kw name="Execute_Command_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:35.576234" level="INFO">Executing command 'curl -L https://nexus.opendaylight.org/content/repositories/opendaylight.release/org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml'.</msg>
<msg time="2026-08-22T23:21:35.660158" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:21:35.660438" level="INFO">${stdout} = &lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml not found in local storage of repository &amp;quot;opendaylight.release&amp;quot; [id=o...</msg>
<msg time="2026-08-22T23:21:35.660544" level="INFO">${stderr} =   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0   ...</msg>
<msg time="2026-08-22T23:21:35.660684" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:21:35.576042" elapsed="0.084696"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.662619" level="INFO">Length is 316.</msg>
<msg time="2026-08-22T23:21:35.662818" level="FAIL">'  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  1125    0  1125    0     0  19278      0 --:--:-- --:--:-- --:--:-- 19396' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-08-22T23:21:35.661981" elapsed="0.001134">'  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  1125    0  1125    0     0  19278      0 --:--:-- --:--:-- --:--:-- 19396' should be empty.</status>
</kw>
<msg time="2026-08-22T23:21:35.663367" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-08-22T23:21:35.663468" level="INFO">${result} = '  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0  ...</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:35.661160" elapsed="0.002362"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.664903" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:35.663928" elapsed="0.001034"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.667325" level="INFO">&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml not found in local storage of repository &amp;quot;opendaylight.release&amp;quot; [id=opendaylight.release]&lt;/title&gt;
    &lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"/&gt;

    &lt;link rel="icon" type="image/png" href="https://nexus.opendaylight.org/favicon.png"&gt;
    &lt;!--[if IE]&gt;
    &lt;link rel="SHORTCUT ICON" href="https://nexus.opendaylight.org/favicon.ico"/&gt;
    &lt;![endif]--&gt;

    &lt;link rel="stylesheet" href="https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02" type="text/css" media="screen" title="no title" charset="utf-8"&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;404 - Path /org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml not found in local storage of repository &amp;quot;opendaylight.release&amp;quot; [id=opendaylight.release]&lt;/h1&gt;
    &lt;p&gt;Path /org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml not found in local storage of repository &amp;quot;opendaylight.release&amp;quot; [id=opendaylight.release]&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:35.666769" elapsed="0.000617"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.668040" level="INFO">  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  1125    0  1125    0     0  19278      0 --:--:-- --:--:-- --:--:-- 19396</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:35.667537" elapsed="0.000551"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.668481" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:35.668238" elapsed="0.000286"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:21:35.665950" elapsed="0.002645"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:35.665143" elapsed="0.003490"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:35.665096" elapsed="0.003564"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:21:35.668822" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:35.668719" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:35.668701" elapsed="0.000223"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:21:35.669080" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:21:35.668983" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:35.668966" elapsed="0.000198"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:35.669308" elapsed="0.000022"/>
</kw>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:21:35.575307" elapsed="0.094171"/>
</kw>
<msg time="2026-08-22T23:21:35.669566" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:35.574078" elapsed="0.095663"/>
</kw>
<msg time="2026-08-22T23:21:35.670087" level="INFO">${metadata} = &lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml not found in local storage of repository &amp;quot;opendaylight.release&amp;quot; [id=o...</msg>
<var>${metadata}</var>
<arg>curl -L ${url}/maven-metadata.xml</arg>
<doc>A wrapper for Execute_Command_Passes with return_success_only=False
Also, log_on_success defaults to True (but is customizable, unlike return_success_only)..</doc>
<status status="PASS" start="2026-08-22T23:21:35.573607" elapsed="0.096510"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:35.673825" level="INFO">Executing command 'echo "&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml not found in local storage of repository &amp;quot;opendaylight.release&amp;quot; [id=opendaylight.release]&lt;/title&gt;
    &lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"/&gt;

    &lt;link rel="icon" type="image/png" href="https://nexus.opendaylight.org/favicon.png"&gt;
    &lt;!--[if IE]&gt;
    &lt;link rel="SHORTCUT ICON" href="https://nexus.opendaylight.org/favicon.ico"/&gt;
    &lt;![endif]--&gt;

    &lt;link rel="stylesheet" href="https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02" type="text/css" media="screen" title="no title" charset="utf-8"&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;404 - Path /org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml not found in local storage of repository &amp;quot;opendaylight.release&amp;quot; [id=opendaylight.release]&lt;/h1&gt;
    &lt;p&gt;Path /org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml not found in local storage of repository &amp;quot;opendaylight.release&amp;quot; [id=opendaylight.release]&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1'.</msg>
<msg time="2026-08-22T23:21:35.711649" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:21:35.711975" level="INFO">${stdout} = &lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml not found in local storage of repository &amp;quot;opendaylight.release&amp;quot; [id=o...</msg>
<msg time="2026-08-22T23:21:35.712095" level="INFO">${stderr} = bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text...</msg>
<msg time="2026-08-22T23:21:35.712200" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:21:35.673640" elapsed="0.038617"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.714213" level="INFO">Length is 253.</msg>
<msg time="2026-08-22T23:21:35.714412" level="FAIL">'bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-08-22T23:21:35.713548" elapsed="0.001016">'bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory' should be empty.</status>
</kw>
<msg time="2026-08-22T23:21:35.714843" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-08-22T23:21:35.714944" level="INFO">${result} = 'bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=tex...</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:35.712725" elapsed="0.002276"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.716379" level="INFO">${success} = False</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:35.715467" elapsed="0.000949"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.717912" level="INFO">&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/controller/samples/clustering-it-model/11.0.5/maven-metadata.xml not found in local storage of repository &amp;quot;opendaylight.release&amp;quot; [id=opendaylight.release]&lt;/title&gt;
    &lt;meta http-equiv=Content-Type content=text/html</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:35.717541" elapsed="0.000445"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.718558" level="INFO">bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:35.718216" elapsed="0.000435"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.719212" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:35.718857" elapsed="0.000425"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:21:35.717045" elapsed="0.002323"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:35.716532" elapsed="0.002888"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:35.716500" elapsed="0.002956"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:21:35.719700" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:35.719535" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:35.719511" elapsed="0.000282"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-08-22T23:21:35.719988" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:35.719865" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:35.719843" elapsed="0.000233"/>
</if>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.720776" level="FAIL">Got rc: 0 or stderr was not empty: bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory</msg>
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-08-22T23:21:35.720268" elapsed="0.000599">Got rc: 0 or stderr was not empty: bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory</status>
</kw>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="FAIL" start="2026-08-22T23:21:35.673067" elapsed="0.047972">Got rc: 0 or stderr was not empty: bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory</status>
</kw>
<msg time="2026-08-22T23:21:35.721121" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-08-22T23:21:35.672398" elapsed="0.048865"/>
</kw>
<arg>echo "${metadata}" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1</arg>
<arg>stderr_must_be_empty=${True}</arg>
<doc>A wrapper for Execute_Command_Passes with return_success_only=False
Also, log_on_success defaults to True (but is customizable, unlike return_success_only)..</doc>
<status status="FAIL" start="2026-08-22T23:21:35.671138" elapsed="0.050478">Got rc: 0 or stderr was not empty: bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory</status>
</kw>
<msg time="2026-08-22T23:21:35.722010" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:21:35.722088" level="INFO">${namepart} = Got rc: 0 or stderr was not empty: bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonaty...</msg>
<var>${status}</var>
<var>${namepart}</var>
<arg>SSHKeywords.Execute_Command_Should_Pass</arg>
<arg>echo "${metadata}" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1</arg>
<arg>stderr_must_be_empty=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:35.670279" elapsed="0.051850"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.723210" level="INFO">Length is 288.</msg>
<msg time="2026-08-22T23:21:35.723356" level="INFO">${length} = 288</msg>
<var>${length}</var>
<arg>${namepart}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:21:35.722382" elapsed="0.001009"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.724667" level="INFO">${namepart} = 11.0.5</msg>
<var>${namepart}</var>
<arg>"${status}" != "PASS" or ${length} == 0</arg>
<arg>${version}</arg>
<arg>${namepart}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:35.723655" elapsed="0.001039"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.725618" level="INFO">${filename} = clustering-it-model-11.0.5-sources.jar</msg>
<var>${filename}</var>
<arg>${name_prefix}${namepart}${name_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:35.724856" elapsed="0.000789"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.726316" level="INFO">clustering-it-model-11.0.5-sources.jar</msg>
<arg>${filename}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:35.725800" elapsed="0.000562"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.727253" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories/opendaylight.release/org/opendaylight/controller/samples/clustering-it-model/11.0.5/clustering-it-model-11.0.5-sources.jar</msg>
<var>${url}</var>
<arg>${url}/${filename}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:35.726513" elapsed="0.000768"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:35.727813" level="INFO">Executing command 'wget -q -N 'https://nexus.opendaylight.org/content/repositories/opendaylight.release/org/opendaylight/controller/samples/clustering-it-model/11.0.5/clustering-it-model-11.0.5-sources.jar' 2&gt;&amp;1'.</msg>
<msg time="2026-08-22T23:21:35.807131" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:21:35.807529" level="INFO">${response} = </msg>
<msg time="2026-08-22T23:21:35.807732" level="INFO">${result} = 0</msg>
<var>${response}</var>
<var>${result}</var>
<arg>wget -q -N '${url}' 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:21:35.727440" elapsed="0.080350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.809478" level="INFO"/>
<arg>${response}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:35.808190" elapsed="0.001384"/>
</kw>
<if>
<branch type="IF" condition="${result} == 0">
<return>
<value>${filename}</value>
<status status="PASS" start="2026-08-22T23:21:35.810133" elapsed="0.000065"/>
</return>
<status status="PASS" start="2026-08-22T23:21:35.809809" elapsed="0.000470"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:35.809760" elapsed="0.001167"/>
</if>
<kw name="Replace String Using Regexp" owner="String">
<var>${release_url}</var>
<arg>${url}</arg>
<arg>autorelease-[0-9]{4}</arg>
<arg>opendaylight.release</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:35.811277" elapsed="0.000052"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${response}</var>
<var>${result}</var>
<arg>wget -q -N '${release_url}' 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:35.811806" elapsed="0.000057"/>
</kw>
<if>
<branch type="IF" condition="${result} != 0">
<kw name="Fail" owner="BuiltIn">
<arg>Artifact "${artifact}" in component "${component}" could not be downloaded from ${release_url} nor ${url}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:35.812315" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:35.812035" elapsed="0.000622"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:35.811995" elapsed="0.000707"/>
</if>
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-08-22T23:21:35.812752" elapsed="0.000023"/>
</return>
<msg time="2026-08-22T23:21:35.812962" level="INFO">${filename} = clustering-it-model-11.0.5-sources.jar</msg>
<var>${filename}</var>
<arg>component=carpeople</arg>
<arg>artifact=clustering-it-model</arg>
<arg>name_suffix=-sources.jar</arg>
<doc>Deploy the specified artifact from Nexus to the cwd of the machine to which the active SSHLibrary connection points.
${component} is a name part of an artifact present in system/ of ODl installation with the same version as ${artifact} should have.
Must have https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-karaf/9.0.4-SNAPSHOT/netconf-karaf-9.0.4-20260822.052751-14.zip variable set to the URL from which the
tested ODL distribution was downloaded and this place must be
inside a repository created by a standard distribution
construction job. If this is detected to ne be the case, fallback URL is used.
If ${explicit_url} is non-empty, Deploy_From_Utrl is called instead.
TODO: Allow deploying to a specific directory, we have SSHKeywords.Execute_Command_At_Cwd_Should_Pass now.</doc>
<status status="PASS" start="2026-08-22T23:21:35.059096" elapsed="0.753902"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.813706" level="INFO">${dir} = '/tmp/schema'</msg>
<var>${dir}</var>
<arg>'${SCHEMA_DIRECTORY}'</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:35.813231" elapsed="0.000512"/>
</kw>
<kw name="Execute_Command_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:35.819573" level="INFO">Executing command 'mkdir -p '/tmp/schema' &amp;&amp; unzip -j 'clustering-it-model-11.0.5-sources.jar' META-INF/yang/car@2014-08-18.yang -d '/tmp/schema/' &amp;&amp; rm 'clustering-it-model-11.0.5-sources.jar''.</msg>
<msg time="2026-08-22T23:21:35.858925" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:21:35.859253" level="INFO">${stdout} = Archive:  clustering-it-model-11.0.5-sources.jar
  inflating: /tmp/schema/car@2014-08-18.yang  </msg>
<msg time="2026-08-22T23:21:35.859355" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:21:35.859572" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:21:35.819179" elapsed="0.040535"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.862209" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:21:35.861528" elapsed="0.000784"/>
</kw>
<msg time="2026-08-22T23:21:35.862635" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:21:35.862743" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:35.860472" elapsed="0.002369"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.864696" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:35.863529" elapsed="0.001231"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.866680" level="INFO">Archive:  clustering-it-model-11.0.5-sources.jar
  inflating: /tmp/schema/car@2014-08-18.yang  </msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:35.866280" elapsed="0.000464"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.867307" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:35.866952" elapsed="0.000411"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.867971" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:35.867568" elapsed="0.000469"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:21:35.865765" elapsed="0.002353"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:35.865129" elapsed="0.003085"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:35.865042" elapsed="0.003250"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:21:35.868866" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:35.868554" elapsed="0.000406"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:35.868486" elapsed="0.000541"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:21:35.869522" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-08-22T23:21:35.869289" elapsed="0.000387"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:35.869224" elapsed="0.000524"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:35.870132" elapsed="0.000131"/>
</kw>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:21:35.817104" elapsed="0.053375"/>
</kw>
<msg time="2026-08-22T23:21:35.870762" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:35.814682" elapsed="0.056185"/>
</kw>
<arg>mkdir -p '${SCHEMA_DIRECTORY}' &amp;&amp; unzip -j '${filename}' META-INF/yang/car@2014-08-18.yang -d '${SCHEMA_DIRECTORY}/' &amp;&amp; rm '${filename}'</arg>
<doc>A wrapper for Execute_Command_Passes with return_success_only=False
Also, log_on_success defaults to True (but is customizable, unlike return_success_only)..</doc>
<status status="PASS" start="2026-08-22T23:21:35.814038" elapsed="0.056947"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Create /tmp/schema, unpack car.yang there from temporarily downloaded sources jar.
TODO: Make this configurable and move to NexusKeywords.</doc>
<status status="PASS" start="2026-08-22T23:21:35.045965" elapsed="0.825097"/>
</kw>
<msg time="2026-08-22T23:21:35.871196" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:35.871273" level="INFO">${result} = None</msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:35.045349" elapsed="0.825958"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:21:35.871529" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:21:35.872235" elapsed="0.000047"/>
</return>
<status status="PASS" start="2026-08-22T23:21:35.872059" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:35.872033" elapsed="0.000320"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:35.872693" elapsed="0.000024"/>
</kw>
<arg>${member_ip}</arg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:21:34.711685" elapsed="1.161134"/>
</kw>
<var name="${member_index}">3</var>
<status status="PASS" start="2026-08-22T23:21:34.710004" elapsed="1.162860"/>
</iter>
<var>${member_index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:21:32.356003" elapsed="3.516898"/>
</for>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>For each index in given list (or all): activate SSH connection, run given Keyword, close active connection. Return None.
Beware that in order to avoid "got positional argument after named arguments", first two arguments in the call should not be named.</doc>
<status status="PASS" start="2026-08-22T23:21:32.353688" elapsed="3.519275"/>
</kw>
<msg time="2026-08-22T23:21:35.873004" 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-08-22T23:21:32.353174" elapsed="3.519877"/>
</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-08-22T23:21:35.876496" elapsed="0.000166"/>
</kw>
<msg time="2026-08-22T23:21:35.876705" 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-08-22T23:21:35.875915" 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="NOT RUN" start="2026-08-22T23:21:35.876919" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:35.877077" 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-08-22T23:21:35.873395" elapsed="0.003763"/>
</kw>
<arg>With_Ssh_To_List_Or_All_Run_Keyword</arg>
<arg>${member_index_list}</arg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-08-22T23:21:32.352335" elapsed="3.524883"/>
</kw>
<arg>${index_list}</arg>
<arg>Populate_Schema_Directory_Over_Active_Connection</arg>
<doc>Remember active ssh connection index, call With_Ssh_To_List_Or_All_Run_Keyword, return None. Restore the conection index on teardown.</doc>
<status status="PASS" start="2026-08-22T23:21:32.351902" elapsed="3.525384"/>
</kw>
<doc>Initialize resources, sreate sessions, on each ODL machine create a directory and copy the car model there.</doc>
<status status="PASS" start="2026-08-22T23:21:28.437811" elapsed="7.439533"/>
</kw>
<test id="s1-s2-t1" name="Start_Testtool" 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-08-22T23:21:35.880641" elapsed="0.000213"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:21:35.880360" 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-08-22T23:21:35.881903" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:35.881793" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:35.881774" 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-08-22T23:21:35.886821" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:35.886715" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:35.886697" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.887879" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:35.887480" elapsed="0.000453"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.888434" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:21:35.888094" elapsed="0.000366"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:21:35.888505" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:21:35.888678" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:21:35.887109" 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-08-22T23:21:35.894062" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:35.893954" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:35.893936" 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-08-22T23:21:35.895284" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:35.895176" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:35.895158" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:35.895840" 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-08-22T23:21:35.895493" elapsed="0.000374"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:35.896272" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:35.896047" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:35.931569" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:35.896806" elapsed="0.035039"/>
</kw>
<msg time="2026-08-22T23:21:35.932276" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:35.932383" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:35.896454" elapsed="0.036012"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:35.944539" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:21:35.933830" elapsed="0.010830"/>
</kw>
<msg time="2026-08-22T23:21:35.944836" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:35.944884" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                            ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:35.932993" elapsed="0.011928"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:35.945236" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:35.945004" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:35.944982" elapsed="0.000337"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:35.945794" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:35.945460" 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-08-22T23:21:35.946136" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:35.945922" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:35.945904" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:35.946249" 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-08-22T23:21:35.949023" elapsed="0.000147"/>
</kw>
<msg time="2026-08-22T23:21:35.949234" 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-08-22T23:21:35.947799" 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-08-22T23:21:35.949707" elapsed="0.000085"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:35.950075" elapsed="0.000087"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:21:35.947099" elapsed="0.003186"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:21:35.946532" 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-08-22T23:21:35.894876" elapsed="0.055575"/>
</kw>
<msg time="2026-08-22T23:21:35.950543" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:35.950611" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                            ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:35.894277" elapsed="0.056374"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:35.950835" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:21:35.950728" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:35.950710" 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-08-22T23:21:35.951317" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:35.951817" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:35.951889" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:21:35.893620" elapsed="0.058379"/>
</kw>
<msg time="2026-08-22T23:21:35.952093" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:35.952138" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                            ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:35.889079" elapsed="0.063122"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:35.952528" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:35.952281" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:35.952264" elapsed="0.000361"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:21:35.888938" elapsed="0.063744"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:35.957989" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:35.957880" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:35.957861" 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-08-22T23:21:35.959240" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:35.959131" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:35.959113" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:35.959822" 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-08-22T23:21:35.959448" elapsed="0.000401"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:35.960255" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:35.960003" elapsed="0.000279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:36.000880" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:35.960786" elapsed="0.040197"/>
</kw>
<msg time="2026-08-22T23:21:36.001169" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:36.001216" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:35.960438" elapsed="0.040814"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:36.018721" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:21:36.001778" elapsed="0.017042"/>
</kw>
<msg time="2026-08-22T23:21:36.018992" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:36.019038" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                            ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:36.001417" elapsed="0.017657"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:36.019370" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:36.019151" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:36.019131" elapsed="0.000317"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:36.019915" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:36.019608" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:36.020253" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:36.020040" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:36.020023" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:36.020364" 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-08-22T23:21:36.023026" elapsed="0.000145"/>
</kw>
<msg time="2026-08-22T23:21:36.023235" 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-08-22T23:21:36.021855" elapsed="0.001519"/>
</kw>
<kw name="Open 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-08-22T23:21:36.023688" elapsed="0.000089"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:36.024055" 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-08-22T23:21:36.021173" 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-08-22T23:21:36.020650" elapsed="0.003673"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:21:35.958826" elapsed="0.065594"/>
</kw>
<msg time="2026-08-22T23:21:36.024538" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:36.024620" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                            ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:35.958204" elapsed="0.066456"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:36.024881" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:21:36.024772" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:36.024753" 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-08-22T23:21:36.025360" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:36.025716" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:36.025789" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:21:35.957520" elapsed="0.068377"/>
</kw>
<msg time="2026-08-22T23:21:36.025989" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:36.026033" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                            ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:35.952956" elapsed="0.073113"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:36.026391" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:36.026144" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:36.026126" elapsed="0.000341"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:21:35.952815" elapsed="0.073676"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:36.031913" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:36.031806" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:36.031787" 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-08-22T23:21:36.033155" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:36.033048" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:36.033030" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:36.033692" 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-08-22T23:21:36.033362" elapsed="0.000356"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:36.034093" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:36.033874" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:36.067500" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:36.034630" elapsed="0.032997"/>
</kw>
<msg time="2026-08-22T23:21:36.067801" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:36.067847" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:36.034276" elapsed="0.033607"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:36.083680" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:21:36.068384" elapsed="0.015880"/>
</kw>
<msg time="2026-08-22T23:21:36.084686" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:36.084842" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                            ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:36.068050" elapsed="0.016879"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:36.085620" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:36.085102" elapsed="0.000643"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:36.085058" elapsed="0.000741"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:36.086825" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:36.086107" elapsed="0.000854"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:36.087625" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:36.087108" elapsed="0.000714"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:36.087069" elapsed="0.000809"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:36.087954" 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-08-22T23:21:36.091392" elapsed="0.000145"/>
</kw>
<msg time="2026-08-22T23:21:36.091620" 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-08-22T23:21:36.090207" elapsed="0.001555"/>
</kw>
<kw name="Open 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-08-22T23:21:36.092073" elapsed="0.000086"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:36.092435" 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-08-22T23:21:36.089522" elapsed="0.003143"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:21:36.088526" elapsed="0.004206"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:21:36.032748" elapsed="0.060102"/>
</kw>
<msg time="2026-08-22T23:21:36.092943" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:36.092987" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                            ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:36.032129" elapsed="0.060895"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:36.093207" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:21:36.093100" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:36.093081" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:36.093849" 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-08-22T23:21:36.094196" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:36.094275" 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-08-22T23:21:36.031454" elapsed="0.062931"/>
</kw>
<msg time="2026-08-22T23:21:36.094476" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:36.094519" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                            ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:36.026904" elapsed="0.067652"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:36.094898" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:36.094650" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:36.094632" elapsed="0.000343"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:21:36.026764" elapsed="0.068234"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:21:35.888760" elapsed="0.206267"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:21:35.886342" elapsed="0.208743"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:21:35.881485" elapsed="0.213657"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:35.881057" elapsed="0.214133"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:21:35.878000" elapsed="0.217244"/>
</kw>
<kw name="Install_And_Start_Testtool" owner="NetconfKeywords">
<kw name="Deploy_Test_Tool" owner="NexusKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:36.115827" level="INFO">${name_prefix} = netconf-testtool-</msg>
<var>${name_prefix}</var>
<arg>${artifact}-</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:36.115502" elapsed="0.000352"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:36.116348" level="INFO">${extension} = jar</msg>
<var>${extension}</var>
<arg>'${component}'=='odl-micro'</arg>
<arg>tar</arg>
<arg>jar</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:36.116017" elapsed="0.000357"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:36.116969" level="INFO">${name_suffix} = -executable.jar</msg>
<var>${name_suffix}</var>
<arg>"${suffix}" != ""</arg>
<arg>-${suffix}.${extension}</arg>
<arg>.${extension}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:36.116538" elapsed="0.000458"/>
</kw>
<kw name="Deploy_Artifact" owner="NexusKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_url}""" != ""</arg>
<arg>Deploy_From_Url</arg>
<arg>${explicit_url}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:36.118294" elapsed="0.000339"/>
</kw>
<kw name="Fetch From Left" owner="String">
<msg time="2026-08-22T23:21:36.119007" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot</msg>
<var>${urlbase}</var>
<arg>${BUNDLE_URL}</arg>
<arg>/org/opendaylight</arg>
<doc>Returns contents of the ``string`` before the first occurrence of ``marker``.</doc>
<status status="PASS" start="2026-08-22T23:21:36.118797" elapsed="0.000236"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:36.119574" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot</msg>
<var>${urlbase}</var>
<arg>'${urlbase}' != '${BUNDLE_URL}'</arg>
<arg>${urlbase}</arg>
<arg>${fallback_url}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:36.119192" elapsed="0.000427"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Magnesium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_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-08-22T23:21:36.138428" elapsed="0.000419"/>
</kw>
<arg>magnesium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to titanium and in case titanium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'carpeople'] {} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:21:36.137970" elapsed="0.000947"/>
</kw>
<msg time="2026-08-22T23:21:36.138963" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>magnesium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:36.129472" elapsed="0.009539"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>carpeople</arg>
<doc>Compare magnesium to titanium and in case titanium is at most magnesium,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:21:36.129065" elapsed="0.010023"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Aluminium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_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-08-22T23:21:36.157454" elapsed="0.000413"/>
</kw>
<arg>aluminium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to titanium and in case titanium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'netconf'] {} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:21:36.156980" elapsed="0.000956"/>
</kw>
<msg time="2026-08-22T23:21:36.157980" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>aluminium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:36.148418" elapsed="0.009610"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>netconf</arg>
<doc>Compare aluminium to titanium and in case titanium is at most aluminium,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:21:36.148035" elapsed="0.010067"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Silicon" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_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-08-22T23:21:36.176684" elapsed="0.000394"/>
</kw>
<arg>silicon</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to titanium and in case titanium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'bgpcep'] {} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:21:36.176221" elapsed="0.000949"/>
</kw>
<msg time="2026-08-22T23:21:36.177216" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>silicon</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:36.167704" elapsed="0.009560"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>bgpcep</arg>
<doc>Compare silicon to titanium and in case titanium is at most silicon,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:21:36.167301" elapsed="0.010038"/>
</kw>
<if>
<branch type="IF" condition="'${build_version}'=='${EMPTY}'">
<kw name="NexusKeywords__Detect_Version_To_Pull" owner="NexusKeywords">
<kw name="NexusKeywords__Get_Items_To_Look_At" owner="NexusKeywords">
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<arg>Component not supported by NexusKeywords version detection: ${component}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:21:36.180299" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:21:36.181060" elapsed="0.000194"/>
</kw>
<msg time="2026-08-22T23:21:36.181301" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Collections.Get_From_Dictionary</arg>
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:36.180722" elapsed="0.000627"/>
</kw>
<msg time="2026-08-22T23:21:36.181449" level="INFO">${itemlist} = netconf-api</msg>
<var>${itemlist}</var>
<arg>${component}</arg>
<doc>Get a list of items that might contain the version number that we are looking for.</doc>
<status status="PASS" start="2026-08-22T23:21:36.179988" elapsed="0.001486"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:36.181780" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:21:36.181935" level="INFO">${current_ssh_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:21:36.181652" elapsed="0.000311"/>
</kw>
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:36.188480" level="INFO">${odl_connection} = 27</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:21:36.188076" elapsed="0.000431"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:21:36.190258" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:21:36.190336" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:21:36.189978" elapsed="0.000382"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:36.190515" elapsed="0.000362"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:21:36.192217" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:21:36.511271" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:21:28 UTC 2026

  System load:  0.03               Processes:             122
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:21:35 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:21:36.191400" elapsed="0.320033"/>
</kw>
<msg time="2026-08-22T23:21:36.511502" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:36.191043" elapsed="0.320526"/>
</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-08-22T23:21:36.189481" elapsed="0.322208"/>
</kw>
<msg time="2026-08-22T23:21:36.511737" 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-08-22T23:21:36.189079" elapsed="0.322707"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:21:36.188705" elapsed="0.323156"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:21:36.511906" elapsed="0.000037"/>
</return>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:21:36.187731" elapsed="0.324322"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:36.512491" level="INFO">Executing command 'sh search.sh /tmp/netconf-karaf-9.0.4-SNAPSHOT/system netconf-api'.</msg>
<msg time="2026-08-22T23:21:36.545449" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:21:36.545762" level="INFO">${version} = 9.0.4-SNAPSHOT
org/opendaylight/netconf</msg>
<msg time="2026-08-22T23:21:36.545874" level="INFO">${result} = 0</msg>
<var>${version}</var>
<var>${result}</var>
<arg>sh search.sh ${WORKSPACE}/${BUNDLEFOLDER}/system ${itemlist}</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:21:36.512235" elapsed="0.033698"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:21:36.546338" elapsed="0.000573"/>
</kw>
<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-08-22T23:21:36.553341" elapsed="0.000197"/>
</kw>
<msg time="2026-08-22T23:21:36.553626" 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-08-22T23:21:36.552663" elapsed="0.001036"/>
</kw>
<kw name="Open 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-08-22T23:21:36.553917" elapsed="0.000031"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:36.554140" elapsed="0.000028"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:21:36.547501" elapsed="0.006752"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:36.554858" level="INFO">9.0.4-SNAPSHOT
org/opendaylight/netconf</msg>
<arg>${version}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:36.554452" elapsed="0.000469"/>
</kw>
<if>
<branch type="IF" condition="${result}!=0">
<kw name="Fail" owner="BuiltIn">
<arg>Component "${component}": searching for "${itemlist}" found no version, cannot locate test tool.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:36.555327" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:36.555026" elapsed="0.000375"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:36.554995" elapsed="0.000441"/>
</if>
<kw name="Split String" owner="String">
<msg time="2026-08-22T23:21:36.555977" level="INFO">${version} = 9.0.4-SNAPSHOT</msg>
<msg time="2026-08-22T23:21:36.556040" level="INFO">${location} = org/opendaylight/netconf</msg>
<var>${version}</var>
<var>${location}</var>
<arg>${version}</arg>
<arg>max_split=1</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-08-22T23:21:36.555657" elapsed="0.000475"/>
</kw>
<return>
<value>${version}</value>
<value>${location}</value>
<status status="PASS" start="2026-08-22T23:21:36.556205" elapsed="0.000041"/>
</return>
<msg time="2026-08-22T23:21:36.556474" level="INFO">${version} = 9.0.4-SNAPSHOT</msg>
<msg time="2026-08-22T23:21:36.556535" level="INFO">${location} = org/opendaylight/netconf</msg>
<var>${version}</var>
<var>${location}</var>
<arg>${component}</arg>
<doc>Determine the exact Nexus directory to be used as a source for a particular test tool
Figure out what version of the tool needs to be pulled out of the
Nexus by looking at the version directory of the subsystem from
which the tool is being pulled. This code is REALLY UGLY but there
is no way around it until the bug
https://bugs.opendaylight.org/show_bug.cgi?id=5206 gets fixed.
I also don't want to depend on maven-metadata-local.xml and other
bits and pieces of ODL distribution which are not required for ODL
to function properly.</doc>
<status status="PASS" start="2026-08-22T23:21:36.179558" elapsed="0.377009"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:36.177411" elapsed="0.379236"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${version}</var>
<var>${location}</var>
<arg>${build_version}</arg>
<arg>${build_location}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:36.556892" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:36.556683" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:36.177392" elapsed="0.379615"/>
</if>
<if>
<branch type="IF" condition="'SNAPSHOT' in '${version}'">
<kw name="Remove Values From List" owner="Collections">
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>netconf</arg>
<arg>bgpcep</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:21:36.557388" elapsed="0.000295"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:36.557086" elapsed="0.000655"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:36.557064" elapsed="0.000714"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:36.558608" level="INFO">${is_staged} = "FALSE"</msg>
<var>${is_staged}</var>
<arg>"opendaylight.release" not in '${urlbase}' and "opendaylight.snapshot" not in '${urlbase}'</arg>
<arg>"TRUE"</arg>
<arg>"FALSE"</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:36.558017" elapsed="0.000632"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:36.559474" level="INFO">${is_mri_component} = "FALSE"</msg>
<var>${is_mri_component}</var>
<arg>'${component}' in ${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>"TRUE"</arg>
<arg>"FALSE"</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:36.558966" elapsed="0.000536"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:36.560086" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot</msg>
<var>${urlbase}</var>
<arg>${is_mri_component} == "TRUE" and ${is_staged} == "FALSE"</arg>
<arg>${NEXUS_RELEASE_BASE_URL}</arg>
<arg>${urlbase}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:36.559690" elapsed="0.000423"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:36.560652" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.4-SNAPSHOT</msg>
<var>${url}</var>
<arg>${urlbase}/${location}/${artifact}/${version}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:36.560271" elapsed="0.000408"/>
</kw>
<kw name="Execute_Command_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:36.562667" level="INFO">Executing command 'curl -L https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.4-SNAPSHOT/maven-metadata.xml'.</msg>
<msg time="2026-08-22T23:21:36.646740" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:21:36.647173" level="INFO">${stdout} = &lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;metadata modelVersion="1.1.0"&gt;
  &lt;groupId&gt;org.opendaylight.netconf&lt;/groupId&gt;
  &lt;artifactId&gt;netconf-testtool&lt;/artifactId&gt;
  &lt;versioning&gt;
    &lt;lastUpdated&gt;2026082...</msg>
<msg time="2026-08-22T23:21:36.647289" level="INFO">${stderr} =   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0   ...</msg>
<msg time="2026-08-22T23:21:36.647385" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:21:36.562462" elapsed="0.084976"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:21:36.649658" level="INFO">Length is 316.</msg>
<msg time="2026-08-22T23:21:36.649871" level="FAIL">'  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  2763  100  2763    0     0  43018      0 --:--:-- --:--:-- --:--:-- 43171' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-08-22T23:21:36.648987" elapsed="0.001044">'  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  2763  100  2763    0     0  43018      0 --:--:-- --:--:-- --:--:-- 43171' should be empty.</status>
</kw>
<msg time="2026-08-22T23:21:36.650271" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-08-22T23:21:36.650369" level="INFO">${result} = '  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0  ...</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:36.648016" elapsed="0.002406"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:36.651853" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:36.650823" elapsed="0.001088"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:36.654469" level="INFO">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;metadata modelVersion="1.1.0"&gt;
  &lt;groupId&gt;org.opendaylight.netconf&lt;/groupId&gt;
  &lt;artifactId&gt;netconf-testtool&lt;/artifactId&gt;
  &lt;versioning&gt;
    &lt;lastUpdated&gt;20260822052751&lt;/lastUpdated&gt;
    &lt;snapshot&gt;
      &lt;timestamp&gt;20260822.052751&lt;/timestamp&gt;
      &lt;buildNumber&gt;14&lt;/buildNumber&gt;
    &lt;/snapshot&gt;
    &lt;snapshotVersions&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;pom&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;javadoc&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;executable&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;stress-client&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;rest-perf-client&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;scale-util&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;stress-client&lt;/classifier&gt;
        &lt;extension&gt;tar.gz&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;cyclonedx&lt;/classifier&gt;
        &lt;extension&gt;xml&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;cyclonedx&lt;/classifier&gt;
        &lt;extension&gt;json&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;sources&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
    &lt;/snapshotVersions&gt;
  &lt;/versioning&gt;
  &lt;version&gt;9.0.4-SNAPSHOT&lt;/version&gt;
&lt;/metadata&gt;</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:36.653923" elapsed="0.000895"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:36.655782" level="INFO">  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  2763  100  2763    0     0  43018      0 --:--:-- --:--:-- --:--:-- 43171</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:36.655159" elapsed="0.000728"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:36.656485" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:36.656217" elapsed="0.000312"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:21:36.652961" elapsed="0.003643"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:36.652109" elapsed="0.004535"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:36.652054" elapsed="0.004623"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:21:36.656849" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:36.656738" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:36.656720" elapsed="0.000204"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:21:36.657065" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-08-22T23:21:36.656974" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:36.656960" elapsed="0.000194"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:36.657299" elapsed="0.000022"/>
</kw>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:21:36.561813" elapsed="0.095611"/>
</kw>
<msg time="2026-08-22T23:21:36.657497" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:36.561264" elapsed="0.096285"/>
</kw>
<msg time="2026-08-22T23:21:36.657741" level="INFO">${metadata} = &lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;metadata modelVersion="1.1.0"&gt;
  &lt;groupId&gt;org.opendaylight.netconf&lt;/groupId&gt;
  &lt;artifactId&gt;netconf-testtool&lt;/artifactId&gt;
  &lt;versioning&gt;
    &lt;lastUpdated&gt;2026082...</msg>
<var>${metadata}</var>
<arg>curl -L ${url}/maven-metadata.xml</arg>
<doc>A wrapper for Execute_Command_Passes with return_success_only=False
Also, log_on_success defaults to True (but is customizable, unlike return_success_only)..</doc>
<status status="PASS" start="2026-08-22T23:21:36.560880" elapsed="0.096892"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:36.660510" level="INFO">Executing command 'echo "&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;metadata modelVersion="1.1.0"&gt;
  &lt;groupId&gt;org.opendaylight.netconf&lt;/groupId&gt;
  &lt;artifactId&gt;netconf-testtool&lt;/artifactId&gt;
  &lt;versioning&gt;
    &lt;lastUpdated&gt;20260822052751&lt;/lastUpdated&gt;
    &lt;snapshot&gt;
      &lt;timestamp&gt;20260822.052751&lt;/timestamp&gt;
      &lt;buildNumber&gt;14&lt;/buildNumber&gt;
    &lt;/snapshot&gt;
    &lt;snapshotVersions&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;pom&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;javadoc&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;executable&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;stress-client&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;rest-perf-client&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;scale-util&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;stress-client&lt;/classifier&gt;
        &lt;extension&gt;tar.gz&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;cyclonedx&lt;/classifier&gt;
        &lt;extension&gt;xml&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;cyclonedx&lt;/classifier&gt;
        &lt;extension&gt;json&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;sources&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
    &lt;/snapshotVersions&gt;
  &lt;/versioning&gt;
  &lt;version&gt;9.0.4-SNAPSHOT&lt;/version&gt;
&lt;/metadata&gt;" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1'.</msg>
<msg time="2026-08-22T23:21:36.699636" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:21:36.699885" level="INFO">${stdout} = 9.0.4-20260822.052751-14</msg>
<msg time="2026-08-22T23:21:36.700049" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:21:36.700144" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:21:36.660317" elapsed="0.039879"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:21:36.702015" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:21:36.701396" elapsed="0.000721"/>
</kw>
<msg time="2026-08-22T23:21:36.702329" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:21:36.702427" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:36.700629" elapsed="0.001849"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:36.703849" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:36.702878" elapsed="0.001029"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:36.706325" level="INFO">9.0.4-20260822.052751-14</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:36.705778" elapsed="0.000645"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:36.707309" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:36.706780" elapsed="0.000663"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:36.708305" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:36.707806" elapsed="0.000562"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:21:36.704866" elapsed="0.003582"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:36.704075" elapsed="0.004426"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:36.704034" elapsed="0.004504"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:21:36.708793" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:36.708645" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:36.708618" elapsed="0.000272"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:21:36.709097" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:21:36.708966" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:36.708943" elapsed="0.000273"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:36.709426" elapsed="0.000032"/>
</kw>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:21:36.659726" elapsed="0.049897"/>
</kw>
<msg time="2026-08-22T23:21:36.709703" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:36.659142" elapsed="0.050632"/>
</kw>
<arg>echo "${metadata}" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1</arg>
<arg>stderr_must_be_empty=${True}</arg>
<doc>A wrapper for Execute_Command_Passes with return_success_only=False
Also, log_on_success defaults to True (but is customizable, unlike return_success_only)..</doc>
<status status="PASS" start="2026-08-22T23:21:36.658666" elapsed="0.051223"/>
</kw>
<msg time="2026-08-22T23:21:36.710031" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:36.710095" level="INFO">${namepart} = 9.0.4-20260822.052751-14</msg>
<var>${status}</var>
<var>${namepart}</var>
<arg>SSHKeywords.Execute_Command_Should_Pass</arg>
<arg>echo "${metadata}" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1</arg>
<arg>stderr_must_be_empty=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:36.657934" elapsed="0.052195"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:21:36.710766" level="INFO">Length is 24.</msg>
<msg time="2026-08-22T23:21:36.710872" level="INFO">${length} = 24</msg>
<var>${length}</var>
<arg>${namepart}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:21:36.710372" elapsed="0.000533"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:36.711729" level="INFO">${namepart} = 9.0.4-20260822.052751-14</msg>
<var>${namepart}</var>
<arg>"${status}" != "PASS" or ${length} == 0</arg>
<arg>${version}</arg>
<arg>${namepart}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:36.711131" elapsed="0.000635"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:36.712489" level="INFO">${filename} = netconf-testtool-9.0.4-20260822.052751-14-executable.jar</msg>
<var>${filename}</var>
<arg>${name_prefix}${namepart}${name_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:36.711990" elapsed="0.000537"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:36.713134" level="INFO">netconf-testtool-9.0.4-20260822.052751-14-executable.jar</msg>
<arg>${filename}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:36.712779" elapsed="0.000419"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:36.713913" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.4-SNAPSHOT/netconf-testtool-9.0.4-20260822.052751-14-executable.jar</msg>
<var>${url}</var>
<arg>${url}/${filename}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:36.713421" elapsed="0.000532"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:36.714432" level="INFO">Executing command 'wget -q -N 'https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.4-SNAPSHOT/netconf-testtool-9.0.4-20260822.052751-14-executable.jar' 2&gt;&amp;1'.</msg>
<msg time="2026-08-22T23:21:36.785666" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:21:36.785906" level="INFO">${response} = </msg>
<msg time="2026-08-22T23:21:36.786005" level="INFO">${result} = 0</msg>
<var>${response}</var>
<var>${result}</var>
<arg>wget -q -N '${url}' 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:21:36.714185" elapsed="0.071870"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:36.787030" level="INFO"/>
<arg>${response}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:36.786435" elapsed="0.000686"/>
</kw>
<if>
<branch type="IF" condition="${result} == 0">
<return>
<value>${filename}</value>
<status status="PASS" start="2026-08-22T23:21:36.787515" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-08-22T23:21:36.787272" elapsed="0.000406"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:36.787230" elapsed="0.000503"/>
</if>
<kw name="Replace String Using Regexp" owner="String">
<var>${release_url}</var>
<arg>${url}</arg>
<arg>autorelease-[0-9]{4}</arg>
<arg>opendaylight.release</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:36.788106" elapsed="0.000050"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${response}</var>
<var>${result}</var>
<arg>wget -q -N '${release_url}' 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:36.788683" elapsed="0.000047"/>
</kw>
<if>
<branch type="IF" condition="${result} != 0">
<kw name="Fail" owner="BuiltIn">
<arg>Artifact "${artifact}" in component "${component}" could not be downloaded from ${release_url} nor ${url}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:36.789201" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:36.788892" elapsed="0.000422"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:36.788855" elapsed="0.000512"/>
</if>
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-08-22T23:21:36.789439" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:21:36.789771" level="INFO">${filename} = netconf-testtool-9.0.4-20260822.052751-14-executable.jar</msg>
<var>${filename}</var>
<arg>${component}</arg>
<arg>${artifact}</arg>
<arg>${name_prefix}</arg>
<arg>${name_suffix}</arg>
<arg>${fallback_url}</arg>
<arg>${explicit_url}</arg>
<arg>${build_version}</arg>
<arg>${build_location}</arg>
<doc>Deploy the specified artifact from Nexus to the cwd of the machine to which the active SSHLibrary connection points.
netconf is a name part of an artifact present in system/ of ODl installation with the same version as netconf-testtool should have.
Must have https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-karaf/9.0.4-SNAPSHOT/netconf-karaf-9.0.4-20260822.052751-14.zip variable set to the URL from which the
tested ODL distribution was downloaded and this place must be
inside a repository created by a standard distribution
construction job. If this is detected to ne be the case, fallback URL is used.
If  is non-empty, Deploy_From_Utrl is called instead.
TODO: Allow deploying to a specific directory, we have SSHKeywords.Execute_Command_At_Cwd_Should_Pass now.</doc>
<status status="PASS" start="2026-08-22T23:21:36.117636" elapsed="0.672191"/>
</kw>
<return>
<value>${filename}</value>
<status status="PASS" start="2026-08-22T23:21:36.789977" elapsed="0.000058"/>
</return>
<msg time="2026-08-22T23:21:36.790301" level="INFO">${filename} = netconf-testtool-9.0.4-20260822.052751-14-executable.jar</msg>
<var>${filename}</var>
<arg>netconf</arg>
<arg>netconf-testtool</arg>
<doc>Deploy a test tool.
The test tools have naming convention of the form
"&lt;repository_url&gt;/some/dir/somewhere/&lt;tool-name&gt;/&lt;tool-name&gt;-&lt;version-tag&gt;-${suffix}.jar"
where "&lt;tool-name&gt;" is the name of the tool and "&lt;version-tag&gt;" is
the version tag that is digged out of the maven metadata. This
keyword calculates ${name_prefix} and ${name_suffix} for
"Deploy_Artifact" and then calls "Deploy_Artifact" to do the real
work of deploying the artifact.</doc>
<status status="PASS" start="2026-08-22T23:21:36.109634" elapsed="0.680722"/>
</kw>
<kw name="Start_Testtool" owner="NetconfKeywords">
<kw name="NetconfKeywords__Deploy_Additional_Schemas" owner="NetconfKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:36.793282" level="INFO">Executing command 'rm -rf schemas 2&gt;&amp;1'.</msg>
<msg time="2026-08-22T23:21:36.835558" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:21:36.835805" level="INFO">${response} = </msg>
<var>${response}</var>
<arg>rm -rf schemas 2&gt;&amp;1</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:21:36.793148" elapsed="0.042711"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:36.836899" level="INFO"/>
<arg>${response}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:36.836270" elapsed="0.000722"/>
</kw>
<if>
<branch type="IF" condition="'${schemas}' == 'none'">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-08-22T23:21:36.837885" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:36.837143" elapsed="0.000852"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:36.837100" elapsed="0.000947"/>
</if>
<kw name="Put Directory" owner="SSHLibrary">
<msg time="2026-08-22T23:21:36.880506" level="INFO">[chan 5] Opened sftp connection (server version 3)</msg>
<msg time="2026-08-22T23:21:36.973307" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/yang-ext@2013-07-09.yang' -&gt; '/home/jenkins/./schemas/yang-ext@2013-07-09.yang'</msg>
<msg time="2026-08-22T23:21:36.973461" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/example-action@2016-07-07.yang' -&gt; '/home/jenkins/./schemas/example-action@2016-07-07.yang'</msg>
<msg time="2026-08-22T23:21:36.973503" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/car@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/car@2014-08-18.yang'</msg>
<msg time="2026-08-22T23:21:36.973539" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/car-purchase@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/car-purchase@2014-08-18.yang'</msg>
<msg time="2026-08-22T23:21:36.973576" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/ncmount-l2fib@2016-03-07.yang' -&gt; '/home/jenkins/./schemas/ncmount-l2fib@2016-03-07.yang'</msg>
<msg time="2026-08-22T23:21:36.973640" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/augment-main-a@2014-01-21.yang' -&gt; '/home/jenkins/./schemas/augment-main-a@2014-01-21.yang'</msg>
<msg time="2026-08-22T23:21:36.973677" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/ietf-netconf-monitoring@2010-10-04.yang' -&gt; '/home/jenkins/./schemas/ietf-netconf-monitoring@2010-10-04.yang'</msg>
<msg time="2026-08-22T23:21:36.973712" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/ietf-netconf-monitoring-extension@2013-12-10.yang' -&gt; '/home/jenkins/./schemas/ietf-netconf-monitoring-extension@2013-12-10.yang'</msg>
<msg time="2026-08-22T23:21:36.973899" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/people@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/people@2014-08-18.yang'</msg>
<msg time="2026-08-22T23:21:36.973940" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/test@2014-10-18.yang' -&gt; '/home/jenkins/./schemas/test@2014-10-18.yang'</msg>
<msg time="2026-08-22T23:21:36.973976" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/car-people@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/car-people@2014-08-18.yang'</msg>
<msg time="2026-08-22T23:21:36.974012" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/ietf-inet-types@2010-09-24.yang' -&gt; '/home/jenkins/./schemas/ietf-inet-types@2010-09-24.yang'</msg>
<msg time="2026-08-22T23:21:36.974046" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/main@2014-01-21.yang' -&gt; '/home/jenkins/./schemas/main@2014-01-21.yang'</msg>
<arg>${schemas}</arg>
<arg>destination=./schemas</arg>
<doc>Uploads a directory, including its content, from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-08-22T23:21:36.838372" elapsed="0.135793"/>
</kw>
<kw name="List Directory" owner="SSHLibrary">
<msg time="2026-08-22T23:21:36.978257" level="INFO">13 items:
augment-main-a@2014-01-21.yang
car-people@2014-08-18.yang
car-purchase@2014-08-18.yang
car@2014-08-18.yang
example-action@2016-07-07.yang
ietf-inet-types@2010-09-24.yang
ietf-netconf-monitoring-extension@2013-12-10.yang
ietf-netconf-monitoring@2010-10-04.yang
main@2014-01-21.yang
ncmount-l2fib@2016-03-07.yang
people@2014-08-18.yang
test@2014-10-18.yang
yang-ext@2013-07-09.yang</msg>
<arg>./schemas</arg>
<doc>Returns and logs items in the remote ``path``, optionally filtered with ``pattern``.</doc>
<status status="PASS" start="2026-08-22T23:21:36.974631" elapsed="0.003710"/>
</kw>
<return>
<value>--schemas-dir ./schemas</value>
<status status="PASS" start="2026-08-22T23:21:36.978424" elapsed="0.000076"/>
</return>
<msg time="2026-08-22T23:21:36.978741" level="INFO">${schemas_option} = --schemas-dir ./schemas</msg>
<var>${schemas_option}</var>
<arg>${schemas}</arg>
<doc>Internal keyword for Install_And_Start_TestTool
This deploys the additional schemas if any and returns a
command line argument to be added to the testtool commandline
to tell it to load them. While this code could be integrated
into its only user, I considered the resulting code to be too
unreadable as the actions are quite different in the two
possibilities (additional schemas present versus no additional
schemas present), therefore a separate keyword is used.</doc>
<status status="PASS" start="2026-08-22T23:21:36.792695" elapsed="0.186083"/>
</kw>
<kw name="NetconfKeywords__Deploy_Custom_RPC" owner="NetconfKeywords">
<if>
<branch type="IF" condition="'${rpc_config}' == 'none'">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-08-22T23:21:36.979916" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:21:36.979702" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:36.979668" elapsed="0.000373"/>
</if>
<kw name="Copy_File_To_Tools_System" owner="SSHKeywords">
<arg>${TOOLS_SYSTEM_1_IP}</arg>
<arg>${rpc_config}</arg>
<arg>/tmp</arg>
<doc>Wrapper keyword to make it easier to copy a file to an Tools specific system</doc>
<status status="NOT RUN" start="2026-08-22T23:21:36.980321" elapsed="0.000035"/>
</kw>
<return>
<value>--rpc-config /tmp/customaction.xml</value>
<status status="NOT RUN" start="2026-08-22T23:21:36.980425" elapsed="0.000023"/>
</return>
<msg time="2026-08-22T23:21:36.983361" level="INFO">${rpc_config_option} = </msg>
<var>${rpc_config_option}</var>
<arg>${rpc_config}</arg>
<doc>Internal keyword for Install_And_Start_TestTool
This deploys the optional custom rpc file.
Drop out of the keyword, returning no command line argument when there
is no rpc file to deploy.</doc>
<status status="PASS" start="2026-08-22T23:21:36.979252" elapsed="0.004147"/>
</kw>
<kw name="Compose_Full_Java_Command" owner="NexusKeywords">
<kw name="Compose_Base_Java_Command" owner="NexusKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${openjdk}""" == "openjdk8"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_8_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_8_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:36.985425" elapsed="0.000601"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${openjdk}""" == "openjdk11"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_11_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_11_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:36.986259" elapsed="0.000456"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${openjdk}""" == "openjdk17"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_17_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_17_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:36.986944" elapsed="0.000420"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Compose_Dilemma_Filepath" owner="NexusKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:36.989162" level="INFO">Executing command 'ls -lA /usr/lib/jvm/java-21-openjdk-amd64/bin/java 2&gt;&amp;1'.</msg>
<msg time="2026-08-22T23:21:37.001310" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:21:37.001620" level="INFO">${out} = -rwxr-xr-x 1 root root 14456 Apr 26 09:33 /usr/lib/jvm/java-21-openjdk-amd64/bin/java</msg>
<msg time="2026-08-22T23:21:37.001738" level="INFO">${rc} = 0</msg>
<var>${out}</var>
<var>${rc}</var>
<arg>ls -lA ${specific_path} 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:21:36.988900" elapsed="0.012895"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${specific_path}</value>
<status status="PASS" start="2026-08-22T23:21:37.002260" elapsed="0.000066"/>
</return>
<status status="PASS" start="2026-08-22T23:21:37.001993" elapsed="0.000414"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:37.001944" elapsed="0.000522"/>
</if>
<return>
<value>${default_path}</value>
<status status="NOT RUN" start="2026-08-22T23:21:37.002551" elapsed="0.000068"/>
</return>
<arg>${JAVA_21_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_21_HOME_UBUNTU}/bin/java</arg>
<doc>Query active SSH connection, return specific path if it exists else default path.</doc>
<status status="PASS" start="2026-08-22T23:21:36.988293" elapsed="0.014566"/>
</kw>
<msg time="2026-08-22T23:21:37.002969" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>"""${openjdk}""" == "openjdk21"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_21_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_21_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:36.987611" elapsed="0.015479"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${out}</var>
<var>${rc}</var>
<arg>java -version 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:37.003504" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>java</value>
<status status="NOT RUN" start="2026-08-22T23:21:37.003855" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:37.003767" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:37.003726" elapsed="0.000374"/>
</if>
<kw name="Execute Command" owner="SSHLibrary">
<var>${java}</var>
<arg>echo $JAVA_HOME/bin/java 2&gt;&amp;1</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:37.004455" elapsed="0.000052"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${out}</var>
<var>${rc}</var>
<arg>${java} -version 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:37.004962" elapsed="0.000050"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${java}</value>
<status status="NOT RUN" start="2026-08-22T23:21:37.005266" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:37.005184" elapsed="0.000143"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:37.005144" elapsed="0.000213"/>
</if>
<kw name="Get Environment Variable" owner="OperatingSystem">
<var>${JAVA_HOME}</var>
<arg>JAVA_HOME</arg>
<arg>${EMPTY}</arg>
<doc>Returns the value of an environment variable with the given name.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:37.005556" elapsed="0.000050"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${java}</var>
<arg>"""${JAVA_HOME}"""!=""</arg>
<arg>${JAVA_HOME}/bin/java</arg>
<arg>false</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:37.005835" elapsed="0.000028"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${out}</var>
<var>${rc}</var>
<arg>${java} -version 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:37.006078" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${java}</value>
<status status="NOT RUN" start="2026-08-22T23:21:37.006256" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:37.006204" elapsed="0.000108"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:37.006182" elapsed="0.000159"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unable to find Java; specify \${JDKVERSION}, put it to your PATH or set JAVA_HOME environment variable.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:37.006533" elapsed="0.000028"/>
</kw>
<msg time="2026-08-22T23:21:37.006728" level="INFO">${base_command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java</msg>
<var>${base_command}</var>
<arg>openjdk=${openjdk}</arg>
<doc>Return string suitable for launching Java programs over SSHLibrary, depending on JRE version needed.
This requires that the SSH connection on which the command is going to be used is active as it is needed for querying files.
Commands composed for one SSH connection shall not be reused on other SSH connections as the two connections may have different Java setups.
Not directly related to Nexus, but versioned Java tools may need this.</doc>
<status status="PASS" start="2026-08-22T23:21:36.984874" elapsed="0.021890"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:37.007453" level="INFO">${full_command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.4-20260822.052751-14-executable.jar  --device-count 1 --debug true --schemas-dir ./...</msg>
<var>${full_command}</var>
<arg>${base_command} ${options}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:37.006979" elapsed="0.000513"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:37.008085" level="INFO">/usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.4-20260822.052751-14-executable.jar  --device-count 1 --debug true --schemas-dir ./schemas  --md-sal true</msg>
<arg>${full_command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:37.007734" elapsed="0.000415"/>
</kw>
<return>
<value>${full_command}</value>
<status status="PASS" start="2026-08-22T23:21:37.008212" elapsed="0.000041"/>
</return>
<msg time="2026-08-22T23:21:37.008426" level="INFO">${command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.4-20260822.052751-14-executable.jar  --device-count 1 --debug true --schemas-dir ./...</msg>
<var>${command}</var>
<arg>${java_options} -jar ${filename} ${tool_options} --device-count ${device-count} --debug ${debug} ${schemas_option} ${rpc_config_option} --md-sal ${mdsal}</arg>
<doc>Return full Bash command to run Java with given options.
This requires that the SSH connection on which the command is going to be used is active as it is needed for querying files.
The options may include JVM options, application command line arguments, Bash redirects and other constructs.</doc>
<status status="PASS" start="2026-08-22T23:21:36.983746" elapsed="0.024717"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:37.009093" level="INFO">Running testtool: /usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.4-20260822.052751-14-executable.jar  --device-count 1 --debug true --schemas-dir ./schemas  --md-sal true</msg>
<arg>Running testtool: ${command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:37.008733" elapsed="0.000425"/>
</kw>
<kw name="Get Log File Name" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:37.013329" level="INFO">${name} = netconf-clustering-txt-Bug8086</msg>
<var>${name}</var>
<arg>"""${SUITE_NAME}""".replace(" ","-").replace("/","-").replace(".","-")</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:37.012830" elapsed="0.000526"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:37.015730" level="INFO">${suffix} = </msg>
<var>${suffix}</var>
<arg>'${testcase}' != ''</arg>
<arg>--${testcase}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:37.013521" elapsed="0.002236"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-08-22T23:21:37.016138" level="INFO">${date} = 2026-08-22 23:21:37.016</msg>
<var>${date}</var>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-08-22T23:21:37.015932" elapsed="0.000232"/>
</kw>
<kw name="Convert Date" owner="DateTime">
<msg time="2026-08-22T23:21:37.016739" level="INFO">${timestamp} = 1787440897.016</msg>
<var>${timestamp}</var>
<arg>${date}</arg>
<arg>epoch</arg>
<doc>Converts between supported `date formats`.</doc>
<status status="PASS" start="2026-08-22T23:21:37.016317" elapsed="0.000449"/>
</kw>
<return>
<value>${testtool}--${name}${suffix}.${timestamp}.log</value>
<status status="PASS" start="2026-08-22T23:21:37.016815" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:21:37.017052" level="INFO">${logfile} = testtool--netconf-clustering-txt-Bug8086.1787440897.016.log</msg>
<var>${logfile}</var>
<arg>testtool</arg>
<doc>Get the name of the suite sanitized to be usable as a part of filename.
These names are used to constructs names of the log files produced
by the testing tools so two suites using a tool wont overwrite the
log files if they happen to run in one job.</doc>
<status status="PASS" start="2026-08-22T23:21:37.009485" elapsed="0.007593"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:37.021769" level="INFO">${testtool_log} = testtool--netconf-clustering-txt-Bug8086.1787440897.016.log</msg>
<arg>${testtool_log}</arg>
<arg>${logfile}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:21:37.017247" elapsed="0.004621"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:37.042708" level="INFO">/usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.4-20260822.052751-14-executable.jar  --device-count 1 --debug true --schemas-dir ./schemas  --md-sal true &gt;testtool--netconf-clustering-txt-Bug8086.1787440897.016.log 2&gt;&amp;1</msg>
<arg>${command} &gt;${logfile} 2&gt;&amp;1</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:37.022031" elapsed="0.020739"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:37.046785" level="INFO">${NetconfKeywords__testtool_device_count} = 1</msg>
<arg>${NetconfKeywords__testtool_device_count}</arg>
<arg>${device-count}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:21:37.042937" elapsed="0.003895"/>
</kw>
<kw name="Perform_Operation_On_Each_Device" owner="NetconfKeywords">
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-08-22T23:21:37.047677" level="INFO">${current_Date} = 2026-08-22 23:21:37.048</msg>
<var>${current_Date}</var>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-08-22T23:21:37.047494" elapsed="0.000210"/>
</kw>
<kw name="Add Time To Date" owner="DateTime">
<msg time="2026-08-22T23:21:37.048209" level="INFO">${deadline_Date} = 2026-08-23 00:06:37.048</msg>
<var>${deadline_Date}</var>
<arg>${current_Date}</arg>
<arg>${timeout}</arg>
<doc>Adds time to date and returns the resulting date.</doc>
<status status="PASS" start="2026-08-22T23:21:37.047858" elapsed="0.000377"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:37.052867" level="INFO">${current_port} = 17830</msg>
<arg>${current_port}</arg>
<arg>${BASE_NETCONF_DEVICE_PORT}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:21:37.048400" elapsed="0.004515"/>
</kw>
<kw name="Repeat Keyword" owner="BuiltIn">
<msg time="2026-08-22T23:21:37.053413" level="INFO">Repeating keyword, round 1/1.</msg>
<kw name="NetconfKeywords__Perform_Operation_With_Checking_On_Next_Device" owner="NetconfKeywords">
<kw name="NetconfKeywords__Check_Netconf_Test_Timeout_Not_Expired" owner="NetconfKeywords">
<if>
<branch type="IF" condition="not ${ENABLE_NETCONF_TEST_TIMEOUT}">
<return>
<status status="NOT RUN" start="2026-08-22T23:21:37.054681" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:37.054549" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:37.054530" elapsed="0.000217"/>
</if>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-08-22T23:21:37.055052" level="INFO">${current_Date} = 2026-08-22 23:21:37.055</msg>
<var>${current_Date}</var>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-08-22T23:21:37.054893" elapsed="0.000185"/>
</kw>
<kw name="Subtract Date From Date" owner="DateTime">
<msg time="2026-08-22T23:21:37.055560" level="INFO">${ellapsed_seconds} = 2699.993</msg>
<var>${ellapsed_seconds}</var>
<arg>${deadline_Date}</arg>
<arg>${current_Date}</arg>
<doc>Subtracts date from another date and returns time between.</doc>
<status status="PASS" start="2026-08-22T23:21:37.055229" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="${ellapsed_seconds}&lt;0">
<kw name="Fail" owner="BuiltIn">
<arg>The global time out period expired</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:37.055945" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:37.055678" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:37.055659" elapsed="0.000364"/>
</if>
<arg>${deadline_Date}</arg>
<status status="PASS" start="2026-08-22T23:21:37.054307" elapsed="0.001763"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:37.056604" level="INFO">${number} = 1</msg>
<var>${number}</var>
<arg>${current_port}-${BASE_NETCONF_DEVICE_PORT}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:37.056216" elapsed="0.000416"/>
</kw>
<kw name="Run Keyword" owner="BuiltIn">
<kw name="NetconfKeywords__Wait_Device_Is_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:37.058099" level="INFO">${number} = 1</msg>
<var>${number}</var>
<arg>'${device_name}'.split('-').pop()</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:37.057749" elapsed="0.000377"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:37.059865" level="INFO">${device-port} = 17830</msg>
<var>${device-port}</var>
<arg>${FIRST_TESTTOOL_PORT}+${device-number}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:37.059163" elapsed="0.000729"/>
</kw>
<kw name="NetconfKeywords__Check_Device_Is_Up" owner="NetconfKeywords">
<kw name="Count_Port_Occurences" owner="SSHKeywords">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_And_Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:37.063764" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-08-22T23:21:37.076012" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:21:37.076148" level="INFO">${netstat_installed} = net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET...</msg>
<var>${netstat_installed}</var>
<arg>netstat --version</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:21:37.063662" elapsed="0.012522"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<doc>Install netstat if it is not already installed.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:37.076787" elapsed="0.000036"/>
</kw>
<msg time="2026-08-22T23:21:37.076913" level="FAIL">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</msg>
<status status="FAIL" start="2026-08-22T23:21:37.076290" elapsed="0.000748">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</branch>
<status status="FAIL" start="2026-08-22T23:21:37.076259" elapsed="0.000842">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="FAIL" start="2026-08-22T23:21:37.063352" elapsed="0.014013">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</kw>
<arg>Check_And_Install_Netstat</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:37.062552" elapsed="0.015187"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:37.081515" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-08-22T23:21:37.132963" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:21:37.133343" level="INFO">${output} = 0</msg>
<var>${output}</var>
<arg>${NETSTAT_COMMAND} 2&gt; /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:21:37.080561" elapsed="0.052856"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:21:37.133536" elapsed="0.000132"/>
</return>
<msg time="2026-08-22T23:21:37.134088" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${last-port}</arg>
<arg>LISTEN</arg>
<arg>java</arg>
<doc>Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.</doc>
<status status="PASS" start="2026-08-22T23:21:37.060547" elapsed="0.073669"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-08-22T23:21:37.135980" level="FAIL">0 != 1</msg>
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-08-22T23:21:37.134882" elapsed="0.001323">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-08-22T23:21:37.060073" elapsed="0.076614">0 != 1</status>
</kw>
<arg>${number}</arg>
<doc>Query netstat on remote machine whether testtool device with the specified number has its port open and fail if not.</doc>
<status status="FAIL" start="2026-08-22T23:21:37.058839" elapsed="0.077991">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:38.140506" level="INFO">${device-port} = 17830</msg>
<var>${device-port}</var>
<arg>${FIRST_TESTTOOL_PORT}+${device-number}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:38.138912" elapsed="0.001707"/>
</kw>
<kw name="NetconfKeywords__Check_Device_Is_Up" owner="NetconfKeywords">
<kw name="Count_Port_Occurences" owner="SSHKeywords">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_And_Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:38.148136" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-08-22T23:21:38.161153" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:21:38.161291" level="INFO">${netstat_installed} = net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET...</msg>
<var>${netstat_installed}</var>
<arg>netstat --version</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:21:38.147962" elapsed="0.013365"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<doc>Install netstat if it is not already installed.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:38.161963" elapsed="0.000037"/>
</kw>
<msg time="2026-08-22T23:21:38.162052" level="FAIL">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</msg>
<status status="FAIL" start="2026-08-22T23:21:38.161458" elapsed="0.000757">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</branch>
<status status="FAIL" start="2026-08-22T23:21:38.161416" elapsed="0.000870">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="FAIL" start="2026-08-22T23:21:38.147115" elapsed="0.015371">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</kw>
<arg>Check_And_Install_Netstat</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:38.146160" elapsed="0.016563"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:38.164954" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-08-22T23:21:38.211230" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:21:38.211726" level="INFO">${output} = 0</msg>
<var>${output}</var>
<arg>${NETSTAT_COMMAND} 2&gt; /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:21:38.164364" elapsed="0.047474"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:21:38.211995" elapsed="0.000144"/>
</return>
<msg time="2026-08-22T23:21:38.212812" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${last-port}</arg>
<arg>LISTEN</arg>
<arg>java</arg>
<doc>Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.</doc>
<status status="PASS" start="2026-08-22T23:21:38.142370" elapsed="0.070670"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-08-22T23:21:38.215648" level="FAIL">0 != 1</msg>
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-08-22T23:21:38.214006" elapsed="0.001935">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-08-22T23:21:38.141086" elapsed="0.076059">0 != 1</status>
</kw>
<arg>${number}</arg>
<doc>Query netstat on remote machine whether testtool device with the specified number has its port open and fail if not.</doc>
<status status="FAIL" start="2026-08-22T23:21:38.137799" elapsed="0.079585">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:39.220896" level="INFO">${device-port} = 17830</msg>
<var>${device-port}</var>
<arg>${FIRST_TESTTOOL_PORT}+${device-number}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:39.219280" elapsed="0.001689"/>
</kw>
<kw name="NetconfKeywords__Check_Device_Is_Up" owner="NetconfKeywords">
<kw name="Count_Port_Occurences" owner="SSHKeywords">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_And_Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:39.227523" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-08-22T23:21:39.281251" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:21:39.281478" level="INFO">${netstat_installed} = net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET...</msg>
<var>${netstat_installed}</var>
<arg>netstat --version</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:21:39.227364" elapsed="0.054185"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<doc>Install netstat if it is not already installed.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:39.282629" elapsed="0.000068"/>
</kw>
<msg time="2026-08-22T23:21:39.282804" level="FAIL">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</msg>
<status status="FAIL" start="2026-08-22T23:21:39.281802" elapsed="0.001230">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</branch>
<status status="FAIL" start="2026-08-22T23:21:39.281745" elapsed="0.001395">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="FAIL" start="2026-08-22T23:21:39.226969" elapsed="0.056468">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</kw>
<arg>Check_And_Install_Netstat</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:39.226095" elapsed="0.057739"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:39.286731" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-08-22T23:21:39.335259" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:21:39.335760" level="INFO">${output} = 0</msg>
<var>${output}</var>
<arg>${NETSTAT_COMMAND} 2&gt; /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:21:39.286163" elapsed="0.049708"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:21:39.336024" elapsed="0.000137"/>
</return>
<msg time="2026-08-22T23:21:39.336860" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${last-port}</arg>
<arg>LISTEN</arg>
<arg>java</arg>
<doc>Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.</doc>
<status status="PASS" start="2026-08-22T23:21:39.222450" elapsed="0.114615"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-08-22T23:21:39.339647" level="FAIL">0 != 1</msg>
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-08-22T23:21:39.338033" elapsed="0.001909">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-08-22T23:21:39.221379" elapsed="0.119480">0 != 1</status>
</kw>
<arg>${number}</arg>
<doc>Query netstat on remote machine whether testtool device with the specified number has its port open and fail if not.</doc>
<status status="FAIL" start="2026-08-22T23:21:39.218262" elapsed="0.122840">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:40.343954" level="INFO">${device-port} = 17830</msg>
<var>${device-port}</var>
<arg>${FIRST_TESTTOOL_PORT}+${device-number}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:40.342559" elapsed="0.001458"/>
</kw>
<kw name="NetconfKeywords__Check_Device_Is_Up" owner="NetconfKeywords">
<kw name="Count_Port_Occurences" owner="SSHKeywords">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_And_Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:40.350967" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-08-22T23:21:40.373495" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:21:40.373752" level="INFO">${netstat_installed} = net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET...</msg>
<var>${netstat_installed}</var>
<arg>netstat --version</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:21:40.350316" elapsed="0.023496"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<doc>Install netstat if it is not already installed.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:40.374720" elapsed="0.000058"/>
</kw>
<msg time="2026-08-22T23:21:40.374854" level="FAIL">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</msg>
<status status="FAIL" start="2026-08-22T23:21:40.373982" elapsed="0.001046">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</branch>
<status status="FAIL" start="2026-08-22T23:21:40.373936" elapsed="0.001190">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="FAIL" start="2026-08-22T23:21:40.349933" elapsed="0.025461">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</kw>
<arg>Check_And_Install_Netstat</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:40.349083" elapsed="0.026679"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:40.379229" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-08-22T23:21:40.443252" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:21:40.444366" level="INFO">${output} = 0</msg>
<var>${output}</var>
<arg>${NETSTAT_COMMAND} 2&gt; /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:21:40.378370" elapsed="0.066138"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:21:40.444885" elapsed="0.000267"/>
</return>
<msg time="2026-08-22T23:21:40.445980" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${last-port}</arg>
<arg>LISTEN</arg>
<arg>java</arg>
<doc>Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.</doc>
<status status="PASS" start="2026-08-22T23:21:40.345473" elapsed="0.100728"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-08-22T23:21:40.449525" level="FAIL">0 != 1</msg>
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-08-22T23:21:40.447421" elapsed="0.002475">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-08-22T23:21:40.344415" elapsed="0.106409">0 != 1</status>
</kw>
<arg>${number}</arg>
<doc>Query netstat on remote machine whether testtool device with the specified number has its port open and fail if not.</doc>
<status status="FAIL" start="2026-08-22T23:21:40.341791" elapsed="0.109283">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:41.454819" level="INFO">${device-port} = 17830</msg>
<var>${device-port}</var>
<arg>${FIRST_TESTTOOL_PORT}+${device-number}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:41.453165" elapsed="0.001731"/>
</kw>
<kw name="NetconfKeywords__Check_Device_Is_Up" owner="NetconfKeywords">
<kw name="Count_Port_Occurences" owner="SSHKeywords">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_And_Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:41.463515" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-08-22T23:21:41.476511" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:21:41.476767" level="INFO">${netstat_installed} = net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET...</msg>
<var>${netstat_installed}</var>
<arg>netstat --version</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:21:41.463357" elapsed="0.013468"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<doc>Install netstat if it is not already installed.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:41.477772" elapsed="0.000056"/>
</kw>
<msg time="2026-08-22T23:21:41.477906" level="FAIL">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</msg>
<status status="FAIL" start="2026-08-22T23:21:41.477008" elapsed="0.001122">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</branch>
<status status="FAIL" start="2026-08-22T23:21:41.476953" elapsed="0.001283">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="FAIL" start="2026-08-22T23:21:41.462719" elapsed="0.015965">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</kw>
<arg>Check_And_Install_Netstat</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:41.460837" elapsed="0.018165"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:21:41.482567" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-08-22T23:21:41.527548" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:21:41.528046" level="INFO">${output} = 1</msg>
<var>${output}</var>
<arg>${NETSTAT_COMMAND} 2&gt; /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:21:41.481693" elapsed="0.046460"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:21:41.528317" elapsed="0.000146"/>
</return>
<msg time="2026-08-22T23:21:41.529143" level="INFO">${count} = 1</msg>
<var>${count}</var>
<arg>${last-port}</arg>
<arg>LISTEN</arg>
<arg>java</arg>
<doc>Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.</doc>
<status status="PASS" start="2026-08-22T23:21:41.456459" elapsed="0.072889"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-08-22T23:21:41.530344" elapsed="0.001599"/>
</kw>
<arg>${device-port}</arg>
<status status="PASS" start="2026-08-22T23:21:41.455314" elapsed="0.077078"/>
</kw>
<arg>${number}</arg>
<doc>Query netstat on remote machine whether testtool device with the specified number has its port open and fail if not.</doc>
<status status="PASS" start="2026-08-22T23:21:41.452103" elapsed="0.080398"/>
</kw>
<arg>${TESTTOOL_BOOT_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Device_Up_And_Running</arg>
<arg>${number}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:21:37.058294" elapsed="4.474342"/>
</kw>
<arg>${DEVICE_NAME_BASE}-${number}</arg>
<arg>log_response=${log_response}</arg>
<status status="PASS" start="2026-08-22T23:21:37.057284" elapsed="4.475491"/>
</kw>
<arg>${operation}</arg>
<arg>${DEVICE_NAME_BASE}-${number}</arg>
<arg>log_response=${log_response}</arg>
<doc>Executes the given keyword with the given arguments.</doc>
<status status="PASS" start="2026-08-22T23:21:37.056816" elapsed="4.476061"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:41.534065" level="INFO">${next} = 17831</msg>
<var>${next}</var>
<arg>${current_port}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:41.533231" elapsed="0.000896"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:41.535475" level="INFO">${current_port} = 17831</msg>
<arg>${current_port}</arg>
<arg>${next}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:21:41.534497" elapsed="0.001021"/>
</kw>
<arg>${operation}</arg>
<arg>${deadline_Date}</arg>
<arg>log_response=${log_response}</arg>
<status status="PASS" start="2026-08-22T23:21:37.053637" elapsed="4.481994"/>
</kw>
<arg>${count} times</arg>
<arg>NetconfKeywords__Perform_Operation_With_Checking_On_Next_Device</arg>
<arg>${operation}</arg>
<arg>${deadline_Date}</arg>
<arg>log_response=${log_response}</arg>
<doc>Executes the specified keyword multiple times.</doc>
<status status="PASS" start="2026-08-22T23:21:37.053082" elapsed="4.482612"/>
</kw>
<arg>NetconfKeywords__Wait_Device_Is_Up_And_Running</arg>
<arg>log_response=${log_response}</arg>
<status status="PASS" start="2026-08-22T23:21:37.047042" elapsed="4.488722"/>
</kw>
<arg>${filename}</arg>
<arg>${device-count}</arg>
<arg>${debug}</arg>
<arg>${schemas}</arg>
<arg>${rpc_config}</arg>
<arg>${tool_options}</arg>
<arg>${java_options}</arg>
<arg>${mdsal}</arg>
<arg>log_response=${log_response}</arg>
<doc>Arrange to collect tool's output into a log file.
Will use specific /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas unless argument resolves to 'none',
which signifies that there are no additional schemas to be deployed.
If so the directory for the additional schemas is deleted on the
remote machine and the additional schemas argument is left out.</doc>
<status status="PASS" start="2026-08-22T23:21:36.790970" elapsed="4.744852"/>
</kw>
<arg>device-count=1</arg>
<arg>schemas=/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas</arg>
<doc>Install and run testtool.</doc>
<status status="PASS" start="2026-08-22T23:21:36.095461" elapsed="5.440481"/>
</kw>
<doc>Deploy and start test tool, then wait for all its devices to become online.</doc>
<status status="PASS" start="2026-08-22T23:21:35.877411" elapsed="5.658665"/>
</test>
<test id="s1-s2-t2" name="Check_Device_Is_Not_Mounted_At_Beginning" line="70">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:21:41.539944" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:21:41.539676" 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-08-22T23:21:41.541229" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:41.541112" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.541092" 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-08-22T23:21:41.546223" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:41.546116" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.546098" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:41.547335" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:41.546948" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:21:41.548093" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:21:41.547523" elapsed="0.000598"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:21:41.548167" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:21:41.548321" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:21:41.546519" elapsed="0.001828"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:41.553847" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:41.553737" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.553718" 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-08-22T23:21:41.555105" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:41.554995" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.554977" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:41.555659" 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-08-22T23:21:41.555318" elapsed="0.000368"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:41.556074" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:41.555843" elapsed="0.000256"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:41.589228" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:41.556603" elapsed="0.032732"/>
</kw>
<msg time="2026-08-22T23:21:41.589514" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:41.589560" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:41.556255" elapsed="0.033362"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:41.610564" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:21:41.590125" elapsed="0.020562"/>
</kw>
<msg time="2026-08-22T23:21:41.610873" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:41.610919" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:41.589786" elapsed="0.021171"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:41.611294" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:41.611069" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.611048" elapsed="0.000327"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:41.611858" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:41.611517" 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-08-22T23:21:41.612212" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:41.611994" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.611976" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:41.612323" 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-08-22T23:21:41.615105" elapsed="0.000147"/>
</kw>
<msg time="2026-08-22T23:21:41.615316" 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-08-22T23:21:41.613850" elapsed="0.001609"/>
</kw>
<kw name="Open 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-08-22T23:21:41.615777" elapsed="0.000087"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:41.616141" 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-08-22T23:21:41.613158" elapsed="0.003186"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:21:41.612621" 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-08-22T23:21:41.554691" elapsed="0.061818"/>
</kw>
<msg time="2026-08-22T23:21:41.616619" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:41.616664" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:41.554064" elapsed="0.062637"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:41.616883" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:21:41.616778" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.616759" 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-08-22T23:21:41.617365" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:41.617723" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:41.617795" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:21:41.553379" elapsed="0.064524"/>
</kw>
<msg time="2026-08-22T23:21:41.617996" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:41.618040" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:41.548788" elapsed="0.069288"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:41.618397" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:41.618151" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.618134" elapsed="0.000340"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:21:41.548639" elapsed="0.069858"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:41.624084" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:41.623975" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.623957" 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-08-22T23:21:41.625299" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:41.625191" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.625173" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:41.625879" 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-08-22T23:21:41.625544" elapsed="0.000362"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:41.626281" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:41.626061" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:41.664225" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:41.626949" elapsed="0.037407"/>
</kw>
<msg time="2026-08-22T23:21:41.664565" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:41.664639" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:41.626462" elapsed="0.038215"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:41.689665" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:21:41.665181" elapsed="0.024592"/>
</kw>
<msg time="2026-08-22T23:21:41.689943" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:41.689989" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:41.664846" elapsed="0.025181"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:41.690335" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:41.690104" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.690084" elapsed="0.000336"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:41.690886" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:41.690559" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:41.691257" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:41.691043" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.691024" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:41.691369" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<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-08-22T23:21:41.694024" elapsed="0.000145"/>
</kw>
<msg time="2026-08-22T23:21:41.694232" 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-08-22T23:21:41.692848" elapsed="0.001524"/>
</kw>
<kw name="Open 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-08-22T23:21:41.694685" elapsed="0.000087"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:41.695075" 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-08-22T23:21:41.692178" elapsed="0.003101"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:21:41.691636" elapsed="0.003709"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:21:41.624890" elapsed="0.070552"/>
</kw>
<msg time="2026-08-22T23:21:41.695533" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:41.695576" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:41.624300" elapsed="0.071357"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:41.695845" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:21:41.695738" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.695719" 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-08-22T23:21:41.696312" 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-08-22T23:21:41.696665" elapsed="0.000059"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:41.696774" 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-08-22T23:21:41.623638" elapsed="0.073247"/>
</kw>
<msg time="2026-08-22T23:21:41.696977" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:41.697020" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:41.618797" elapsed="0.078260"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:41.697376" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:41.697131" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.697114" elapsed="0.000339"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:21:41.618649" elapsed="0.078828"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:41.702940" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:41.702831" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.702812" 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-08-22T23:21:41.704180" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:41.704072" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.704054" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:41.704722" 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-08-22T23:21:41.704385" elapsed="0.000363"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:41.705120" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:41.704901" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:41.737977" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:41.705651" elapsed="0.032452"/>
</kw>
<msg time="2026-08-22T23:21:41.738284" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:41.738331" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:41.705301" elapsed="0.033067"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:41.766767" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:21:41.738909" elapsed="0.028146"/>
</kw>
<msg time="2026-08-22T23:21:41.767270" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:41.767317" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:41.738543" elapsed="0.028812"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:41.767694" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:41.767432" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.767413" elapsed="0.000365"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:41.768224" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:41.767917" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:41.768574" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:41.768361" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.768343" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:41.768709" 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-08-22T23:21:41.771464" elapsed="0.000170"/>
</kw>
<msg time="2026-08-22T23:21:41.771698" 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-08-22T23:21:41.770186" 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-08-22T23:21:41.772183" elapsed="0.000087"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:41.772552" elapsed="0.000113"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:21:41.769497" 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-08-22T23:21:41.768963" 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-08-22T23:21:41.703770" elapsed="0.069183"/>
</kw>
<msg time="2026-08-22T23:21:41.773044" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:41.773088" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:41.703181" elapsed="0.069943"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:41.773309" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:21:41.773201" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.773182" 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-08-22T23:21:41.773803" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:41.774131" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:41.774203" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:21:41.702477" elapsed="0.071834"/>
</kw>
<msg time="2026-08-22T23:21:41.774403" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:41.774446" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:41.697882" elapsed="0.076600"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:41.774970" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:41.774558" elapsed="0.000467"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.774540" elapsed="0.000509"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:21:41.697743" elapsed="0.077329"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:21:41.548417" elapsed="0.226683"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:21:41.545756" elapsed="0.229444"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:21:41.540812" elapsed="0.234448"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:41.540362" elapsed="0.234943"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:21:41.536917" elapsed="0.238441"/>
</kw>
<kw name="Check_Device_Has_No_Netconf_Connector" owner="NetconfKeywords">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:41.788213" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:41.784357" elapsed="0.003883"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:41.788574" elapsed="0.000041"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-22T23:21:41.788422" elapsed="0.000230"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-22T23:21:41.788295" elapsed="0.000382"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:41.788981" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:41.788740" elapsed="0.000299"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:41.789792" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:41.789294" elapsed="0.000525"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:41.789062" elapsed="0.000867"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:41.790121" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:41.789956" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.788723" elapsed="0.001475"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:41.790232" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:21:41.790379" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:21:41.783905" elapsed="0.006500"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:41.790450" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:21:41.790608" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:21:41.783405" elapsed="0.007231"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:41.797853" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:41.797601" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:41.798294" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:41.798050" 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-08-22T23:21:41.811670" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:41.811867" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Fri, 21-Aug-2026 23:21:41 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1011'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}} 
 </msg>
<msg time="2026-08-22T23:21:41.812260" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:21:41.800462" elapsed="0.011861"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:41.798403" elapsed="0.014016"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:41.812863" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:41.812477" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.798385" elapsed="0.014768"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:41.820697" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:41.815497" elapsed="0.005255"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:41.814982" elapsed="0.005804"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.814940" elapsed="0.005871"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:41.823386" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:41.821086" elapsed="0.002346"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:41.820867" elapsed="0.002599"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.820850" elapsed="0.002640"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:41.824074" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:41.823664" 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-08-22T23:21:41.824409" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:41.824171" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:41.825007" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:41.824702" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:41.824524" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.824153" elapsed="0.000938"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:41.825637" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:41.825249" 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-08-22T23:21:41.825969" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:41.825736" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:41.826504" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:41.826209" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:41.826051" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.825717" 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-08-22T23:21:41.826753" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:21:41.827640" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:41.827291" 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-08-22T23:21:41.827823" 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-08-22T23:21:41.813993" elapsed="0.016331"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:41.830499" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:41.830393" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.830374" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:21:41.833746" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:21:41.830727" elapsed="0.003048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:21:41.833828" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:21:41.833987" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:21:41.793297" elapsed="0.040717"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:21:41.834071" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:21:41.834218" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:21:41.790856" elapsed="0.043388"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:41.834672" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:41.834402" elapsed="0.000327"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:41.835296" level="INFO">${actual_count} = 0</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:41.834881" elapsed="0.000476"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-22T23:21:41.835410" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:21:41.835565" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-22T23:21:41.776073" elapsed="0.059533"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:21:41.836025" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:21:41.835762" elapsed="0.000319"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${NODE_CONFIGURER}</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="PASS" start="2026-08-22T23:21:41.775594" elapsed="0.060545"/>
</kw>
<doc>Sanity check making sure our device is not there. Fail if found.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-08-22T23:21:41.536309" elapsed="0.299938"/>
</test>
<test id="s1-s2-t3" name="Configure_Device_On_Netconf" line="75">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:21:41.839494" elapsed="0.000223"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:21:41.839218" 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-08-22T23:21:41.840743" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:41.840634" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.840614" 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-08-22T23:21:41.845710" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:41.845602" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.845569" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:41.846766" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:41.846372" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:21:41.847250" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:21:41.846948" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:21:41.847336" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:21:41.847492" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:21:41.845998" elapsed="0.001519"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:41.853136" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:41.853028" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.853009" 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-08-22T23:21:41.854371" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:41.854260" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.854241" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:41.854915" 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-08-22T23:21:41.854601" elapsed="0.000340"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:41.855335" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:41.855096" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:41.887311" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:41.855869" elapsed="0.031562"/>
</kw>
<msg time="2026-08-22T23:21:41.887635" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:41.887681" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:41.855519" elapsed="0.032199"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:41.904592" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:21:41.888218" elapsed="0.016473"/>
</kw>
<msg time="2026-08-22T23:21:41.904858" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:41.904904" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:41.887884" elapsed="0.017090"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:41.905272" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:41.905052" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.905033" elapsed="0.000317"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:41.905816" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:41.905489" 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-08-22T23:21:41.906160" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:41.905948" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.905929" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:41.906271" 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-08-22T23:21:41.908966" elapsed="0.000145"/>
</kw>
<msg time="2026-08-22T23:21:41.909173" 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-08-22T23:21:41.907793" 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="NOT RUN" start="2026-08-22T23:21:41.909633" elapsed="0.000093"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:41.910006" 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-08-22T23:21:41.907069" 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-08-22T23:21:41.906525" elapsed="0.003755"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:21:41.853954" elapsed="0.056424"/>
</kw>
<msg time="2026-08-22T23:21:41.910469" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:41.910513" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:41.853355" elapsed="0.057196"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:41.910774" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:21:41.910668" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.910649" 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-08-22T23:21:41.911246" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:41.911612" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:41.911686" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:21:41.852685" elapsed="0.059109"/>
</kw>
<msg time="2026-08-22T23:21:41.911886" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:41.911929" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:41.847894" elapsed="0.064073"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:41.912288" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:41.912041" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.912024" elapsed="0.000342"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:21:41.847754" elapsed="0.064635"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:41.918070" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:41.917962" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.917943" 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-08-22T23:21:41.919278" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:41.919171" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.919152" elapsed="0.000239"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:41.919889" 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-08-22T23:21:41.919553" elapsed="0.000362"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:41.920293" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:41.920071" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:41.955922" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:41.920830" elapsed="0.035194"/>
</kw>
<msg time="2026-08-22T23:21:41.956202" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:41.956248" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:41.920475" elapsed="0.035809"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:41.977179" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:21:41.956811" elapsed="0.020471"/>
</kw>
<msg time="2026-08-22T23:21:41.977458" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:41.977504" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:41.956452" elapsed="0.021089"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:41.978018" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:41.977800" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.977779" elapsed="0.000317"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:41.978535" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:41.978235" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:41.978903" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:41.978688" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.978670" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:41.979014" 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-08-22T23:21:41.981682" elapsed="0.000146"/>
</kw>
<msg time="2026-08-22T23:21:41.981891" 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-08-22T23:21:41.980492" elapsed="0.001540"/>
</kw>
<kw name="Open 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-08-22T23:21:41.982327" elapsed="0.000087"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:41.982716" 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-08-22T23:21:41.979832" elapsed="0.003088"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:21:41.979266" 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-08-22T23:21:41.918868" elapsed="0.064213"/>
</kw>
<msg time="2026-08-22T23:21:41.983173" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:41.983217" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:41.918288" elapsed="0.064967"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:41.983436" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:21:41.983330" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.983312" 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-08-22T23:21:41.983943" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:41.984311" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:41.984382" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:21:41.917619" elapsed="0.066872"/>
</kw>
<msg time="2026-08-22T23:21:41.984741" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:41.984790" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:41.912791" elapsed="0.072037"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:41.985152" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:41.984904" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.984886" elapsed="0.000343"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:21:41.912510" elapsed="0.072742"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:41.990772" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:41.990665" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.990645" 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-08-22T23:21:41.992004" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:41.991898" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:41.991880" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:41.992520" 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-08-22T23:21:41.992212" elapsed="0.000334"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:41.992935" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:41.992715" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:42.025472" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:41.993443" elapsed="0.032148"/>
</kw>
<msg time="2026-08-22T23:21:42.025774" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:42.025820" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:41.993115" elapsed="0.032742"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:42.041599" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:21:42.026359" elapsed="0.015340"/>
</kw>
<msg time="2026-08-22T23:21:42.041867" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:42.041913" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:42.026025" elapsed="0.015925"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.042239" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.042024" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.042005" elapsed="0.000311"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.042780" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:42.042457" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.043122" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.042911" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.042893" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:42.043231" 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-08-22T23:21:42.045904" elapsed="0.000144"/>
</kw>
<msg time="2026-08-22T23:21:42.046143" 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-08-22T23:21:42.044744" elapsed="0.001542"/>
</kw>
<kw name="Open 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-08-22T23:21:42.046594" elapsed="0.000092"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.046965" 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-08-22T23:21:42.044058" elapsed="0.003110"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:21:42.043486" elapsed="0.003747"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:21:41.991560" elapsed="0.055770"/>
</kw>
<msg time="2026-08-22T23:21:42.047425" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:42.047469" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:41.990989" elapsed="0.056516"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:42.047730" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-08-22T23:21:42.047621" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.047563" elapsed="0.000268"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.048214" 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-08-22T23:21:42.048542" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:42.048635" 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-08-22T23:21:41.990309" elapsed="0.058437"/>
</kw>
<msg time="2026-08-22T23:21:42.048838" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:42.048882" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:41.985511" elapsed="0.063407"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.049237" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.048993" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.048976" elapsed="0.000337"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:21:41.985373" elapsed="0.063963"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:21:41.847568" elapsed="0.201797"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:21:41.845232" elapsed="0.204187"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:21:41.840332" elapsed="0.209144"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:41.839918" elapsed="0.209601"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:21:41.837104" elapsed="0.212466"/>
</kw>
<kw name="Configure_Device_In_Netconf" owner="NetconfKeywords">
<kw name="Set_Variable_If_At_Least_Scandium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Set_Variable_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Set Variable If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:42.071188" elapsed="0.000443"/>
</kw>
<msg time="2026-08-22T23:21:42.071684" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>BuiltIn.Set_Variable_If</arg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:42.070826" elapsed="0.000913"/>
</kw>
<arg>scandium</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Compare ${lower_bound} to titanium and return scandium if titanium is at least ${lower_bound},
return calcium otherwise.</doc>
<status status="PASS" start="2026-08-22T23:21:42.070402" elapsed="0.001424"/>
</kw>
<msg time="2026-08-22T23:21:42.071870" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Set_Variable_If_At_Least</arg>
<arg>scandium</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:42.061547" elapsed="0.010368"/>
</kw>
<msg time="2026-08-22T23:21:42.072016" level="INFO">${version} = scandium</msg>
<var>${version}</var>
<arg>scandium</arg>
<arg>calcium</arg>
<doc>Compare scandium to titanium and return ${value_if_true} if titanium is at least scandium, return ${value_if_false} otherwise.</doc>
<status status="PASS" start="2026-08-22T23:21:42.061226" elapsed="0.010814"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.073003" level="INFO">${mapping} = {'DEVICE_IP': '10.30.171.196', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/t...</msg>
<var>${mapping}</var>
<arg>DEVICE_IP=${device_address}</arg>
<arg>DEVICE_NAME=${device_name}</arg>
<arg>DEVICE_PORT=${device_port}</arg>
<arg>DEVICE_USER=${device_user}</arg>
<arg>DEVICE_PASSWORD=${device_password}</arg>
<arg>DEVICE_KEY=${device_key}</arg>
<arg>SCHEMA_DIRECTORY=${schema_directory}</arg>
<arg>RESTCONF_ROOT=${RESTCONF_ROOT}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:21:42.072250" elapsed="0.000782"/>
</kw>
<if>
<branch type="IF" condition="'${http_method}'=='post'">
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<arg>folder=${DIRECTORY_WITH_DEVICE_TEMPLATES}${/}${version}${/}${device_type}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.073439" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.073121" elapsed="0.000385"/>
</branch>
<branch type="ELSE">
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.105553" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:42.105174" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:21:42.106421" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/bug8086.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:21:42.106105" elapsed="0.000405">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/bug8086.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:21:42.106622" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:21:42.105762" elapsed="0.000886"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.107191" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:42.106809" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:21:42.107519" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/bug8086/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/bug8086/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:21:42.107697" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:21:42.107375" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.108160" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:42.107911" 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-08-22T23:21:42.109163" level="INFO">mapping: {'DEVICE_IP': '10.30.171.196', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tmp/schema', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:42.108904" elapsed="0.000305"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.109641" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:21:42.109363" elapsed="0.000304"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.110466" level="INFO">${value} = 10.30.171.196</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:21:42.110025" elapsed="0.000467"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:21:42.111525" level="INFO">${encoded} = 10.30.171.196</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:21:42.111092" elapsed="0.000567"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:21:42.112004" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:21:42.112166" level="INFO">${encoded_value} = 10.30.171.196</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:21:42.110699" elapsed="0.001491"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:21:42.112349" elapsed="0.000469"/>
</kw>
<var name="${key}">DEVICE_IP</var>
<var name="${value}">10.30.171.196</var>
<status status="PASS" start="2026-08-22T23:21:42.109896" elapsed="0.002964"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.113535" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:21:42.113103" elapsed="0.000458"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:21:42.114603" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:21:42.114162" elapsed="0.000596"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:21:42.115074" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:21:42.115234" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:21:42.113771" elapsed="0.001488"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:21:42.115408" elapsed="0.000614"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:21:42.112973" elapsed="0.003092"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.116766" level="INFO">${value} = 17830</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:21:42.116307" elapsed="0.000486"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:21:42.117899" level="INFO">${encoded} = 17830</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:21:42.117365" elapsed="0.000679"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:21:42.118426" elapsed="0.000042"/>
</return>
<msg time="2026-08-22T23:21:42.118663" level="INFO">${encoded_value} = 17830</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:21:42.116974" elapsed="0.001725"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:21:42.118902" elapsed="0.000754"/>
</kw>
<var name="${key}">DEVICE_PORT</var>
<var name="${value}">17830</var>
<status status="PASS" start="2026-08-22T23:21:42.116177" elapsed="0.003524"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.120431" level="INFO">${value} = admin</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:21:42.119983" elapsed="0.000474"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:21:42.121514" level="INFO">${encoded} = admin</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:21:42.121081" elapsed="0.000651"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:21:42.122052" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:21:42.122214" level="INFO">${encoded_value} = admin</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:21:42.120685" elapsed="0.001554"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:21:42.122387" elapsed="0.000456"/>
</kw>
<var name="${key}">DEVICE_USER</var>
<var name="${value}">admin</var>
<status status="PASS" start="2026-08-22T23:21:42.119818" elapsed="0.003067"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.123718" level="INFO">${value} = topsecret</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:21:42.123128" elapsed="0.000626"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:21:42.125161" level="INFO">${encoded} = topsecret</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:21:42.124736" elapsed="0.000541"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:21:42.125687" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:21:42.125848" level="INFO">${encoded_value} = topsecret</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:21:42.124311" elapsed="0.001562"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:21:42.126021" elapsed="0.000425"/>
</kw>
<var name="${key}">DEVICE_PASSWORD</var>
<var name="${value}">topsecret</var>
<status status="PASS" start="2026-08-22T23:21:42.122999" elapsed="0.003489"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.127178" level="INFO">${value} = device-key</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:21:42.126748" elapsed="0.000457"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:21:42.128321" level="INFO">${encoded} = device-key</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:21:42.127859" elapsed="0.000579"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:21:42.128768" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:21:42.128927" level="INFO">${encoded_value} = device-key</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:21:42.127386" elapsed="0.001566"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:21:42.129099" elapsed="0.000424"/>
</kw>
<var name="${key}">DEVICE_KEY</var>
<var name="${value}">device-key</var>
<status status="PASS" start="2026-08-22T23:21:42.126617" elapsed="0.002947"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.130293" level="INFO">${value} = /tmp/schema</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:21:42.129868" elapsed="0.000451"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:21:42.131317" level="INFO">${encoded} = /tmp/schema</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:21:42.130903" elapsed="0.000574"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:21:42.131891" elapsed="0.000044"/>
</return>
<msg time="2026-08-22T23:21:42.132065" level="INFO">${encoded_value} = /tmp/schema</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:21:42.130498" elapsed="0.001592"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:21:42.132238" elapsed="0.000441"/>
</kw>
<var name="${key}">SCHEMA_DIRECTORY</var>
<var name="${value}">/tmp/schema</var>
<status status="PASS" start="2026-08-22T23:21:42.129740" elapsed="0.002981"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.133404" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:21:42.132962" elapsed="0.000469"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:21:42.134509" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:21:42.134083" elapsed="0.000560"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:21:42.134954" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:21:42.135113" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:21:42.133691" elapsed="0.001446"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:21:42.135285" elapsed="0.000505"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:21:42.132832" elapsed="0.003000"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:21:42.109716" elapsed="0.026153"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:21:42.135914" elapsed="0.000058"/>
</return>
<msg time="2026-08-22T23:21:42.136110" level="INFO">${mapping_to_use} = {'DEVICE_IP': '10.30.171.196', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/t...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:21:42.108566" elapsed="0.027571"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:42.108272" elapsed="0.027896"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.136343" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.136195" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.108254" elapsed="0.028166"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.137288" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:42.136562" elapsed="0.000754"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:21:42.137366" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:21:42.104543" elapsed="0.032947"/>
</kw>
<msg time="2026-08-22T23:21:42.137545" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:42.091678" elapsed="0.046019"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.150342" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.162565" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.174825" 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-08-22T23:21:42.175056" 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-08-22T23:21:42.175229" 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-08-22T23:21:42.175610" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.175452" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:42.175437" 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-08-22T23:21:42.175829" 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-08-22T23:21:42.175992" 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-08-22T23:21:42.176434" elapsed="0.000031"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:21:42.175409" elapsed="0.001091"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:21:42.175307" elapsed="0.001219"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.176693" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:42.176771" elapsed="0.000020"/>
</return>
<msg time="2026-08-22T23:21:42.176908" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:21:42.087439" elapsed="0.089496"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.203082" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086.titanium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:42.202709" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:21:42.203837" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/bug8086.titanium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:21:42.203608" elapsed="0.000301">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/bug8086.titanium/data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:21:42.204002" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:21:42.203267" elapsed="0.000759"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.204593" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:42.204198" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:21:42.204922" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/bug8086/data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/bug8086/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:21:42.205067" level="INFO">${template} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;$DEVICE_NAME&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;$DEVICE_IP&lt;/host&gt;
    &lt;port&gt;$DEVI...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:21:42.204779" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.205490" level="INFO">&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;$DEVICE_NAME&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;$DEVICE_IP&lt;/host&gt;
    &lt;port&gt;$DEVICE_PORT&lt;/port&gt;
    &lt;login-password-unencrypted&gt;
      &lt;username&gt;$DEVICE_USER&lt;/username&gt;
      &lt;password&gt;$DEVICE_PASSWORD&lt;/password&gt;
    &lt;/login-password-unencrypted&gt;
    &lt;tcp-only&gt;false&lt;/tcp-only&gt;
    &lt;keepalive-delay&gt;0&lt;/keepalive-delay&gt;
    &lt;schema-cache-directory&gt;$SCHEMA_DIRECTORY&lt;/schema-cache-directory&gt;
  &lt;/netconf-node&gt;
&lt;/node&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:42.205248" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:21:42.205916" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.205626" elapsed="0.000349"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.206474" level="INFO">${mapping_to_use} = {'DEVICE_IP': '10.30.171.196', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/t...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:42.206141" elapsed="0.000361"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:42.205999" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.205607" elapsed="0.000953"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.207413" level="INFO">${final_text} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;10.30.171.196&lt;/host&gt;
    &lt;...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:42.206722" elapsed="0.000729"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:21:42.207500" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:21:42.202088" elapsed="0.005555"/>
</kw>
<msg time="2026-08-22T23:21:42.207698" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:42.189607" elapsed="0.018139"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.220181" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.232414" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.244665" 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-08-22T23:21:42.244857" 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-08-22T23:21:42.245028" 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-08-22T23:21:42.245384" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.245243" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:42.245229" elapsed="0.000234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.245614" 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-08-22T23:21:42.245780" 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-08-22T23:21:42.245940" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:21:42.245202" elapsed="0.000790"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:21:42.245101" elapsed="0.000916"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.246158" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:42.246233" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:21:42.246357" level="INFO">${data} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;10.30.171.196&lt;/host&gt;
    &lt;...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:21:42.186966" elapsed="0.059479"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:21:42.247720" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/bug8086/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:21:42.247460" elapsed="0.000324">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/bug8086/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:21:42.247876" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:21:42.247124" elapsed="0.000777"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.248244" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.247971" elapsed="0.000332"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.248819" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:42.248508" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:42.248328" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.247953" elapsed="0.000950"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.251217" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:42.249052" elapsed="0.002191"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:21:42.251294" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:21:42.251450" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:21:42.246802" elapsed="0.004673"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.252899" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:42.252652" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.253331" level="INFO">&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;10.30.171.196&lt;/host&gt;
    &lt;port&gt;17830&lt;/port&gt;
    &lt;login-password-unencrypted&gt;
      &lt;username&gt;admin&lt;/username&gt;
      &lt;password&gt;topsecret&lt;/password&gt;
    &lt;/login-password-unencrypted&gt;
    &lt;tcp-only&gt;false&lt;/tcp-only&gt;
    &lt;keepalive-delay&gt;0&lt;/keepalive-delay&gt;
    &lt;schema-cache-directory&gt;/tmp/schema&lt;/schema-cache-directory&gt;
  &lt;/netconf-node&gt;
&lt;/node&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:42.253094" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.253794" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:42.253532" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.254222" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:42.253985" elapsed="0.000280"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:42.255083" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:21:42.254883" elapsed="0.000226"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:21:42.255435" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:21:42.255258" 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-08-22T23:21:42.255620" elapsed="0.000206"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.256251" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:42.255979" elapsed="0.000318"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:21:42.256338" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:21:42.256492" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:21:42.254466" elapsed="0.002051"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:21:42.274672" level="INFO">PUT Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Content-Length': '517', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;10.30.171.196&lt;/host&gt;
    &lt;port&gt;17830&lt;/port&gt;
    &lt;login-password-unencrypted&gt;
      &lt;username&gt;admin&lt;/username&gt;
      &lt;password&gt;topsecret&lt;/password&gt;
    &lt;/login-password-unencrypted&gt;
    &lt;tcp-only&gt;false&lt;/tcp-only&gt;
    &lt;keepalive-delay&gt;0&lt;/keepalive-delay&gt;
    &lt;schema-cache-directory&gt;/tmp/schema&lt;/schema-cache-directory&gt;
  &lt;/netconf-node&gt;
&lt;/node&gt; 
 </msg>
<msg time="2026-08-22T23:21:42.274965" level="INFO">PUT Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:42.275179" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:21:42.258842" elapsed="0.016395"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:42.256603" elapsed="0.018736"/>
</branch>
<branch type="ELSE">
<kw name="PUT 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 PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.275779" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.275399" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.256569" elapsed="0.019415"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.283431" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:42.278164" elapsed="0.005364"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:42.277671" elapsed="0.005965"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.277628" elapsed="0.006068"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.287418" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:42.284347" elapsed="0.003117"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:42.283821" elapsed="0.003677"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.283784" elapsed="0.003739"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.288080" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:42.287700" 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-08-22T23:21:42.288426" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.288177" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.288984" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:42.288682" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:42.288509" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.288159" elapsed="0.000909"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.289605" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:42.289224" 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-08-22T23:21:42.289932" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.289702" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.290460" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:42.290167" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:42.290012" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.289684" elapsed="0.000857"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:21:42.290702" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:21:42.291487" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:42.291206" 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-08-22T23:21:42.291679" elapsed="0.002375"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:21:42.276841" elapsed="0.017275"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:21:42.294287" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:21:42.294182" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.294164" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.294518" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:42.294601" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:21:42.297033" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT 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-08-22T23:21:42.251818" elapsed="0.045246"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:21:42.297130" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:21:42.297298" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-08-22T23:21:42.076393" elapsed="0.220971"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.297734" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.297469" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.297451" elapsed="0.000376"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:21:42.297862" elapsed="0.000025"/>
</return>
<arg>folder=${DIRECTORY_WITH_DEVICE_TEMPLATES}${/}${version}${/}${device_type}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-08-22T23:21:42.073783" elapsed="0.224203"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:42.073531" elapsed="0.224499"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.073102" elapsed="0.224951"/>
</if>
<kw name="Set To Dictionary" owner="Collections">
<arg>${NetconfKeywords__mounted_device_types}</arg>
<arg>${device_name}</arg>
<arg>${device_type}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:21:42.298202" elapsed="0.000246"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>device_type=bug8086</arg>
<arg>session=${NODE_CONFIGURER}</arg>
<arg>schema_directory=${SCHEMA_DIRECTORY}</arg>
<doc>Tell Netconf about the specified device so it can add it into its configuration.</doc>
<status status="PASS" start="2026-08-22T23:21:42.049986" elapsed="0.248528"/>
</kw>
<doc>Make request to configure a testtool device on Netconf connector</doc>
<tag>critical</tag>
<status status="PASS" start="2026-08-22T23:21:41.836524" elapsed="0.462136"/>
</test>
<test id="s1-s2-t4" name="Check_Configurer_Has_Netconf_Connector_For_Device" 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-08-22T23:21:42.302228" elapsed="0.000221"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:21:42.301970" 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-08-22T23:21:42.303491" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:42.303383" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.303365" 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-08-22T23:21:42.308437" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:42.308305" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.308287" elapsed="0.000217"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.309491" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:42.309113" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.309992" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:21:42.309688" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:21:42.310062" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:21:42.310215" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:21:42.308740" elapsed="0.001499"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:42.315652" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:42.315529" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.315511" 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-08-22T23:21:42.316949" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:42.316801" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.316782" elapsed="0.000234"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:42.317477" 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-08-22T23:21:42.317160" elapsed="0.000343"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:42.317910" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:42.317675" elapsed="0.000261"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:42.353143" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:42.318420" elapsed="0.034825"/>
</kw>
<msg time="2026-08-22T23:21:42.353475" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:42.353522" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:42.318091" elapsed="0.035468"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:42.375832" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o "n "n "e "c "t "o "r "_ "F "o "r "_ "D "e "v "i "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:21:42.354084" elapsed="0.021858"/>
</kw>
<msg time="2026-08-22T23:21:42.376112" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:42.376158" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:42.353745" elapsed="0.022450"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.376504" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.376273" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.376253" elapsed="0.000352"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.377049" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o "n "n "e "c "t "o "r "_ "F "o "r "_ "D "e "v "i "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:42.376747" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.377399" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.377188" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.377170" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:42.377514" 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-08-22T23:21:42.380208" elapsed="0.000146"/>
</kw>
<msg time="2026-08-22T23:21:42.380417" 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-08-22T23:21:42.379012" elapsed="0.001592"/>
</kw>
<kw name="Open 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-08-22T23:21:42.380901" elapsed="0.000088"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.381265" 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-08-22T23:21:42.378327" elapsed="0.003148"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:21:42.377795" elapsed="0.003745"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:21:42.316477" elapsed="0.065194"/>
</kw>
<msg time="2026-08-22T23:21:42.381763" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:42.381806" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:42.315866" elapsed="0.065977"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:42.382022" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:21:42.381918" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.381900" 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-08-22T23:21:42.382494" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.382847" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:42.382918" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:21:42.315194" elapsed="0.067833"/>
</kw>
<msg time="2026-08-22T23:21:42.383120" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:42.383163" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:42.310614" elapsed="0.072586"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.383563" elapsed="0.000172"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.383317" elapsed="0.000454"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.383299" elapsed="0.000496"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:21:42.310461" elapsed="0.073358"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:42.389420" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:42.389314" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.389295" 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-08-22T23:21:42.390649" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:42.390519" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.390502" elapsed="0.000214"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:42.391166" 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-08-22T23:21:42.390856" elapsed="0.000336"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:42.391566" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:42.391347" elapsed="0.000261"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:42.427706" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:42.392094" elapsed="0.035738"/>
</kw>
<msg time="2026-08-22T23:21:42.428021" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:42.428068" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:42.391764" elapsed="0.036341"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:42.456278" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o "n "n "e "c "t "o "r "_ "F "o "r "_ "D "e "v "i "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:21:42.428674" elapsed="0.027714"/>
</kw>
<msg time="2026-08-22T23:21:42.456563" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:42.456630" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:42.428278" elapsed="0.028401"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.456972" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.456756" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.456737" elapsed="0.000313"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.457488" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o "n "n "e "c "t "o "r "_ "F "o "r "_ "D "e "v "i "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:42.457188" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.458039" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.457820" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.457628" elapsed="0.000490"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:42.458152" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<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-08-22T23:21:42.460840" elapsed="0.000147"/>
</kw>
<msg time="2026-08-22T23:21:42.461049" 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-08-22T23:21:42.459647" elapsed="0.001542"/>
</kw>
<kw name="Open 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-08-22T23:21:42.461480" elapsed="0.000085"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.461863" 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-08-22T23:21:42.458959" elapsed="0.003106"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:21:42.458411" 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-08-22T23:21:42.390219" elapsed="0.072064"/>
</kw>
<msg time="2026-08-22T23:21:42.462375" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:42.462424" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:42.389651" elapsed="0.072811"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:42.462664" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:21:42.462538" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.462519" 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-08-22T23:21:42.463134" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.463463" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:42.463535" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:21:42.388974" elapsed="0.074832"/>
</kw>
<msg time="2026-08-22T23:21:42.463902" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:42.463946" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:42.384218" elapsed="0.079765"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.464305" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.464059" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.464041" elapsed="0.000341"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:21:42.384078" elapsed="0.080328"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:42.469727" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:42.469619" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.469599" 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-08-22T23:21:42.470938" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:42.470831" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.470813" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:42.471456" 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-08-22T23:21:42.471147" elapsed="0.000336"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:42.471879" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:42.471657" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:42.503997" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:42.472391" elapsed="0.031707"/>
</kw>
<msg time="2026-08-22T23:21:42.504268" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:42.504314" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:42.472063" elapsed="0.032288"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:42.527377" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o "n "n "e "c "t "o "r "_ "F "o "r "_ "D "e "v "i "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:21:42.504919" elapsed="0.022609"/>
</kw>
<msg time="2026-08-22T23:21:42.527754" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:42.527801" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:42.504518" elapsed="0.023320"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.528189" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.527935" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.527907" elapsed="0.000426"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.528872" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o "n "n "e "c "t "o "r "_ "F "o "r "_ "D "e "v "i "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:42.528479" elapsed="0.000468"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.529230" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.529015" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.528997" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:42.529344" 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-08-22T23:21:42.532383" elapsed="0.000155"/>
</kw>
<msg time="2026-08-22T23:21:42.532628" 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-08-22T23:21:42.531165" elapsed="0.001610"/>
</kw>
<kw name="Open 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-08-22T23:21:42.533092" elapsed="0.000087"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.533461" 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-08-22T23:21:42.530452" elapsed="0.003238"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:21:42.529670" elapsed="0.004087"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:21:42.470509" elapsed="0.063347"/>
</kw>
<msg time="2026-08-22T23:21:42.533948" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:42.533992" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:42.469942" elapsed="0.064087"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:42.534212" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:21:42.534106" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.534087" 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-08-22T23:21:42.534851" 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-08-22T23:21:42.535187" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:42.535258" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:21:42.469268" elapsed="0.066098"/>
</kw>
<msg time="2026-08-22T23:21:42.535465" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:42.535509" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:42.464689" elapsed="0.070857"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.535887" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.535639" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.535621" elapsed="0.000343"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:21:42.464528" elapsed="0.071460"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:21:42.310291" elapsed="0.225729"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:21:42.307948" elapsed="0.228136"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:21:42.303097" elapsed="0.233043"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:42.302674" elapsed="0.233513"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:21:42.299693" elapsed="0.236547"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Instance_Count">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.555674" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:42.553413" elapsed="0.002289"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.556042" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-22T23:21:42.555891" elapsed="0.000209"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-22T23:21:42.555762" elapsed="0.000363"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.556427" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.556186" elapsed="0.000298"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.557245" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:42.556756" elapsed="0.000516"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:42.556509" elapsed="0.000800"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.557496" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.557334" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.556170" elapsed="0.001404"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:42.557627" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:21:42.557777" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:21:42.552957" elapsed="0.004845"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:42.557848" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:21:42.557990" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:21:42.552417" elapsed="0.005597"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.565309" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:42.565057" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.565772" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:42.565507" 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-08-22T23:21:42.576282" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:42.576489" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1235'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}},"node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"connection-status":"connecting","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196"}}]}]}} 
 </msg>
<msg time="2026-08-22T23:21:42.576630" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:21:42.567937" elapsed="0.008721"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:42.565883" elapsed="0.010818"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.576880" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.576728" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.565865" elapsed="0.011141"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.580446" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}},"node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"connection-status":"connecting","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196"}}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:42.578030" elapsed="0.002544"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:42.577812" elapsed="0.002816"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.577794" elapsed="0.002860"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.583269" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:42.580948" elapsed="0.002367"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:42.580711" elapsed="0.002640"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.580694" elapsed="0.002682"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.583965" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:42.583537" 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-08-22T23:21:42.584303" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.584065" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.584865" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:42.584545" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:42.584386" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.584047" elapsed="0.000934"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.585507" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:42.585140" 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-08-22T23:21:42.585856" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.585622" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.586395" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:42.586097" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:42.585939" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.585603" 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-08-22T23:21:42.586643" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:21:42.587462" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:42.587153" 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-08-22T23:21:42.587659" 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-08-22T23:21:42.577374" elapsed="0.012848"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:42.590399" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:42.590292" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.590274" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:21:42.593732" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "node": [
     {
      "netconf-node-topology:netconf-node": {
       "connection-status": "connecting",
       "host": "10.30.171.19...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:21:42.590627" elapsed="0.003136"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:21:42.593816" elapsed="0.000139"/>
</return>
<msg time="2026-08-22T23:21:42.594090" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "node": [
     {
      "netconf-node-topology:netconf-node": {
       "connection-status": "connecting",
       "host": "10.30.171.19...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:21:42.560695" elapsed="0.033421"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:21:42.594174" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:21:42.594322" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "node": [
     {
      "netconf-node-topology:netconf-node": {
       "connection-status": "connecting",
       "host": "10.30.171.19...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:21:42.558229" elapsed="0.036120"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.594778" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "node": [
     {
      "netconf-node-topology:netconf-node": {
       "connection-status": "connecting",
       "host": "10.30.171.196",
       "login-password-unencrypted": {
        "password": "topsecret",
        "username": "admin"
       },
       "port": 17830
      },
      "node-id": "netconf-test-device"
     }
    ],
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:42.594507" elapsed="0.000371"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.595428" level="INFO">${actual_count} = 1</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:42.595034" elapsed="0.000422"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-22T23:21:42.595502" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:21:42.595673" level="INFO">${count} = 1</msg>
<var>${count}</var>
<arg>${DEVICE_NAME}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-22T23:21:42.544953" elapsed="0.050745"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.596139" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:21:42.595853" elapsed="0.000341"/>
</kw>
<arg>1</arg>
<arg>session=${NODE_CONFIGURER}</arg>
<doc>Count device instances over ${session} and check the count is ${expected}.</doc>
<status status="PASS" start="2026-08-22T23:21:42.544462" elapsed="0.051792"/>
</kw>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Device_Instance_Count</arg>
<arg>1</arg>
<arg>session=${NODE_CONFIGURER}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:21:42.536418" elapsed="0.059884"/>
</kw>
<doc>Get the list of mounts and search for our device there. Fail if not found.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-08-22T23:21:42.299033" elapsed="0.297391"/>
</test>
<test id="s1-s2-t5" name="Wait_For_Device_To_Become_Visible_For_Configurer" line="94">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:21:42.599777" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:21:42.599500" 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-08-22T23:21:42.601051" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:42.600914" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.600895" elapsed="0.000225"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:42.606142" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:42.606037" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.606019" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.607201" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:42.606819" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.607707" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:21:42.607384" elapsed="0.000350"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:21:42.607780" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:21:42.607934" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:21:42.606431" 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-08-22T23:21:42.613646" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:42.613521" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.613502" 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-08-22T23:21:42.614866" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:42.614759" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.614741" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:42.615390" 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-08-22T23:21:42.615076" elapsed="0.000340"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:42.615811" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:42.615570" elapsed="0.000268"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:42.647986" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:42.616321" elapsed="0.031775"/>
</kw>
<msg time="2026-08-22T23:21:42.648284" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:42.648332" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:42.615993" elapsed="0.032376"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:42.670887" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:21:42.648893" elapsed="0.022150"/>
</kw>
<msg time="2026-08-22T23:21:42.671214" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:42.671261" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:42.648536" elapsed="0.022764"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.671622" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.671377" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.671357" elapsed="0.000347"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.672149" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:42.671845" 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-08-22T23:21:42.672502" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.672289" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.672271" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:42.672637" 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-08-22T23:21:42.675335" elapsed="0.000143"/>
</kw>
<msg time="2026-08-22T23:21:42.675541" 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-08-22T23:21:42.674154" elapsed="0.001552"/>
</kw>
<kw name="Open 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-08-22T23:21:42.676004" elapsed="0.000087"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.676368" 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-08-22T23:21:42.673452" 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-08-22T23:21:42.672900" elapsed="0.003774"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:21:42.614435" elapsed="0.062337"/>
</kw>
<msg time="2026-08-22T23:21:42.676863" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:42.676907" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:42.613865" elapsed="0.063079"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:42.677135" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:21:42.677019" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.677001" 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-08-22T23:21:42.677629" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.677958" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:42.678029" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:21:42.613178" elapsed="0.064958"/>
</kw>
<msg time="2026-08-22T23:21:42.678229" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:42.678272" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:42.608318" elapsed="0.069991"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.678782" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.678382" elapsed="0.000456"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.678365" elapsed="0.000497"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:21:42.608180" elapsed="0.070705"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:42.684483" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:42.684374" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.684355" 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-08-22T23:21:42.685772" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:42.685664" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.685646" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:42.686289" 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-08-22T23:21:42.685980" elapsed="0.000336"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:42.686709" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:42.686469" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:42.719391" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:42.687217" elapsed="0.032300"/>
</kw>
<msg time="2026-08-22T23:21:42.719729" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:42.719776" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:42.686891" elapsed="0.032922"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:42.744717" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:21:42.720380" elapsed="0.024456"/>
</kw>
<msg time="2026-08-22T23:21:42.745005" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:42.745051" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:42.720006" elapsed="0.025081"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.745424" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.745174" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.745150" elapsed="0.000355"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.746117" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:42.745663" 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-08-22T23:21:42.746466" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.746255" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.746238" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:42.746595" 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-08-22T23:21:42.749412" elapsed="0.000190"/>
</kw>
<msg time="2026-08-22T23:21:42.749668" 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-08-22T23:21:42.748156" elapsed="0.001663"/>
</kw>
<kw name="Open 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-08-22T23:21:42.750117" elapsed="0.000087"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.750485" 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-08-22T23:21:42.747420" 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-08-22T23:21:42.746881" elapsed="0.003906"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:21:42.685344" elapsed="0.065542"/>
</kw>
<msg time="2026-08-22T23:21:42.750982" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:42.751026" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:42.684763" elapsed="0.066302"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:42.751250" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:21:42.751142" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.751123" 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 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.751839" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.752170" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:42.752241" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:21:42.684030" elapsed="0.068321"/>
</kw>
<msg time="2026-08-22T23:21:42.752445" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:42.752488" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:42.679141" elapsed="0.073384"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.753002" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.752753" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.752734" elapsed="0.000344"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:21:42.679005" elapsed="0.074097"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:42.758707" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:42.758597" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.758563" 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-08-22T23:21:42.759912" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:42.759806" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.759788" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:42.760429" 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-08-22T23:21:42.760117" elapsed="0.000338"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:42.760845" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:42.760626" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:42.793825" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:42.761378" elapsed="0.032550"/>
</kw>
<msg time="2026-08-22T23:21:42.794100" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:42.794146" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:42.761027" elapsed="0.033155"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:42.814875" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:21:42.794707" elapsed="0.020277"/>
</kw>
<msg time="2026-08-22T23:21:42.815154" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:42.815199" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:42.794349" elapsed="0.020887"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.815526" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.815312" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.815293" elapsed="0.000334"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.816073" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:42.815769" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.816423" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.816211" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.816193" elapsed="0.000344"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:42.816572" 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-08-22T23:21:42.819246" elapsed="0.000144"/>
</kw>
<msg time="2026-08-22T23:21:42.819458" 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-08-22T23:21:42.818077" 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-08-22T23:21:42.819913" elapsed="0.000087"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.820274" 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-08-22T23:21:42.817371" elapsed="0.003106"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:21:42.816847" 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-08-22T23:21:42.759485" elapsed="0.061190"/>
</kw>
<msg time="2026-08-22T23:21:42.820768" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:42.820811" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:42.758925" elapsed="0.061923"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:42.821029" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-08-22T23:21:42.820924" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.820906" elapsed="0.000203"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.821511" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.821861" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:42.821933" 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-08-22T23:21:42.758234" elapsed="0.063808"/>
</kw>
<msg time="2026-08-22T23:21:42.822135" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:42.822179" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:42.753391" elapsed="0.068825"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.822540" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.822290" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.822273" elapsed="0.000388"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:21:42.753230" elapsed="0.069455"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:21:42.608011" elapsed="0.214703"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:21:42.605678" elapsed="0.217095"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:21:42.600624" elapsed="0.222207"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:42.600187" elapsed="0.222690"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:21:42.597334" elapsed="0.225597"/>
</kw>
<kw name="Wait_Device_Connected" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.835161" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:42.833069" elapsed="0.002118"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.835881" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:42.835537" elapsed="0.000371"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:21:42.835381" elapsed="0.000564"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.836492" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:42.836173" elapsed="0.000379"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:21:42.836025" elapsed="0.000581"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:21:42.835246" elapsed="0.001389"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.836940" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.836701" elapsed="0.000298"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.837748" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:42.837252" elapsed="0.000524"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:42.837022" elapsed="0.000792"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.837999" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.837838" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.836683" elapsed="0.001394"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:42.838111" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:21:42.838259" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:21:42.832611" elapsed="0.005673"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:42.838331" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:21:42.838477" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:21:42.832031" elapsed="0.006471"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.845931" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:42.845679" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.846368" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:42.846126" 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-08-22T23:21:42.855925" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:42.856081" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"connection-status":"connecting","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196"}}]} 
 </msg>
<msg time="2026-08-22T23:21:42.856177" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:21:42.848525" elapsed="0.007678"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:42.846477" elapsed="0.009769"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:42.856423" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.856271" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.846459" elapsed="0.010050"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.860142" level="INFO">{"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"connection-status":"connecting","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196"}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:42.857590" elapsed="0.002601"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:42.857305" elapsed="0.002921"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.857287" elapsed="0.002964"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.862864" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:42.860535" elapsed="0.002375"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:42.860309" elapsed="0.002636"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.860292" elapsed="0.002678"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.863531" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:42.863131" 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-08-22T23:21:42.863923" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.863681" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.864466" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:42.864166" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:42.864006" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.863661" elapsed="0.000890"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.865088" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:42.864724" 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-08-22T23:21:42.865415" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:42.865185" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.865994" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:42.865695" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:42.865496" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.865167" 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-08-22T23:21:42.866223" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:21:42.867041" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:42.866746" 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-08-22T23:21:42.867220" elapsed="0.002301"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:21:42.856883" elapsed="0.012730"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:42.869790" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:42.869684" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:42.869665" elapsed="0.000190"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:21:42.872697" level="INFO">${text_normalized} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:21:42.869996" elapsed="0.002731"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:21:42.872779" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:21:42.872934" level="INFO">${response_text} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:21:42.841185" elapsed="0.031775"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:21:42.873017" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:21:42.873164" level="INFO">${device_status} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:21:42.838739" elapsed="0.034451"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:21:42.873748" level="FAIL">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</msg>
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:21:42.873348" elapsed="0.000488">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</status>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:21:42.824320" elapsed="0.049649">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:43.891345" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:43.888984" elapsed="0.002395"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:43.892122" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:43.891793" elapsed="0.000355"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:21:43.891638" elapsed="0.000548"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:43.892748" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:43.892414" elapsed="0.000361"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:21:43.892266" elapsed="0.000545"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:21:43.891458" elapsed="0.001382"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:43.893178" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:43.892915" elapsed="0.000322"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:43.893978" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:43.893490" elapsed="0.000517"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:43.893262" elapsed="0.000783"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:43.894231" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:43.894070" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:43.892894" elapsed="0.001416"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:43.894350" elapsed="0.000038"/>
</return>
<msg time="2026-08-22T23:21:43.894522" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:21:43.888485" elapsed="0.006062"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:43.894609" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:21:43.894753" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:21:43.887693" elapsed="0.007085"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:43.902094" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:43.901837" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:43.902692" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:43.902290" elapsed="0.000446"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:21:43.911531" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:43.911749" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"connection-status":"connecting","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196"}}]} 
 </msg>
<msg time="2026-08-22T23:21:43.911848" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:21:43.904890" elapsed="0.006985"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:43.902804" 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-08-22T23:21:43.912100" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:43.911944" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:43.902785" elapsed="0.009400"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:43.917074" level="INFO">{"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"connection-status":"connecting","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196"}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:43.913534" elapsed="0.003685"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:43.913231" elapsed="0.004039"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:43.913206" elapsed="0.004099"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:43.920796" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:43.917716" elapsed="0.003126"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:43.917385" elapsed="0.003491"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:43.917361" elapsed="0.003540"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:43.921453" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:43.921058" 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-08-22T23:21:43.921799" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:43.921550" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:43.922331" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:43.922035" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:43.921880" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:43.921532" elapsed="0.000882"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:43.923051" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:43.922677" 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-08-22T23:21:43.923377" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:43.923147" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:43.923948" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:43.923651" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:43.923462" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:43.923130" 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-08-22T23:21:43.924181" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:21:43.925007" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:43.924707" 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-08-22T23:21:43.925183" elapsed="0.002288"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:21:43.912640" elapsed="0.014895"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:43.927768" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:43.927649" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:43.927603" elapsed="0.000232"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:21:43.930660" level="INFO">${text_normalized} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:21:43.927974" elapsed="0.002716"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:21:43.930741" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:21:43.930898" level="INFO">${response_text} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:21:43.897513" elapsed="0.033412"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:21:43.930982" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:21:43.931130" level="INFO">${device_status} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:21:43.894998" elapsed="0.036158"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:21:43.931696" level="FAIL">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</msg>
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:21:43.931311" elapsed="0.000499">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</status>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:21:43.874905" elapsed="0.057031">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:44.950683" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:44.946835" elapsed="0.003882"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:44.951431" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:44.951099" elapsed="0.000360"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:21:44.950942" elapsed="0.000556"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:44.952068" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:44.951747" elapsed="0.000348"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:21:44.951596" elapsed="0.000535"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:21:44.950793" elapsed="0.001367"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:44.952503" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:44.952235" elapsed="0.000326"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:44.953302" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:44.952836" elapsed="0.000495"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:44.952602" elapsed="0.000766"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:44.953569" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:44.953393" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:44.952214" elapsed="0.001448"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:44.953700" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:21:44.953863" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:21:44.946334" elapsed="0.007555"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:44.953936" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:21:44.954077" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:21:44.945755" elapsed="0.008348"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:44.961501" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:44.961223" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:44.961962" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:44.961719" 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-08-22T23:21:44.973888" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:44.974099" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '3689'} 
 body={"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"unavailable-capabilities":{"unavailable-capability":[{"failure-reason":"missing-source","capability":"(urn:ietf:params:xml:ns:netconf:notification:1.0?revision=2008-07-14)notifications"}]},"clustered-connection-status":{"netconf-master-node":"pekko://opendaylight-cluster-data@127.0.0.1:2550"},"negotiated-ssh-transport-parameters":{"encryption-alg":"chacha20-poly1305","host-key-alg":"rsa-sha2-512","mac-alg":"none","key-exchange-alg":"sntrup761x25519-sha512"},"session-id":1,"connection-status":"connected","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196","available-capabilities":{"available-capability":[{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:notification:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:exi:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:candidate:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.1"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.0"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people?revision=2014-08-18)people"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)ietf-yang-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?revision=2010-10-04)ietf-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car?revision=2014-08-18)car"},{"capability-origin":"device-advertised","capability":"(ns:augment:main:a?revision=2014-01-21)augment-main-a"},{"capability-origin":"device-advertised","capability":"(ns:main?revision=2014-01-21)main"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:netconf:monitoring?revision=2022-07-18)odl-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:netconf:base:1.0?revision=2011-06-01)ietf-netconf"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring-extension?revision=2013-12-10)ietf-netconf-monitoring-extension"},{"capability-origin":"device-advertised","capability":"(org:opendaylight:coretutorials:ncmount:example:l2fib?revision=2016-03-07)ncmount-l2fib"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people?revision=2014-08-18)car-people"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-purchase?revision=2014-08-18)car-purchase"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:test:netconf:crud?revision=2014-10-18)test"},{"capability-origin":"device-advertised","capability":"(https://example.com/ns/example-action?revision=2016-07-07)example-action"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2010-09-24)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2013-07-15)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:yang:extension:yang-ext?revision=2013-07-09)yang-ext"}]}}}]} 
 </msg>
<msg time="2026-08-22T23:21:44.974285" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:21:44.964116" elapsed="0.010196"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:44.962072" elapsed="0.012282"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:44.974631" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:44.974381" elapsed="0.000399"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:44.962054" elapsed="0.012773"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:44.982618" level="INFO">{"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"unavailable-capabilities":{"unavailable-capability":[{"failure-reason":"missing-source","capability":"(urn:ietf:params:xml:ns:netconf:notification:1.0?revision=2008-07-14)notifications"}]},"clustered-connection-status":{"netconf-master-node":"pekko://opendaylight-cluster-data@127.0.0.1:2550"},"negotiated-ssh-transport-parameters":{"encryption-alg":"chacha20-poly1305","host-key-alg":"rsa-sha2-512","mac-alg":"none","key-exchange-alg":"sntrup761x25519-sha512"},"session-id":1,"connection-status":"connected","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196","available-capabilities":{"available-capability":[{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:notification:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:exi:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:candidate:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.1"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.0"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people?revision=2014-08-18)people"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)ietf-yang-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?revision=2010-10-04)ietf-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car?revision=2014-08-18)car"},{"capability-origin":"device-advertised","capability":"(ns:augment:main:a?revision=2014-01-21)augment-main-a"},{"capability-origin":"device-advertised","capability":"(ns:main?revision=2014-01-21)main"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:netconf:monitoring?revision=2022-07-18)odl-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:netconf:base:1.0?revision=2011-06-01)ietf-netconf"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring-extension?revision=2013-12-10)ietf-netconf-monitoring-extension"},{"capability-origin":"device-advertised","capability":"(org:opendaylight:coretutorials:ncmount:example:l2fib?revision=2016-03-07)ncmount-l2fib"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people?revision=2014-08-18)car-people"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-purchase?revision=2014-08-18)car-purchase"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:test:netconf:crud?revision=2014-10-18)test"},{"capability-origin":"device-advertised","capability":"(https://example.com/ns/example-action?revision=2016-07-07)example-action"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2010-09-24)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2013-07-15)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:yang:extension:yang-ext?revision=2013-07-09)yang-ext"}]}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:44.977109" elapsed="0.005583"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:44.976617" elapsed="0.006110"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:44.976547" elapsed="0.006205"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:44.985446" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:44.983029" elapsed="0.002464"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:44.982808" elapsed="0.002731"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:44.982791" elapsed="0.002774"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:44.986132" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:44.985742" 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-08-22T23:21:44.986461" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:44.986230" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:44.987015" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:44.986717" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:44.986542" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:44.986212" elapsed="0.000886"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:21:44.987629" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:44.987252" 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-08-22T23:21:44.987954" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:44.987726" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:44.988479" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:44.988187" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:44.988034" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:44.987708" 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-08-22T23:21:44.988775" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:21:44.989627" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:21:44.989283" 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-08-22T23:21:44.989806" elapsed="0.002315"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:21:44.975636" elapsed="0.016548"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:44.992360" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:44.992253" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:44.992235" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:21:44.996052" level="INFO">${text_normalized} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "available-capabilities": {
     "available-capability": [
      {
       "capability": "(https://example.com/ns/exampl...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:21:44.992567" elapsed="0.003515"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:21:44.996135" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:21:44.996294" level="INFO">${response_text} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "available-capabilities": {
     "available-capability": [
      {
       "capability": "(https://example.com/ns/exampl...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:21:44.956798" elapsed="0.039522"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:21:44.996379" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:21:44.996527" level="INFO">${device_status} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "available-capabilities": {
     "available-capability": [
      {
       "capability": "(https://example.com/ns/exampl...</msg>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:21:44.954323" elapsed="0.042230"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-08-22T23:21:44.996726" elapsed="0.000308"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="PASS" start="2026-08-22T23:21:44.932804" elapsed="0.064292"/>
</kw>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Connected</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:21:42.823744" elapsed="2.173403"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${NODE_CONFIGURER}</arg>
<doc>Wait for the device to become connected.
It is more readable to use this keyword in a test case than to put the whole WUKS below into it.</doc>
<status status="PASS" start="2026-08-22T23:21:42.823146" elapsed="2.174062"/>
</kw>
<doc>Wait until the device becomes visible on configurer node.</doc>
<status status="PASS" start="2026-08-22T23:21:42.596730" elapsed="2.400601"/>
</test>
<test id="s1-s2-t6" name="Wait_For_Device_To_Become_Visible_For_Checker" 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-08-22T23:21:45.000695" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:21:45.000414" 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-08-22T23:21:45.002005" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:45.001889" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:45.001869" 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-08-22T23:21:45.007051" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:45.006944" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:45.006926" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:21:45.008115" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:21:45.007733" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:21:45.008620" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:21:45.008300" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:21:45.008692" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:21:45.008850" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:21:45.007341" 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-08-22T23:21:45.014719" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:45.014609" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:45.014588" 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-08-22T23:21:45.015987" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:45.015880" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:45.015862" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:45.016516" 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-08-22T23:21:45.016195" elapsed="0.000347"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:45.016958" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:45.016723" elapsed="0.000261"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:45.049401" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:45.017471" elapsed="0.033238"/>
</kw>
<msg time="2026-08-22T23:21:45.050908" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:45.050958" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:45.017141" elapsed="0.033856"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:45.072676" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:21:45.051526" elapsed="0.021261"/>
</kw>
<msg time="2026-08-22T23:21:45.072960" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:45.073007" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:45.051172" elapsed="0.021874"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:45.073361" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:45.073129" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:45.073105" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:45.073975" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:45.073606" 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-08-22T23:21:45.074361" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:45.074132" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:45.074112" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:45.074478" 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-08-22T23:21:45.077298" elapsed="0.000153"/>
</kw>
<msg time="2026-08-22T23:21:45.077516" 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-08-22T23:21:45.076034" 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-08-22T23:21:45.078023" elapsed="0.000094"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:45.078424" 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-08-22T23:21:45.075323" elapsed="0.003353"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:21:45.074769" elapsed="0.003976"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:21:45.015553" elapsed="0.063293"/>
</kw>
<msg time="2026-08-22T23:21:45.078978" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:45.079024" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:45.014936" elapsed="0.064126"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:45.079261" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:21:45.079141" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:45.079122" 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-08-22T23:21:45.079775" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:45.080111" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:45.080185" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:21:45.014253" elapsed="0.066053"/>
</kw>
<msg time="2026-08-22T23:21:45.080404" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:45.080450" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:45.009301" elapsed="0.071188"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:45.080979" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:45.080571" elapsed="0.000465"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:45.080553" elapsed="0.000507"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:21:45.009162" elapsed="0.071922"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:45.086770" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:45.086658" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:45.086638" 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-08-22T23:21:45.088025" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:45.087914" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:45.087895" elapsed="0.000200"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:45.088573" 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-08-22T23:21:45.088237" elapsed="0.000381"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:45.089004" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:45.088776" elapsed="0.000255"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:45.127958" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:45.089531" elapsed="0.038531"/>
</kw>
<msg time="2026-08-22T23:21:45.128237" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:45.128283" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:45.089188" elapsed="0.039132"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:45.155175" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:21:45.128851" elapsed="0.026590"/>
</kw>
<msg time="2026-08-22T23:21:45.155731" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:45.155781" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:45.128488" elapsed="0.027332"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:45.156303" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:45.155951" elapsed="0.000415"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:45.155908" elapsed="0.000488"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:45.156976" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:45.156547" 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-08-22T23:21:45.157465" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:45.157240" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:45.157220" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:45.157606" 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-08-22T23:21:45.160563" elapsed="0.000174"/>
</kw>
<msg time="2026-08-22T23:21:45.160803" 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-08-22T23:21:45.159281" 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-08-22T23:21:45.161259" elapsed="0.000091"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:45.161656" 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-08-22T23:21:45.158553" elapsed="0.003341"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:21:45.157955" elapsed="0.004008"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:21:45.087600" elapsed="0.074464"/>
</kw>
<msg time="2026-08-22T23:21:45.162161" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:45.162206" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:45.086988" elapsed="0.075257"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:45.162431" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:21:45.162323" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:45.162305" 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-08-22T23:21:45.162955" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:45.163303" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:45.163375" 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-08-22T23:21:45.086283" elapsed="0.077205"/>
</kw>
<msg time="2026-08-22T23:21:45.163754" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:45.163804" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:45.081359" elapsed="0.082485"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:45.164176" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:45.163924" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:45.163906" elapsed="0.000347"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:21:45.081211" elapsed="0.083066"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:21:45.170099" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:45.169991" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:45.169972" 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-08-22T23:21:45.171334" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:45.171226" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:45.171207" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:21:45.171903" 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-08-22T23:21:45.171545" elapsed="0.000385"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:21:45.172309" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:21:45.172084" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:21:45.205378" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:21:45.172848" elapsed="0.032690"/>
</kw>
<msg time="2026-08-22T23:21:45.205736" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:21:45.205783" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:45.172493" elapsed="0.033327"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:21:45.227162" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:21:45.206344" elapsed="0.020928"/>
</kw>
<msg time="2026-08-22T23:21:45.227446" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:21:45.227492" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:45.206005" elapsed="0.021523"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:45.227851" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:45.227628" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:45.227607" elapsed="0.000322"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:45.228373" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:45.228069" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:45.228740" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:45.228509" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:45.228491" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:21:45.228852" 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-08-22T23:21:45.231561" elapsed="0.000167"/>
</kw>
<msg time="2026-08-22T23:21:45.231793" 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-08-22T23:21:45.230364" elapsed="0.001569"/>
</kw>
<kw name="Open 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-08-22T23:21:45.232230" elapsed="0.000087"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:45.232620" 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-08-22T23:21:45.229665" elapsed="0.003163"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:21:45.229113" elapsed="0.003780"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:21:45.170911" elapsed="0.062080"/>
</kw>
<msg time="2026-08-22T23:21:45.233083" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:45.233127" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:45.170318" elapsed="0.062847"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:21:45.233348" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:21:45.233242" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:45.233223" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:45.233845" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:45.234222" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:21:45.234295" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:21:45.169606" elapsed="0.064798"/>
</kw>
<msg time="2026-08-22T23:21:45.234503" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:21:45.234547" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:45.164559" elapsed="0.070189"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:45.235117" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:45.234865" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:45.234847" elapsed="0.000348"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:21:45.164412" elapsed="0.070807"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:21:45.008986" elapsed="0.226265"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:21:45.006562" elapsed="0.228753"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:21:45.001564" elapsed="0.233813"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:21:45.001111" elapsed="0.234317"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:21:44.998272" elapsed="0.237216"/>
</kw>
<kw name="Wait_Device_Connected" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:45.247764" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:45.245627" elapsed="0.002164"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:45.248464" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:45.248138" elapsed="0.000352"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:21:45.247988" elapsed="0.000539"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:45.249089" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:45.248770" elapsed="0.000345"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:21:45.248622" elapsed="0.000529"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:21:45.247849" elapsed="0.001331"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:45.249479" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:45.249243" elapsed="0.000294"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:45.250300" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:45.249806" elapsed="0.000523"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:45.249561" elapsed="0.000805"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:45.250551" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:45.250390" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:45.249226" elapsed="0.001419"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:45.250680" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:21:45.250829" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:21:45.245154" elapsed="0.005701"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:45.250901" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:21:45.251044" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:21:45.244566" elapsed="0.006503"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:45.258469" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:45.258215" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:45.259016" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:45.258763" 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-08-22T23:21:45.270484" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:45.270771" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Set-Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Fri, 21-Aug-2026 23:21:45 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:21:45.270941" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:45.261199" elapsed="0.010315">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:45.259127" elapsed="0.012529">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:45.271923" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:45.271704" elapsed="0.000312"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:45.259109" elapsed="0.012941">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:45.272576" elapsed="0.000058"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:45.272790" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:45.272736" elapsed="0.000115"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:45.272711" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:45.273085" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:45.273186" 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-08-22T23:21:45.253779" elapsed="0.019556">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:45.273435" elapsed="0.000022"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:45.251292" elapsed="0.022278">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:45.273831" elapsed="0.000030"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:21:45.236818" elapsed="0.037198">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:46.291432" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:46.289291" elapsed="0.002175"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:46.292209" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:46.291880" elapsed="0.000357"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:21:46.291723" elapsed="0.000552"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:46.292874" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:46.292521" elapsed="0.000380"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:21:46.292356" elapsed="0.000582"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:21:46.291535" elapsed="0.001433"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:46.293312" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:46.293044" elapsed="0.000327"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:46.294113" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:46.293644" elapsed="0.000563"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:46.293397" elapsed="0.000850"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:46.294435" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:46.294272" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:46.293022" elapsed="0.001492"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:46.294554" elapsed="0.000052"/>
</return>
<msg time="2026-08-22T23:21:46.294735" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:21:46.288803" elapsed="0.005960"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:46.294825" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:21:46.294975" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:21:46.288206" elapsed="0.006795"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:46.302305" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:46.302045" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:46.302826" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:46.302506" 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-08-22T23:21:46.311129" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:46.311315" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:21:46.311446" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:46.305004" elapsed="0.006927">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:46.302943" elapsed="0.009084">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:46.312279" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:46.312068" elapsed="0.000282"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:46.302925" elapsed="0.009450">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:46.312915" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:46.313067" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:46.313025" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:46.313004" elapsed="0.000131"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:46.313282" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:46.313354" elapsed="0.000017"/>
</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-08-22T23:21:46.297699" elapsed="0.015769">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:46.313540" elapsed="0.000017"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:46.295224" elapsed="0.018583">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:46.313989" elapsed="0.000024"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:21:46.274932" elapsed="0.039172">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:47.330338" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:47.328087" elapsed="0.002286"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:47.331130" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:47.330780" elapsed="0.000378"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:21:47.330615" elapsed="0.000582"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:47.331798" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:47.331436" elapsed="0.000390"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:21:47.331281" elapsed="0.000582"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:21:47.330442" elapsed="0.001451"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:47.332238" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:47.331966" elapsed="0.000333"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:47.333058" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:47.332565" elapsed="0.000524"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:47.332324" elapsed="0.000846"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:47.333366" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:47.333197" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:47.331946" elapsed="0.001499"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:47.333484" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:21:47.333668" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:21:47.327597" elapsed="0.006104"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:47.333749" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:21:47.333895" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:21:47.326995" elapsed="0.006927"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:47.341288" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:47.340970" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:47.341757" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:47.341489" 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-08-22T23:21:47.351269" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:47.351659" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:21:47.351933" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:47.343944" elapsed="0.008887">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:47.341868" elapsed="0.011324">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:47.353754" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:47.353285" elapsed="0.000637"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:47.341850" elapsed="0.012132">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:47.354962" elapsed="0.000064"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:47.355302" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:47.355205" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:47.355162" 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-08-22T23:21:47.355836" elapsed="0.000052"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:47.356010" elapsed="0.000037"/>
</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-08-22T23:21:47.336692" elapsed="0.019575">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:47.356440" elapsed="0.000037"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:47.334147" elapsed="0.022555">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:47.357110" elapsed="0.000071"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:21:47.314980" elapsed="0.042416">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:48.374685" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:48.372529" elapsed="0.002188"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:48.375420" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:48.375088" elapsed="0.000359"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:21:48.374929" elapsed="0.000558"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:48.376056" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:48.375733" elapsed="0.000350"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:21:48.375568" elapsed="0.000551"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:21:48.374785" elapsed="0.001364"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:48.376482" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:48.376219" elapsed="0.000323"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:48.377296" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:48.376830" elapsed="0.000496"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:48.376569" elapsed="0.000794"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:48.377549" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:48.377387" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:48.376200" elapsed="0.001456"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:48.377694" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:21:48.377922" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:21:48.372055" elapsed="0.005894"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:48.377997" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:21:48.378141" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:21:48.371421" elapsed="0.006745"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:48.385414" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:48.385160" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:48.385871" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:48.385628" 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-08-22T23:21:48.395993" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:48.396221" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:21:48.396388" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:48.388039" elapsed="0.008899">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:48.385981" elapsed="0.011083">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:48.397389" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:48.397116" elapsed="0.000367"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:48.385963" elapsed="0.011554">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:48.398105" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:48.398298" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:48.398243" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:48.398218" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:48.398634" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:48.398734" 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-08-22T23:21:48.380871" elapsed="0.018015">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:48.399011" elapsed="0.000039"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:48.378389" elapsed="0.020797">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:48.399422" elapsed="0.000030"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:21:48.358262" elapsed="0.041333">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:49.416084" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:49.413960" elapsed="0.002156"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:49.416837" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:49.416496" elapsed="0.000368"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:21:49.416334" elapsed="0.000567"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:49.417447" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:49.417130" elapsed="0.000343"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:21:49.416981" elapsed="0.000527"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:21:49.416185" elapsed="0.001351"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:49.417967" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:49.417625" elapsed="0.000401"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:49.418771" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:49.418285" elapsed="0.000515"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:49.418051" elapsed="0.000786"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:49.419025" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:49.418862" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:49.417604" elapsed="0.001500"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:49.419142" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:21:49.419300" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:21:49.413459" elapsed="0.005867"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:49.419372" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:21:49.419515" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:21:49.412884" elapsed="0.006657"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:49.427033" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:49.426766" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:49.427473" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:49.427232" 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-08-22T23:21:49.435999" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:49.436179" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:21:49.436312" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:49.429656" elapsed="0.007165">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:49.427600" elapsed="0.009346">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:49.437274" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:49.437002" elapsed="0.000366"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:49.427565" elapsed="0.009837">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:49.438083" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:49.438283" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:49.438226" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:49.438200" elapsed="0.000175"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:49.438592" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:49.438696" 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-08-22T23:21:49.422248" elapsed="0.016599">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:49.438947" elapsed="0.000022"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:49.419815" elapsed="0.019265">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:49.439320" elapsed="0.000030"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:21:49.400491" elapsed="0.038981">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:50.456450" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:50.454326" elapsed="0.002156"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:50.457218" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:50.456857" elapsed="0.000389"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:21:50.456704" elapsed="0.000581"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:50.457855" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:50.457513" elapsed="0.000369"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:21:50.457363" elapsed="0.000555"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:21:50.456549" elapsed="0.001397"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:50.458278" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:50.458017" elapsed="0.000320"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:50.459073" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:50.458608" elapsed="0.000494"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:50.458362" elapsed="0.000777"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:50.459327" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:50.459165" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:50.457997" elapsed="0.001407"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:50.459441" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:21:50.459614" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:21:50.453846" elapsed="0.005795"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:50.459690" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:21:50.459832" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:21:50.453259" elapsed="0.006599"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:50.467225" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:50.466968" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:50.467689" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:50.467425" 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-08-22T23:21:50.476895" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:50.477089" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:21:50.477208" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:50.469995" elapsed="0.007633">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:50.467799" elapsed="0.009916">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:50.477921" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:50.477750" elapsed="0.000239"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:50.467781" elapsed="0.010232">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:50.478409" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:50.478544" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:50.478507" elapsed="0.000094"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:50.478490" elapsed="0.000134"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:50.478766" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:50.478836" 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-08-22T23:21:50.462637" elapsed="0.016304">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:50.479011" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:50.460079" elapsed="0.019025">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:50.479271" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:21:50.440284" elapsed="0.039095">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:51.496846" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:51.494714" elapsed="0.002164"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:51.497570" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:51.497243" elapsed="0.000370"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:21:51.497088" elapsed="0.000563"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:51.498226" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:51.497881" elapsed="0.000525"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:21:51.497732" elapsed="0.000716"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:21:51.496947" elapsed="0.001531"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:51.498834" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:51.498554" elapsed="0.000337"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:51.499623" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:51.499144" elapsed="0.000509"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:51.498916" elapsed="0.000774"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:51.499875" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:51.499715" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:51.498533" elapsed="0.001419"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:51.499990" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:21:51.500150" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:21:51.494223" elapsed="0.005952"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:51.500222" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:21:51.500368" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:21:51.493639" elapsed="0.006755"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:51.509237" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:51.508981" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:51.509691" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:51.509434" 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-08-22T23:21:51.519048" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:51.519205" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:21:51.519322" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:51.511852" elapsed="0.007879">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:51.509801" elapsed="0.010015">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:51.520011" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:51.519851" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:51.509783" elapsed="0.010320">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:51.520475" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:51.520634" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:51.520573" elapsed="0.000105"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:51.520556" elapsed="0.000144"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:51.520841" elapsed="0.000065"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:51.520958" 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-08-22T23:21:51.504642" elapsed="0.016422">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:51.521135" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:51.500631" elapsed="0.020600">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:51.521399" elapsed="0.000021"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:21:51.480151" elapsed="0.041356">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:52.538739" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:52.536351" elapsed="0.002421"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:52.539515" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:52.539183" elapsed="0.000359"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:21:52.538992" elapsed="0.000602"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:52.540154" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:52.539831" elapsed="0.000350"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:21:52.539681" elapsed="0.000536"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:21:52.538844" elapsed="0.001402"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:52.540604" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:52.540322" elapsed="0.000343"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:52.541398" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:52.540925" elapsed="0.000502"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:52.540690" elapsed="0.000774"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:52.541670" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:52.541490" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:52.540302" elapsed="0.001449"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:52.541789" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:21:52.541952" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:21:52.535868" elapsed="0.006110"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:52.542026" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:21:52.542169" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:21:52.535264" elapsed="0.006931"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:52.549626" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:52.549352" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:52.550071" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:52.549827" 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-08-22T23:21:52.559011" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:52.559245" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:21:52.559352" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:52.552248" elapsed="0.007522">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:52.550180" elapsed="0.009672">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:52.560044" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:52.559886" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:52.550162" elapsed="0.009973">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:52.560512" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:52.560704" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:52.560665" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:52.560645" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:52.560911" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:52.560981" 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-08-22T23:21:52.545030" elapsed="0.016056">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:52.561156" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:52.542425" elapsed="0.018826">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:52.561415" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:21:52.522266" elapsed="0.039257">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:53.579624" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:53.577415" elapsed="0.002244"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:53.580409" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:53.580077" elapsed="0.000360"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:21:53.579889" elapsed="0.000586"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:53.581047" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:53.580726" elapsed="0.000347"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:21:53.580559" elapsed="0.000551"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:21:53.579732" elapsed="0.001406"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:53.581485" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:53.581217" elapsed="0.000326"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:53.582285" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:53.581820" elapsed="0.000493"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:53.581570" elapsed="0.000928"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:53.582706" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:53.582526" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:53.581195" elapsed="0.001590"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:53.582824" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:21:53.582988" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:21:53.576929" elapsed="0.006085"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:53.583061" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:21:53.583204" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:21:53.576159" elapsed="0.007071"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:53.590526" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:53.590268" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:53.590985" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:53.590742" 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-08-22T23:21:53.600509" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:53.600687" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:21:53.600831" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:53.593173" elapsed="0.008177">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:53.591096" elapsed="0.010371">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:53.601759" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:53.601513" elapsed="0.000338"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:53.591078" elapsed="0.010807">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:53.602415" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:53.602626" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:53.602550" elapsed="0.000135"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:53.602525" elapsed="0.000190"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:53.602914" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:53.603012" 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-08-22T23:21:53.585943" elapsed="0.017224">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:53.603264" elapsed="0.000021"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:53.583452" elapsed="0.019942">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:53.603761" elapsed="0.000033"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:21:53.562759" elapsed="0.041161">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:54.621564" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:54.619384" elapsed="0.002228"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:54.622328" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:54.621998" elapsed="0.000357"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:21:54.621842" elapsed="0.000551"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:54.622975" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:54.622646" elapsed="0.000356"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:21:54.622475" elapsed="0.000564"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:21:54.621686" elapsed="0.001382"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:54.623411" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:54.623145" elapsed="0.000324"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:54.624212" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:54.623742" elapsed="0.000499"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:54.623494" elapsed="0.000784"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:54.624469" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:54.624303" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:54.623124" elapsed="0.001422"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:54.624609" elapsed="0.000039"/>
</return>
<msg time="2026-08-22T23:21:54.624778" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:21:54.618894" elapsed="0.005910"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:54.624851" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:21:54.625026" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:21:54.618164" elapsed="0.006889"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:54.632390" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:54.632134" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:54.632848" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:54.632603" 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-08-22T23:21:54.641447" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:54.641627" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:21:54.641756" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:54.635043" elapsed="0.007255">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:54.632985" elapsed="0.009515">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:54.642793" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:54.642549" elapsed="0.000337"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:54.632966" elapsed="0.009954">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:54.643444" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:54.643654" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:54.643598" elapsed="0.000115"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:54.643555" elapsed="0.000189"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:54.643942" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:54.644039" 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-08-22T23:21:54.627790" elapsed="0.016396">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:54.644283" elapsed="0.000022"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:54.625283" elapsed="0.019134">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:54.644668" elapsed="0.000031"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:21:54.604830" elapsed="0.039993">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:55.662320" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:55.660161" elapsed="0.002191"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:55.663055" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:55.662726" elapsed="0.000356"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:21:55.662559" elapsed="0.000560"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:55.663682" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:55.663347" elapsed="0.000363"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:21:55.663200" elapsed="0.000550"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:21:55.662418" elapsed="0.001362"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:55.664115" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:55.663851" elapsed="0.000323"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:55.664913" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:55.664428" elapsed="0.000515"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:55.664199" elapsed="0.000780"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:55.665168" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:55.665006" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:55.663831" elapsed="0.001473"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:55.665343" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:21:55.665505" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:21:55.659643" elapsed="0.005888"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:55.665595" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:21:55.665816" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:21:55.658672" elapsed="0.007170"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:55.673127" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:55.672868" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:55.673572" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:55.673328" 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-08-22T23:21:55.682816" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:55.682972" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:21:55.683077" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:55.675756" elapsed="0.007705">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:55.673701" elapsed="0.009850">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:55.683793" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:55.683627" elapsed="0.000233"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:55.673683" elapsed="0.010201">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:55.684262" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:55.684398" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:55.684359" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:55.684341" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:55.684620" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:55.684692" 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-08-22T23:21:55.668532" elapsed="0.016265">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:55.684868" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:55.666067" elapsed="0.018895">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:55.685128" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:21:55.645710" elapsed="0.039541">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:56.703282" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:56.700495" elapsed="0.002890"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:56.704106" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:56.703777" elapsed="0.000356"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:21:56.703618" elapsed="0.000553"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:56.704735" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:56.704399" elapsed="0.000366"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:21:56.704251" elapsed="0.000552"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:21:56.703455" elapsed="0.001378"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:56.705172" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:56.704906" elapsed="0.000325"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:56.705973" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:56.705488" elapsed="0.000515"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:56.705257" elapsed="0.000782"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:56.706251" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:56.706065" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:56.704886" elapsed="0.001444"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:56.706367" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:21:56.706528" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:21:56.699839" elapsed="0.006714"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:56.706615" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:21:56.706760" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:21:56.699020" elapsed="0.007765"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:56.714020" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:56.713759" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:56.714497" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:56.714245" 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-08-22T23:21:56.723075" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:56.723242" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:21:56.723357" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:56.716661" elapsed="0.007134">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:56.714624" elapsed="0.009256">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:56.724084" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:56.723916" elapsed="0.000234"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:56.714605" elapsed="0.009570">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:56.724562" elapsed="0.000092"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:56.724776" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:56.724732" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:56.724713" elapsed="0.000128"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:56.724984" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:56.725055" 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-08-22T23:21:56.709446" elapsed="0.015716">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:56.725232" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:56.707004" elapsed="0.018323">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:56.725493" elapsed="0.000021"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:21:56.686127" elapsed="0.039491">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:57.740727" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:57.738559" elapsed="0.002201"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:57.741474" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:57.741141" elapsed="0.000360"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:21:57.740987" elapsed="0.000552"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:57.742113" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:57.741788" elapsed="0.000352"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:21:57.741638" elapsed="0.000538"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:21:57.740841" elapsed="0.001365"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:57.742538" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:57.742278" elapsed="0.000338"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:57.743345" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:57.742875" elapsed="0.000499"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:57.742642" elapsed="0.000768"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:57.743625" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:57.743435" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:57.742259" elapsed="0.001447"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:57.743743" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:21:57.743902" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:21:57.738083" elapsed="0.005846"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:57.743976" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:21:57.744119" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:21:57.737367" elapsed="0.006777"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:57.751442" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:57.751183" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:57.751981" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:57.751733" 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-08-22T23:21:57.760696" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:57.760890" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:21:57.761034" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:57.754166" elapsed="0.007378">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:57.752092" elapsed="0.009587">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:57.761950" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:57.761728" elapsed="0.000313"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:57.752074" elapsed="0.010001">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:57.762611" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:57.762825" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:57.762767" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:57.762741" 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-08-22T23:21:57.763111" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:57.763209" 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-08-22T23:21:57.746830" elapsed="0.016523">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:57.763449" elapsed="0.000022"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:57.744367" elapsed="0.019237">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:57.763839" elapsed="0.000031"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:21:57.726235" elapsed="0.037756">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:58.781634" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:58.779327" elapsed="0.002340"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:58.782362" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:58.782036" elapsed="0.000353"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:21:58.781885" elapsed="0.000542"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:58.782993" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:58.782672" elapsed="0.000348"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:21:58.782508" elapsed="0.000622"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:21:58.781739" elapsed="0.001423"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:58.783508" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:58.783240" elapsed="0.000357"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:58.784337" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:58.783866" elapsed="0.000499"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:58.783624" elapsed="0.000778"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:58.784603" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:58.784427" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:58.783218" elapsed="0.001463"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:58.784722" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:21:58.784887" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:21:58.778657" elapsed="0.006256"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:58.784960" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:21:58.785102" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:21:58.777758" elapsed="0.007369"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:58.792445" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:58.792184" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:58.792904" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:58.792657" 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-08-22T23:21:58.801888" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:58.802118" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:21:58.802299" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:58.795054" elapsed="0.007797">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:58.793015" elapsed="0.009952">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:58.803233" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:58.803015" elapsed="0.000310"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:58.792997" elapsed="0.010362">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:58.803968" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:58.804166" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:58.804114" elapsed="0.000110"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:58.804090" elapsed="0.000164"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:58.804451" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:58.804620" elapsed="0.000024"/>
</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-08-22T23:21:58.787837" elapsed="0.016942">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:58.804901" elapsed="0.000027"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:58.785354" elapsed="0.019706">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:58.805291" elapsed="0.000029"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:21:58.764818" elapsed="0.040624">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:59.822723" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:59.820550" elapsed="0.002212"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:59.823503" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:59.823142" elapsed="0.000405"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:21:59.822986" elapsed="0.000614"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:59.824176" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:59.823848" elapsed="0.000355"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:21:59.823685" elapsed="0.000554"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:21:59.822837" elapsed="0.001432"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:59.824628" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:59.824345" elapsed="0.000344"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:21:59.825424" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:21:59.824956" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-08-22T23:21:59.824715" elapsed="0.000775"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:59.825694" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:59.825516" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-08-22T23:21:59.824323" elapsed="0.001453"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:59.825826" elapsed="0.000039"/>
</return>
<msg time="2026-08-22T23:21:59.825994" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:21:59.820067" elapsed="0.005953"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:21:59.826067" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:21:59.826211" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:21:59.819434" elapsed="0.006802"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:59.833748" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:59.833469" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:21:59.834211" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:21:59.833960" 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-08-22T23:21:59.844267" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:21:59.844487" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:21:59.844645" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:21:59.836558" elapsed="0.008490">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:21:59.834322" elapsed="0.010812">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:59.845326" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:21:59.845169" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:21:59.834303" elapsed="0.011113">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:59.845802" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:59.845942" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:21:59.845904" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:21:59.845887" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:59.846150" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:21:59.846223" 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-08-22T23:21:59.829133" elapsed="0.017194">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:21:59.846395" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:21:59.826458" elapsed="0.020032">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:21:59.846670" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:21:59.806227" elapsed="0.040552">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:00.864080" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:00.861859" elapsed="0.002257"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:00.864877" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:00.864514" elapsed="0.000391"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:22:00.864343" elapsed="0.000601"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:00.865513" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:00.865188" elapsed="0.000352"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:22:00.865032" elapsed="0.000572"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:22:00.864192" elapsed="0.001444"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:00.866015" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:00.865714" elapsed="0.000362"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:00.866834" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:00.866345" elapsed="0.000520"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:00.866110" elapsed="0.000912"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:00.867228" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:00.867049" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:00.865693" elapsed="0.001616"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:00.867350" elapsed="0.000039"/>
</return>
<msg time="2026-08-22T23:22:00.867519" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:22:00.861331" elapsed="0.006215"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:00.867610" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:22:00.867756" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:22:00.860629" elapsed="0.007152"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:00.875618" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:00.875318" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:00.876070" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:00.875824" 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-08-22T23:22:00.886293" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:00.886465" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:22:00.886602" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:00.878457" elapsed="0.008562">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:00.876184" elapsed="0.010924">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:00.887319" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:00.887145" elapsed="0.000245"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:00.876165" elapsed="0.011251">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:00.887834" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:00.887977" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:00.887936" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:00.887917" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:00.888186" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:00.888258" 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-08-22T23:22:00.870762" elapsed="0.017631">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:00.888468" elapsed="0.000017"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:00.868012" elapsed="0.020553">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:00.888820" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:22:00.847626" elapsed="0.041307">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:01.945437" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:01.942793" elapsed="0.002684"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:01.946256" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:01.945911" elapsed="0.000372"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:22:01.945744" elapsed="0.000577"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:01.946893" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:01.946556" elapsed="0.000363"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:22:01.946406" elapsed="0.000549"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:22:01.945564" elapsed="0.001420"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:01.947358" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:01.947078" elapsed="0.000338"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:01.948166" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:01.947690" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:01.947443" elapsed="0.000804"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:01.948447" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:01.948273" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:01.947051" elapsed="0.001474"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:01.948568" elapsed="0.000518"/>
</return>
<msg time="2026-08-22T23:22:01.949252" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:22:01.941621" elapsed="0.007661"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:01.949335" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:22:01.949505" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:22:01.936384" elapsed="0.013150"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:01.957663" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:01.956885" elapsed="0.000834"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:01.958166" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:01.957876" 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-08-22T23:22:01.968423" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:01.968640" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:22:01.968765" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:01.960368" elapsed="0.009799">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:01.958285" elapsed="0.012106">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:01.970665" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:01.970433" elapsed="0.000303"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:01.958265" elapsed="0.012497">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:01.971247" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:01.971399" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:01.971353" elapsed="0.000095"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:01.971334" elapsed="0.000136"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:01.971638" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:01.971714" elapsed="0.000019"/>
</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-08-22T23:22:01.952461" elapsed="0.019384">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:01.971919" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:01.949844" elapsed="0.022183">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:01.972206" elapsed="0.000023"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:22:01.890039" elapsed="0.082283">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:02.991398" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:02.989013" elapsed="0.002430"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:02.992224" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:02.991897" elapsed="0.000354"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:22:02.991735" elapsed="0.000554"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:03.011482" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:02.992526" elapsed="0.019919"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:22:02.992378" elapsed="0.020169"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:22:02.991545" elapsed="0.021068"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:03.015064" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:03.013199" elapsed="0.001951"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:03.016200" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:03.015449" elapsed="0.000784"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:03.015181" elapsed="0.001089"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:03.016463" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:03.016297" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:03.012716" elapsed="0.003848"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:03.016638" elapsed="0.000051"/>
</return>
<msg time="2026-08-22T23:22:03.016836" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:22:02.988463" elapsed="0.028401"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:03.016918" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:22:03.017702" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:22:02.987849" elapsed="0.029881"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:03.025862" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:03.025546" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:03.026309" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:03.026066" 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-08-22T23:22:03.036041" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:03.036238" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:22:03.036399" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:03.028508" elapsed="0.008821">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:03.026426" elapsed="0.010990">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:03.037628" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:03.037451" elapsed="0.000243"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:03.026405" elapsed="0.011314">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:03.038116" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:03.038252" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:03.038212" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:03.038195" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:03.038460" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:03.038530" 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-08-22T23:22:03.021186" elapsed="0.017464">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:03.038720" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:03.018018" elapsed="0.020798">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:03.038987" elapsed="0.000021"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:22:02.973413" elapsed="0.065683">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:04.058399" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:04.055940" elapsed="0.002617"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:04.059317" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:04.058984" elapsed="0.000361"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:22:04.058824" elapsed="0.000558"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:04.059969" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:04.059632" elapsed="0.000364"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:22:04.059465" elapsed="0.000567"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:22:04.058659" elapsed="0.001403"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:04.060420" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:04.060143" elapsed="0.000337"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:04.061241" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:04.060763" elapsed="0.000509"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:04.060505" elapsed="0.000803"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:04.061499" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:04.061334" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:04.060121" elapsed="0.001474"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:04.061640" elapsed="0.000044"/>
</return>
<msg time="2026-08-22T23:22:04.061817" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:22:04.055142" elapsed="0.006702"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:04.061892" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:22:04.062035" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:22:04.054307" elapsed="0.007754"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:04.069433" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:04.069167" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:04.069895" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:04.069647" 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-08-22T23:22:04.079267" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:04.079466" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:22:04.079626" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:04.072225" elapsed="0.007935">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:04.070005" elapsed="0.010275">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:04.080543" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:04.080327" elapsed="0.000333"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:04.069987" elapsed="0.010707">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:04.081229" elapsed="0.000084"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:04.081473" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:04.081418" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:04.081393" elapsed="0.000175"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:04.081791" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:04.081892" 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-08-22T23:22:04.064777" elapsed="0.017264">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:04.082141" elapsed="0.000021"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:04.062283" elapsed="0.019990">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:04.082508" elapsed="0.000031"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:22:04.040121" elapsed="0.042559">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:05.114518" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:05.112338" elapsed="0.002217"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:05.115773" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:05.115388" elapsed="0.000413"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:22:05.115234" elapsed="0.000605"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:05.116390" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:05.116070" elapsed="0.000346"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:22:05.115921" elapsed="0.000531"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:22:05.115083" elapsed="0.001398"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:05.116848" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:05.116558" elapsed="0.000350"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:05.117647" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:05.117165" elapsed="0.000512"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:05.116933" elapsed="0.000780"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:05.117899" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:05.117738" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:05.116536" elapsed="0.001442"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:05.118018" elapsed="0.000041"/>
</return>
<msg time="2026-08-22T23:22:05.118186" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:22:05.111836" elapsed="0.006376"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:05.118259" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:22:05.118401" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:22:05.111129" elapsed="0.007298"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:05.125950" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:05.125554" elapsed="0.003792"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:05.130186" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:05.129716" 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-08-22T23:22:05.140609" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:05.140795" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:22:05.140927" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:05.132786" elapsed="0.009060">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:05.130329" elapsed="0.011606">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:05.142136" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:05.141974" elapsed="0.000228"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:05.130299" elapsed="0.011927">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:05.142696" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:05.142843" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:05.142800" elapsed="0.000093"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:05.142781" elapsed="0.000136"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:05.143063" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:05.143132" 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-08-22T23:22:05.121197" elapsed="0.022049">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:05.143365" elapsed="0.000018"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:05.118670" elapsed="0.024807">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:05.143667" elapsed="0.000023"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:22:05.099865" elapsed="0.043915">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:06.162362" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:06.160168" elapsed="0.002232"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:06.163143" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:06.162815" elapsed="0.000355"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:22:06.162659" elapsed="0.000551"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:06.163796" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:06.163444" elapsed="0.000379"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:22:06.163295" elapsed="0.000692"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:22:06.162482" elapsed="0.001537"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:06.164385" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:06.164103" elapsed="0.000340"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:06.165188" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:06.164720" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:06.164470" elapsed="0.000783"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:06.165442" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:06.165278" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:06.164080" elapsed="0.001439"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:06.165562" elapsed="0.000060"/>
</return>
<msg time="2026-08-22T23:22:06.165755" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:22:06.159666" elapsed="0.006115"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:06.165828" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:22:06.165971" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:22:06.159047" elapsed="0.006949"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:06.208969" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:06.207465" elapsed="0.002032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:06.210024" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:06.209763" 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-08-22T23:22:06.221336" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:06.222033" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:22:06.222187" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:06.212965" elapsed="0.011513">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:06.210164" elapsed="0.014444">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:06.224921" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:06.224656" elapsed="0.000334"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:06.210134" elapsed="0.014881">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:06.225493" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:06.225664" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:06.225617" elapsed="0.000095"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:06.225596" elapsed="0.000138"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:06.225880" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:06.226061" elapsed="0.000017"/>
</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-08-22T23:22:06.168728" elapsed="0.057454">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:06.226254" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:06.166219" elapsed="0.060132">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:06.226523" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:22:06.144771" elapsed="0.081882">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<msg time="2026-08-22T23:22:06.226771" level="FAIL">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Connected</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:21:45.236211" elapsed="20.990660">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${NODE_CHECKER}</arg>
<doc>Wait for the device to become connected.
It is more readable to use this keyword in a test case than to put the whole WUKS below into it.</doc>
<status status="FAIL" start="2026-08-22T23:21:45.235731" elapsed="20.991254">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<doc>Wait until the device becomes visible on checker node.</doc>
<status status="FAIL" start="2026-08-22T23:21:44.997689" elapsed="21.229479">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</test>
<test id="s1-s2-t7" name="Wait_For_Device_To_Become_Visible_For_Setter" line="102">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:22:06.236626" elapsed="0.000451"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:22:06.236210" elapsed="0.000969"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:06.238855" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:06.238626" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:06.238565" elapsed="0.000413"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:06.246184" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:06.246029" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:06.246003" elapsed="0.000276"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:22:06.247782" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:22:06.247165" elapsed="0.000661"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:22:06.248416" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:22:06.248071" elapsed="0.000370"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:22:06.248486" elapsed="0.000047"/>
</return>
<msg time="2026-08-22T23:22:06.248684" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:22:06.246626" elapsed="0.002083"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:06.254230" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:06.254120" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:06.254101" 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-08-22T23:22:06.255545" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:06.255434" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:06.255415" elapsed="0.000227"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:22:06.256216" 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-08-22T23:22:06.255794" elapsed="0.000449"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:22:06.256690" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:22:06.256422" elapsed="0.000295"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:22:06.289839" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:22:06.257235" elapsed="0.032734"/>
</kw>
<msg time="2026-08-22T23:22:06.290155" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:22:06.290202" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:06.256873" elapsed="0.033368"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:22:06.312545" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "S "e "t "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-08-22T23:22:06.290783" elapsed="0.022198"/>
</kw>
<msg time="2026-08-22T23:22:06.313344" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:22:06.313394" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:06.290408" elapsed="0.023031"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:06.314150" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:06.313663" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:06.313569" elapsed="0.000687"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:06.315001" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "S "e "t "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-08-22T23:22:06.314414" elapsed="0.000673"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:06.315389" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:06.315171" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:06.315151" elapsed="0.000316"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:22:06.315514" elapsed="0.000081"/>
</return>
<kw name="Run Keyword 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-08-22T23:22:06.318980" elapsed="0.000184"/>
</kw>
<msg time="2026-08-22T23:22:06.319234" 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-08-22T23:22:06.317459" elapsed="0.001946"/>
</kw>
<kw name="Open 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-08-22T23:22:06.319744" elapsed="0.000098"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:06.320257" 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-08-22T23:22:06.316655" elapsed="0.003830"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:22:06.315955" elapsed="0.004604"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:22:06.255115" elapsed="0.065576"/>
</kw>
<msg time="2026-08-22T23:22:06.320800" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:06.320847" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:06.254450" elapsed="0.066446"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:22:06.321089" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:22:06.320979" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:06.320959" 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-08-22T23:22:06.321815" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:06.322194" elapsed="0.000130"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:22:06.322377" 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-08-22T23:22:06.253779" elapsed="0.068719"/>
</kw>
<msg time="2026-08-22T23:22:06.322628" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:06.322676" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:06.249120" elapsed="0.073597"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:06.323062" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:06.322804" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:06.322785" elapsed="0.000384"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:22:06.248976" elapsed="0.074220"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:06.329024" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:06.328914" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:06.328895" 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-08-22T23:22:06.330246" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:06.330137" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:06.330119" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:22:06.330820" 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-08-22T23:22:06.330460" elapsed="0.000387"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:22:06.331250" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:22:06.331008" elapsed="0.000268"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:22:06.365489" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:22:06.331788" elapsed="0.033832"/>
</kw>
<msg time="2026-08-22T23:22:06.365800" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:22:06.365847" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:06.331432" elapsed="0.034452"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:22:06.390943" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "S "e "t "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-08-22T23:22:06.366399" elapsed="0.024667"/>
</kw>
<msg time="2026-08-22T23:22:06.391247" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:22:06.391294" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:06.366056" elapsed="0.025276"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:06.391660" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:06.391411" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:06.391390" elapsed="0.000350"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:06.392192" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "S "e "t "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-08-22T23:22:06.391881" 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-08-22T23:22:06.392547" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:06.392331" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:06.392313" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:22:06.392679" 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-08-22T23:22:06.395499" elapsed="0.000173"/>
</kw>
<msg time="2026-08-22T23:22:06.395739" 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-08-22T23:22:06.394185" elapsed="0.002425"/>
</kw>
<kw name="Open 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-08-22T23:22:06.396915" elapsed="0.000093"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:06.397296" 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-08-22T23:22:06.393464" elapsed="0.004050"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:22:06.392936" elapsed="0.004666"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:22:06.329835" elapsed="0.067869"/>
</kw>
<msg time="2026-08-22T23:22:06.397797" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:06.397841" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:06.329241" elapsed="0.068639"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:22:06.398063" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:22:06.397956" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:06.397937" 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-08-22T23:22:06.398538" 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-08-22T23:22:06.399054" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:22:06.399127" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:22:06.328536" elapsed="0.070701"/>
</kw>
<msg time="2026-08-22T23:22:06.399331" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:06.399375" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:06.323518" elapsed="0.075893"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:06.399755" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:06.399486" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:06.399469" elapsed="0.000363"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:22:06.323366" elapsed="0.076489"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:06.405213" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:06.405107" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:06.405088" 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-08-22T23:22:06.406464" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:06.406357" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:06.406339" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:22:06.407048" 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-08-22T23:22:06.406695" elapsed="0.000380"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:22:06.407452" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:22:06.407230" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:22:06.439620" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:22:06.407980" elapsed="0.031755"/>
</kw>
<msg time="2026-08-22T23:22:06.439913" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:22:06.439960" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:06.407650" elapsed="0.032347"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:22:06.462811" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "S "e "t "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-08-22T23:22:06.440501" elapsed="0.023873"/>
</kw>
<msg time="2026-08-22T23:22:06.464791" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:22:06.464863" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:06.440164" elapsed="0.024753"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:06.465725" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:06.465125" elapsed="0.000685"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:06.465052" elapsed="0.000804"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:06.466899" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "S "e "t "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-08-22T23:22:06.466067" elapsed="0.001018"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:06.467801" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:06.467247" elapsed="0.000680"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:06.467204" elapsed="0.000778"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:22:06.468066" elapsed="0.000087"/>
</return>
<kw name="Run Keyword 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-08-22T23:22:06.475027" elapsed="0.000598"/>
</kw>
<msg time="2026-08-22T23:22:06.475783" 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-08-22T23:22:06.471872" elapsed="0.004242"/>
</kw>
<kw name="Open 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-08-22T23:22:06.476996" elapsed="0.000218"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:06.477938" 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-08-22T23:22:06.470170" elapsed="0.008277"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:22:06.468820" elapsed="0.009891"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:22:06.406056" elapsed="0.072900"/>
</kw>
<msg time="2026-08-22T23:22:06.479188" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:06.479295" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:06.405426" elapsed="0.073965"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:22:06.479890" elapsed="0.000062"/>
</return>
<status status="PASS" start="2026-08-22T23:22:06.479620" elapsed="0.000420"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:06.479533" elapsed="0.000567"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:06.481198" elapsed="0.000062"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:06.482097" elapsed="0.000060"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:22:06.482270" elapsed="0.000038"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:22:06.404769" elapsed="0.077760"/>
</kw>
<msg time="2026-08-22T23:22:06.482848" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:06.482955" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:06.400116" elapsed="0.082894"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:06.483349" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:06.483092" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:06.483074" elapsed="0.000353"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:22:06.399980" elapsed="0.083472"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:22:06.248776" elapsed="0.234720"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:22:06.245501" elapsed="0.238089"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:22:06.238138" elapsed="0.245706"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:06.237405" elapsed="0.246497"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:22:06.230113" elapsed="0.253859"/>
</kw>
<kw name="Wait_Device_Connected" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:06.496513" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:06.494122" elapsed="0.002418"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:06.497267" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:06.496937" elapsed="0.000357"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:22:06.496781" elapsed="0.000550"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:06.497900" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:06.497560" elapsed="0.000366"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:22:06.497411" elapsed="0.000551"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:22:06.496620" elapsed="0.001371"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:06.498297" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:06.498056" elapsed="0.000299"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:06.499119" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:06.498646" elapsed="0.000504"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:06.498379" elapsed="0.000808"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:06.499377" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:06.499211" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:06.498038" elapsed="0.001417"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:06.499490" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:22:06.499654" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:22:06.493655" elapsed="0.006025"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:06.499726" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:22:06.499867" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:22:06.493064" elapsed="0.006829"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:06.507216" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:06.506916" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:06.507679" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:06.507418" 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-08-22T23:22:06.521373" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:06.521646" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Set-Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Fri, 21-Aug-2026 23:22:06 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:22:06.521831" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:06.509828" elapsed="0.012661">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:06.507791" elapsed="0.014951">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:06.523073" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:06.522801" elapsed="0.000373"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:06.507772" elapsed="0.015439">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:06.523876" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:06.524096" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:06.524032" elapsed="0.000130"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:06.524004" elapsed="0.000190"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:06.524409" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:06.524514" 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-08-22T23:22:06.502612" elapsed="0.022088">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:06.524807" elapsed="0.000023"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:06.500117" elapsed="0.024832">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:06.525199" elapsed="0.000032"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:22:06.485393" elapsed="0.039969">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:07.543020" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:07.539861" elapsed="0.003216"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:07.544320" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:07.543790" elapsed="0.000568"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:22:07.543511" elapsed="0.000901"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:07.545242" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:07.544767" elapsed="0.000513"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:22:07.544533" elapsed="0.000798"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:22:07.543202" elapsed="0.002170"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:07.545918" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:07.545492" elapsed="0.000532"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:07.547234" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:07.546468" elapsed="0.000810"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:07.546070" elapsed="0.001317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:07.547681" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:07.547428" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:07.545457" elapsed="0.002335"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:07.547852" elapsed="0.000063"/>
</return>
<msg time="2026-08-22T23:22:07.548077" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:22:07.539032" elapsed="0.009158"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:07.548242" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:22:07.548391" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:22:07.538164" elapsed="0.010253"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:07.555809" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:07.555506" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:07.556323" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:07.556032" 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-08-22T23:22:07.568425" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:07.568699" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:22:07.568846" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:07.558566" elapsed="0.010821">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:07.556439" elapsed="0.013047">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:07.569707" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:07.569522" elapsed="0.000252"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:07.556420" elapsed="0.013378">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:07.570230" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:07.570369" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:07.570331" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:07.570313" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:07.570592" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:07.570665" elapsed="0.000014"/>
</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-08-22T23:22:07.551112" elapsed="0.019666">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:07.570846" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:07.548663" elapsed="0.022278">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:07.571116" elapsed="0.000021"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:22:07.526309" elapsed="0.045182">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:08.590158" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:08.587399" elapsed="0.002803"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:08.590980" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:08.590652" elapsed="0.000354"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:22:08.590478" elapsed="0.000568"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:08.591616" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:08.591283" elapsed="0.000361"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:22:08.591136" elapsed="0.000545"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:22:08.590300" elapsed="0.001410"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:08.592106" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:08.591805" elapsed="0.000359"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:08.593033" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:08.592423" elapsed="0.000639"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:08.592193" elapsed="0.000907"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:08.593288" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:08.593125" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:08.591777" elapsed="0.001589"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:08.593413" elapsed="0.000053"/>
</return>
<msg time="2026-08-22T23:22:08.593618" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:22:08.586706" elapsed="0.006940"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:08.593694" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:22:08.593837" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:22:08.585851" elapsed="0.008010"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:08.601211" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:08.600947" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:08.601671" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:08.601409" 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-08-22T23:22:08.613392" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:08.613681" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:22:08.613849" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:08.603819" elapsed="0.010635">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:08.601781" elapsed="0.012791">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:08.614866" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:08.614647" elapsed="0.000308"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:08.601763" elapsed="0.013225">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:08.615560" elapsed="0.000058"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:08.615775" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:08.615724" elapsed="0.000108"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:08.615699" elapsed="0.000163"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:08.616057" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:08.616153" elapsed="0.000020"/>
</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-08-22T23:22:08.596595" elapsed="0.019707">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:08.616416" elapsed="0.000022"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:08.594087" elapsed="0.022468">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:08.616812" elapsed="0.000031"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:22:08.572851" elapsed="0.044119">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:09.635404" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:09.632416" elapsed="0.003027"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:09.636192" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:09.635860" elapsed="0.000359"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:22:09.635702" elapsed="0.000555"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:09.636828" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:09.636490" elapsed="0.000365"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:22:09.636340" elapsed="0.000552"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:22:09.635527" elapsed="0.001394"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:09.637282" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:09.636999" elapsed="0.000341"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:09.638111" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:09.637610" elapsed="0.000531"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:09.637365" elapsed="0.000813"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:09.638364" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:09.638204" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:09.636977" elapsed="0.001464"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:09.638480" elapsed="0.000041"/>
</return>
<msg time="2026-08-22T23:22:09.638666" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:22:09.631911" elapsed="0.006781"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:09.638740" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:22:09.638882" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:22:09.631287" elapsed="0.007621"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:09.646294" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:09.646027" elapsed="0.000448"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:09.646899" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:09.646650" 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-08-22T23:22:09.658182" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:09.658433" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:22:09.658619" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:09.649039" elapsed="0.010168">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:09.647010" elapsed="0.012312">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:09.659608" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:09.659369" elapsed="0.000332"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:09.646991" elapsed="0.012742">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:09.660243" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:09.660429" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:09.660377" elapsed="0.000109"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:09.660354" elapsed="0.000161"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:09.660730" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:09.660828" 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-08-22T23:22:09.641594" elapsed="0.019379">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:09.661067" elapsed="0.000021"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:09.639134" elapsed="0.022061">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:09.661423" elapsed="0.000030"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:22:09.618126" elapsed="0.043447">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:10.681299" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:10.679032" elapsed="0.002305"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:10.682091" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:10.681763" elapsed="0.000355"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:22:10.681602" elapsed="0.000554"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:10.682724" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:10.682389" elapsed="0.000361"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:22:10.682240" elapsed="0.000620"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:22:10.681423" elapsed="0.001469"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:10.683286" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:10.682983" elapsed="0.000361"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:10.684119" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:10.683648" elapsed="0.000499"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:10.683373" elapsed="0.000810"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:10.684369" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:10.684208" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:10.682958" elapsed="0.001488"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:10.684490" elapsed="0.000050"/>
</return>
<msg time="2026-08-22T23:22:10.684694" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:22:10.678506" elapsed="0.006217"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:10.684772" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:22:10.684915" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:22:10.677901" elapsed="0.007039"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:10.692206" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:10.691943" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:10.692666" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:10.692403" 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-08-22T23:22:10.702261" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:10.702491" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:22:10.702650" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:10.694833" elapsed="0.008331">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:10.692776" elapsed="0.010481">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:10.703447" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:10.703291" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:10.692758" elapsed="0.010777">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:10.703961" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:10.704098" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:10.704061" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:10.704043" 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-08-22T23:22:10.704301" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:10.704370" elapsed="0.000054"/>
</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-08-22T23:22:10.687638" elapsed="0.016884">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:10.704608" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:10.685164" elapsed="0.019547">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:10.704877" elapsed="0.000021"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:22:10.662560" elapsed="0.042423">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:11.792527" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:11.790312" elapsed="0.002255"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:11.793321" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:11.792997" elapsed="0.000350"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:22:11.792840" elapsed="0.000545"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:11.793980" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:11.793660" elapsed="0.000347"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:22:11.793495" elapsed="0.000547"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:22:11.792671" elapsed="0.001400"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:11.794451" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:11.794158" elapsed="0.000350"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:11.795248" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:11.794785" elapsed="0.000492"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:11.794536" elapsed="0.000777"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:11.795499" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:11.795338" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:11.794133" elapsed="0.001460"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:11.795640" elapsed="0.000049"/>
</return>
<msg time="2026-08-22T23:22:11.795827" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:22:11.789800" elapsed="0.006052"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:11.795900" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:22:11.796041" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:22:11.788772" elapsed="0.007294"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:11.803352" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:11.803084" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:11.803810" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:11.803550" 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-08-22T23:22:11.815070" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:11.815488" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:22:11.815804" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:11.806145" elapsed="0.010530">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:11.803921" elapsed="0.012939">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:11.817274" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:11.816936" elapsed="0.000506"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:11.803902" elapsed="0.013596">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:11.818352" elapsed="0.000058"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:11.818682" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:11.818567" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:11.818530" elapsed="0.000294"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:11.819132" elapsed="0.000046"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:11.819288" elapsed="0.000032"/>
</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-08-22T23:22:11.798782" elapsed="0.020738">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:11.819704" elapsed="0.000035"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:11.796306" elapsed="0.023609">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:11.820279" elapsed="0.000047"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:22:11.705954" elapsed="0.114568">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:12.839033" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:12.836726" elapsed="0.002350"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:12.839880" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:12.839514" elapsed="0.000394"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:22:12.839353" elapsed="0.000598"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:12.840557" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:12.840234" elapsed="0.000366"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:22:12.840068" elapsed="0.000570"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:22:12.839175" elapsed="0.001491"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:12.841066" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:12.840761" elapsed="0.000365"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:12.841880" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:12.841392" elapsed="0.000518"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:12.841155" elapsed="0.000890"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:12.842236" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:12.842071" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:12.840734" elapsed="0.001579"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:12.842360" elapsed="0.000056"/>
</return>
<msg time="2026-08-22T23:22:12.842554" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:22:12.836185" elapsed="0.006418"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:12.842672" elapsed="0.000038"/>
</return>
<msg time="2026-08-22T23:22:12.842846" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:22:12.835513" elapsed="0.007359"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:12.850671" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:12.850386" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:12.851122" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:12.850874" 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-08-22T23:22:12.862270" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:12.862497" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:22:12.862656" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:12.853364" elapsed="0.009798">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:12.851233" elapsed="0.012033">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:12.863467" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:12.863301" elapsed="0.000240"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:12.851214" elapsed="0.012352">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:12.864007" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:12.864158" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:12.864112" elapsed="0.000092"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:12.864094" elapsed="0.000132"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:12.864378" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:12.864456" elapsed="0.000018"/>
</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-08-22T23:22:12.845982" elapsed="0.018609">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:12.864668" elapsed="0.000021"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:12.843103" elapsed="0.021673">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:12.864984" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:22:12.821673" elapsed="0.043423">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:13.885089" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:13.881885" elapsed="0.003246"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:13.885933" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:13.885552" elapsed="0.000442"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:22:13.885387" elapsed="0.000649"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:13.886626" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:13.886278" elapsed="0.000376"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:22:13.886123" elapsed="0.000569"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:22:13.885220" elapsed="0.001502"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:13.887124" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:13.886810" elapsed="0.000374"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:13.887958" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:13.887450" elapsed="0.000537"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:13.887212" elapsed="0.000813"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:13.888224" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:13.888051" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:13.886784" elapsed="0.001518"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:13.888346" elapsed="0.000053"/>
</return>
<msg time="2026-08-22T23:22:13.888538" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:22:13.881099" elapsed="0.007466"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:13.888632" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:22:13.888778" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:22:13.879984" elapsed="0.008820"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:13.900643" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:13.899969" elapsed="0.000815"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:13.901737" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:13.901132" 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-08-22T23:22:13.917857" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:13.918144" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:22:13.918332" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:13.906815" elapsed="0.012104">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:13.902025" elapsed="0.017131">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:13.919503" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:13.919214" elapsed="0.000361"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:13.901972" elapsed="0.017647">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:13.920178" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:13.920347" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:13.920299" elapsed="0.000099"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:13.920275" elapsed="0.000145"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:13.920571" elapsed="0.000038"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:13.920667" elapsed="0.000017"/>
</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-08-22T23:22:13.892032" elapsed="0.028765">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:13.920870" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:13.889065" elapsed="0.031906">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:13.921161" elapsed="0.000023"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:22:13.866192" elapsed="0.055088">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:14.941540" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:14.938335" elapsed="0.003264"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:14.942371" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:14.942042" elapsed="0.000356"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:22:14.941881" elapsed="0.000554"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:14.943010" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:14.942688" elapsed="0.000349"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:22:14.942522" elapsed="0.000550"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:22:14.941699" elapsed="0.001402"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:14.943501" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:14.943196" elapsed="0.000364"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:14.944308" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:14.943839" elapsed="0.000499"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:14.943604" elapsed="0.000769"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:14.944603" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:14.944398" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:14.943169" elapsed="0.001513"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:14.944729" elapsed="0.000051"/>
</return>
<msg time="2026-08-22T23:22:14.944914" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:22:14.937626" elapsed="0.007314"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:14.944990" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:22:14.945226" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:22:14.936761" elapsed="0.008491"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:14.957270" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:14.956657" elapsed="0.000732"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:14.957813" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:14.957549" 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-08-22T23:22:14.968547" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:14.968851" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:22:14.969027" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:14.960006" elapsed="0.009651">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:14.957933" elapsed="0.011845">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:14.970045" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:14.969826" elapsed="0.000309"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:14.957912" elapsed="0.012256">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:14.970757" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:14.970948" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:14.970892" elapsed="0.000115"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:14.970868" elapsed="0.000170"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:14.971235" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:14.971331" 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-08-22T23:22:14.947958" elapsed="0.023523">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:14.971597" elapsed="0.000024"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:14.945477" elapsed="0.026257">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:14.971968" elapsed="0.000030"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:22:14.922401" elapsed="0.049716">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:15.989424" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:15.986266" elapsed="0.003360"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:15.990670" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:15.990190" elapsed="0.000519"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:22:15.989979" elapsed="0.000780"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:15.991521" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:15.991089" elapsed="0.000468"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:22:15.990870" elapsed="0.000759"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:22:15.989750" elapsed="0.001920"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:15.992170" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:15.991787" elapsed="0.000459"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:15.993232" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:15.992623" elapsed="0.000647"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:15.992283" elapsed="0.001034"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:15.993568" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:15.993349" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:15.991755" elapsed="0.001937"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:15.993749" elapsed="0.000067"/>
</return>
<msg time="2026-08-22T23:22:15.993985" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:22:15.985595" elapsed="0.008430"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:15.994090" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:22:15.994284" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:22:15.984677" elapsed="0.009641"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:16.004658" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:16.004211" elapsed="0.000522"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:16.005261" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:16.004940" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:22:16.018749" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:16.018993" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:22:16.019177" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:16.008660" elapsed="0.011066">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:16.005426" elapsed="0.014406">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:16.020093" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:16.019879" elapsed="0.000311"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:16.005393" elapsed="0.014838">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:16.020844" elapsed="0.000122"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:16.021101" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:16.021055" elapsed="0.000098"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:16.021033" elapsed="0.000147"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:16.021384" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:16.021462" 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-08-22T23:22:15.998440" elapsed="0.023164">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:16.021680" elapsed="0.000017"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:15.994678" elapsed="0.027101">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:16.021957" elapsed="0.000023"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:22:15.973062" elapsed="0.049008">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:17.040410" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:17.038179" elapsed="0.002269"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:17.041186" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:17.040857" elapsed="0.000356"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:22:17.040702" elapsed="0.000550"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:17.041846" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:17.041484" elapsed="0.000389"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:22:17.041335" elapsed="0.000574"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:22:17.040532" elapsed="0.001406"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:17.042299" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:17.042021" elapsed="0.000336"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:17.043097" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:17.042630" elapsed="0.000494"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:17.042384" elapsed="0.000776"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:17.043344" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:17.043184" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:17.041998" elapsed="0.001430"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:17.043470" elapsed="0.000041"/>
</return>
<msg time="2026-08-22T23:22:17.043654" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:22:17.037662" elapsed="0.006019"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:17.043728" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:22:17.043871" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:22:17.037048" elapsed="0.006849"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:17.051449" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:17.051188" elapsed="0.000442"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:17.052030" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:17.051783" 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-08-22T23:22:17.062639" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:17.062812" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:22:17.062929" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:17.054205" elapsed="0.009156">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:17.052141" elapsed="0.011307">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:17.063655" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:17.063481" elapsed="0.000242"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:17.052123" elapsed="0.011624">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:17.064119" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:17.064254" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:17.064217" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:17.064199" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:17.064458" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:17.064528" 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-08-22T23:22:17.046850" elapsed="0.017798">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:17.064720" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:17.044131" elapsed="0.020684">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:17.064982" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:22:17.022987" elapsed="0.042105">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:18.083613" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:18.081151" elapsed="0.002501"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:18.084382" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:18.084052" elapsed="0.000357"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:22:18.083897" elapsed="0.000551"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:18.085033" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:18.084712" elapsed="0.000348"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:22:18.084532" elapsed="0.000962"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:22:18.083734" elapsed="0.002079"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:18.087277" elapsed="0.000069"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:18.086170" elapsed="0.001273"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:18.089666" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:18.088085" elapsed="0.001658"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:18.087508" elapsed="0.002320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:18.090267" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:18.089890" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:18.086068" elapsed="0.004403"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:18.090573" elapsed="0.000129"/>
</return>
<msg time="2026-08-22T23:22:18.091029" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:22:18.080646" elapsed="0.010442"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:18.091205" elapsed="0.000063"/>
</return>
<msg time="2026-08-22T23:22:18.091565" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:22:18.080022" elapsed="0.011634"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:18.102786" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:18.102493" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:18.103239" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:18.102992" 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-08-22T23:22:18.115563" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:18.115823" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:22:18.115971" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:18.105613" elapsed="0.010911">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:18.103351" elapsed="0.013319">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:18.116881" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:18.116708" elapsed="0.000239"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:18.103332" elapsed="0.013639">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:18.117498" elapsed="0.000066"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:18.117841" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:18.117756" elapsed="0.000176"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:18.117716" 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-08-22T23:22:18.118302" elapsed="0.000049"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:18.118458" elapsed="0.000220"/>
</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-08-22T23:22:18.097984" elapsed="0.020932">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:18.119074" elapsed="0.000036"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:18.092296" elapsed="0.026992">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:18.119697" elapsed="0.000050"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:22:18.066058" elapsed="0.053893">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:19.138889" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:19.136488" elapsed="0.002447"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:19.139768" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:19.139381" elapsed="0.000416"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:22:19.139218" elapsed="0.000624"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:19.140416" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:19.140085" elapsed="0.000358"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:22:19.139931" elapsed="0.000548"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:22:19.139033" elapsed="0.001474"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:19.140933" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:19.140618" elapsed="0.000375"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:19.141757" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:19.141256" elapsed="0.000532"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:19.141022" elapsed="0.000803"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:19.142014" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:19.141849" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:19.140589" elapsed="0.001503"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:19.142138" elapsed="0.000052"/>
</return>
<msg time="2026-08-22T23:22:19.142327" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:22:19.135736" elapsed="0.006617"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:19.142403" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:22:19.142546" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:22:19.134798" elapsed="0.007773"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:19.150128" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:19.149862" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:19.150572" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:19.150328" 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-08-22T23:22:19.162321" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:19.162639" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:22:19.162774" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:19.152778" elapsed="0.010476">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:19.150698" elapsed="0.012646">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:19.163600" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:19.163379" elapsed="0.000302"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:19.150680" elapsed="0.013031">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:19.164118" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:19.164256" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:19.164218" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:19.164200" elapsed="0.000129"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:19.164706" elapsed="0.000051"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:19.164868" elapsed="0.000033"/>
</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-08-22T23:22:19.145406" elapsed="0.019700">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:19.165261" elapsed="0.000034"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:19.142830" elapsed="0.022641">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:19.165910" elapsed="0.000055"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:22:19.121069" elapsed="0.045117">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:20.183434" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:20.181140" elapsed="0.002336"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:20.184247" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:20.183918" elapsed="0.000356"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:22:20.183759" elapsed="0.000553"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:20.184881" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:20.184547" elapsed="0.000360"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:22:20.184398" elapsed="0.000544"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:22:20.183568" elapsed="0.001403"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:20.185362" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:20.185063" elapsed="0.000368"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:20.186182" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:20.185716" elapsed="0.000495"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:20.185461" elapsed="0.000885"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:20.186562" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:20.186373" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:20.185037" elapsed="0.001623"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:20.186705" elapsed="0.000051"/>
</return>
<msg time="2026-08-22T23:22:20.186890" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:22:20.180618" elapsed="0.006298"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:20.186965" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:22:20.187107" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:22:20.179988" elapsed="0.007145"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:20.194440" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:20.194174" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:20.194934" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:20.194684" 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-08-22T23:22:20.207044" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:20.207270" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:22:20.207405" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:20.197406" elapsed="0.010517">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:20.195046" elapsed="0.012971">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:20.208208" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:20.208051" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:20.195028" elapsed="0.013271">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:20.208709" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:20.208846" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:20.208808" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:20.208790" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:20.209051" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:20.209121" 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-08-22T23:22:20.189845" elapsed="0.019386">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:20.209302" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:20.187357" elapsed="0.022044">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:20.209640" elapsed="0.000024"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:22:20.167317" elapsed="0.042437">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:21.228714" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:21.226342" elapsed="0.002416"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:21.229538" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:21.229206" elapsed="0.000359"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:22:21.229045" elapsed="0.000589"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:21.230207" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:21.229884" elapsed="0.000350"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:22:21.229731" elapsed="0.000540"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:22:21.228864" elapsed="0.001436"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:21.230722" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:21.230399" elapsed="0.000385"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:21.231525" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:21.231048" elapsed="0.000504"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:21.230813" elapsed="0.000792"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:21.231795" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:21.231631" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:21.230372" elapsed="0.001501"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:21.231921" elapsed="0.000055"/>
</return>
<msg time="2026-08-22T23:22:21.232120" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:22:21.225510" elapsed="0.006636"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:21.232196" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:22:21.232339" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:22:21.224656" elapsed="0.007709"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:21.242890" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:21.242617" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:21.243343" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:21.243093" 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-08-22T23:22:21.254675" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:21.255051" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:22:21.255328" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:21.245516" elapsed="0.010815">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:21.243454" elapsed="0.013216">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:21.257107" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:21.256755" elapsed="0.000498"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:21.243436" elapsed="0.013871">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:21.258261" elapsed="0.000068"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:21.258622" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:21.258508" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:21.258467" 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-08-22T23:22:21.259082" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:21.259236" elapsed="0.000033"/>
</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-08-22T23:22:21.238210" elapsed="0.021282">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:21.259690" elapsed="0.000035"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:21.232611" elapsed="0.027296">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:21.260274" elapsed="0.000047"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:22:21.210858" elapsed="0.049652">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:22.277856" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:22.275182" elapsed="0.002719"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:22.278722" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:22.278344" elapsed="0.000405"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:22:22.278183" elapsed="0.000603"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:22.279346" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:22.279024" elapsed="0.000349"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:22:22.278873" elapsed="0.000535"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:22:22.278001" elapsed="0.001436"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:22.279860" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:22.279533" elapsed="0.000387"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:22.280662" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:22.280179" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:22.279948" elapsed="0.000838"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:22.280992" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:22.280818" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:22.279506" elapsed="0.001564"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:22.281119" elapsed="0.000054"/>
</return>
<msg time="2026-08-22T23:22:22.281315" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:22:22.274651" elapsed="0.006691"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:22.281394" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:22:22.281671" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:22:22.273989" elapsed="0.007710"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:22.289143" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:22.288872" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:22.289742" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:22.289344" elapsed="0.000460"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:22:22.303114" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:22.303349" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:22:22.303487" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:22.292832" elapsed="0.011205">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:22.289898" elapsed="0.014233">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:22.304325" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:22.304166" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:22.289873" elapsed="0.014541">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:22.304890" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:22.305031" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:22.304993" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:22.304975" 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-08-22T23:22:22.305236" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:22.305305" 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-08-22T23:22:22.284460" elapsed="0.020984">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:22.305660" elapsed="0.000036"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:22.281930" elapsed="0.023949">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:22.306254" elapsed="0.000098"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:22:22.261721" elapsed="0.044837">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:23.326456" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:23.323492" elapsed="0.003129"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:23.327417" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:23.327082" elapsed="0.000362"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:22:23.326915" elapsed="0.000568"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:23.328134" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:23.327773" elapsed="0.000388"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:22:23.327619" elapsed="0.000578"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:22:23.326728" elapsed="0.001499"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:23.328648" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:23.328324" elapsed="0.000384"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:23.329443" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:23.328971" elapsed="0.000501"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:23.328736" elapsed="0.000773"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:23.329718" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:23.329535" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:23.328296" elapsed="0.001502"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:23.329846" elapsed="0.000054"/>
</return>
<msg time="2026-08-22T23:22:23.330038" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:22:23.322782" elapsed="0.007283"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:23.330114" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:22:23.330258" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:22:23.321880" elapsed="0.008404"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:23.337847" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:23.337546" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:23.338324" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:23.338071" 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-08-22T23:22:23.349106" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:23.349339" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:22:23.349484" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:23.340626" elapsed="0.009379">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:23.338442" elapsed="0.011655">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:23.350298" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:23.350135" elapsed="0.000228"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:23.338420" elapsed="0.011968">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:23.350826" elapsed="0.000097"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:23.351041" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:23.351000" elapsed="0.000097"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:23.350982" elapsed="0.000144"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:23.351279" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:23.351352" 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-08-22T23:22:23.333083" elapsed="0.018387">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:23.351543" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:23.330527" elapsed="0.021141">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:23.351884" elapsed="0.000026"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:22:23.307673" elapsed="0.044331">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:24.370225" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:24.367160" elapsed="0.003138"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:24.371181" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:24.370767" elapsed="0.000444"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:22:24.370570" elapsed="0.000680"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:24.371838" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:24.371489" elapsed="0.000375"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:22:24.371336" elapsed="0.000565"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:22:24.370394" elapsed="0.001536"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:24.372407" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:24.372032" elapsed="0.000455"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:24.373471" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:24.372855" elapsed="0.000655"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:24.372524" elapsed="0.001032"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:24.373826" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:24.373607" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:24.372000" elapsed="0.001930"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:24.373984" elapsed="0.000057"/>
</return>
<msg time="2026-08-22T23:22:24.374192" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:22:24.366440" elapsed="0.007786"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:24.374278" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:22:24.374451" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:22:24.365022" elapsed="0.009457"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:24.383798" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:24.383480" elapsed="0.000520"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:24.384557" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:24.384214" 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-08-22T23:22:24.395628" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:24.396136" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:22:24.396498" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:24.386872" elapsed="0.010844">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:24.384709" elapsed="0.013211">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:24.398365" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:24.398002" elapsed="0.000512"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:24.384681" elapsed="0.013887">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:24.399529" elapsed="0.000092"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:24.399880" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:24.399793" elapsed="0.000183"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:24.399752" 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-08-22T23:22:24.400347" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:24.400528" elapsed="0.000092"/>
</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-08-22T23:22:24.378074" elapsed="0.022849">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:24.401150" elapsed="0.000057"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:24.374768" elapsed="0.026712">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:24.401972" elapsed="0.000052"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:22:24.353045" elapsed="0.049182">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:25.420313" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:25.417639" elapsed="0.002734"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:25.421408" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:25.420979" elapsed="0.000466"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:22:25.420781" elapsed="0.000718"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:25.422336" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:25.421816" elapsed="0.000565"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:22:25.421610" elapsed="0.000994"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:22:25.420510" elapsed="0.002157"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:25.423256" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:25.422822" elapsed="0.000519"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:25.424412" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:25.423745" elapsed="0.000710"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:25.423382" elapsed="0.001128"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:25.424808" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:25.424549" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:25.422778" elapsed="0.002145"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:25.424985" elapsed="0.000069"/>
</return>
<msg time="2026-08-22T23:22:25.425257" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:22:25.417062" elapsed="0.008234"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:25.425368" elapsed="0.000040"/>
</return>
<msg time="2026-08-22T23:22:25.425600" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:22:25.416193" elapsed="0.009448"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:25.436284" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:25.435871" elapsed="0.000484"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:25.436937" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:25.436569" elapsed="0.000437"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:22:25.451374" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:25.451800" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:22:25.452086" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:25.440751" elapsed="0.012295">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:25.437095" elapsed="0.016169">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:25.453828" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:25.453358" elapsed="0.000632"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:25.437069" elapsed="0.016981">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:25.455136" elapsed="0.000070"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:25.455614" elapsed="0.000053"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:25.455475" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:25.455417" elapsed="0.000380"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:25.456150" elapsed="0.000053"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:25.456318" elapsed="0.000168"/>
</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-08-22T23:22:25.429453" elapsed="0.027313">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:25.456940" elapsed="0.000068"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:25.425995" elapsed="0.031279">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:25.457735" elapsed="0.000055"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:22:25.403159" elapsed="0.054850">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:26.478268" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:26.475115" elapsed="0.003205"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:26.479126" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:26.478799" elapsed="0.000354"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:22:26.478638" elapsed="0.000552"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:26.479765" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:26.479427" elapsed="0.000365"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:22:26.479277" elapsed="0.000551"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:22:26.478432" elapsed="0.001425"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:26.480250" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:26.479949" elapsed="0.000359"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:26.481049" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:26.480570" elapsed="0.000509"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:26.480336" elapsed="0.000779"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:26.481304" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:26.481140" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.479923" elapsed="0.001457"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:26.481427" elapsed="0.000048"/>
</return>
<msg time="2026-08-22T23:22:26.481636" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:22:26.474384" elapsed="0.007280"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:22:26.481712" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:22:26.481857" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:22:26.473460" elapsed="0.008422"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:26.489260" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:26.488992" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:26.489780" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:26.489461" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:22:26.500042" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:26.500357" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:22:26.500494" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:26.491934" elapsed="0.009226">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:26.489894" elapsed="0.011393">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:26.501559" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:26.501336" elapsed="0.000364"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:26.489876" elapsed="0.011860">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:26.502273" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:26.502462" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:26.502409" elapsed="0.000114"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:26.502385" elapsed="0.000172"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:26.502779" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:26.502879" 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-08-22T23:22:26.484641" elapsed="0.018393">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:26.503132" elapsed="0.000021"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:26.482107" elapsed="0.021161">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:26.503502" elapsed="0.000030"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:22:26.459005" elapsed="0.044672">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<msg time="2026-08-22T23:22:26.503825" level="FAIL">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Connected</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:22:06.484754" elapsed="20.019205">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${NODE_SETTER}</arg>
<doc>Wait for the device to become connected.
It is more readable to use this keyword in a test case than to put the whole WUKS below into it.</doc>
<status status="FAIL" start="2026-08-22T23:22:06.484217" elapsed="20.019904">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<doc>Wait until the device becomes visible on setter node.</doc>
<status status="FAIL" start="2026-08-22T23:22:06.228636" elapsed="20.275733">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</test>
<test id="s1-s2-t8" name="Check_Device_Data_Is_Seen_As_Empty_On_Configurer" line="106">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:22:26.510088" elapsed="0.000307"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:22:26.509712" elapsed="0.000763"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:26.511565" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:26.511448" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.511429" elapsed="0.000221"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:26.516542" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:26.516434" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.516416" elapsed="0.000209"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:22:26.517662" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:22:26.517234" elapsed="0.000455"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:22:26.518155" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:22:26.517849" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:22:26.518225" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:22:26.518384" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:22:26.516854" elapsed="0.001555"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:26.524096" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:26.523987" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.523967" 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-08-22T23:22:26.525364" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:26.525255" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.525237" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:22:26.525987" 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-08-22T23:22:26.525645" elapsed="0.000369"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:22:26.526413" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:22:26.526175" elapsed="0.000264"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:22:26.562848" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:22:26.526957" elapsed="0.036002"/>
</kw>
<msg time="2026-08-22T23:22:26.563159" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:22:26.563207" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:26.526620" elapsed="0.036624"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:22:26.587440" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:22:26.563966" elapsed="0.023599"/>
</kw>
<msg time="2026-08-22T23:22:26.587766" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:22:26.587814" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:26.563418" elapsed="0.024434"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:26.588187" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:26.587942" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.587916" elapsed="0.000354"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:26.588774" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:26.588423" 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-08-22T23:22:26.589138" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:26.588917" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.588898" elapsed="0.000320"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:22:26.589254" 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-08-22T23:22:26.592293" elapsed="0.000151"/>
</kw>
<msg time="2026-08-22T23:22:26.592511" 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-08-22T23:22:26.590985" elapsed="0.001706"/>
</kw>
<kw name="Open 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-08-22T23:22:26.592998" elapsed="0.000090"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:26.593534" elapsed="0.000118"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:22:26.590262" elapsed="0.003519"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:22:26.589682" elapsed="0.004171"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:22:26.524953" elapsed="0.069004"/>
</kw>
<msg time="2026-08-22T23:22:26.594053" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:26.594098" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:26.524316" elapsed="0.069819"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:22:26.594324" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:22:26.594213" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.594194" 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-08-22T23:22:26.594844" 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-08-22T23:22:26.595184" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:22:26.595258" 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-08-22T23:22:26.523648" elapsed="0.071721"/>
</kw>
<msg time="2026-08-22T23:22:26.595466" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:26.595511" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:26.518800" elapsed="0.076749"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:26.595898" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:26.595642" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.595625" elapsed="0.000350"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:22:26.518657" elapsed="0.077342"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:26.601725" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:26.601522" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.601486" elapsed="0.000307"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:26.602965" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:26.602854" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.602836" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:22:26.603496" 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-08-22T23:22:26.603177" elapsed="0.000346"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:22:26.603920" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:22:26.603696" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:22:26.636002" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:22:26.604437" elapsed="0.032010"/>
</kw>
<msg time="2026-08-22T23:22:26.637080" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:22:26.637192" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:26.604104" elapsed="0.033173"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:22:26.659571" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:22:26.639843" elapsed="0.019856"/>
</kw>
<msg time="2026-08-22T23:22:26.659877" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:22:26.659926" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:26.638078" elapsed="0.021886"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:26.660365" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:26.660079" elapsed="0.000344"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.660044" elapsed="0.000408"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:26.660943" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:26.660619" 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-08-22T23:22:26.661306" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:26.661088" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.661070" elapsed="0.000316"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:22:26.661427" elapsed="0.000090"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<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-08-22T23:22:26.664661" elapsed="0.000162"/>
</kw>
<msg time="2026-08-22T23:22:26.664891" 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-08-22T23:22:26.663210" elapsed="0.001836"/>
</kw>
<kw name="Open 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-08-22T23:22:26.665354" elapsed="0.000330"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:26.665989" 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-08-22T23:22:26.662469" elapsed="0.003742"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:22:26.661869" elapsed="0.004412"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:22:26.602521" elapsed="0.063863"/>
</kw>
<msg time="2026-08-22T23:22:26.666482" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:26.666528" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:26.601945" elapsed="0.064624"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:22:26.666850" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:22:26.666740" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.666720" 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-08-22T23:22:26.667358" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:26.667828" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:22:26.667902" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:22:26.601154" elapsed="0.066861"/>
</kw>
<msg time="2026-08-22T23:22:26.668117" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:26.668164" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:26.596271" elapsed="0.071930"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:26.668531" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:26.668278" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.668261" elapsed="0.000400"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:22:26.596130" elapsed="0.072560"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:26.674226" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:26.674113" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.674094" 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-08-22T23:22:26.675447" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:26.675338" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.675320" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:22:26.676009" 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-08-22T23:22:26.675679" elapsed="0.000357"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:22:26.676415" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:22:26.676191" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:22:26.710359" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:22:26.676953" elapsed="0.033522"/>
</kw>
<msg time="2026-08-22T23:22:26.710679" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:22:26.710727" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:26.676615" elapsed="0.034149"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:22:26.742795" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:22:26.711289" elapsed="0.032548"/>
</kw>
<msg time="2026-08-22T23:22:26.744195" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:22:26.744263" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:26.710939" elapsed="0.033376"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:26.745039" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:26.744509" elapsed="0.000621"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.744439" elapsed="0.000736"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:26.746078" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:26.745384" elapsed="0.000799"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:26.746627" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:26.746279" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.746253" elapsed="0.000460"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:22:26.746754" 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-08-22T23:22:26.749985" elapsed="0.000160"/>
</kw>
<msg time="2026-08-22T23:22:26.750211" 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-08-22T23:22:26.748604" elapsed="0.001765"/>
</kw>
<kw name="Open 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-08-22T23:22:26.750710" elapsed="0.000090"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:26.751091" 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-08-22T23:22:26.747850" elapsed="0.003458"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:22:26.747158" elapsed="0.004218"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:22:26.675036" elapsed="0.076440"/>
</kw>
<msg time="2026-08-22T23:22:26.751778" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:26.751829" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:26.674444" elapsed="0.077493"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:22:26.752131" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:22:26.752021" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.752001" 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-08-22T23:22:26.752668" 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-08-22T23:22:26.753023" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:22:26.753096" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:22:26.673761" elapsed="0.079447"/>
</kw>
<msg time="2026-08-22T23:22:26.753310" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:26.753356" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:26.668978" elapsed="0.084416"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:26.753801" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:26.753523" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.753504" elapsed="0.000376"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:22:26.668833" elapsed="0.085072"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:22:26.518464" elapsed="0.235481"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:22:26.516073" elapsed="0.237954"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:22:26.511112" elapsed="0.242986"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:26.510658" elapsed="0.243496"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:22:26.505919" elapsed="0.248302"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:26.767339" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:26.766938" elapsed="0.000430"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:26.774828" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:26.774556" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:26.775279" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:26.775028" 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-08-22T23:22:26.803821" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:26.804174" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:22:26.804395" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:22:26.777494" elapsed="0.026958"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:26.775391" elapsed="0.029154"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:26.804993" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:26.804640" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.775373" elapsed="0.029813"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:26.813462" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:26.807729" elapsed="0.005844"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:26.807123" elapsed="0.006559"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.807083" elapsed="0.006656"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:26.816736" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:26.814359" elapsed="0.002455"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:26.813867" elapsed="0.002994"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.813830" elapsed="0.003065"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:22:26.817701" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:22:26.817136" 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-08-22T23:22:26.818048" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:26.817803" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:26.818614" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:26.818291" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:26.818130" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.817785" elapsed="0.000917"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:22:26.819227" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:22:26.818859" 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-08-22T23:22:26.819554" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:26.819323" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:26.820109" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:26.819811" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:26.819652" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.819306" 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-08-22T23:22:26.820339" elapsed="0.000402"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:22:26.821254" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:22:26.820910" 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-08-22T23:22:26.821473" 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-08-22T23:22:26.806119" elapsed="0.017860"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:22:26.824156" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:22:26.824048" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.824030" 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-08-22T23:22:26.824480" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:26.824565" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:22:26.826923" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:22:26.770223" elapsed="0.056729"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:22:26.827013" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:22:26.827164" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:22:26.767599" elapsed="0.059590"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:22:26.827471" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:26.827259" elapsed="0.000599"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.827242" elapsed="0.000641"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:26.828143" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:26.827938" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.827922" elapsed="0.000301"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="PASS" start="2026-08-22T23:22:26.766499" elapsed="0.061818"/>
</kw>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${NODE_CONFIGURER}</arg>
<arg>${empty_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:22:26.754421" elapsed="0.073949"/>
</kw>
<doc>Get the device data as seen by configurer and make sure it is empty.</doc>
<status status="PASS" start="2026-08-22T23:22:26.505038" elapsed="0.323469"/>
</test>
<test id="s1-s2-t9" name="Check_Device_Data_Is_Seen_As_Empty_On_Checker" 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-08-22T23:22:26.833325" elapsed="0.000350"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:22:26.832956" elapsed="0.000796"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:26.835119" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:26.834970" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.834945" elapsed="0.000268"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:26.842219" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:26.842072" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.842046" elapsed="0.000266"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:22:26.843712" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:22:26.843180" elapsed="0.000568"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:22:26.844377" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:22:26.843965" elapsed="0.000447"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:22:26.844472" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:22:26.844697" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:22:26.842660" elapsed="0.002071"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:26.854290" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:26.854177" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.854157" 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-08-22T23:22:26.855765" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:26.855655" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.855635" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:22:26.856309" 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-08-22T23:22:26.855979" elapsed="0.000358"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:22:26.856772" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:22:26.856493" elapsed="0.000307"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:22:26.896108" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:22:26.857297" elapsed="0.039125"/>
</kw>
<msg time="2026-08-22T23:22:26.896924" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:22:26.897030" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:26.856961" elapsed="0.040152"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:22:26.918242" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:22:26.898930" elapsed="0.019607"/>
</kw>
<msg time="2026-08-22T23:22:26.918990" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:22:26.919096" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:26.898061" elapsed="0.021119"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:26.920004" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:26.919397" elapsed="0.000734"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.919325" elapsed="0.000981"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:26.921567" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:26.920719" elapsed="0.001056"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:26.922427" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:26.921934" elapsed="0.000614"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.921892" elapsed="0.000702"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:22:26.922641" 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-08-22T23:22:26.925667" elapsed="0.000156"/>
</kw>
<msg time="2026-08-22T23:22:26.925890" 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-08-22T23:22:26.924310" elapsed="0.001743"/>
</kw>
<kw name="Open 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-08-22T23:22:26.926356" elapsed="0.000090"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:26.926762" 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-08-22T23:22:26.923560" elapsed="0.003423"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:22:26.922980" elapsed="0.004072"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:22:26.855314" elapsed="0.071840"/>
</kw>
<msg time="2026-08-22T23:22:26.927252" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:26.927297" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:26.854544" elapsed="0.072792"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:22:26.927527" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:22:26.927415" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.927396" elapsed="0.000244"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:26.928070" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:26.928419" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:22:26.928491" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:22:26.853824" elapsed="0.074793"/>
</kw>
<msg time="2026-08-22T23:22:26.928719" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:26.928762" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:26.845266" elapsed="0.083533"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:26.929132" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:26.928877" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.928860" elapsed="0.000350"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:22:26.845068" elapsed="0.084167"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:26.935249" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:26.935140" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.935121" 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-08-22T23:22:26.936467" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:26.936359" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:26.936340" elapsed="0.000200"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:22:26.937040" 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-08-22T23:22:26.936711" elapsed="0.000356"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:22:26.937559" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:22:26.937223" elapsed="0.000381"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:22:26.973003" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:22:26.938106" elapsed="0.034998"/>
</kw>
<msg time="2026-08-22T23:22:26.973321" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:22:26.973369" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:26.937768" elapsed="0.035637"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:22:27.000647" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:22:26.973948" elapsed="0.026806"/>
</kw>
<msg time="2026-08-22T23:22:27.000922" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:22:27.000967" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:26.973573" elapsed="0.027430"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:27.001330" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:27.001079" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:27.001060" elapsed="0.000352"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:27.001887" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:27.001557" 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-08-22T23:22:27.002238" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:27.002025" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:27.002007" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:22:27.002348" 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-08-22T23:22:27.004998" elapsed="0.000146"/>
</kw>
<msg time="2026-08-22T23:22:27.005206" 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-08-22T23:22:27.003826" elapsed="0.001743"/>
</kw>
<kw name="Open 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-08-22T23:22:27.005928" elapsed="0.000089"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:27.006297" 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-08-22T23:22:27.003145" elapsed="0.003361"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:22:27.002618" 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-08-22T23:22:26.936057" elapsed="0.070652"/>
</kw>
<msg time="2026-08-22T23:22:27.006800" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:27.006843" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:26.935466" elapsed="0.071413"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:22:27.007061" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:22:27.006955" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:27.006936" 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-08-22T23:22:27.007533" 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-08-22T23:22:27.007891" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:22:27.007962" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:22:26.934783" elapsed="0.073339"/>
</kw>
<msg time="2026-08-22T23:22:27.008215" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:27.008259" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:26.929539" elapsed="0.078757"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:27.008640" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:27.008371" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:27.008353" elapsed="0.000366"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:22:26.929396" elapsed="0.079348"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:27.014419" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:27.014310" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:27.014291" 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-08-22T23:22:27.015658" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:27.015522" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:27.015503" elapsed="0.000223"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:22:27.016180" 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-08-22T23:22:27.015868" elapsed="0.000339"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:22:27.016730" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:22:27.016361" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:22:27.049638" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:22:27.017299" elapsed="0.032570"/>
</kw>
<msg time="2026-08-22T23:22:27.050251" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:22:27.050353" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:27.016920" elapsed="0.033514"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:22:27.072135" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:22:27.051642" elapsed="0.020609"/>
</kw>
<msg time="2026-08-22T23:22:27.072430" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:22:27.072477" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:27.050843" elapsed="0.021671"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:27.072845" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:27.072619" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:27.072573" elapsed="0.000351"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:27.073392" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:27.073070" 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-08-22T23:22:27.073767" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:27.073530" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:27.073512" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:22:27.073878" 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-08-22T23:22:27.076547" elapsed="0.000163"/>
</kw>
<msg time="2026-08-22T23:22:27.076774" 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-08-22T23:22:27.075360" elapsed="0.001555"/>
</kw>
<kw name="Open 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-08-22T23:22:27.077249" elapsed="0.000133"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:27.077702" 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-08-22T23:22:27.074694" elapsed="0.003213"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:22:27.074133" 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-08-22T23:22:27.015223" elapsed="0.062849"/>
</kw>
<msg time="2026-08-22T23:22:27.078162" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:27.078205" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:27.014653" elapsed="0.063591"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:22:27.078427" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:22:27.078319" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:27.078300" 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-08-22T23:22:27.078924" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:27.079259" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:22:27.079330" 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-08-22T23:22:27.013968" elapsed="0.065471"/>
</kw>
<msg time="2026-08-22T23:22:27.079531" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:27.079595" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:27.009001" elapsed="0.070635"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:27.079963" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:27.079712" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:27.079694" elapsed="0.000347"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:22:27.008865" elapsed="0.071200"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:22:26.844814" elapsed="0.235281"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:22:26.841569" elapsed="0.238592"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:22:26.834558" elapsed="0.245663"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:26.833965" elapsed="0.246305"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:22:26.829876" elapsed="0.250450"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:27.093195" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:27.092793" elapsed="0.000437"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:27.100444" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:27.100193" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:27.100932" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:27.100678" 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-08-22T23:22:27.109795" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:27.110010" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:27.110210" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:27.103136" elapsed="0.007616">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:27.101044" elapsed="0.009803">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:27.111037" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:27.110881" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:27.101026" elapsed="0.010100">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:27.111517" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:27.111671" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:27.111634" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:27.111615" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:27.111878" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:27.111947" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:27.095871" elapsed="0.016189">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:27.112129" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:27.093453" elapsed="0.018769">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:27.112444" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:27.112300" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:27.112283" elapsed="0.000245"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:27.112738" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:27.112595" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:27.112565" elapsed="0.000252"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:27.092376" elapsed="0.020519">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:28.130605" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:28.130042" elapsed="0.000607"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:28.138458" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:28.138192" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:28.138938" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:28.138683" 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-08-22T23:22:28.148069" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:28.148322" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:28.148636" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:28.141212" elapsed="0.007992">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:28.139071" elapsed="0.010229">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:28.149498" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:28.149338" elapsed="0.000273"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:28.139042" elapsed="0.010604">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:28.150180" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:28.150377" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:28.150318" elapsed="0.000127"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:28.150293" elapsed="0.000182"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:28.150703" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:28.150803" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:28.133847" elapsed="0.017109">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:28.151051" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:28.130913" elapsed="0.020268">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:28.151490" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:28.151289" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:28.151266" elapsed="0.000355"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:28.151906" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:28.151706" elapsed="0.000283"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:28.151684" elapsed="0.000338"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:28.129372" elapsed="0.022760">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:29.170077" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:29.169603" elapsed="0.000509"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:29.177773" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:29.177490" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:29.178226" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:29.177977" 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-08-22T23:22:29.186430" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:29.186670" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:29.186862" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:29.180488" elapsed="0.006832">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:29.178348" elapsed="0.009060">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:29.187619" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:29.187444" elapsed="0.000245"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:29.178325" elapsed="0.009389">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:29.188096" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:29.188235" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:29.188193" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:29.188175" elapsed="0.000128"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:29.188448" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:29.188518" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:29.172803" elapsed="0.015840">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:29.188714" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:29.170343" elapsed="0.018465">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:29.189031" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:29.188885" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:29.188869" elapsed="0.000242"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:29.189358" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:29.189210" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:29.189188" elapsed="0.000256"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:29.169067" elapsed="0.020455">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:30.208708" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:30.208061" elapsed="0.000702"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:30.216649" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:30.216346" elapsed="0.000463"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:30.217227" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:30.216971" 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-08-22T23:22:30.226900" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:30.227162" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:30.227481" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:30.219537" elapsed="0.008615">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:30.217371" elapsed="0.010908">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:30.228558" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:30.228336" elapsed="0.000337"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:30.217333" elapsed="0.011374">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:30.229253" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:30.229452" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:30.229390" elapsed="0.000133"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:30.229366" elapsed="0.000188"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:30.229781" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:30.229882" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:30.211640" elapsed="0.018394">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:30.230129" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:30.209038" elapsed="0.021221">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:30.230568" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:30.230366" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:30.230343" elapsed="0.000358"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:30.230969" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:30.230773" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:30.230752" elapsed="0.000327"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:30.207256" elapsed="0.023944">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:31.250442" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:31.249813" elapsed="0.000677"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:31.258406" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:31.258134" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:31.258878" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:31.258625" 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-08-22T23:22:31.268033" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:31.268330" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:31.268665" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:31.261169" elapsed="0.008176">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:31.259023" elapsed="0.010453">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:31.269836" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:31.269536" elapsed="0.000395"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:31.258986" elapsed="0.010980">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:31.270513" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:31.270775" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:31.270702" elapsed="0.000155"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:31.270670" 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-08-22T23:22:31.271092" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:31.271191" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:31.253419" elapsed="0.017927">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:31.271441" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:31.250789" elapsed="0.020781">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:31.271908" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:31.271707" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:31.271684" elapsed="0.000335"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:31.272289" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:31.272094" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:31.272072" elapsed="0.000326"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:31.248975" elapsed="0.023542">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:32.291262" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:32.290729" elapsed="0.000568"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:32.299033" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:32.298686" elapsed="0.000396"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:32.299493" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:32.299241" 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-08-22T23:22:32.308996" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:32.309207" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:32.309402" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:32.301733" elapsed="0.008135">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:32.299636" elapsed="0.010318">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:32.310151" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:32.309992" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:32.299611" elapsed="0.010632">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:32.310638" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:32.310783" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:32.310743" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:32.310725" elapsed="0.000159"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:32.311036" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:32.311108" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:32.294123" elapsed="0.017093">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:32.311285" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:32.291653" elapsed="0.019725">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:32.311621" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:32.311457" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:32.311440" elapsed="0.000264"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:32.311899" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:32.311758" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:32.311743" elapsed="0.000235"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:32.290192" elapsed="0.021866">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:33.329799" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:33.329214" elapsed="0.000632"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:33.337605" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:33.337292" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:33.338069" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:33.337816" 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-08-22T23:22:33.347974" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:33.348187" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:33.348420" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:33.340309" elapsed="0.008707">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:33.338207" elapsed="0.010934">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:33.349414" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:33.349196" elapsed="0.000310"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:33.338175" elapsed="0.011365">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:33.350106" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:33.350302" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:33.350243" elapsed="0.000127"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:33.350219" elapsed="0.000181"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:33.350620" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:33.350722" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:33.332620" elapsed="0.018254">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:33.350970" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:33.330100" elapsed="0.021000">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:33.351409" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:33.351207" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:33.351185" elapsed="0.000336"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:33.351814" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:33.351617" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:33.351592" elapsed="0.000331"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:33.328525" elapsed="0.023506">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:34.370832" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:34.370235" elapsed="0.000642"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:34.379834" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:34.379219" elapsed="0.000724"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:34.380871" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:34.380295" elapsed="0.000675"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:22:34.393860" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:34.394097" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:34.394334" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:34.385840" elapsed="0.009014">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:34.381139" elapsed="0.013835">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:34.395245" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:34.395027" elapsed="0.000312"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:34.381088" elapsed="0.014285">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:34.395933" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:34.396129" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:34.396072" elapsed="0.000125"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:34.396048" elapsed="0.000180"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:34.396431" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:34.396530" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:34.373651" elapsed="0.023054">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:34.396803" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:34.371139" elapsed="0.025796">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:34.397242" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:34.397044" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:34.397021" elapsed="0.000333"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:34.397643" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:34.397428" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:34.397406" elapsed="0.000350"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:34.369500" elapsed="0.028363">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:35.416385" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:35.415786" elapsed="0.000646"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:35.424141" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:35.423874" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:35.424608" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:35.424345" 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-08-22T23:22:35.434157" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:35.434374" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:35.434618" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:35.426864" elapsed="0.008297">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:35.424751" elapsed="0.010529">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:35.435594" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:35.435351" elapsed="0.000340"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:35.424715" elapsed="0.011010">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:35.436280" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:35.436475" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:35.436417" elapsed="0.000122"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:35.436393" elapsed="0.000176"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:35.436795" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:35.436894" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:35.419231" elapsed="0.017815">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:35.437143" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:35.416716" elapsed="0.020558">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:35.437605" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:35.437384" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:35.437362" elapsed="0.000357"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:35.437989" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:35.437794" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:35.437772" elapsed="0.000327"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:35.415025" elapsed="0.023182">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:36.457957" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:36.457384" elapsed="0.000615"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:36.467930" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:36.467660" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:36.468382" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:36.468133" 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-08-22T23:22:36.477726" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:36.477952" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:36.478179" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:36.470684" elapsed="0.008002">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:36.468515" elapsed="0.010268">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:36.478984" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:36.478824" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:36.468485" elapsed="0.010589">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:36.479464" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:36.479624" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:36.479562" elapsed="0.000115"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:36.479545" 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-08-22T23:22:36.479862" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:36.479934" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:36.460795" elapsed="0.019250">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:36.480115" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:36.458254" elapsed="0.021954">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:36.480430" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:36.480287" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:36.480270" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:36.480769" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:36.480563" elapsed="0.000266"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:36.480547" elapsed="0.000306"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:36.456714" elapsed="0.024217">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:37.502165" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:37.501538" elapsed="0.000673"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:37.509601" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:37.509321" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:37.510082" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:37.509828" 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-08-22T23:22:37.519076" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:37.519336" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:37.519643" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:37.512672" elapsed="0.007560">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:37.510223" elapsed="0.010127">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:37.520646" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:37.520402" elapsed="0.000337"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:37.510191" elapsed="0.010581">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:37.521312" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:37.521506" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:37.521447" elapsed="0.000122"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:37.521423" elapsed="0.000198"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:37.521850" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:37.521950" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:37.504988" elapsed="0.017114">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:37.522199" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:37.502495" elapsed="0.019836">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:37.522664" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:37.522442" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:37.522419" elapsed="0.000358"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:37.523047" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:37.522851" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:37.522830" elapsed="0.000328"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:37.500783" elapsed="0.022481">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<msg time="2026-08-22T23:22:37.523407" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:22:27.080512" elapsed="10.443028">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<doc>Get the device data as seen by checker and make sure it is empty.</doc>
<status status="FAIL" start="2026-08-22T23:22:26.829018" elapsed="10.694789">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</test>
<test id="s1-s2-t10" name="Check_Device_Data_Is_Seen_As_Empty_On_Setter" line="124">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:22:37.528659" elapsed="0.000299"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:22:37.528257" elapsed="0.000782"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:37.530505" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:37.530348" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:37.530321" 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-08-22T23:22:37.535628" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:37.535505" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:37.535487" elapsed="0.000209"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:22:37.536733" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:22:37.536304" elapsed="0.000459"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:22:37.537229" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:22:37.536925" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:22:37.537301" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:22:37.537462" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:22:37.535923" 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-08-22T23:22:37.543310" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:37.543200" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:37.543181" 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-08-22T23:22:37.544615" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:37.544483" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:37.544465" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:22:37.545162" 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-08-22T23:22:37.544831" elapsed="0.000358"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:22:37.545606" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:22:37.545350" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:22:37.580027" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:22:37.546164" elapsed="0.033972"/>
</kw>
<msg time="2026-08-22T23:22:37.580350" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:22:37.580398" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:37.545793" elapsed="0.034642"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:22:37.607425" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "S "e "t "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-08-22T23:22:37.580991" elapsed="0.026544"/>
</kw>
<msg time="2026-08-22T23:22:37.607728" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:22:37.607774" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:37.580636" elapsed="0.027175"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:37.608116" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:37.607890" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:37.607869" elapsed="0.000327"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:37.608675" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "S "e "t "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-08-22T23:22:37.608341" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:37.609030" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:37.608816" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:37.608797" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:22:37.609141" 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-08-22T23:22:37.611920" elapsed="0.000147"/>
</kw>
<msg time="2026-08-22T23:22:37.612167" 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-08-22T23:22:37.610711" elapsed="0.001601"/>
</kw>
<kw name="Open 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-08-22T23:22:37.612650" elapsed="0.000090"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:37.613032" 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-08-22T23:22:37.610004" elapsed="0.003238"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:22:37.609426" elapsed="0.003884"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:22:37.544180" elapsed="0.069230"/>
</kw>
<msg time="2026-08-22T23:22:37.613503" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:37.613548" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:37.543530" elapsed="0.070072"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:22:37.613805" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:22:37.613697" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:37.613678" 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-08-22T23:22:37.614334" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:37.614699" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:22:37.614772" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:22:37.542855" elapsed="0.072026"/>
</kw>
<msg time="2026-08-22T23:22:37.614974" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:37.615018" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:37.537937" elapsed="0.077118"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:37.615377" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:37.615130" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:37.615113" elapsed="0.000343"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:22:37.537763" elapsed="0.077716"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:37.621448" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:37.621339" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:37.621319" 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-08-22T23:22:37.622725" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:37.622614" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:37.622569" elapsed="0.000223"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:22:37.623247" 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-08-22T23:22:37.622933" elapsed="0.000340"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:22:37.623669" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:22:37.623429" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:22:37.661916" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:22:37.624188" elapsed="0.037861"/>
</kw>
<msg time="2026-08-22T23:22:37.662228" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:22:37.662275" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:37.623854" elapsed="0.038458"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:22:37.684689" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "S "e "t "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-08-22T23:22:37.662860" elapsed="0.021983"/>
</kw>
<msg time="2026-08-22T23:22:37.685018" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:22:37.685063" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:37.662484" elapsed="0.022616"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:37.685399" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:37.685177" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:37.685157" elapsed="0.000321"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:37.685951" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "S "e "t "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-08-22T23:22:37.685644" 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-08-22T23:22:37.686314" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:37.686102" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:37.686085" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:22:37.686425" 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-08-22T23:22:37.689319" elapsed="0.000146"/>
</kw>
<msg time="2026-08-22T23:22:37.689529" 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-08-22T23:22:37.687953" elapsed="0.001750"/>
</kw>
<kw name="Open 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-08-22T23:22:37.690024" elapsed="0.000092"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:37.690397" 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-08-22T23:22:37.687241" 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-08-22T23:22:37.686699" 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-08-22T23:22:37.622285" elapsed="0.068516"/>
</kw>
<msg time="2026-08-22T23:22:37.690893" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:37.690938" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:37.621682" elapsed="0.069293"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:22:37.691157" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:22:37.691051" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:37.691033" 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-08-22T23:22:37.691660" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:37.691995" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:22:37.692068" 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-08-22T23:22:37.620994" elapsed="0.071185"/>
</kw>
<msg time="2026-08-22T23:22:37.692272" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:37.692317" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:37.615777" elapsed="0.076577"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:37.692691" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:37.692428" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:37.692410" elapsed="0.000358"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:22:37.615638" elapsed="0.077154"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:37.698617" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:37.698482" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:37.698463" elapsed="0.000261"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:37.699891" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:37.699783" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:37.699765" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:22:37.700437" 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-08-22T23:22:37.700099" elapsed="0.000364"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:22:37.700879" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:22:37.700634" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:22:37.735523" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:22:37.701391" elapsed="0.034465"/>
</kw>
<msg time="2026-08-22T23:22:37.736166" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:22:37.736218" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:37.701062" elapsed="0.035194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:22:37.760226" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "S "e "t "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-08-22T23:22:37.737227" elapsed="0.023430"/>
</kw>
<msg time="2026-08-22T23:22:37.761063" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:22:37.761135" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:37.736620" elapsed="0.024574"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:37.762013" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:37.761415" elapsed="0.000718"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:37.761338" elapsed="0.000846"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:37.763103" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "S "e "t "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-08-22T23:22:37.762420" elapsed="0.000800"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:37.763678" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:37.763322" elapsed="0.000439"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:37.763293" elapsed="0.000504"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:22:37.763860" elapsed="0.000076"/>
</return>
<kw name="Run Keyword 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-08-22T23:22:37.768526" elapsed="0.000268"/>
</kw>
<msg time="2026-08-22T23:22:37.768891" 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-08-22T23:22:37.766531" elapsed="0.002591"/>
</kw>
<kw name="Open 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-08-22T23:22:37.769611" elapsed="0.000139"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:37.770214" 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-08-22T23:22:37.765376" elapsed="0.005158"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:22:37.764424" elapsed="0.006367"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:22:37.699451" elapsed="0.071446"/>
</kw>
<msg time="2026-08-22T23:22:37.771004" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:37.771051" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:37.698882" elapsed="0.072216"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:22:37.771294" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:22:37.771183" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:37.771163" 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 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:37.771956" 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-08-22T23:22:37.772331" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:22:37.772405" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:22:37.698140" elapsed="0.074383"/>
</kw>
<msg time="2026-08-22T23:22:37.772695" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:37.772745" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:37.693052" elapsed="0.079732"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:37.773131" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:37.772870" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:37.772852" elapsed="0.000358"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:22:37.692915" elapsed="0.080322"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:22:37.537551" elapsed="0.235733"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:22:37.535142" elapsed="0.238222"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:22:37.529938" elapsed="0.243496"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:37.529261" elapsed="0.244231"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:22:37.525196" elapsed="0.248364"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:37.786959" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:37.786528" elapsed="0.000458"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:37.794552" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:37.794288" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:37.795025" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:37.794772" 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-08-22T23:22:37.805713" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:37.805994" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:37.806197" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:37.797226" elapsed="0.009686">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:37.795138" elapsed="0.011907">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:37.807324" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:37.807094" elapsed="0.000383"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:37.795119" elapsed="0.012395">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:37.808208" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:37.808413" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:37.808358" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:37.808332" elapsed="0.000175"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:37.808744" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:37.808850" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:37.789825" elapsed="0.019188">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:37.809115" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:37.787205" elapsed="0.022048">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:37.809605" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:37.809368" elapsed="0.000322"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:37.809344" elapsed="0.000382"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:37.810018" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:37.809805" elapsed="0.000293"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:37.809783" elapsed="0.000387"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:37.786080" elapsed="0.024211">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:38.828205" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:38.827696" elapsed="0.000548"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:38.836118" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:38.835850" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:38.836588" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:38.836322" 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-08-22T23:22:38.847315" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:38.847519" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:38.847684" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:38.838838" elapsed="0.009642">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:38.836722" elapsed="0.012080">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:38.849234" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:38.848885" elapsed="0.000499"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:38.836695" elapsed="0.012743">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:38.850314" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:38.850655" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:38.850535" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:38.850496" 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-08-22T23:22:38.851128" elapsed="0.000049"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:38.851315" elapsed="0.000035"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:38.831402" elapsed="0.020152">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:38.851742" elapsed="0.000037"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:38.828484" elapsed="0.023473">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:38.852456" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:38.852135" elapsed="0.000473"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:38.852097" elapsed="0.000569"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:38.853103" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:38.852788" elapsed="0.000437"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:38.852754" elapsed="0.000524"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:38.827083" elapsed="0.026368">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:39.873051" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:39.872390" elapsed="0.000709"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:39.880979" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:39.880701" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:39.881437" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:39.881184" 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-08-22T23:22:39.891615" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:39.891859" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:39.892172" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:39.883741" elapsed="0.009113">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:39.881599" elapsed="0.011379">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:39.893258" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:39.893035" elapsed="0.000316"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:39.881545" elapsed="0.011840">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:39.893968" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:39.894167" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:39.894107" elapsed="0.000128"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:39.894083" elapsed="0.000182"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:39.894467" elapsed="0.000072"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:39.894628" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:39.875919" elapsed="0.018867">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:39.894882" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:39.873372" elapsed="0.021642">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:39.895326" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:39.895124" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:39.895101" elapsed="0.000336"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:39.895725" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:39.895510" elapsed="0.000293"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:39.895489" elapsed="0.000346"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:39.871559" elapsed="0.024384">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:40.915479" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:40.914874" elapsed="0.000650"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:40.923402" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:40.923131" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:40.923868" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:40.923619" 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-08-22T23:22:40.934736" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:40.935034" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:40.935355" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:40.926397" elapsed="0.009665">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:40.924010" elapsed="0.012184">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:40.936472" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:40.936251" elapsed="0.000315"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:40.923976" elapsed="0.012646">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:40.937202" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:40.937404" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:40.937341" elapsed="0.000134"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:40.937316" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:40.937731" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:40.937833" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:40.918375" elapsed="0.019616">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:40.938089" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:40.915833" elapsed="0.022387">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:40.938531" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:40.938329" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:40.938306" elapsed="0.000359"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:40.938939" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:40.938742" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:40.938720" elapsed="0.000329"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:40.914076" elapsed="0.025084">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:41.958793" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:41.958156" elapsed="0.000685"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:41.966714" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:41.966413" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:41.967178" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:41.966926" 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-08-22T23:22:41.977854" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:41.978092" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:41.978406" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:41.969444" elapsed="0.009619">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:41.967320" elapsed="0.011869">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:41.979478" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:41.979243" elapsed="0.000326"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:41.967288" elapsed="0.012337">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:41.980244" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:41.980451" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:41.980390" elapsed="0.000131"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:41.980363" elapsed="0.000187"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:41.980775" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:41.980877" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:41.961706" elapsed="0.019334">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:41.981138" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:41.959160" elapsed="0.022110">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:41.981604" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:41.981380" elapsed="0.000306"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:41.981357" elapsed="0.000362"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:41.982014" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:41.981793" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:41.981771" elapsed="0.000354"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:41.957314" elapsed="0.024922">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:43.001103" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:43.000512" elapsed="0.000637"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:43.008860" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:43.008563" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:43.009315" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:43.009065" 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-08-22T23:22:43.019697" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:43.019924" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:43.020204" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:43.011602" elapsed="0.009244">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:43.009454" elapsed="0.011525">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:43.021268" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:43.021036" elapsed="0.000331"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:43.009421" elapsed="0.011982">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:43.021998" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:43.022207" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:43.022144" elapsed="0.000134"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:43.022119" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:43.022525" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:43.022654" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:43.003947" elapsed="0.018889">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:43.022945" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:43.001407" elapsed="0.021678">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:43.023417" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:43.023203" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:43.023178" elapsed="0.000358"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:43.023847" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:43.023637" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:43.023613" elapsed="0.000353"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:42.999779" elapsed="0.024301">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:44.043530" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:44.042922" elapsed="0.000669"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:44.051262" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:44.050998" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:44.051759" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:44.051490" 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-08-22T23:22:44.062227" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:44.062443" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:44.062679" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:44.054028" elapsed="0.009224">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:44.051896" elapsed="0.011480">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:44.063697" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:44.063454" elapsed="0.000337"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:44.051866" elapsed="0.011960">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:44.064362" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:44.064557" elapsed="0.000044"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:44.064499" elapsed="0.000145"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:44.064475" elapsed="0.000198"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:44.064877" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:44.064975" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:44.046341" elapsed="0.018786">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:44.065224" elapsed="0.000020"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:44.043846" elapsed="0.021505">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:44.065679" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:44.065458" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:44.065436" elapsed="0.000355"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:44.066061" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:44.065866" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:44.065844" elapsed="0.000324"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:44.042244" elapsed="0.024030">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:45.084973" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:45.084411" elapsed="0.000605"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:45.095172" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:45.094906" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:45.095642" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:45.095376" 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-08-22T23:22:45.107182" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:45.107523" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:45.107914" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:45.097930" elapsed="0.010983">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:45.095782" elapsed="0.013330">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:45.109608" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:45.109199" elapsed="0.000572"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:45.095751" elapsed="0.014079">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:45.110827" elapsed="0.000066"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:45.111165" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:45.111071" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:45.111029" elapsed="0.000294"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:45.111698" elapsed="0.000052"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:45.111868" elapsed="0.000035"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:45.087802" elapsed="0.024364">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:45.112336" elapsed="0.000036"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:45.085268" elapsed="0.027293">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:45.113056" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:45.112783" elapsed="0.000352"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:45.112743" elapsed="0.000440"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:45.113456" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:45.113259" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:45.113238" elapsed="0.000329"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:45.083763" elapsed="0.029937">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:46.131834" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:46.131262" elapsed="0.000615"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:46.139418" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:46.139147" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:46.139896" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:46.139640" 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-08-22T23:22:46.149784" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:46.149997" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:46.150206" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:46.142454" elapsed="0.008229">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:46.140041" elapsed="0.010731">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:46.150972" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:46.150813" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:46.140009" elapsed="0.011054">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:46.151455" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:46.151612" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:46.151553" elapsed="0.000108"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:46.151536" elapsed="0.000147"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:46.151830" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:46.151901" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:46.134677" elapsed="0.017332">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:46.152080" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:46.132139" elapsed="0.020036">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:46.152396" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:46.152254" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:46.152237" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:46.152757" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:46.152531" elapsed="0.000287"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:46.152515" elapsed="0.000327"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:46.130613" elapsed="0.022309">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:47.170743" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:47.170208" elapsed="0.000574"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:47.178151" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:47.177885" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:47.178614" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:47.178352" 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-08-22T23:22:47.188472" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:47.188708" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:47.188917" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:47.181097" elapsed="0.008330">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:47.178754" elapsed="0.010761">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:47.189730" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:47.189555" elapsed="0.000239"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:47.178725" elapsed="0.011093">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:47.190345" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:47.190537" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:47.190480" elapsed="0.000146"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:47.190456" elapsed="0.000202"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:47.190859" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:47.190956" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:47.173529" elapsed="0.017575">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:47.191199" elapsed="0.000020"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:47.171030" elapsed="0.020297">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:47.191660" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:47.191434" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:47.191411" elapsed="0.000360"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:47.192041" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:47.191847" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:47.191825" elapsed="0.000323"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:47.169591" elapsed="0.022663">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.212879" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:48.212338" elapsed="0.000582"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.220407" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:48.220137" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.220878" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:48.220626" 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-08-22T23:22:48.231341" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:48.231571" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:48.231817" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:48.223389" elapsed="0.008976">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:48.221014" elapsed="0.011473">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.232809" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:48.232538" elapsed="0.000368"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:48.220988" elapsed="0.011954">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.233600" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:48.233827" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:48.233770" elapsed="0.000125"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:48.233741" 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-08-22T23:22:48.234130" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:48.234228" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:48.215685" elapsed="0.018700">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:48.234485" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:48.213169" elapsed="0.021497">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.234989" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:48.234785" elapsed="0.000287"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:48.234759" elapsed="0.000349"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.235386" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:48.235190" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:48.235168" elapsed="0.000331"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:48.211721" elapsed="0.023910">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<msg time="2026-08-22T23:22:48.235778" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:22:37.773784" elapsed="10.462141">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<doc>Get the device data as seen by setter and make sure it is empty.</doc>
<status status="FAIL" start="2026-08-22T23:22:37.524323" elapsed="10.711855">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</test>
<test id="s1-s2-t11" name="Create_Device_Data" 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-08-22T23:22:48.248266" elapsed="0.000478"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:22:48.247712" elapsed="0.001158"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:48.250454" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:48.250230" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.250197" elapsed="0.000371"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:48.258321" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:48.258154" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.258112" elapsed="0.000306"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.259477" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:22:48.259069" elapsed="0.000439"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.259993" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:22:48.259682" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:22:48.260064" elapsed="0.000046"/>
</return>
<msg time="2026-08-22T23:22:48.260239" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:22:48.258682" elapsed="0.001583"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:48.265852" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:48.265731" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.265687" elapsed="0.000236"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:48.267148" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:48.267040" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.267022" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:22:48.267736" 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-08-22T23:22:48.267367" elapsed="0.000397"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:22:48.268171" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:22:48.267928" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:22:48.314122" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:22:48.268709" elapsed="0.045541"/>
</kw>
<msg time="2026-08-22T23:22:48.314439" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:22:48.314486" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:48.268354" elapsed="0.046170"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:22:48.328796" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:22:48.315094" elapsed="0.013809"/>
</kw>
<msg time="2026-08-22T23:22:48.329078" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:22:48.329124" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m        ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:48.314733" elapsed="0.014429"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.329507" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:48.329256" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.329229" elapsed="0.000387"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.330102" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:48.329786" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.330449" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:48.330234" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.330215" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:22:48.330563" 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-08-22T23:22:48.333719" elapsed="0.000420"/>
</kw>
<msg time="2026-08-22T23:22:48.334209" 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-08-22T23:22:48.332212" elapsed="0.002157"/>
</kw>
<kw name="Open 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-08-22T23:22:48.334769" elapsed="0.000093"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.335151" 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-08-22T23:22:48.331486" 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-08-22T23:22:48.330909" elapsed="0.004531"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:22:48.266735" elapsed="0.068807"/>
</kw>
<msg time="2026-08-22T23:22:48.335656" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:48.335703" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m        ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:48.266076" elapsed="0.069667"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:22:48.335938" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:22:48.335824" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.335804" 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-08-22T23:22:48.336452" 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-08-22T23:22:48.336812" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:22:48.336886" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:22:48.265349" elapsed="0.071648"/>
</kw>
<msg time="2026-08-22T23:22:48.337100" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:48.337145" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m        ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:48.260681" elapsed="0.076502"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.337508" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:48.337259" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.337241" elapsed="0.000373"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:22:48.260521" elapsed="0.077120"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:48.343609" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:48.343477" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.343457" 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-08-22T23:22:48.344877" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:48.344769" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.344751" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:22:48.345427" 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-08-22T23:22:48.345091" elapsed="0.000364"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:22:48.345892" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:22:48.345629" elapsed="0.000289"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:22:48.382732" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:22:48.346408" elapsed="0.036608"/>
</kw>
<msg time="2026-08-22T23:22:48.383294" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:22:48.383345" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:48.346076" elapsed="0.037307"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:22:48.399861" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:22:48.384288" elapsed="0.015676"/>
</kw>
<msg time="2026-08-22T23:22:48.400257" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:22:48.400303" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m        ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:48.383731" elapsed="0.016611"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.400754" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:48.400456" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.400421" elapsed="0.000419"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.401304" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:48.400983" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.401666" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:48.401435" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.401416" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:22:48.401822" 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-08-22T23:22:48.404688" elapsed="0.000169"/>
</kw>
<msg time="2026-08-22T23:22:48.404921" 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-08-22T23:22:48.403504" elapsed="0.001587"/>
</kw>
<kw name="Open 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-08-22T23:22:48.405709" elapsed="0.000103"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.406106" 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-08-22T23:22:48.402780" elapsed="0.003541"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:22:48.402177" 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-08-22T23:22:48.344437" elapsed="0.062053"/>
</kw>
<msg time="2026-08-22T23:22:48.408018" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:48.408085" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m        ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:48.343840" elapsed="0.064289"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:22:48.408377" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:22:48.408241" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.408211" 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 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.409033" 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-08-22T23:22:48.409397" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:22:48.409470" 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-08-22T23:22:48.343095" elapsed="0.066734"/>
</kw>
<msg time="2026-08-22T23:22:48.409940" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:48.409986" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m        ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:48.337950" elapsed="0.072078"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.410378" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:48.410105" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.410087" elapsed="0.000371"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:22:48.337806" elapsed="0.072677"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:48.416269" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:48.416158" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.416139" elapsed="0.000271"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:48.417624" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:48.417487" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.417468" elapsed="0.000226"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:22:48.418197" 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-08-22T23:22:48.417853" elapsed="0.000370"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:22:48.418633" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:22:48.418382" elapsed="0.000278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:22:48.454542" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:22:48.419149" elapsed="0.035611"/>
</kw>
<msg time="2026-08-22T23:22:48.455009" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:22:48.455059" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:48.418817" elapsed="0.036283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:22:48.492974" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:22:48.455904" elapsed="0.042522"/>
</kw>
<msg time="2026-08-22T23:22:48.500831" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:22:48.500899" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m        ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:48.455379" elapsed="0.045567"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.503701" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:48.502435" elapsed="0.001348"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.501973" elapsed="0.001838"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.504556" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:48.503967" 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-08-22T23:22:48.504953" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:48.504728" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.504707" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:22:48.505071" elapsed="0.000484"/>
</return>
<kw name="Run Keyword 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-08-22T23:22:48.508906" elapsed="0.000168"/>
</kw>
<msg time="2026-08-22T23:22:48.509143" 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-08-22T23:22:48.507279" 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-08-22T23:22:48.509635" elapsed="0.000091"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.510046" 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-08-22T23:22:48.506526" elapsed="0.003730"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:22:48.505914" elapsed="0.004410"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:22:48.417181" elapsed="0.093246"/>
</kw>
<msg time="2026-08-22T23:22:48.510535" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:48.510599" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m        ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:48.416566" elapsed="0.094075"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:22:48.510841" elapsed="0.000341"/>
</return>
<status status="PASS" start="2026-08-22T23:22:48.510727" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.510706" elapsed="0.000538"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.511767" elapsed="0.000092"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.512189" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:22:48.512262" 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-08-22T23:22:48.415776" elapsed="0.096598"/>
</kw>
<msg time="2026-08-22T23:22:48.512473" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:48.512517" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m        ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:48.410798" elapsed="0.101757"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.512908" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:48.512655" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.512637" elapsed="0.000349"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:22:48.410646" elapsed="0.102364"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:22:48.260330" elapsed="0.252716"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:22:48.257525" elapsed="0.255587"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:22:48.249875" elapsed="0.263300"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:48.249111" elapsed="0.264111"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:22:48.239310" elapsed="0.273972"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.513956" level="INFO">${template_as_string} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${template_as_string}</var>
<arg>DEVICE_NAME=${device_name}</arg>
<arg>RESTCONF_ROOT=${RESTCONF_ROOT}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:22:48.513464" elapsed="0.000520"/>
</kw>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.549325" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:48.548910" elapsed="0.000451"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:22:48.550235" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:22:48.549909" elapsed="0.000413">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:22:48.550418" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:22:48.549536" elapsed="0.000906"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.551017" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:22:48.550628" elapsed="0.000416"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:22:48.551350" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:22:48.551598" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:22:48.551204" elapsed="0.000422"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.552061" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:48.551789" 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-08-22T23:22:48.553139" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:48.552879" elapsed="0.000306"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.553669" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:22:48.553344" elapsed="0.000434"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.554831" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:22:48.554211" elapsed="0.000646"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:22:48.555636" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:22:48.555384" elapsed="0.000278"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:22:48.555718" elapsed="0.000042"/>
</return>
<msg time="2026-08-22T23:22:48.555901" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:22:48.555056" elapsed="0.000870"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:22:48.556085" elapsed="0.000258"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:22:48.554070" elapsed="0.002316"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.556957" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:22:48.556655" elapsed="0.000327"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:22:48.557715" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:22:48.557485" elapsed="0.000256"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:22:48.557790" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:22:48.557960" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:22:48.557166" elapsed="0.000818"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:22:48.558137" elapsed="0.000223"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:22:48.556506" elapsed="0.001895"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:22:48.553869" elapsed="0.004567"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:22:48.558483" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:22:48.558656" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:22:48.552534" elapsed="0.006148"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:48.552200" elapsed="0.006514"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.558889" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:48.558741" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.552172" elapsed="0.006795"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.559732" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:22:48.559117" elapsed="0.000643"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:22:48.559809" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:22:48.548278" elapsed="0.011655"/>
</kw>
<msg time="2026-08-22T23:22:48.559988" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:22:48.535724" elapsed="0.024314"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.572494" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.601334" elapsed="0.001423"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.617041" 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-08-22T23:22:48.617758" 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-08-22T23:22:48.617966" 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-08-22T23:22:48.618865" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:48.618706" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:48.618241" elapsed="0.000713"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.619098" 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-08-22T23:22:48.619262" 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-08-22T23:22:48.619424" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:22:48.618197" elapsed="0.001280"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:22:48.618058" elapsed="0.001449"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.619674" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:48.619757" elapsed="0.000020"/>
</return>
<msg time="2026-08-22T23:22:48.619940" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:22:48.531266" elapsed="0.088705"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.645843" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:48.645429" elapsed="0.000466"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:22:48.646701" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:22:48.646399" elapsed="0.000385">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:22:48.646879" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:22:48.646062" elapsed="0.000841"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.647449" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:22:48.647066" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:22:48.648249" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:22:48.648415" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:22:48.648099" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.648869" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:48.648613" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:22:48.649331" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:48.648988" elapsed="0.000479"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.650017" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:48.649690" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:48.649497" elapsed="0.000584"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.648968" elapsed="0.001136"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.650730" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:22:48.650250" elapsed="0.000509"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:22:48.650813" elapsed="0.000037"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:22:48.644787" elapsed="0.006168"/>
</kw>
<msg time="2026-08-22T23:22:48.651011" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:22:48.631430" elapsed="0.019632"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.663479" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.675845" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.711746" elapsed="0.000500"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.714281" elapsed="0.000033"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.714489" 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-08-22T23:22:48.715020" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:48.714865" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:48.714846" 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-08-22T23:22:48.715250" 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-08-22T23:22:48.715417" 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-08-22T23:22:48.715598" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:22:48.714806" elapsed="0.000848"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:22:48.714646" elapsed="0.001035"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.715826" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:48.715908" elapsed="0.000019"/>
</return>
<msg time="2026-08-22T23:22:48.716548" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:22:48.630503" elapsed="0.089215"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:22:48.721514" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:22:48.721207" elapsed="0.000404">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:22:48.721712" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:22:48.720785" elapsed="0.000953"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.722118" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:48.721819" elapsed="0.000357"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.722705" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:48.722389" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-08-22T23:22:48.722203" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.721796" elapsed="0.000995"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.725200" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:22:48.722943" elapsed="0.002284"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:22:48.725282" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:22:48.725444" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:22:48.720316" elapsed="0.005153"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.727072" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:48.726816" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.727511" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:48.727273" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.727979" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:48.727733" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.728453" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:48.728204" elapsed="0.000293"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:22:48.729328" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:22:48.729120" elapsed="0.000234"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:22:48.729702" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:22:48.729506" 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-08-22T23:22:48.729875" elapsed="0.000221"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.730494" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:48.730249" elapsed="0.000289"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:22:48.730595" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:22:48.730752" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:22:48.728717" elapsed="0.002060"/>
</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-08-22T23:22:48.742376" level="INFO">POST Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Content-Length': '72', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:22:48.743002" level="INFO">POST Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:48.743177" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:48.733606" elapsed="0.011713">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:48.730847" elapsed="0.014580">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.745718" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:48.745473" elapsed="0.000319"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:48.730830" elapsed="0.014988">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.746296" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:48.746449" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:48.746407" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:48.746387" elapsed="0.000129"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.746680" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:48.746751" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:48.725822" elapsed="0.021039">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:48.746944" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:48.519431" elapsed="0.227611">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.747358" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:48.747166" elapsed="0.000262"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:48.747149" elapsed="0.000304"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:48.747487" elapsed="0.000015"/>
</return>
<arg>${directory_with_template_folders}${/}dataorig</arg>
<arg>${template_as_string}</arg>
<arg>session=${NODE_SETTER}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:22:48.514242" elapsed="0.233364">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<doc>Send some sample test data into the device and check that the request went OK.</doc>
<status status="FAIL" start="2026-08-22T23:22:48.238437" elapsed="0.509343">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</test>
<test id="s1-s2-t12" name="Check_New_Device_Data_Is_Visible_On_Setter" line="143">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:22:48.751209" elapsed="0.000256"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:22:48.750942" elapsed="0.000580"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:48.752637" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:48.752498" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.752479" elapsed="0.000227"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:48.757777" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:48.757668" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.757649" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.758902" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:22:48.758468" elapsed="0.000462"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.759401" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:22:48.759092" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:22:48.759473" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:22:48.759648" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:22:48.758088" 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-08-22T23:22:48.767412" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:48.767297" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.767277" 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-08-22T23:22:48.768737" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:48.768627" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.768607" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:22:48.769275" 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-08-22T23:22:48.768948" elapsed="0.000354"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:22:48.769716" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:22:48.769462" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:22:48.820434" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:22:48.770266" elapsed="0.054289"/>
</kw>
<msg time="2026-08-22T23:22:48.826345" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:22:48.826428" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:48.769899" elapsed="0.056587"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:22:48.836523" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "S "e "t "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-08-22T23:22:48.829330" elapsed="0.007333"/>
</kw>
<msg time="2026-08-22T23:22:48.836856" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:22:48.836912" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:48.827778" elapsed="0.009171"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.837303" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:48.837045" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.837017" elapsed="0.000369"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.837863" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "S "e "t "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-08-22T23:22:48.837529" 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-08-22T23:22:48.838248" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:48.838034" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.838015" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:22:48.838366" elapsed="0.000506"/>
</return>
<kw name="Run Keyword 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-08-22T23:22:48.842898" elapsed="0.000155"/>
</kw>
<msg time="2026-08-22T23:22:48.843121" 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-08-22T23:22:48.841456" elapsed="0.001849"/>
</kw>
<kw name="Open 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-08-22T23:22:48.843637" elapsed="0.000283"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.844215" 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-08-22T23:22:48.840258" elapsed="0.004175"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:22:48.839683" elapsed="0.004817"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:22:48.768291" elapsed="0.076330"/>
</kw>
<msg time="2026-08-22T23:22:48.844727" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:48.844773" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:48.767658" elapsed="0.077154"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:22:48.845006" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:22:48.844894" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.844874" 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-08-22T23:22:48.845503" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.846030" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:22:48.846105" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:22:48.766943" elapsed="0.079279"/>
</kw>
<msg time="2026-08-22T23:22:48.846320" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:48.846365" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:48.760049" elapsed="0.086353"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.846748" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:48.846479" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.846461" elapsed="0.000366"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:22:48.759904" elapsed="0.086947"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:48.853012" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:48.852901" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.852881" 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-08-22T23:22:48.854330" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:48.854219" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.854201" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:22:48.854885" 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-08-22T23:22:48.854542" elapsed="0.000370"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:22:48.855291" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:22:48.855069" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:22:48.891594" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:22:48.855831" elapsed="0.035880"/>
</kw>
<msg time="2026-08-22T23:22:48.891886" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:22:48.891932" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:48.855474" elapsed="0.036495"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:22:48.914465" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "S "e "t "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-08-22T23:22:48.892544" elapsed="0.022180"/>
</kw>
<msg time="2026-08-22T23:22:48.914977" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:22:48.915024" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:48.892199" elapsed="0.022864"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.915527" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:48.915188" elapsed="0.000430"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.915149" elapsed="0.000499"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.916195" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "S "e "t "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-08-22T23:22:48.915798" 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-08-22T23:22:48.916557" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:48.916338" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.916320" elapsed="0.000336"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:22:48.916696" 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-08-22T23:22:48.919549" elapsed="0.000183"/>
</kw>
<msg time="2026-08-22T23:22:48.919798" 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-08-22T23:22:48.918369" 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-08-22T23:22:48.920260" elapsed="0.000091"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.920665" 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-08-22T23:22:48.917625" elapsed="0.003254"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:22:48.917019" elapsed="0.003928"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:22:48.853877" elapsed="0.067171"/>
</kw>
<msg time="2026-08-22T23:22:48.921179" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:48.921226" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:48.853236" elapsed="0.068033"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:22:48.921458" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:22:48.921350" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.921330" 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-08-22T23:22:48.921984" elapsed="0.000043"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.922349" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:22:48.922420" 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-08-22T23:22:48.852531" elapsed="0.070001"/>
</kw>
<msg time="2026-08-22T23:22:48.922746" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:48.922792" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:48.847128" elapsed="0.075704"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.923163" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:48.922912" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.922894" elapsed="0.000399"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:22:48.846986" elapsed="0.076332"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:48.929161" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:48.929052" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.929033" 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-08-22T23:22:48.930390" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:48.930280" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.930262" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:22:48.930946" 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-08-22T23:22:48.930626" elapsed="0.000347"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:22:48.931351" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:22:48.931130" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:22:48.968888" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:22:48.931885" elapsed="0.037250"/>
</kw>
<msg time="2026-08-22T23:22:48.969407" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:22:48.969471" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:48.931533" elapsed="0.037978"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:22:48.995331" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "S "e "t "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-08-22T23:22:48.970332" elapsed="0.025127"/>
</kw>
<msg time="2026-08-22T23:22:48.995660" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:22:48.995707" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:48.969813" elapsed="0.025932"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:48.996110" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:48.995844" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.995815" elapsed="0.000380"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:48.996711" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "S "e "t "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-08-22T23:22:48.996353" 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-08-22T23:22:48.997071" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:48.996854" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:48.996835" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:22:48.997189" 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-08-22T23:22:49.000041" elapsed="0.000151"/>
</kw>
<msg time="2026-08-22T23:22:49.000256" 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-08-22T23:22:48.998856" elapsed="0.001553"/>
</kw>
<kw name="Open 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-08-22T23:22:49.000742" elapsed="0.000093"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:49.001123" elapsed="0.000087"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:22:48.998128" elapsed="0.003208"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:22:48.997510" elapsed="0.003894"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:22:48.929963" elapsed="0.071541"/>
</kw>
<msg time="2026-08-22T23:22:49.001618" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:49.001665" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:48.929378" elapsed="0.072992"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:22:49.002573" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-08-22T23:22:49.002459" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:49.002438" 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-08-22T23:22:49.003114" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:49.003456" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:22:49.003528" 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-08-22T23:22:48.928703" elapsed="0.074966"/>
</kw>
<msg time="2026-08-22T23:22:49.003773" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:49.003820" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:48.923619" elapsed="0.080239"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:49.004195" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:49.003937" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:49.003919" elapsed="0.000354"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:22:48.923457" elapsed="0.080841"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:22:48.759728" elapsed="0.244606"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:22:48.757285" elapsed="0.247113"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:22:48.752200" elapsed="0.252257"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:48.751746" elapsed="0.252758"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:22:48.748656" elapsed="0.255906"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:49.017663" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:49.017245" elapsed="0.000446"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:49.025069" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:49.024815" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:49.025516" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:49.025269" 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-08-22T23:22:49.035937" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:49.036128" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:49.036269" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:49.027746" elapsed="0.011187">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:49.025644" elapsed="0.013513">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:49.039525" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:49.039220" elapsed="0.000428"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:49.025625" elapsed="0.014060">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:49.040305" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:49.040510" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:49.040451" elapsed="0.000123"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:49.040425" 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-08-22T23:22:49.040873" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:49.040972" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:49.020390" elapsed="0.020739">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:49.041227" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:49.017905" elapsed="0.023456">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:49.041698" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:49.041473" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:49.041448" elapsed="0.000363"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:49.042107" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:49.041888" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:49.041865" elapsed="0.000355"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:49.016836" elapsed="0.025497">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:50.061981" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:50.061443" elapsed="0.000575"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:50.070043" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:50.069769" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:50.070620" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:50.070264" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:22:50.080979" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:50.081148" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:50.081356" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:50.072965" elapsed="0.008835">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:50.070771" elapsed="0.011128">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:50.082101" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:50.081941" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:50.070733" elapsed="0.011458">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:50.082634" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:50.082778" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:50.082737" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:50.082719" elapsed="0.000129"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:50.083013" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:50.083090" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:50.065192" elapsed="0.018005">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:50.083268" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:50.062285" elapsed="0.021077">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:50.083602" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:50.083441" elapsed="0.000234"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:50.083424" elapsed="0.000276"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:50.083900" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:50.083757" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:50.083741" elapsed="0.000239"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:50.060783" elapsed="0.023291">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:51.102706" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:51.102214" elapsed="0.000527"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:51.110420" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:51.110156" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:51.110906" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:51.110641" 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-08-22T23:22:51.121571" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:51.121763" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:51.121934" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:51.113144" elapsed="0.009186">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:51.111028" elapsed="0.011385">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:51.122634" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:51.122456" elapsed="0.000247"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:51.111005" elapsed="0.011723">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:51.123166" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:51.123310" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:51.123269" elapsed="0.000094"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:51.123251" 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-08-22T23:22:51.123829" elapsed="0.000056"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:51.124001" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:51.105541" elapsed="0.018722">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:51.124425" elapsed="0.000035"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:51.102992" elapsed="0.021677">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:51.125258" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:51.124853" elapsed="0.000552"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:51.124813" elapsed="0.000654"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:51.125999" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:51.125646" elapsed="0.000485"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:51.125568" elapsed="0.000616"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:51.101688" elapsed="0.024670">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:52.145515" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:52.145038" elapsed="0.000512"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:52.153150" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:52.152890" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:52.153613" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:52.153351" 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-08-22T23:22:52.163309" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:52.163470" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:52.163671" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:52.155875" elapsed="0.008183">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:52.153737" elapsed="0.010404">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:52.164337" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:52.164179" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:52.153713" elapsed="0.010716">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:52.164828" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:52.164969" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:52.164929" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:52.164911" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:52.165182" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:52.165254" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:52.148346" elapsed="0.017014">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:52.165432" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:52.145802" elapsed="0.019725">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:52.165777" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:52.165624" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:52.165607" elapsed="0.000261"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:52.166083" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:52.165936" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:52.165919" elapsed="0.000246"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:52.144504" elapsed="0.021742">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:53.184257" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:53.183773" elapsed="0.000520"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:53.191847" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:53.191568" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:53.192300" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:53.192052" 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-08-22T23:22:53.204434" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:53.204845" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:53.205258" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:53.194515" elapsed="0.011646">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:53.192425" elapsed="0.013943">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:53.206928" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:53.206458" elapsed="0.000633"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:53.192399" elapsed="0.014751">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:53.208194" elapsed="0.000060"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:53.208542" elapsed="0.000068"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:53.208437" elapsed="0.000257"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:53.208383" elapsed="0.000362"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:53.209072" elapsed="0.000049"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:53.209243" elapsed="0.000037"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:53.186985" elapsed="0.022513">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:53.209701" elapsed="0.000040"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:53.184529" elapsed="0.025406">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:53.210475" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:53.210127" elapsed="0.000513"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:53.210086" elapsed="0.000613"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:53.211166" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:53.210829" elapsed="0.000471"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:53.210791" elapsed="0.000566"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:53.183199" elapsed="0.028374">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:54.233427" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:54.232959" elapsed="0.000503"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:54.241057" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:54.240758" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:54.241516" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:54.241266" 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-08-22T23:22:54.251788" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:54.251948" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:54.252142" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:54.243827" elapsed="0.009125">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:54.241659" elapsed="0.011476">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:54.253571" elapsed="0.000084"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:54.253219" elapsed="0.000537"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:54.241634" elapsed="0.012179">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:54.254698" elapsed="0.000060"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:54.255033" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:54.254919" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:54.254880" elapsed="0.000306"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:54.255506" elapsed="0.000049"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:54.255700" elapsed="0.001014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:54.236191" elapsed="0.020735">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:54.257085" elapsed="0.000036"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:54.233712" elapsed="0.023616">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:54.257874" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:54.257517" elapsed="0.000486"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:54.257480" elapsed="0.000578"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:54.258529" elapsed="0.000074"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:54.258190" elapsed="0.000497"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:54.258149" elapsed="0.000591"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:54.232408" elapsed="0.026505">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:55.277831" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:55.277334" elapsed="0.000533"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:55.285643" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:55.285362" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:55.286117" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:55.285863" 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-08-22T23:22:55.296287" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:55.296470" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:55.296762" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:55.288435" elapsed="0.008867">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:55.286242" elapsed="0.011177">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:55.297716" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:55.297471" elapsed="0.000342"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:55.286217" elapsed="0.011631">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:55.298389" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:55.298603" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:55.298527" elapsed="0.000140"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:55.298502" 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-08-22T23:22:55.298900" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:55.299000" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:55.280546" elapsed="0.018603">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:55.299247" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:55.278101" elapsed="0.021279">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:55.299716" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:55.299492" elapsed="0.000306"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:55.299468" elapsed="0.000364"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:55.300121" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:55.299909" elapsed="0.000292"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:55.299887" elapsed="0.000348"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:55.276787" elapsed="0.023556">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:56.317863" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:56.317357" elapsed="0.000543"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:56.325409" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:56.325107" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:56.325881" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:56.325631" 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-08-22T23:22:56.335821" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:56.335987" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:56.336215" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:56.328122" elapsed="0.008514">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:56.326007" elapsed="0.010716">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:56.336923" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:56.336761" elapsed="0.000229"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:56.325981" elapsed="0.011034">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:56.337536" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:56.337771" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:56.337712" elapsed="0.000123"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:56.337681" elapsed="0.000185"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:56.338096" elapsed="0.000039"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:56.338209" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:56.320593" elapsed="0.017783">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:56.338507" elapsed="0.000027"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:56.318138" elapsed="0.020535">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:56.338989" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:56.338787" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:56.338764" elapsed="0.000336"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:56.339367" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:56.339175" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:56.339153" elapsed="0.000323"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:56.316788" elapsed="0.022814">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:57.357319" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:57.356851" elapsed="0.000504"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:57.364899" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:57.364637" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:57.365352" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:57.365100" 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-08-22T23:22:57.375409" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:57.375573" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:57.375772" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:57.367546" elapsed="0.008616">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:57.365474" elapsed="0.010771">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:57.376471" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:57.376281" elapsed="0.000258"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:57.365451" elapsed="0.011113">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:57.376961" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:57.377101" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:57.377061" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:57.377044" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:57.377368" elapsed="0.000050"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:57.377529" elapsed="0.000032"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:57.360019" elapsed="0.017782">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:57.377959" elapsed="0.000034"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:57.357603" elapsed="0.020567">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:57.378702" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:57.378351" elapsed="0.000481"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:57.378314" elapsed="0.000573"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:57.379319" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:57.379007" elapsed="0.000439"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:57.378973" elapsed="0.000527"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:57.356273" elapsed="0.023432">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:58.399611" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:58.399070" elapsed="0.000582"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:58.409218" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:58.408918" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:58.409705" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:58.409436" 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-08-22T23:22:58.419951" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:58.420171" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:58.420426" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:58.411917" elapsed="0.009116">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:58.409836" elapsed="0.011318">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:58.421434" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:58.421207" elapsed="0.000319"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:58.409809" elapsed="0.011750">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:58.422132" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:58.422329" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:58.422272" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:58.422248" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:58.422640" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:58.422739" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:58.402472" elapsed="0.020418">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:58.422986" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:58.399918" elapsed="0.023200">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:58.423423" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:58.423227" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:58.423204" elapsed="0.000328"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:58.423823" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:58.423628" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:58.423604" elapsed="0.000326"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:58.398440" elapsed="0.025598">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:59.442407" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:59.441943" elapsed="0.000498"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:59.449742" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:59.449461" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:59.450193" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:59.449944" 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-08-22T23:22:59.460674" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:59.460832" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:59.461005" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:59.452622" elapsed="0.008821">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:59.450317" elapsed="0.011240">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:59.461852" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:59.461634" elapsed="0.000311"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:59.450293" elapsed="0.011685">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:59.462499" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:59.462714" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:59.462660" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:59.462634" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:59.463006" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:59.463105" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:59.445126" elapsed="0.018125">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:59.463346" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:59.442691" elapsed="0.020787">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:59.463809" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:59.463608" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:59.463565" elapsed="0.000355"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:59.464188" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:59.463994" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:59.463972" elapsed="0.000324"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:59.441402" elapsed="0.023002">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<msg time="2026-08-22T23:22:59.464534" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:22:49.004752" elapsed="10.459946">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<doc>Get the device data and make sure it contains the created content.</doc>
<status status="FAIL" start="2026-08-22T23:22:48.748078" elapsed="10.716840">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</test>
<test id="s1-s2-t13" name="Check_New_Device_Data_Is_Visible_On_Checker" 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-08-22T23:22:59.469433" elapsed="0.000253"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:22:59.469105" elapsed="0.000639"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:59.470780" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:59.470657" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:59.470638" elapsed="0.000210"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:59.475801" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:59.475693" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:59.475675" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:22:59.477006" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:22:59.476560" elapsed="0.000473"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:22:59.477497" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:22:59.477192" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:22:59.477569" elapsed="0.000049"/>
</return>
<msg time="2026-08-22T23:22:59.477746" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:22:59.476175" 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-08-22T23:22:59.483478" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:59.483368" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:59.483349" 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-08-22T23:22:59.484764" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:59.484655" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:59.484636" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:22:59.485301" 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-08-22T23:22:59.484977" elapsed="0.000355"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:22:59.485751" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:22:59.485491" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:22:59.520466" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:22:59.486273" elapsed="0.034300"/>
</kw>
<msg time="2026-08-22T23:22:59.520787" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:22:59.520834" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:59.485937" elapsed="0.034934"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:22:59.543415" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:22:59.521378" elapsed="0.022157"/>
</kw>
<msg time="2026-08-22T23:22:59.543738" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:22:59.543785" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:59.521040" elapsed="0.022782"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:59.544146" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:59.543908" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:59.543885" elapsed="0.000342"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:59.544740" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:59.544370" elapsed="0.000442"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:59.545094" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:59.544881" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:59.544863" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:22:59.545207" 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">
<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-08-22T23:22:59.547939" elapsed="0.000147"/>
</kw>
<msg time="2026-08-22T23:22:59.548199" 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-08-22T23:22:59.546776" 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-08-22T23:22:59.548705" elapsed="0.000089"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:59.549082" 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-08-22T23:22:59.546065" elapsed="0.003227"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:22:59.545496" elapsed="0.003865"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:22:59.484323" elapsed="0.065137"/>
</kw>
<msg time="2026-08-22T23:22:59.549556" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:59.549619" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:59.483713" elapsed="0.065945"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:22:59.549843" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:22:59.549735" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:59.549716" 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-08-22T23:22:59.550328" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:59.550682" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:22:59.550754" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:22:59.483027" elapsed="0.067837"/>
</kw>
<msg time="2026-08-22T23:22:59.550959" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:59.551004" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:59.478145" elapsed="0.072896"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:59.551366" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:59.551117" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:59.551100" elapsed="0.000344"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:22:59.478004" elapsed="0.073464"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:59.557151" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:59.557043" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:59.557024" 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-08-22T23:22:59.558362" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:59.558255" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:59.558237" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:22:59.558922" 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-08-22T23:22:59.558570" elapsed="0.000379"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:22:59.559332" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:22:59.559107" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:22:59.595816" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:22:59.560029" elapsed="0.035889"/>
</kw>
<msg time="2026-08-22T23:22:59.596107" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:22:59.596155" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:59.559515" elapsed="0.036677"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:22:59.622053" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:22:59.596746" elapsed="0.025453"/>
</kw>
<msg time="2026-08-22T23:22:59.622370" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:22:59.622416" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:59.596361" elapsed="0.026092"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:59.622779" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:59.622530" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:59.622510" elapsed="0.000348"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:59.623302" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:59.622998" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:59.623669" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:59.623439" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:59.623421" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:22:59.623782" 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-08-22T23:22:59.626396" elapsed="0.000143"/>
</kw>
<msg time="2026-08-22T23:22:59.626628" 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-08-22T23:22:59.625270" elapsed="0.001504"/>
</kw>
<kw name="Open 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-08-22T23:22:59.627068" elapsed="0.000089"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:59.627436" 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-08-22T23:22:59.624567" 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-08-22T23:22:59.624038" 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-08-22T23:22:59.557954" elapsed="0.069875"/>
</kw>
<msg time="2026-08-22T23:22:59.627920" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:59.627964" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:59.557367" elapsed="0.070634"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:22:59.628183" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:22:59.628077" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:59.628059" 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-08-22T23:22:59.628866" 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-08-22T23:22:59.629225" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:22:59.629297" 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-08-22T23:22:59.556701" elapsed="0.072706"/>
</kw>
<msg time="2026-08-22T23:22:59.629501" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:59.629544" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:59.551753" elapsed="0.077864"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:59.629951" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:59.629696" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:59.629678" elapsed="0.000350"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:22:59.551613" elapsed="0.078439"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:59.635780" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:59.635672" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:59.635653" elapsed="0.000239"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:22:59.637087" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:59.636978" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:59.636959" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:22:59.637637" 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-08-22T23:22:59.637297" elapsed="0.000367"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:22:59.638040" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:22:59.637820" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:22:59.668724" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:22:59.638555" elapsed="0.030273"/>
</kw>
<msg time="2026-08-22T23:22:59.669020" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:22:59.669066" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:59.638223" elapsed="0.030880"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:22:59.689900" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:22:59.669648" elapsed="0.020371"/>
</kw>
<msg time="2026-08-22T23:22:59.690195" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:22:59.690242" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:59.669273" elapsed="0.021006"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:59.690639" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:59.690376" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:59.690350" elapsed="0.000372"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:59.691186" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:59.690865" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:59.691537" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:59.691323" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:59.691305" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:22:59.691675" 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-08-22T23:22:59.694410" elapsed="0.000145"/>
</kw>
<msg time="2026-08-22T23:22:59.694636" 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-08-22T23:22:59.693251" 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-08-22T23:22:59.695083" elapsed="0.000088"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:59.695451" elapsed="0.000087"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:22:59.692507" 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-08-22T23:22:59.691960" elapsed="0.003782"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:22:59.636674" elapsed="0.059167"/>
</kw>
<msg time="2026-08-22T23:22:59.695936" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:59.695980" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:59.636044" elapsed="0.059977"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:22:59.696206" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:22:59.696098" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:59.696080" 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-08-22T23:22:59.696807" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:59.697150" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:22:59.697224" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:22:59.635317" elapsed="0.062023"/>
</kw>
<msg time="2026-08-22T23:22:59.697437" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:22:59.697482" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:59.630311" elapsed="0.067208"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:59.697881" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:59.697630" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-08-22T23:22:59.697610" elapsed="0.000350"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:22:59.630175" elapsed="0.067810"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:22:59.477826" elapsed="0.220191"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:22:59.475318" elapsed="0.222760"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:22:59.470344" elapsed="0.227793"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:22:59.469900" elapsed="0.228283"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:22:59.466014" elapsed="0.232224"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:22:59.711297" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:22:59.710904" elapsed="0.000421"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:59.718605" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:59.718337" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:22:59.719059" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:22:59.718807" 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-08-22T23:22:59.727715" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:22:59.727924" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:22:59.728073" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:22:59.721258" elapsed="0.007349">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:22:59.719171" elapsed="0.009566">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:59.728998" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:59.728784" elapsed="0.000352"/>
</branch>
<status status="FAIL" start="2026-08-22T23:22:59.719153" elapsed="0.010020">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:59.729727" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:59.729917" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:22:59.729864" elapsed="0.000111"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:59.729840" elapsed="0.000165"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:59.730208" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:22:59.730308" elapsed="0.000024"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:22:59.713982" elapsed="0.016480">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:22:59.730560" elapsed="0.000041"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:22:59.711538" elapsed="0.019176">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:59.731031" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:59.730826" elapsed="0.000283"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:59.730802" elapsed="0.000341"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:22:59.731417" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:22:59.731219" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:22:59.731197" elapsed="0.000331"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:22:59.710491" elapsed="0.021168">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:00.749539" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:00.749059" elapsed="0.000515"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:00.757294" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:00.757033" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:00.757767" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:00.757498" 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-08-22T23:23:00.766424" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:00.766604" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:00.766733" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:00.759998" elapsed="0.007126">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:00.757895" elapsed="0.009382">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:00.767478" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:00.767315" elapsed="0.000229"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:00.757869" elapsed="0.009700">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:00.767969" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:00.768110" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:00.768068" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:00.768050" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:00.768322" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:00.768396" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:00.752661" elapsed="0.015841">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:00.768573" elapsed="0.000031"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:00.749900" elapsed="0.018786">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:00.768951" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:00.768806" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:00.768788" elapsed="0.000243"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:00.769227" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:00.769086" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:00.769069" elapsed="0.000237"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:00.748489" elapsed="0.020925">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:01.786826" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:01.786294" elapsed="0.000569"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:01.794657" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:01.794367" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:01.795113" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:01.794865" 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-08-22T23:23:01.804091" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:01.804258" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:01.804457" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:01.797355" elapsed="0.007543">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:01.795241" elapsed="0.009745">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:01.805185" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:01.805025" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:01.795212" elapsed="0.010065">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:01.805691" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:01.805836" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:01.805792" elapsed="0.000091"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:01.805774" elapsed="0.000131"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:01.806047" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:01.806118" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:01.789605" elapsed="0.016621">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:01.806296" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:01.787124" elapsed="0.019266">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:01.806632" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:01.806470" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:01.806453" elapsed="0.000260"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:01.806908" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:01.806768" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:01.806752" elapsed="0.000235"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:01.785707" elapsed="0.021359">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:02.826382" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:02.825918" elapsed="0.000503"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:02.833926" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:02.833661" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:02.834379" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:02.834129" 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-08-22T23:23:02.843469" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:02.843700" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:02.843939" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:02.836696" elapsed="0.007770">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:02.834506" elapsed="0.010095">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:02.844895" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:02.844654" elapsed="0.000335"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:02.834483" elapsed="0.010541">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:02.845548" elapsed="0.000060"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:02.845768" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:02.845712" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:02.845687" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:02.846059" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:02.846159" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:02.829110" elapsed="0.017194">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:02.846401" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:02.826671" elapsed="0.019861">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:02.846868" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:02.846667" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:02.846643" elapsed="0.000338"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:02.847253" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:02.847057" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:02.847035" elapsed="0.000329"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:02.825386" elapsed="0.022088">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:03.866122" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:03.865660" elapsed="0.000497"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:03.873645" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:03.873368" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:03.874099" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:03.873850" 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-08-22T23:23:03.882780" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:03.882938" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:03.883129" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:03.876287" elapsed="0.007316">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:03.874220" elapsed="0.009507">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:03.884013" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:03.883781" elapsed="0.000334"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:03.874197" elapsed="0.009954">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:03.884750" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:03.884984" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:03.884922" elapsed="0.000128"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:03.884873" 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-08-22T23:23:03.885298" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:03.885405" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:03.868821" elapsed="0.016743">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:03.885691" elapsed="0.000024"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:03.866396" elapsed="0.019438">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:03.886166" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:03.885952" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:03.885928" elapsed="0.000359"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:03.886593" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:03.886367" elapsed="0.000313"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:03.886343" elapsed="0.000373"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:03.865120" elapsed="0.021714">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:04.903422" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:04.902960" elapsed="0.000497"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:04.911112" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:04.910850" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:04.911564" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:04.911315" 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-08-22T23:23:04.919714" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:04.919877" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:04.920056" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:04.913817" elapsed="0.006627">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:04.911701" elapsed="0.008828">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:04.920740" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:04.920565" elapsed="0.000243"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:04.911680" elapsed="0.009153">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:04.921251" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:04.921393" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:04.921352" elapsed="0.000093"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:04.921334" elapsed="0.000145"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:04.921701" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:04.921804" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:04.906260" elapsed="0.015692">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:04.922050" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:04.903703" elapsed="0.018481">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:04.922494" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:04.922295" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:04.922272" elapsed="0.000356"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:04.922901" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:04.922705" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:04.922683" elapsed="0.000330"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:04.902412" elapsed="0.020710">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:05.941238" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:05.940742" elapsed="0.000532"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:05.948884" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:05.948604" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:05.949364" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:05.949113" 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-08-22T23:23:05.958102" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:05.958461" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:05.958894" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:05.951566" elapsed="0.008166">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:05.949491" elapsed="0.010426">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:05.960352" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:05.959996" elapsed="0.000501"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:05.949465" elapsed="0.011087">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:05.961481" elapsed="0.000062"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:05.961826" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:05.961737" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:05.961697" 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-08-22T23:23:05.962283" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:05.962435" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:05.943960" elapsed="0.018743">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:05.962856" elapsed="0.000034"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:05.941525" elapsed="0.021539">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:05.963552" elapsed="0.000073"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:05.963234" elapsed="0.000470"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:05.963199" elapsed="0.000558"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:05.964179" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:05.963873" elapsed="0.000425"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:05.963840" elapsed="0.000510"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:05.940183" elapsed="0.024336">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:06.983848" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:06.983341" elapsed="0.000555"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:06.993345" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:06.993078" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:06.993873" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:06.993573" elapsed="0.000346"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:23:07.001795" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:07.002134" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:07.002505" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:06.996174" elapsed="0.007205">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:06.993998" elapsed="0.009572">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:07.004057" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:07.003685" elapsed="0.000528"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:06.993974" elapsed="0.010297">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:07.005221" elapsed="0.000062"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:07.005544" elapsed="0.000063"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:07.005452" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:07.005412" 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-08-22T23:23:07.006073" elapsed="0.000051"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:07.006242" elapsed="0.000035"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:06.986713" elapsed="0.019778">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:07.006692" elapsed="0.000038"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:06.984146" elapsed="0.022773">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:07.007449" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:07.007106" elapsed="0.000507"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:07.007067" elapsed="0.000607"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:07.008139" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:07.007804" elapsed="0.000467"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:07.007766" elapsed="0.000562"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:06.982748" elapsed="0.025764">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:08.028035" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:08.027520" elapsed="0.000556"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:08.035572" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:08.035298" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:08.036066" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:08.035810" 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-08-22T23:23:08.045220" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:08.045410" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:08.045683" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:08.038559" elapsed="0.007661">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:08.036196" elapsed="0.010143">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:08.046722" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:08.046398" elapsed="0.000433"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:08.036170" elapsed="0.010696">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:08.047422" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:08.047679" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:08.047619" elapsed="0.000124"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:08.047563" 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-08-22T23:23:08.047982" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:08.048081" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:08.030880" elapsed="0.017354">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:08.048331" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:08.028318" elapsed="0.020144">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:08.048831" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:08.048608" elapsed="0.000321"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:08.048553" elapsed="0.000412"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:08.049241" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:08.049044" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:08.049022" elapsed="0.000331"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:08.026974" elapsed="0.022489">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:09.067329" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:09.066839" elapsed="0.000526"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:09.074719" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:09.074441" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:09.075171" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:09.074922" 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-08-22T23:23:09.084336" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:09.084497" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:09.084707" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:09.077639" elapsed="0.007506">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:09.075297" elapsed="0.009937">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:09.085447" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:09.085273" elapsed="0.000242"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:09.075273" elapsed="0.010273">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:09.086142" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:09.086342" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:09.086286" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:09.086260" elapsed="0.000175"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:09.086658" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:09.086761" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:09.070078" elapsed="0.016833">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:09.087011" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:09.067617" elapsed="0.019527">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:09.087458" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:09.087256" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:09.087233" elapsed="0.000338"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:09.087868" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:09.087672" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:09.087650" elapsed="0.000330"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:09.066248" elapsed="0.021843">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:10.106717" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:10.106202" elapsed="0.000553"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:10.114960" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:10.114673" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:10.115522" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:10.115181" 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-08-22T23:23:10.126563" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:10.127003" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:10.127433" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:10.118474" elapsed="0.009818">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:10.115726" elapsed="0.012770">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:10.129120" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:10.128615" elapsed="0.000667"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:10.115692" elapsed="0.013647">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:10.130388" elapsed="0.000065"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:10.130759" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:10.130663" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:10.130615" 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-08-22T23:23:10.131231" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:10.131385" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:10.109738" elapsed="0.021957">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:10.131858" elapsed="0.000036"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:10.107016" elapsed="0.025055">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:10.132570" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:10.132248" elapsed="0.000478"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:10.132209" elapsed="0.000571"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:10.133263" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:10.132947" elapsed="0.000438"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:10.132909" elapsed="0.000528"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:10.105616" elapsed="0.028028">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<msg time="2026-08-22T23:23:10.133865" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:22:59.698408" elapsed="10.435671">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<doc>Check that the created device data make their way into the checker node.</doc>
<status status="FAIL" start="2026-08-22T23:22:59.465215" elapsed="10.669246">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</test>
<test id="s1-s2-t14" name="Check_New_Device_Data_Is_Visible_On_Configurer" line="161">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:23:10.138990" elapsed="0.000282"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:23:10.138721" elapsed="0.000608"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:23:10.140410" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:10.140280" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:10.140261" elapsed="0.000219"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:23:10.145824" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:10.145714" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:10.145695" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:23:10.146921" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:23:10.146502" elapsed="0.000447"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:23:10.147416" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:23:10.147111" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:23:10.147488" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:23:10.147669" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:23:10.146123" elapsed="0.001572"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:23:10.153223" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:10.153109" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:10.153089" 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-08-22T23:23:10.154486" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:10.154377" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:10.154359" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:23:10.155051" 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-08-22T23:23:10.154721" elapsed="0.000357"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:23:10.155474" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:23:10.155239" elapsed="0.000260"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:23:10.188896" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:23:10.156014" elapsed="0.032992"/>
</kw>
<msg time="2026-08-22T23:23:10.189202" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:23:10.189248" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:10.155679" elapsed="0.033607"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:23:10.211262" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:23:10.189825" elapsed="0.021549"/>
</kw>
<msg time="2026-08-22T23:23:10.211546" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:23:10.211614" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:10.189455" elapsed="0.022199"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:10.211955" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:10.211731" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:10.211712" elapsed="0.000322"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:10.212482" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:10.212178" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:10.212900" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:10.212642" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:10.212623" elapsed="0.000360"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:23:10.213016" 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-08-22T23:23:10.215800" elapsed="0.000279"/>
</kw>
<msg time="2026-08-22T23:23:10.216180" 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-08-22T23:23:10.214559" elapsed="0.001769"/>
</kw>
<kw name="Open 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-08-22T23:23:10.216657" elapsed="0.000093"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:10.217056" 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-08-22T23:23:10.213870" elapsed="0.003403"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:23:10.213304" elapsed="0.004037"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:23:10.154074" elapsed="0.063366"/>
</kw>
<msg time="2026-08-22T23:23:10.217532" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:23:10.217598" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:10.153443" elapsed="0.064195"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:23:10.217823" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:23:10.217715" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:10.217697" 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-08-22T23:23:10.218304" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:10.218680" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:23:10.218753" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:23:10.152735" elapsed="0.066126"/>
</kw>
<msg time="2026-08-22T23:23:10.218955" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:23:10.218998" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:10.148091" elapsed="0.070944"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:10.219357" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:10.219110" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:10.219093" elapsed="0.000342"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:23:10.147947" elapsed="0.071511"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:23:10.225051" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:10.224942" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:10.224922" 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-08-22T23:23:10.226272" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:10.226163" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:10.226144" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:23:10.226885" 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-08-22T23:23:10.226481" elapsed="0.000432"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:23:10.227291" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:23:10.227069" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:23:10.260756" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:23:10.227825" elapsed="0.033073"/>
</kw>
<msg time="2026-08-22T23:23:10.261073" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:23:10.261123" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:10.227474" elapsed="0.033686"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:23:10.284576" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:23:10.261692" elapsed="0.023407"/>
</kw>
<msg time="2026-08-22T23:23:10.285402" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:23:10.285453" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:10.261330" elapsed="0.024163"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:10.286038" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:10.285654" elapsed="0.000452"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:10.285608" elapsed="0.000527"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:10.286753" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:10.286285" elapsed="0.000545"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:10.287120" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:10.286900" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:10.286881" elapsed="0.000318"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:23:10.287240" 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-08-22T23:23:10.290569" elapsed="0.000228"/>
</kw>
<msg time="2026-08-22T23:23:10.290865" 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-08-22T23:23:10.289016" elapsed="0.002014"/>
</kw>
<kw name="Open 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-08-22T23:23:10.291651" elapsed="0.000092"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:10.292169" 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-08-22T23:23:10.288224" elapsed="0.004166"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:23:10.287611" elapsed="0.004850"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:23:10.225857" elapsed="0.066707"/>
</kw>
<msg time="2026-08-22T23:23:10.292749" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:23:10.292795" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:10.225273" elapsed="0.067593"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:23:10.293062" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:23:10.292949" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:10.292930" 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-08-22T23:23:10.293651" 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-08-22T23:23:10.293998" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:23:10.294071" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:23:10.224561" elapsed="0.069621"/>
</kw>
<msg time="2026-08-22T23:23:10.294279" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:23:10.294324" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:10.219865" elapsed="0.074497"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:10.294747" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:10.294438" elapsed="0.000365"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:10.294421" elapsed="0.000406"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:23:10.219726" elapsed="0.075125"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:23:10.300444" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:10.300333" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:10.300314" 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-08-22T23:23:10.301809" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:10.301697" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:10.301678" elapsed="0.000200"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:23:10.302357" 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-08-22T23:23:10.302025" elapsed="0.000359"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:23:10.302793" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:23:10.302543" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:23:10.336163" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:23:10.303314" elapsed="0.033062"/>
</kw>
<msg time="2026-08-22T23:23:10.336689" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:23:10.336759" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:10.302978" elapsed="0.033847"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:23:10.365758" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:23:10.337783" elapsed="0.028095"/>
</kw>
<msg time="2026-08-22T23:23:10.366052" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:23:10.366099" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:10.337158" elapsed="0.028979"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:10.366465" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:10.366228" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:10.366200" elapsed="0.000347"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:10.367026" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:10.366715" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:10.367385" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:10.367170" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:10.367151" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:23:10.367500" 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-08-22T23:23:10.370378" elapsed="0.000149"/>
</kw>
<msg time="2026-08-22T23:23:10.370618" 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-08-22T23:23:10.369154" elapsed="0.001619"/>
</kw>
<kw name="Open 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-08-22T23:23:10.371076" elapsed="0.000091"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:10.371449" elapsed="0.000087"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:23:10.368367" 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-08-22T23:23:10.367819" elapsed="0.003937"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:23:10.301366" elapsed="0.070492"/>
</kw>
<msg time="2026-08-22T23:23:10.371958" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:23:10.372003" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:10.300752" elapsed="0.071291"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:23:10.372229" elapsed="0.000304"/>
</return>
<status status="PASS" start="2026-08-22T23:23:10.372122" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:10.372103" elapsed="0.000563"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:10.373128" 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-08-22T23:23:10.373468" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:23:10.373541" 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-08-22T23:23:10.299960" elapsed="0.073851"/>
</kw>
<msg time="2026-08-22T23:23:10.373908" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:23:10.373953" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:10.295134" elapsed="0.078856"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:10.374315" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:10.374066" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:10.374049" elapsed="0.000343"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:23:10.294992" elapsed="0.079424"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:23:10.147757" elapsed="0.226691"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:23:10.145330" elapsed="0.229178"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:23:10.139971" elapsed="0.234593"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:10.139491" elapsed="0.235139"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:23:10.136173" elapsed="0.238511"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:10.387218" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:10.386827" elapsed="0.000419"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:10.397173" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:10.396511" elapsed="0.000769"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:10.398198" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:10.397648" elapsed="0.000649"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:23:10.447493" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:10.447828" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:23:10.448052" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:23:10.403093" elapsed="0.045016"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:10.398444" elapsed="0.049758"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:10.448636" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:10.448260" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:10.398404" elapsed="0.050454"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:10.455752" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:10.451148" elapsed="0.004674"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:10.450654" elapsed="0.005217"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:10.450611" elapsed="0.005294"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:10.459575" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:10.456352" elapsed="0.003307"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:10.456036" elapsed="0.003671"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:10.456010" elapsed="0.003732"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:23:10.460538" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:10.459972" 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-08-22T23:23:10.461044" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:10.460697" elapsed="0.000428"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:10.461827" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:10.461383" elapsed="0.000482"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:10.461160" elapsed="0.000755"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:10.460671" elapsed="0.001274"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:23:10.462740" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:10.462164" 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-08-22T23:23:10.463211" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:10.462881" elapsed="0.000409"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:10.463978" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:10.463542" elapsed="0.000472"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:10.463324" elapsed="0.000740"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:10.462855" 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-08-22T23:23:10.464301" elapsed="0.000533"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:23:10.465489" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:10.465067" 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-08-22T23:23:10.465775" elapsed="0.002293"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:23:10.449676" elapsed="0.018454"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:23:10.468307" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:23:10.468200" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:10.468182" 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-08-22T23:23:10.468536" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:10.468623" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:23:10.471050" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:23:10.390054" elapsed="0.081025"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:23:10.471140" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:23:10.471291" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:23:10.387461" elapsed="0.083856"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:23:10.471968" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:23:10.471611" elapsed="0.000428">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:10.471387" elapsed="0.000721">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:23:10.471370" elapsed="0.000773">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:10.472399" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:10.472250" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:10.472231" elapsed="0.000251"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:10.386411" elapsed="0.086154">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:11.491395" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:11.490922" elapsed="0.000507"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:11.499299" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:11.498994" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:11.499784" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:11.499514" 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-08-22T23:23:11.529844" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:11.530164" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:23:11.530420" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:23:11.502066" elapsed="0.028413"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:11.499908" elapsed="0.030748"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:11.531118" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:11.530728" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:11.499884" elapsed="0.031430"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:11.537653" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:11.533826" elapsed="0.003912"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:11.533373" elapsed="0.004422"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:11.533328" elapsed="0.004508"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:11.541831" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:11.538275" elapsed="0.003633"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:11.537927" elapsed="0.004036"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:11.537901" elapsed="0.004101"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:23:11.543041" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:11.542282" elapsed="0.000800"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:11.543541" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:11.543190" elapsed="0.000438"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:11.544121" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:11.543817" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:11.543654" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:11.543162" elapsed="0.001043"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:23:11.544809" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:11.544362" 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-08-22T23:23:11.545180" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:11.544923" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:11.545732" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:11.545417" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:11.545262" elapsed="0.000671"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:11.544902" elapsed="0.001056"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:23:11.546120" elapsed="0.000361"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:23:11.546961" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:11.546663" 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-08-22T23:23:11.547144" 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-08-22T23:23:11.532198" elapsed="0.017440"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:23:11.549832" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:23:11.549716" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:11.549695" 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-08-22T23:23:11.550083" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:11.550155" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:23:11.552621" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:23:11.494278" elapsed="0.058383"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:23:11.552963" elapsed="0.000046"/>
</return>
<msg time="2026-08-22T23:23:11.553178" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:23:11.491694" elapsed="0.061518"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:23:11.554029" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:23:11.553557" elapsed="0.000562">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:11.553305" elapsed="0.000893">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:23:11.553283" elapsed="0.000952">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:11.554469" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:11.554311" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:11.554294" elapsed="0.000257"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:11.490329" elapsed="0.064335">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:12.572452" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:12.571950" elapsed="0.000540"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:12.579949" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:12.579665" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:12.580446" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:12.580168" 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-08-22T23:23:12.603399" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:12.603860" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:23:12.604125" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:23:12.582754" elapsed="0.021431"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:12.580574" elapsed="0.023722"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:12.605004" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:12.604363" elapsed="0.000797"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:12.580550" elapsed="0.024659"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:12.612092" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:12.607744" elapsed="0.004424"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:12.607199" elapsed="0.005022"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:12.607155" elapsed="0.005104"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:12.616197" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:12.612740" elapsed="0.003527"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:12.612344" elapsed="0.003975"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:12.612319" elapsed="0.004036"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:23:12.617235" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:12.616634" 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-08-22T23:23:12.617752" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:12.617380" elapsed="0.000460"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:12.618562" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:12.618111" elapsed="0.000512"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:12.617876" elapsed="0.000802"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:12.617353" elapsed="0.001356"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:23:12.619478" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:12.618939" 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-08-22T23:23:12.619989" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:12.619645" elapsed="0.000429"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:12.620815" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:12.620423" elapsed="0.000420"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:12.620185" elapsed="0.000695"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:12.619617" 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-08-22T23:23:12.621054" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:23:12.621888" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:12.621569" 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-08-22T23:23:12.622066" 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-08-22T23:23:12.606130" elapsed="0.018441"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:23:12.624782" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:23:12.624656" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:12.624637" 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-08-22T23:23:12.625024" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:12.625095" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:23:12.627430" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:23:12.575214" elapsed="0.052247"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:23:12.627599" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:23:12.627762" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:23:12.572763" elapsed="0.055026"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:23:12.628466" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:23:12.628077" elapsed="0.000470">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:12.627860" elapsed="0.000777">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:23:12.627842" elapsed="0.000872">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:12.628951" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:12.628800" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:12.628782" elapsed="0.000249"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:12.571366" elapsed="0.057752">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:13.647287" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:13.646807" elapsed="0.000516"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:13.654618" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:13.654336" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:13.655065" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:13.654819" 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-08-22T23:23:13.676532" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:13.676716" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:23:13.676816" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:23:13.657543" elapsed="0.019299"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:13.655187" elapsed="0.021697"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:13.677063" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:13.676911" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:13.655163" elapsed="0.021985"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:13.682354" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:13.678166" elapsed="0.004239"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:13.677946" elapsed="0.004494"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:13.677928" elapsed="0.004537"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:13.685094" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:13.682763" elapsed="0.002378"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:13.682523" elapsed="0.002652"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:13.682505" elapsed="0.002695"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:23:13.685784" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:13.685369" 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-08-22T23:23:13.686177" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:13.685939" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:13.686741" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:13.686419" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:13.686259" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:13.685920" elapsed="0.000907"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:23:13.687346" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:13.686983" 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-08-22T23:23:13.687688" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:13.687442" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:13.688219" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:13.687925" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:13.687769" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:13.687424" 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-08-22T23:23:13.688449" elapsed="0.000396"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:23:13.689300" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:13.689004" 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-08-22T23:23:13.689475" elapsed="0.002409"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:23:13.677507" elapsed="0.014440"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:23:13.692124" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:23:13.692016" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:13.691997" 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-08-22T23:23:13.692368" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:13.692438" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:23:13.694808" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:23:13.649999" elapsed="0.044838"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:23:13.694897" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:23:13.695049" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:23:13.647558" elapsed="0.047518"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:23:13.695724" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:23:13.695350" elapsed="0.000452">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:13.695145" elapsed="0.000728">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:23:13.695128" elapsed="0.000780">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:13.696121" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:13.695977" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:13.695961" elapsed="0.000240"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:13.646232" elapsed="0.050052">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:14.713784" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:14.713318" elapsed="0.000501"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:14.721308" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:14.721048" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:14.721777" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:14.721509" 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-08-22T23:23:14.743229" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:14.743518" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:23:14.743776" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:23:14.723962" elapsed="0.019873"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:14.721898" elapsed="0.022034"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:14.744332" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:14.743992" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:14.721876" elapsed="0.022687"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:14.752451" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:14.746930" elapsed="0.005720"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:14.746401" elapsed="0.006333"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:14.746361" elapsed="0.006431"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:14.756868" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:14.753418" elapsed="0.003516"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:14.752920" elapsed="0.004063"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:14.752883" elapsed="0.004136"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:23:14.757830" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:14.757260" 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-08-22T23:23:14.758299" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:14.757969" elapsed="0.000410"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:14.759081" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:14.758658" elapsed="0.000462"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:14.758414" elapsed="0.000757"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:14.757943" elapsed="0.001259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:23:14.760089" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:14.759421" elapsed="0.000706"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:14.760571" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:14.760227" elapsed="0.000458"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:14.761382" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:14.760968" elapsed="0.000451"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:14.760728" elapsed="0.000741"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:14.760202" 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-08-22T23:23:14.761733" elapsed="0.000491"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:23:14.762879" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:14.762451" 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-08-22T23:23:14.763231" elapsed="0.003164"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:23:14.745413" elapsed="0.021047"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:23:14.766656" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:23:14.766530" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:14.766511" 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-08-22T23:23:14.766903" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:14.766975" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:23:14.769444" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:23:14.716466" elapsed="0.053008"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:23:14.769535" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:23:14.769707" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:23:14.714046" elapsed="0.055688"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:23:14.770375" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:23:14.770012" elapsed="0.000443">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:14.769805" elapsed="0.000722">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:23:14.769788" elapsed="0.000775">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:14.770803" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:14.770650" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:14.770633" elapsed="0.000251"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:14.712817" elapsed="0.058149">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:15.789338" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:15.788848" elapsed="0.000525"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:15.796725" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:15.796439" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:15.797177" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:15.796930" 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-08-22T23:23:15.819742" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:15.819938" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:23:15.820041" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:23:15.799399" elapsed="0.020672"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:15.797301" elapsed="0.022887"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:15.820381" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:15.820219" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:15.797277" elapsed="0.023233"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:15.824020" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:15.821553" elapsed="0.002517"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:15.821330" elapsed="0.002776"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:15.821311" elapsed="0.002821"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:15.826822" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:15.824426" elapsed="0.002443"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:15.824189" elapsed="0.002716"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:15.824173" elapsed="0.002757"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:23:15.827507" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:15.827106" 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-08-22T23:23:15.827870" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:15.827626" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:15.828444" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:15.828113" elapsed="0.000361"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:15.827953" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:15.827608" elapsed="0.000926"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:23:15.829081" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:15.828710" 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-08-22T23:23:15.829413" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:15.829180" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:15.829977" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:15.829681" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:15.829496" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:15.829162" 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-08-22T23:23:15.830214" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:23:15.831042" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:15.830741" 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-08-22T23:23:15.831219" 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-08-22T23:23:15.820901" elapsed="0.012904"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:23:15.833986" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:23:15.833876" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:15.833858" 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-08-22T23:23:15.834327" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:15.834401" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:23:15.836844" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:23:15.792063" elapsed="0.044810"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:23:15.836934" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:23:15.837094" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:23:15.789626" elapsed="0.047495"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:23:15.837829" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:23:15.837403" elapsed="0.000511">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:15.837192" elapsed="0.000798">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:23:15.837175" elapsed="0.000850">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:15.838242" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:15.838096" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:15.838079" elapsed="0.000244"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:15.788208" elapsed="0.050200">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:16.857837" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:16.857347" elapsed="0.000526"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:16.865169" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:16.864907" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:16.865642" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:16.865374" 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-08-22T23:23:16.886068" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:16.886214" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:23:16.886314" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:23:16.867851" elapsed="0.018490"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:16.865767" elapsed="0.020619"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:16.886569" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:16.886414" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:16.865744" elapsed="0.020938"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:16.894946" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:16.888989" elapsed="0.006070"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:16.888465" elapsed="0.006675"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:16.888424" elapsed="0.006774"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:16.898722" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:16.895864" elapsed="0.002907"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:16.895327" elapsed="0.003480"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:16.895288" elapsed="0.003545"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:23:16.899408" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:16.899009" 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-08-22T23:23:16.899766" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:16.899509" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:16.900331" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:16.900013" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:16.899850" elapsed="0.000618"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:16.899491" elapsed="0.001001"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:23:16.901047" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:16.900668" 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-08-22T23:23:16.901382" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:16.901147" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:16.901944" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:16.901643" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:16.901467" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:16.901128" 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-08-22T23:23:16.902184" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:23:16.903013" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:16.902718" 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-08-22T23:23:16.903194" elapsed="0.002371"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:23:16.887451" elapsed="0.018193"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:23:16.905827" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:23:16.905715" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:16.905696" 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-08-22T23:23:16.906067" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:16.906140" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:23:16.908631" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:23:16.860554" elapsed="0.048108"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:23:16.908723" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:23:16.908879" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:23:16.858111" elapsed="0.050796"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:23:16.909547" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:23:16.909187" elapsed="0.000455">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:16.908978" elapsed="0.000735">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:23:16.908961" elapsed="0.000787">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:16.909967" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:16.909819" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:16.909802" elapsed="0.000245"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:16.856805" elapsed="0.053324">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:17.929104" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:17.928562" elapsed="0.000581"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:17.936880" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:17.936611" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:17.937334" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:17.937084" 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-08-22T23:23:17.960764" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:17.961083" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:23:17.961310" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:23:17.939570" elapsed="0.021798"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:17.937473" elapsed="0.023994"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:17.961960" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:17.961535" elapsed="0.000584"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:17.937436" elapsed="0.024733"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:17.968373" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:17.964631" elapsed="0.003812"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:17.964034" elapsed="0.004459"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:17.963992" elapsed="0.004536"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:17.972176" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:17.968946" elapsed="0.003336"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:17.968631" elapsed="0.003702"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:17.968605" elapsed="0.003762"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:23:17.973177" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:17.972636" 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-08-22T23:23:17.973510" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:17.973275" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:17.974072" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:17.973772" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:17.973611" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:17.973257" elapsed="0.000899"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:23:17.974687" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:17.974311" 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-08-22T23:23:17.975010" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:17.974782" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:17.975539" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:17.975246" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:17.975091" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:17.974765" 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-08-22T23:23:17.975813" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:23:17.976844" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:17.976338" 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-08-22T23:23:17.977029" elapsed="0.002314"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:23:17.963054" elapsed="0.016355"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:23:17.979665" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:23:17.979534" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:17.979514" 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-08-22T23:23:17.979919" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:17.979991" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:23:17.982329" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:23:17.931992" elapsed="0.050367"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:23:17.982420" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:23:17.982573" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:23:17.929512" elapsed="0.053106"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:23:17.983269" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:23:17.982897" elapsed="0.000455">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:17.982689" elapsed="0.000736">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:23:17.982672" elapsed="0.000787">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:17.983690" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:17.983529" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:17.983512" elapsed="0.000259"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:17.927915" elapsed="0.055939">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:19.002622" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:19.002131" elapsed="0.000527"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:19.009873" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:19.009611" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:19.010327" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:19.010076" 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-08-22T23:23:19.040847" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:19.041055" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:23:19.041206" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:23:19.012539" elapsed="0.028705"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:19.010453" elapsed="0.030856"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:19.041609" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:19.041351" elapsed="0.000435"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:19.010426" elapsed="0.031396"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:19.046754" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:19.043327" elapsed="0.003495"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:19.043007" elapsed="0.003866"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:19.042979" elapsed="0.003928"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:19.050365" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:19.047292" elapsed="0.003119"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:19.046985" elapsed="0.003460"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:19.046961" elapsed="0.003509"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:23:19.051082" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:19.050666" 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-08-22T23:23:19.051415" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:19.051181" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:19.051978" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:19.051672" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:19.051496" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:19.051163" elapsed="0.000918"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:23:19.052614" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:19.052236" 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-08-22T23:23:19.052939" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:19.052711" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:19.053470" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:19.053174" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:19.053019" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:19.052693" elapsed="0.000858"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:23:19.053718" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:23:19.054534" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:19.054227" 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-08-22T23:23:19.054732" elapsed="0.002693"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:23:19.042362" elapsed="0.015144"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:23:19.057711" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-08-22T23:23:19.057591" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:19.057559" 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-08-22T23:23:19.057979" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:19.058051" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:23:19.060465" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:23:19.005323" elapsed="0.055171"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:23:19.060555" elapsed="0.000042"/>
</return>
<msg time="2026-08-22T23:23:19.060733" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:23:19.002894" elapsed="0.057865"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:23:19.061405" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:23:19.061041" elapsed="0.000443">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:19.060834" elapsed="0.000790">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:23:19.060817" elapsed="0.000845">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:19.061881" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:19.061734" elapsed="0.000250"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:19.061716" elapsed="0.000294"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:19.001573" elapsed="0.060523">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:20.082781" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:20.082283" elapsed="0.000534"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:20.090189" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:20.089930" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:20.090650" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:20.090389" 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-08-22T23:23:20.114834" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:20.114990" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:23:20.115089" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:23:20.092848" elapsed="0.022266"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:20.090776" elapsed="0.024381"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:20.115338" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:20.115186" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:20.090752" elapsed="0.024673"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:20.119033" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:20.116458" elapsed="0.002625"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:20.116239" elapsed="0.002880"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:20.116220" elapsed="0.002924"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:20.121797" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:20.119418" elapsed="0.002427"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:20.119200" elapsed="0.002680"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:20.119183" elapsed="0.002723"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:23:20.122476" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:20.122080" 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-08-22T23:23:20.122830" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:20.122591" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:20.123602" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:20.123160" elapsed="0.000483"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:20.122937" elapsed="0.000757"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:20.122556" elapsed="0.001168"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:23:20.124478" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:20.123972" 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-08-22T23:23:20.125038" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:20.124642" elapsed="0.000478"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:20.125830" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:20.125375" elapsed="0.000491"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:20.125155" elapsed="0.000762"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:20.124616" elapsed="0.001332"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:23:20.126156" elapsed="0.000505"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:23:20.127293" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:20.126886" 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-08-22T23:23:20.127541" elapsed="0.003282"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:23:20.115799" elapsed="0.015114"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:23:20.131163" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-08-22T23:23:20.131011" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:20.130985" 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-08-22T23:23:20.131497" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:20.131617" elapsed="0.000022"/>
</return>
<msg time="2026-08-22T23:23:20.134285" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:23:20.085503" elapsed="0.048811"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:23:20.134373" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:23:20.134523" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:23:20.083054" elapsed="0.051495"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:23:20.135204" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:23:20.134842" elapsed="0.000440">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:20.134635" elapsed="0.000718">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:23:20.134618" elapsed="0.000769">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:20.135617" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:20.135457" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:20.135440" elapsed="0.000257"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:20.081741" elapsed="0.054040">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.154209" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:21.153735" elapsed="0.000509"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.161714" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:21.161440" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.162157" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:21.161912" 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-08-22T23:23:21.183647" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:21.183838" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:23:21.183941" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:23:21.164429" elapsed="0.019537"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:21.162354" elapsed="0.021656"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.184192" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.184038" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.162328" elapsed="0.021951"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.187693" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:21.185307" elapsed="0.002435"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:21.185089" elapsed="0.002689"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.185070" elapsed="0.002747"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.190429" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:21.188099" elapsed="0.002377"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:21.187877" elapsed="0.002634"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.187858" elapsed="0.002678"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.191130" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:21.190729" 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-08-22T23:23:21.191463" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.191229" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.192053" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:21.191724" elapsed="0.000357"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:21.191545" elapsed="0.000573"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.191211" elapsed="0.000928"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.192676" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:21.192294" 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-08-22T23:23:21.193000" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.192772" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.193533" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:21.193237" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:21.193082" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.192754" 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-08-22T23:23:21.193783" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:23:21.194603" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:21.194292" 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-08-22T23:23:21.194891" elapsed="0.002316"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:23:21.184663" elapsed="0.012608"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:23:21.197450" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:23:21.197341" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.197323" 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-08-22T23:23:21.197706" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.197815" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:23:21.200160" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:23:21.156897" elapsed="0.043293"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:23:21.200250" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:23:21.200401" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:23:21.154478" elapsed="0.045950"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.201094" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:23:21.200722" elapsed="0.000456">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:21.200498" elapsed="0.000754">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:23:21.200481" elapsed="0.000807">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.201503" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.201357" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:21.201341" elapsed="0.000258"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:21.153183" elapsed="0.048502">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<msg time="2026-08-22T23:23:21.201779" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:23:10.374852" elapsed="10.827029">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<doc>Check that the created device data make their way into the configurer node.</doc>
<status status="FAIL" start="2026-08-22T23:23:10.135328" elapsed="11.066724">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</test>
<test id="s1-s2-t15" name="Modify_Device_Data" 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-08-22T23:23:21.205677" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:23:21.205391" 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-08-22T23:23:21.206934" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:21.206820" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.206801" 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-08-22T23:23:21.211974" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:21.211868" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.211850" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.213030" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:23:21.212650" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.213517" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:23:21.213214" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:23:21.213603" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:23:21.213759" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:23:21.212262" elapsed="0.001522"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.219273" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:21.219165" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.219147" 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-08-22T23:23:21.220532" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:21.220425" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.220407" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:23:21.221091" 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-08-22T23:23:21.220771" elapsed="0.000347"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:23:21.221512" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:23:21.221276" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:23:21.253129" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:23:21.222043" elapsed="0.031197"/>
</kw>
<msg time="2026-08-22T23:23:21.253438" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:23:21.253485" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.221711" elapsed="0.031811"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:23:21.269227" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:23:21.254209" elapsed="0.015118"/>
</kw>
<msg time="2026-08-22T23:23:21.269497" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:23:21.269542" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m        ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.253716" elapsed="0.015885"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.269916" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.269684" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.269663" elapsed="0.000334"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.270446" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:21.270138" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.270809" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.270575" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.270557" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:23:21.270922" 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-08-22T23:23:21.274199" elapsed="0.000147"/>
</kw>
<msg time="2026-08-22T23:23:21.274410" 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-08-22T23:23:21.272781" elapsed="0.001788"/>
</kw>
<kw name="Open 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-08-22T23:23:21.274893" elapsed="0.000091"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.275271" 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-08-22T23:23:21.271746" elapsed="0.003739"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:23:21.271191" elapsed="0.004361"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:23:21.220125" elapsed="0.055549"/>
</kw>
<msg time="2026-08-22T23:23:21.275767" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:23:21.275841" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m        ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.219488" elapsed="0.056392"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:23:21.276102" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:23:21.275995" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.275976" 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-08-22T23:23:21.276747" 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-08-22T23:23:21.277086" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.277157" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:23:21.218831" elapsed="0.058442"/>
</kw>
<msg time="2026-08-22T23:23:21.277366" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:23:21.277410" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m        ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.214203" elapsed="0.063245"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.277785" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.277523" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.277506" elapsed="0.000357"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:23:21.214063" elapsed="0.063823"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.283185" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:21.283078" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.283059" 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-08-22T23:23:21.284414" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:21.284308" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.284290" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:23:21.284957" 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-08-22T23:23:21.284647" elapsed="0.000337"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:23:21.285356" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:23:21.285138" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:23:21.315533" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:23:21.285884" elapsed="0.029786"/>
</kw>
<msg time="2026-08-22T23:23:21.315872" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:23:21.315919" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.285536" elapsed="0.030419"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:23:21.330043" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:23:21.318314" elapsed="0.011831"/>
</kw>
<msg time="2026-08-22T23:23:21.330317" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:23:21.330362" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m        ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.316121" elapsed="0.014279"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.330723" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.330478" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.330458" elapsed="0.000344"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.331245" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:21.330939" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.331601" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.331373" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.331355" elapsed="0.000365"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:23:21.331753" 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">
<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-08-22T23:23:21.334477" elapsed="0.000169"/>
</kw>
<msg time="2026-08-22T23:23:21.334711" 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-08-22T23:23:21.333282" 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-08-22T23:23:21.335149" elapsed="0.000088"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.335516" 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-08-22T23:23:21.332599" elapsed="0.003148"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:23:21.332044" elapsed="0.003800"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:23:21.284007" elapsed="0.051935"/>
</kw>
<msg time="2026-08-22T23:23:21.336034" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:23:21.336077" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m        ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.283398" elapsed="0.052717"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:23:21.336296" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:23:21.336191" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.336173" elapsed="0.000204"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.336789" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.337123" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.337193" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:23:21.282736" elapsed="0.054563"/>
</kw>
<msg time="2026-08-22T23:23:21.337392" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:23:21.337435" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m        ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.278145" elapsed="0.059329"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.337966" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.337548" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.337531" elapsed="0.000513"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:23:21.278010" elapsed="0.060057"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.343425" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:21.343317" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.343298" 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-08-22T23:23:21.344670" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:21.344540" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.344522" elapsed="0.000216"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:23:21.345196" 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-08-22T23:23:21.344879" elapsed="0.000343"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:23:21.345617" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:23:21.345379" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:23:21.376968" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:23:21.346133" elapsed="0.030954"/>
</kw>
<msg time="2026-08-22T23:23:21.377348" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:23:21.377396" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.345803" elapsed="0.031630"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:23:21.392556" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:23:21.377974" elapsed="0.014741"/>
</kw>
<msg time="2026-08-22T23:23:21.392915" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:23:21.392963" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m        ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.377626" elapsed="0.015375"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.393373" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.393101" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.393071" elapsed="0.000387"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.394009" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:21.393628" 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-08-22T23:23:21.394668" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.394432" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.394125" elapsed="0.000624"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:23:21.394785" 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-08-22T23:23:21.397841" elapsed="0.000150"/>
</kw>
<msg time="2026-08-22T23:23:21.398055" 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-08-22T23:23:21.396388" elapsed="0.001817"/>
</kw>
<kw name="Open 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-08-22T23:23:21.398508" elapsed="0.000110"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.398904" 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-08-22T23:23:21.395671" elapsed="0.003443"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:23:21.395090" elapsed="0.004091"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:23:21.344242" elapsed="0.055036"/>
</kw>
<msg time="2026-08-22T23:23:21.399369" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:23:21.399412" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m        ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.343658" elapsed="0.055794"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:23:21.399655" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:23:21.399527" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.399509" elapsed="0.000229"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.400193" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.400533" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.400771" 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-08-22T23:23:21.342976" elapsed="0.057908"/>
</kw>
<msg time="2026-08-22T23:23:21.401016" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:23:21.401081" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m        ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.338329" elapsed="0.062807"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.401674" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.401295" elapsed="0.000456"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.401216" elapsed="0.000568"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:23:21.338193" elapsed="0.063623"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:23:21.213874" elapsed="0.187985"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:23:21.211482" elapsed="0.190459"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:23:21.206516" elapsed="0.195500"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.206093" elapsed="0.195986"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:23:21.203050" elapsed="0.199102"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.403065" level="INFO">${template_as_string} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${template_as_string}</var>
<arg>DEVICE_NAME=${device_name}</arg>
<arg>RESTCONF_ROOT=${RESTCONF_ROOT}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:23:21.402427" elapsed="0.000675"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.439714" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:21.439315" elapsed="0.000429"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:23:21.440556" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:23:21.440254" elapsed="0.000405">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:23:21.440755" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:23:21.439920" elapsed="0.000860"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.441328" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:23:21.440943" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:23:21.441671" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:23:21.441842" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:23:21.441515" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.442270" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:21.442022" 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-08-22T23:23:21.443282" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:21.443026" elapsed="0.000301"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.443792" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:23:21.443482" elapsed="0.000338"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.444485" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:23:21.444185" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:23:21.445256" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:23:21.445028" elapsed="0.000253"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:23:21.445332" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:23:21.445489" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:23:21.444712" elapsed="0.000801"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:23:21.445680" elapsed="0.000244"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:23:21.444052" elapsed="0.001913"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.446562" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:23:21.446263" elapsed="0.000341"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:23:21.447323" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:23:21.447109" elapsed="0.000239"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:23:21.447398" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:23:21.447547" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:23:21.446789" elapsed="0.000783"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:23:21.447737" elapsed="0.000253"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:23:21.446132" elapsed="0.001899"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:23:21.443874" elapsed="0.004191"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:23:21.448109" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:23:21.448266" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:23:21.442704" elapsed="0.005587"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:21.442385" elapsed="0.005938"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.448496" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.448349" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.442365" elapsed="0.006206"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.449332" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:21.448733" elapsed="0.000626"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:23:21.449408" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:23:21.438702" elapsed="0.010831"/>
</kw>
<msg time="2026-08-22T23:23:21.449603" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:23:21.425832" elapsed="0.023820"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.462269" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.474803" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.487325" elapsed="0.000038"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.487573" 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-08-22T23:23:21.487801" 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-08-22T23:23:21.488324" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.488172" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:21.488153" 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-08-22T23:23:21.488554" 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-08-22T23:23:21.488742" 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-08-22T23:23:21.488909" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:23:21.488114" elapsed="0.000849"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.487978" 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-08-22T23:23:21.489139" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.489220" elapsed="0.000019"/>
</return>
<msg time="2026-08-22T23:23:21.489387" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:23:21.421551" elapsed="0.067865"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.516574" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:21.516140" elapsed="0.000486"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:23:21.517433" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:23:21.517150" elapsed="0.000367">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:23:21.517628" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:23:21.516801" elapsed="0.000852"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.518199" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:23:21.517816" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:23:21.518528" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:23:21.518753" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:23:21.518385" elapsed="0.000396"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.519183" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:21.518935" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:23:21.519670" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.519310" elapsed="0.000419"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.520230" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:21.519933" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:21.519781" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.519286" elapsed="0.001028"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.520944" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:23:21.520460" elapsed="0.000512"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:23:21.521025" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:23:21.515412" elapsed="0.005752"/>
</kw>
<msg time="2026-08-22T23:23:21.521294" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:23:21.502354" elapsed="0.018992"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.533932" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.546359" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.558601" 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-08-22T23:23:21.558829" 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-08-22T23:23:21.559015" 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-08-22T23:23:21.559449" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.559297" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:21.559279" 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-08-22T23:23:21.559697" 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-08-22T23:23:21.559907" 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-08-22T23:23:21.560072" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:23:21.559236" elapsed="0.000889"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.559102" 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-08-22T23:23:21.560305" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.560386" elapsed="0.000020"/>
</return>
<msg time="2026-08-22T23:23:21.560558" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:23:21.499622" elapsed="0.060985"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:23:21.562070" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:23:21.561755" elapsed="0.000497">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:23:21.562351" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:23:21.561312" elapsed="0.001065"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.562730" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.562448" elapsed="0.000339"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.563288" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:21.562989" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:23:21.562812" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.562429" elapsed="0.000943"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.565733" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:23:21.563521" elapsed="0.002238"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:23:21.565812" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:23:21.565971" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:23:21.560946" elapsed="0.005051"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.567395" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:21.567140" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.567860" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:21.567608" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.568301" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:21.568054" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.568755" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:21.568491" elapsed="0.000308"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:23:21.569615" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:23:21.569397" elapsed="0.000246"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:23:21.569984" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:23:21.569802" 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-08-22T23:23:21.570157" elapsed="0.000208"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.570783" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:21.570516" elapsed="0.000312"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:23:21.570871" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:23:21.571025" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:23:21.568999" elapsed="0.002052"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:23:21.581622" level="INFO">PUT Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Content-Length': '81', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:23:21.581806" level="INFO">PUT Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:21.581966" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:21.573396" elapsed="0.009127">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:21.571120" elapsed="0.011596">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</branch>
<branch type="ELSE">
<kw name="PUT 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 PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.582986" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.582767" elapsed="0.000316"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:21.571103" elapsed="0.012014">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.583660" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.583866" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:21.583813" elapsed="0.000112"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:21.583788" elapsed="0.000168"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.584153" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.584248" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:21.566328" elapsed="0.018063">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.584493" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:21.409768" elapsed="0.174878">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.585049" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.584799" elapsed="0.000345"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:21.584776" elapsed="0.000401"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.585223" elapsed="0.000019"/>
</return>
<arg>${directory_with_template_folders}${/}datamod1</arg>
<arg>${template_as_string}</arg>
<arg>session=${NODE_SETTER}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:23:21.403454" elapsed="0.181901">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<doc>Send a request to change the sample test data and check that the request went OK.</doc>
<status status="FAIL" start="2026-08-22T23:23:21.202473" elapsed="0.383097">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</test>
<test id="s1-s2-t16" name="Check_Device_Data_Is_Modified" line="180">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:23:21.590045" elapsed="0.000298"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:23:21.589680" elapsed="0.000739"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.591859" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:21.591657" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.591631" elapsed="0.000324"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.597066" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:21.596961" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.596944" elapsed="0.000189"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.598127" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:23:21.597744" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.598637" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:23:21.598311" elapsed="0.000353"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:23:21.598710" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:23:21.598914" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:23:21.597354" 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-08-22T23:23:21.604665" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:21.604539" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.604520" 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-08-22T23:23:21.605931" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:21.605824" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.605806" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:23:21.606463" 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-08-22T23:23:21.606143" elapsed="0.000347"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:23:21.606903" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:23:21.606666" elapsed="0.000263"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:23:21.638775" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:23:21.607418" elapsed="0.031524"/>
</kw>
<msg time="2026-08-22T23:23:21.639149" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:23:21.639196" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.607087" elapsed="0.032146"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:23:21.656360" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:23:21.639926" elapsed="0.016542"/>
</kw>
<msg time="2026-08-22T23:23:21.656664" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:23:21.656710" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.639445" elapsed="0.017302"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.657087" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.656839" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.656813" elapsed="0.000356"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.657653" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:21.657309" elapsed="0.000414"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.658009" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.657790" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.657772" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:23:21.658123" 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-08-22T23:23:21.660943" elapsed="0.000149"/>
</kw>
<msg time="2026-08-22T23:23:21.661156" 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-08-22T23:23:21.659772" 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-08-22T23:23:21.661722" elapsed="0.000094"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.662104" elapsed="0.000087"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:23:21.659020" elapsed="0.003293"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:23:21.658427" elapsed="0.003954"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:23:21.605496" elapsed="0.056985"/>
</kw>
<msg time="2026-08-22T23:23:21.662655" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:23:21.662701" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.604886" elapsed="0.057852"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:23:21.662924" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:23:21.662816" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.662798" 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-08-22T23:23:21.663410" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.663779" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.663854" 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-08-22T23:23:21.604195" elapsed="0.059775"/>
</kw>
<msg time="2026-08-22T23:23:21.664067" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:23:21.664112" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.599307" elapsed="0.064843"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.664475" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.664226" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.664209" elapsed="0.000343"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:23:21.599168" elapsed="0.065758"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.671268" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:21.671112" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.671081" elapsed="0.000280"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.672817" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:21.672705" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.672686" elapsed="0.000204"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:23:21.673383" 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-08-22T23:23:21.673035" elapsed="0.000377"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:23:21.673823" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:23:21.673574" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:23:21.707266" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:23:21.674341" elapsed="0.033116"/>
</kw>
<msg time="2026-08-22T23:23:21.707699" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:23:21.707775" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.674004" elapsed="0.033810"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:23:21.724568" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:23:21.708483" elapsed="0.016216"/>
</kw>
<msg time="2026-08-22T23:23:21.724878" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:23:21.724924" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.708044" elapsed="0.016916"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.725333" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.725062" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.725031" elapsed="0.000387"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.725927" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:21.725563" 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-08-22T23:23:21.726387" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.726168" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.726149" elapsed="0.000316"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:23:21.726504" 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-08-22T23:23:21.729487" elapsed="0.000178"/>
</kw>
<msg time="2026-08-22T23:23:21.729731" 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-08-22T23:23:21.728211" elapsed="0.001670"/>
</kw>
<kw name="Open 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-08-22T23:23:21.730178" elapsed="0.000087"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.730546" elapsed="0.000113"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:23:21.727425" elapsed="0.003358"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:23:21.726845" elapsed="0.004007"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:23:21.672361" elapsed="0.058590"/>
</kw>
<msg time="2026-08-22T23:23:21.731045" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:23:21.731090" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.671590" elapsed="0.059540"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:23:21.731314" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:23:21.731207" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.731188" 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-08-22T23:23:21.731983" 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-08-22T23:23:21.732327" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.732399" 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-08-22T23:23:21.670551" elapsed="0.061961"/>
</kw>
<msg time="2026-08-22T23:23:21.732626" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:23:21.732673" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.665224" elapsed="0.067488"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.733038" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.732789" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.732771" elapsed="0.000344"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:23:21.665081" elapsed="0.068057"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.738869" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:21.738757" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.738738" 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-08-22T23:23:21.740131" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:21.740023" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.740006" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:23:21.740686" 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-08-22T23:23:21.740341" elapsed="0.000373"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:23:21.741098" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:23:21.740870" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:23:21.772913" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:23:21.741696" elapsed="0.031423"/>
</kw>
<msg time="2026-08-22T23:23:21.773356" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:23:21.773406" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.741337" elapsed="0.032106"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:23:21.790927" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:23:21.774163" elapsed="0.016956"/>
</kw>
<msg time="2026-08-22T23:23:21.791352" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:23:21.791400" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.773708" elapsed="0.017730"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.791932" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.791563" elapsed="0.000429"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.791524" elapsed="0.000497"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.792558" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:21.792167" elapsed="0.000479"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.792932" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.792716" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.792697" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:23:21.793051" 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-08-22T23:23:21.796028" elapsed="0.000153"/>
</kw>
<msg time="2026-08-22T23:23:21.796248" 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-08-22T23:23:21.794751" elapsed="0.001653"/>
</kw>
<kw name="Open 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-08-22T23:23:21.796730" elapsed="0.000089"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.797099" 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-08-22T23:23:21.794005" elapsed="0.003304"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:23:21.793386" elapsed="0.003993"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:23:21.739694" elapsed="0.057783"/>
</kw>
<msg time="2026-08-22T23:23:21.797574" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:23:21.797644" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.739089" elapsed="0.058595"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:23:21.797871" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:23:21.797762" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.797744" 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-08-22T23:23:21.798370" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.798760" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.798833" 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-08-22T23:23:21.738377" elapsed="0.060568"/>
</kw>
<msg time="2026-08-22T23:23:21.799045" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:23:21.799150" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.733413" elapsed="0.065776"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.799520" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.799269" elapsed="0.000471"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.799251" elapsed="0.000520"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:23:21.733274" elapsed="0.066523"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:23:21.598993" elapsed="0.200839"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:23:21.596604" elapsed="0.203293"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:23:21.591238" elapsed="0.208719"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.590648" elapsed="0.209357"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:23:21.586576" elapsed="0.213487"/>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.812399" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:21.811950" elapsed="0.000480"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.819853" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:21.819546" elapsed="0.000364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.820312" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:21.820066" 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-08-22T23:23:21.830209" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:21.830389" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:21.830520" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:21.822516" elapsed="0.008487">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:21.820438" elapsed="0.010653">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.831299" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.831130" elapsed="0.000235"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:21.820413" elapsed="0.010976">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.831849" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.831997" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:21.831955" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:21.831937" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.832205" elapsed="0.000089"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.832347" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:21.815223" elapsed="0.017234">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.832526" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:21.812685" elapsed="0.019953">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.832887" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.832720" elapsed="0.000251"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:21.832703" elapsed="0.000304"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.833297" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.833087" elapsed="0.000292"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:21.833064" elapsed="0.000350"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:21.811443" elapsed="0.022089">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<doc>Get the device data and make sure it contains the modified content.</doc>
<status status="FAIL" start="2026-08-22T23:23:21.585883" elapsed="0.247895">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</test>
<test id="s1-s2-t17" name="Check_Modified_Device_Data_Is_Visible_On_Checker" line="184">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:23:21.839029" elapsed="0.000331"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:23:21.838641" elapsed="0.000801"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.840976" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:21.840807" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.840780" elapsed="0.000295"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.847213" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:21.847107" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.847089" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.848292" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:23:21.847904" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.848798" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:23:21.848477" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:23:21.848873" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:23:21.849032" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:23:21.847501" elapsed="0.001555"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.854411" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:21.854304" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.854286" 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-08-22T23:23:21.855675" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:21.855541" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.855522" elapsed="0.000246"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:23:21.856238" 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-08-22T23:23:21.855915" elapsed="0.000350"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:23:21.856672" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:23:21.856423" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:23:21.889429" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:23:21.857231" elapsed="0.032461"/>
</kw>
<msg time="2026-08-22T23:23:21.889975" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:23:21.890027" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.856896" elapsed="0.033169"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:23:21.909614" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:23:21.891074" elapsed="0.018657"/>
</kw>
<msg time="2026-08-22T23:23:21.909908" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:23:21.909954" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.890335" elapsed="0.019657"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.910354" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.910095" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.910063" elapsed="0.000374"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.910920" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:21.910602" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.911279" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.911062" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.911044" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:23:21.911395" 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-08-22T23:23:21.914398" elapsed="0.000153"/>
</kw>
<msg time="2026-08-22T23:23:21.914657" 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-08-22T23:23:21.913083" elapsed="0.001730"/>
</kw>
<kw name="Open 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-08-22T23:23:21.915120" elapsed="0.000091"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.915496" elapsed="0.000118"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:23:21.912347" elapsed="0.003539"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:23:21.911758" elapsed="0.004210"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:23:21.855241" elapsed="0.060827"/>
</kw>
<msg time="2026-08-22T23:23:21.916162" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:23:21.916207" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.854643" elapsed="0.061602"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:23:21.916430" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:23:21.916322" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.916304" 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-08-22T23:23:21.916945" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.917278" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.917349" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:23:21.853970" elapsed="0.063487"/>
</kw>
<msg time="2026-08-22T23:23:21.917800" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:23:21.917848" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.849429" elapsed="0.068458"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.918214" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.917965" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.917947" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:23:21.849289" elapsed="0.069027"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.924070" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:21.923962" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.923943" 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-08-22T23:23:21.925326" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:21.925219" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.925200" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:23:21.925879" 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-08-22T23:23:21.925537" elapsed="0.000368"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:23:21.926284" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:23:21.926059" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:23:21.959993" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:23:21.926860" elapsed="0.033237"/>
</kw>
<msg time="2026-08-22T23:23:21.960288" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:23:21.960334" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.926465" elapsed="0.033906"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:23:21.980854" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:23:21.962818" elapsed="0.018153"/>
</kw>
<msg time="2026-08-22T23:23:21.981148" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:23:21.981194" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.960537" elapsed="0.020694"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.981539" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.981312" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.981290" elapsed="0.000365"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:21.982109" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:21.981798" 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-08-22T23:23:21.982466" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.982249" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.982230" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:23:21.982594" 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-08-22T23:23:21.985418" elapsed="0.000149"/>
</kw>
<msg time="2026-08-22T23:23:21.985654" 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-08-22T23:23:21.984136" elapsed="0.001663"/>
</kw>
<kw name="Open 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-08-22T23:23:21.986098" elapsed="0.000209"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.986681" 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-08-22T23:23:21.983393" elapsed="0.003499"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:23:21.982862" 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-08-22T23:23:21.924915" elapsed="0.062142"/>
</kw>
<msg time="2026-08-22T23:23:21.987147" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:23:21.987190" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.924286" elapsed="0.062941"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:23:21.987408" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:23:21.987302" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.987284" 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-08-22T23:23:21.987931" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.988260" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.988331" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:23:21.923590" elapsed="0.064848"/>
</kw>
<msg time="2026-08-22T23:23:21.988531" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:23:21.988574" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.918605" elapsed="0.070162"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:21.989091" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:21.988842" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.988825" elapsed="0.000344"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:23:21.918448" elapsed="0.070744"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:23:21.994562" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:21.994455" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.994436" 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-08-22T23:23:21.995815" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:21.995706" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:21.995675" elapsed="0.000207"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:23:21.996340" 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-08-22T23:23:21.996026" elapsed="0.000340"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:23:21.996815" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:23:21.996520" elapsed="0.000321"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:23:22.027447" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:23:21.997328" elapsed="0.030245"/>
</kw>
<msg time="2026-08-22T23:23:22.027817" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:23:22.027864" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.996999" elapsed="0.030902"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:23:22.051799" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:23:22.028455" elapsed="0.023474"/>
</kw>
<msg time="2026-08-22T23:23:22.052106" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:23:22.052153" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:22.028089" elapsed="0.024164"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:22.052626" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:22.052349" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:22.052322" elapsed="0.000387"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:22.053463" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:22.052851" 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-08-22T23:23:22.053843" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:22.053625" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:22.053605" elapsed="0.000336"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:23:22.053978" 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-08-22T23:23:22.056984" elapsed="0.000152"/>
</kw>
<msg time="2026-08-22T23:23:22.057201" 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-08-22T23:23:22.055602" elapsed="0.001751"/>
</kw>
<kw name="Open 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-08-22T23:23:22.057681" elapsed="0.000090"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:22.058054" 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-08-22T23:23:22.054885" elapsed="0.003382"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:23:22.054274" 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-08-22T23:23:21.995369" elapsed="0.063063"/>
</kw>
<msg time="2026-08-22T23:23:22.058526" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:23:22.058570" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.994795" elapsed="0.063837"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:23:22.058817" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:23:22.058709" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:22.058691" 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-08-22T23:23:22.059298" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:22.059817" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:23:22.059890" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:23:21.994112" elapsed="0.065888"/>
</kw>
<msg time="2026-08-22T23:23:22.060096" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:23:22.060140" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.989454" elapsed="0.070722"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:22.060499" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:22.060251" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:23:22.060234" elapsed="0.000358"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:23:21.989316" elapsed="0.071302"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:23:21.849112" elapsed="0.211540"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:23:21.846748" elapsed="0.213968"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:23:21.840353" elapsed="0.220421"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:23:21.839696" elapsed="0.221126"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:23:21.835154" elapsed="0.225767"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:22.073555" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:22.073163" elapsed="0.000436"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:22.081021" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:22.080766" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:22.081470" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:22.081221" 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-08-22T23:23:22.090164" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:22.090430" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:22.090691" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:22.083669" elapsed="0.007557">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:22.081600" elapsed="0.009712">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:22.091509" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:22.091348" elapsed="0.000243"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:22.081565" elapsed="0.010053">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:22.092053" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:22.092191" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:22.092152" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:22.092134" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:22.092396" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:22.092467" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:22.076241" elapsed="0.016332">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:22.092660" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:22.073816" elapsed="0.018938">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:22.093026" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:22.092833" elapsed="0.000322"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:22.092817" elapsed="0.000376"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:22.093471" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:22.093272" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:22.093249" elapsed="0.000355"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:22.072761" elapsed="0.020957">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:23.106868" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:23.106373" elapsed="0.000530"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:23.114177" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:23.113919" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:23.114640" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:23.114379" 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-08-22T23:23:23.123301" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:23.123458" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:23.123609" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:23.117125" elapsed="0.006879">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:23.114762" elapsed="0.009325">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:23.124278" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:23.124123" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:23.114740" elapsed="0.009631">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:23.124762" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:23.124902" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:23.124861" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:23.124843" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:23.125108" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:23.125180" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:23.109596" elapsed="0.015688">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:23.125354" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:23.107138" elapsed="0.018310">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:23.125761" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:23.125603" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:23.125571" elapsed="0.000272"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:23.126044" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:23.125899" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:23.125883" elapsed="0.000241"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:23.105807" elapsed="0.020396">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:24.145095" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:24.144662" elapsed="0.000464"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:24.152344" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:24.152087" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:24.152815" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:24.152546" 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-08-22T23:23:24.161665" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:24.161815" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:24.161927" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:24.155163" elapsed="0.007139">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:24.152936" elapsed="0.009449">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:24.162594" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:24.162420" elapsed="0.000243"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:24.152915" elapsed="0.009773">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:24.163065" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:24.163200" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:24.163162" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:24.163145" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:24.163445" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:24.163518" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:24.147771" elapsed="0.015868">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:24.163765" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:24.145349" elapsed="0.018519">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:24.164202" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:24.163972" elapsed="0.000308"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:24.163946" elapsed="0.000367"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:24.164604" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:24.164389" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:24.164367" elapsed="0.000352"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:24.144196" elapsed="0.020634">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:25.185606" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:25.185123" elapsed="0.000518"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:25.192947" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:25.192687" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:25.193395" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:25.193148" 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-08-22T23:23:25.202855" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:25.203093" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:25.203305" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:25.195795" elapsed="0.008070">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:25.193521" elapsed="0.010476">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:25.204326" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:25.204057" elapsed="0.000361"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:25.193496" elapsed="0.010955">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:25.205054" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:25.205251" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:25.205195" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:25.205169" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:25.205540" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:25.205743" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:25.188358" elapsed="0.017540">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:25.205996" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:25.185890" elapsed="0.020243">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:25.206462" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:25.206251" elapsed="0.000290"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:25.206226" elapsed="0.000368"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:25.206873" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:25.206674" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:25.206652" elapsed="0.000331"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:25.184571" elapsed="0.022522">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:26.225844" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:26.225349" elapsed="0.000529"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:26.233498" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:26.233229" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:26.233969" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:26.233719" 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-08-22T23:23:26.242812" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:26.242979" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:26.243202" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:26.236402" elapsed="0.007356">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:26.234111" elapsed="0.009764">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:26.244143" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:26.243925" elapsed="0.000322"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:26.234086" elapsed="0.010195">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:26.244827" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:26.245099" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:26.245042" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:26.245016" elapsed="0.000181"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:26.245419" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:26.245521" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:26.228686" elapsed="0.017005">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:26.245788" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:26.226131" elapsed="0.019791">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:26.246280" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:26.246051" elapsed="0.000310"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:26.246024" elapsed="0.000370"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:26.246686" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:26.246471" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:26.246449" elapsed="0.000349"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:26.224818" elapsed="0.022089">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:27.267256" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:27.266760" elapsed="0.000531"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:27.274978" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:27.274704" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:27.275435" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:27.275187" 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-08-22T23:23:27.283969" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:27.284128" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:27.284244" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:27.277822" elapsed="0.006832">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:27.275561" elapsed="0.009182">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:27.284935" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:27.284779" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:27.275538" elapsed="0.009489">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:27.285472" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:27.285631" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:27.285573" elapsed="0.000105"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:27.285555" elapsed="0.000145"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:27.285846" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:27.285918" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:27.270349" elapsed="0.015677">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:27.286097" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:27.267527" elapsed="0.018668">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:27.286421" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:27.286276" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:27.286259" elapsed="0.000243"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:27.286713" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:27.286556" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:27.286540" elapsed="0.000253"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:27.266204" elapsed="0.020667">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:28.304743" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:28.304270" elapsed="0.000507"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:28.312090" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:28.311833" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:28.312541" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:28.312294" 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-08-22T23:23:28.321278" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:28.321436" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:28.321549" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:28.314933" elapsed="0.007026">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:28.312679" elapsed="0.009387">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:28.322327" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:28.322114" elapsed="0.000377"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:28.312656" elapsed="0.009871">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:28.323112" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:28.323308" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:28.323252" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:28.323228" elapsed="0.000172"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:28.323621" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:28.323724" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:28.307435" elapsed="0.016436">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:28.323969" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:28.305010" elapsed="0.019121">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:28.324484" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:28.324244" elapsed="0.000326"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:28.324221" elapsed="0.000401"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:28.324899" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:28.324701" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:28.324679" elapsed="0.000332"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:28.303763" elapsed="0.021358">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:29.344948" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:29.344499" elapsed="0.000480"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:29.352143" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:29.351891" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:29.352644" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:29.352340" 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-08-22T23:23:29.361560" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:29.361731" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:29.361838" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:29.354976" elapsed="0.007295">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:29.352772" elapsed="0.009674">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:29.362749" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:29.362495" elapsed="0.000348"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:29.352752" elapsed="0.010125">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:29.363388" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:29.363593" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:29.363521" elapsed="0.000140"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:29.363497" 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-08-22T23:23:29.363889" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:29.363986" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:29.347609" elapsed="0.016520">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:29.364224" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:29.345200" elapsed="0.019154">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:29.364680" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:29.364463" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:29.364440" elapsed="0.000351"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:29.365057" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:29.364865" elapsed="0.000267"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:29.364843" elapsed="0.000321"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:29.344057" elapsed="0.021213">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:30.383075" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:30.382610" elapsed="0.000499"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:30.390552" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:30.390258" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:30.391043" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:30.390792" 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-08-22T23:23:30.399533" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:30.399723" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:30.399909" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:30.393233" elapsed="0.007071">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:30.391166" elapsed="0.009223">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:30.400618" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:30.400425" elapsed="0.000261"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:30.391144" elapsed="0.009566">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:30.401120" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:30.401267" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:30.401226" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:30.401207" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:30.401475" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:30.401545" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:30.385763" elapsed="0.015904">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:30.401737" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:30.383340" elapsed="0.018498">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:30.402061" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:30.401917" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:30.401901" elapsed="0.000239"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:30.402332" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:30.402193" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:30.402177" elapsed="0.000234"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:30.382057" elapsed="0.020473">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:31.419754" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:31.419253" elapsed="0.000536"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:31.427224" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:31.426957" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:31.427694" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:31.427428" 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-08-22T23:23:31.436656" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:31.436967" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:31.437311" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:31.429881" elapsed="0.008252">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:31.427816" elapsed="0.010553">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:31.438825" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:31.438449" elapsed="0.000525"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:31.427794" elapsed="0.011232">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:31.439886" elapsed="0.000057"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:31.440203" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:31.440104" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:31.440064" 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-08-22T23:23:31.440741" elapsed="0.000053"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:31.440912" elapsed="0.000035"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:31.422457" elapsed="0.018700">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:31.441319" elapsed="0.000036"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:31.420023" elapsed="0.021514">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:31.442098" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:31.441757" elapsed="0.000478"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:31.441717" elapsed="0.000598"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:31.442807" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:31.442445" elapsed="0.000495"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:31.442408" elapsed="0.000587"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:31.418458" elapsed="0.024719">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:32.462884" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:32.462364" elapsed="0.000556"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:32.472437" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:32.472087" elapsed="0.000413"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:32.472935" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:32.472684" 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-08-22T23:23:32.481160" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:32.481344" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:32.481566" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:32.475150" elapsed="0.006864">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:32.473066" elapsed="0.009058">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:32.482343" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:32.482165" elapsed="0.000245"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:32.473038" elapsed="0.009397">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:32.482884" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:32.483030" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:32.482987" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:32.482968" elapsed="0.000131"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:32.483260" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:32.483333" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:32.465714" elapsed="0.017731">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:32.483515" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:32.463178" elapsed="0.020457">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:32.483866" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:32.483720" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:32.483702" elapsed="0.000242"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:32.484137" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:32.483997" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:32.483981" elapsed="0.000234"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:32.461757" elapsed="0.022536">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:33.508982" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:33.507952" elapsed="0.001111"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:33.519396" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:33.519123" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:33.519860" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:33.519612" 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-08-22T23:23:33.569419" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:33.569790" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:33.570192" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:33.562474" elapsed="0.008566">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:33.519983" elapsed="0.051239">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:33.571676" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:33.571298" elapsed="0.000526"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:33.519959" elapsed="0.051918">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:33.572748" elapsed="0.000058"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:33.573052" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:33.572967" elapsed="0.000180"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:33.572928" 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-08-22T23:23:33.573503" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:33.573738" elapsed="0.000036"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:33.514709" elapsed="0.059265">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:33.574122" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:33.509610" elapsed="0.064651">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:33.574606" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:33.574377" elapsed="0.000314"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:33.574352" elapsed="0.000374"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:33.575011" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:33.574804" elapsed="0.000288"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:33.574782" elapsed="0.000345"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:33.506747" elapsed="0.068491">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:34.594191" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:34.593706" elapsed="0.000519"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:34.601791" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:34.601511" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:34.602257" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:34.601994" 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-08-22T23:23:34.610883" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:34.611054" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:34.611264" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:34.604452" elapsed="0.007357">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:34.602377" elapsed="0.009551">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:34.612217" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:34.611981" elapsed="0.000332"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:34.602354" elapsed="0.009992">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:34.612914" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:34.613111" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:34.613055" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:34.613031" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:34.613404" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:34.613505" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:34.596908" elapsed="0.016770">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:34.613779" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:34.594464" elapsed="0.019446">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:34.614243" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:34.614040" elapsed="0.000284"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:34.614016" elapsed="0.000342"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:34.614651" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:34.614433" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:34.614411" elapsed="0.000355"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:34.593177" elapsed="0.021698">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:35.635902" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:35.635410" elapsed="0.000527"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:35.643484" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:35.643220" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:35.643955" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:35.643705" 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-08-22T23:23:35.652953" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:35.653118" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:35.653343" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:35.646187" elapsed="0.007758">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:35.644077" elapsed="0.009992">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:35.654355" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:35.654121" elapsed="0.000331"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:35.644053" elapsed="0.010435">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:35.655065" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:35.655268" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:35.655209" elapsed="0.000123"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:35.655184" elapsed="0.000181"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:35.655569" elapsed="0.000053"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:35.655695" elapsed="0.000024"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:35.638646" elapsed="0.017209">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:35.655985" elapsed="0.000028"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:35.636172" elapsed="0.019976">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:35.656473" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:35.656264" elapsed="0.000290"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:35.656240" elapsed="0.000496"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:35.657030" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:35.656825" elapsed="0.000288"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:35.656801" elapsed="0.000346"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:35.634875" elapsed="0.022385">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:36.676435" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:36.675982" elapsed="0.000487"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:36.683954" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:36.683693" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:36.684413" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:36.684157" 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-08-22T23:23:36.692947" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:36.693117" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:36.693317" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:36.686652" elapsed="0.007088">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:36.684535" elapsed="0.009293">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:36.694078" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:36.693866" elapsed="0.000292"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:36.684512" elapsed="0.009671">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:36.694608" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:36.694751" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:36.694711" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:36.694693" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:36.694963" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:36.695033" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:36.679149" elapsed="0.015992">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:36.695213" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:36.676714" elapsed="0.018594">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:36.695529" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:36.695388" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:36.695371" elapsed="0.000254"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:36.695818" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:36.695679" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:36.695664" elapsed="0.000233"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:36.675461" elapsed="0.020514">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:37.714996" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:37.714443" elapsed="0.000595"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:37.722670" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:37.722358" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:37.723133" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:37.722880" 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-08-22T23:23:37.732065" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:37.732295" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:37.732564" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:37.725375" elapsed="0.007756">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:37.723266" elapsed="0.009987">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:37.733522" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:37.733306" elapsed="0.000332"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:37.723236" elapsed="0.010437">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:37.734206" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:37.734429" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:37.734349" elapsed="0.000145"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:37.734325" elapsed="0.000200"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:37.734747" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:37.734848" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:37.717771" elapsed="0.017228">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:37.735098" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:37.715287" elapsed="0.019941">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:37.735536" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:37.735339" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:37.735316" elapsed="0.000355"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:37.735939" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:37.735746" elapsed="0.000268"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:37.735725" elapsed="0.000321"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:37.713801" elapsed="0.022351">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:38.753569" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:38.752910" elapsed="0.000730"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:38.761745" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:38.761462" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:38.762197" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:38.761949" 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-08-22T23:23:38.770567" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:38.770772" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:38.771008" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:38.764463" elapsed="0.006996">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:38.762336" elapsed="0.009216">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:38.771858" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:38.771661" elapsed="0.000266"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:38.762308" elapsed="0.009644">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:38.772383" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:38.772528" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:38.772486" elapsed="0.000105"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:38.772467" elapsed="0.000148"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:38.772760" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:38.772831" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:38.756901" elapsed="0.016040">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:38.773012" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:38.753970" elapsed="0.019137">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:38.773335" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:38.773186" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:38.773170" elapsed="0.000244"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:38.773622" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:38.773467" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:38.773452" elapsed="0.000252"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:38.752144" elapsed="0.021638">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:39.798811" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:39.798306" elapsed="0.000540"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:39.806342" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:39.806078" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:39.806813" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:39.806545" 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-08-22T23:23:39.814290" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:39.814482" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:39.814725" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:39.809067" elapsed="0.006138">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:39.806937" elapsed="0.008365">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:39.815553" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:39.815343" elapsed="0.000299"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:39.806914" elapsed="0.008753">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:39.816132" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:39.816282" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:39.816237" elapsed="0.000096"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:39.816218" elapsed="0.000136"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:39.816497" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:39.816569" elapsed="0.000038"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:39.801521" elapsed="0.015185">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:39.816778" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:39.799080" elapsed="0.017793">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:39.817099" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:39.816954" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:39.816937" elapsed="0.000243"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:39.817374" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:39.817234" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:39.817218" elapsed="0.000235"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:39.797788" elapsed="0.019743">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:40.838818" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:40.838306" elapsed="0.000549"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:40.846319" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:40.846057" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:40.846787" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:40.846522" 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-08-22T23:23:40.855886" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:40.856049" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:40.856234" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:40.848994" elapsed="0.007814">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:40.846911" elapsed="0.010016">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:40.857192" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:40.856976" elapsed="0.000308"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:40.846887" elapsed="0.010430">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:40.857996" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:40.858222" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:40.858164" elapsed="0.000122"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:40.858137" elapsed="0.000180"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:40.858517" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:40.858638" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:40.841519" elapsed="0.017272">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:40.858886" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:40.839093" elapsed="0.019921">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:40.859322" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:40.859121" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:40.859099" elapsed="0.000335"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:40.859721" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:40.859508" elapsed="0.000292"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:40.859487" elapsed="0.000345"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:40.837736" elapsed="0.022203">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:41.879127" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:41.878442" elapsed="0.000735"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:41.887667" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:41.887388" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:41.888120" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:41.887870" 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-08-22T23:23:41.896893" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:41.897071" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:41.897275" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:41.890349" elapsed="0.007382">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:41.888247" elapsed="0.009570">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:41.898009" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:41.897853" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:41.888221" elapsed="0.009879">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:41.898531" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:41.898694" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:41.898652" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:41.898633" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:41.898907" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:41.898978" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:41.882852" elapsed="0.016235">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:41.899158" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:41.879508" elapsed="0.019745">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:41.899475" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:41.899331" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:41.899315" elapsed="0.000238"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:41.899762" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:41.899622" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:41.899606" elapsed="0.000234"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:41.877685" elapsed="0.022231">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:42.919196" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:42.918517" elapsed="0.000730"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:42.927596" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:42.927264" elapsed="0.000391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:42.928078" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:42.927817" 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-08-22T23:23:42.936407" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:42.936603" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:42.936805" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:42.930312" elapsed="0.007032">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:42.928207" elapsed="0.009228">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:42.937685" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:42.937474" elapsed="0.000279"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:42.928182" elapsed="0.009595">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:42.938189" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:42.938333" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:42.938291" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:42.938272" elapsed="0.000130"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:42.938546" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:42.938632" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:42.922531" elapsed="0.016212">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:42.938814" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:42.919601" elapsed="0.019308">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:42.939176" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:42.939019" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:42.938998" elapsed="0.000262"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:42.939451" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:42.939313" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:42.939297" elapsed="0.000232"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:42.917955" elapsed="0.021666">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:43.957389" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:43.956906" elapsed="0.000522"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:43.964947" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:43.964682" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:43.965393" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:43.965148" 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-08-22T23:23:43.973611" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:43.973769" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:43.973958" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:43.967605" elapsed="0.006747">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:43.965516" elapsed="0.008921">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:43.974643" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:43.974473" elapsed="0.000237"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:43.965492" elapsed="0.009243">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:43.975116" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:43.975257" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:43.975216" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:43.975198" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:43.975471" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:43.975544" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:43.960084" elapsed="0.015583">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:43.975739" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:43.957677" elapsed="0.018157">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:43.976057" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:43.975914" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:43.975897" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:43.976332" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:43.976192" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:43.976177" elapsed="0.000255"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:43.956344" elapsed="0.020166">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:44.997300" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:44.996666" elapsed="0.000680"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:45.005473" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:45.005210" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:45.005968" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:45.005692" 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-08-22T23:23:45.015135" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:45.015302" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:45.015489" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:45.008189" elapsed="0.007713">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:45.006097" elapsed="0.009891">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:45.016188" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:45.016025" elapsed="0.000230"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:45.006072" elapsed="0.010208">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:45.016683" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:45.016823" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:45.016783" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:45.016765" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:45.017037" elapsed="0.000035"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:45.017124" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:45.000471" elapsed="0.016761">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:45.017304" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:44.997685" elapsed="0.019714">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:45.017650" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:45.017484" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:45.017468" elapsed="0.000265"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:45.017946" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:45.017787" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:45.017772" elapsed="0.000255"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:44.995929" elapsed="0.022182">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:46.036251" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:46.035772" elapsed="0.000515"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:46.051089" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:46.050822" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:46.051543" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:46.051294" 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-08-22T23:23:46.060345" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:46.060510" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:46.060713" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:46.053794" elapsed="0.007309">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:46.051696" elapsed="0.009489">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:46.061376" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:46.061220" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:46.051672" elapsed="0.009799">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:46.061863" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:46.062002" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:46.061962" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:46.061945" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:46.062209" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:46.062279" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:46.040313" elapsed="0.022069">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:46.062451" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:46.036522" elapsed="0.026022">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:46.062782" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:46.062638" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:46.062621" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:46.063055" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:46.062916" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:46.062900" elapsed="0.000234"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:46.035210" elapsed="0.028000">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:47.084194" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:47.083716" elapsed="0.000514"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:47.091561" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:47.091303" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:47.092025" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:47.091778" 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-08-22T23:23:47.100706" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:47.100917" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:47.101146" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:47.094441" elapsed="0.007272">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:47.092149" elapsed="0.009680">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:47.102096" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:47.101879" elapsed="0.000311"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:47.092125" elapsed="0.010099">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:47.102813" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:47.103011" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:47.102952" elapsed="0.000124"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:47.102928" elapsed="0.000179"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:47.103305" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:47.103406" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:47.086925" elapsed="0.016643">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:47.103715" elapsed="0.000027"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:47.084465" elapsed="0.019388">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:47.104163" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:47.103962" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:47.103940" elapsed="0.000337"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:47.104546" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:47.104352" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:47.104331" elapsed="0.000353"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:47.083160" elapsed="0.021631">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:48.125839" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:48.125353" elapsed="0.000521"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:48.133171" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:48.132912" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:48.133637" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:48.133373" 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-08-22T23:23:48.142384" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:48.142548" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:48.142832" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:48.136034" elapsed="0.007339">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:48.133762" elapsed="0.009725">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:48.143774" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:48.143535" elapsed="0.000332"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:48.133740" elapsed="0.010161">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:48.144415" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:48.144631" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:48.144555" elapsed="0.000137"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:48.144531" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:48.144922" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:48.145021" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:48.128549" elapsed="0.016615">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:48.145261" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:48.126109" elapsed="0.019283">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:48.145725" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:48.145501" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:48.145479" elapsed="0.000360"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:48.146108" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:48.145914" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:48.145893" elapsed="0.000325"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:48.124815" elapsed="0.021509">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:49.167366" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:49.166893" elapsed="0.000509"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:49.174869" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:49.174605" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:49.175317" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:49.175070" 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-08-22T23:23:49.184241" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:49.184406" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:49.184641" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:49.177793" elapsed="0.007392">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:49.175447" elapsed="0.009878">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:49.185649" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:49.185377" elapsed="0.000389"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:49.175421" elapsed="0.010379">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:49.186319" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:49.186513" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:49.186455" elapsed="0.000138"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:49.186431" 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-08-22T23:23:49.186827" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:49.186928" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:49.170200" elapsed="0.016875">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:49.187173" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:49.167655" elapsed="0.019650">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:49.187632" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:49.187414" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:49.187392" elapsed="0.000354"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:49.188015" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:49.187821" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:49.187800" elapsed="0.000327"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:49.166332" elapsed="0.021903">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:50.209746" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:50.209244" elapsed="0.000538"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:50.217049" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:50.216790" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:50.217512" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:50.217262" 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-08-22T23:23:50.225611" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:50.225844" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:50.226089" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:50.219964" elapsed="0.006664">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:50.217662" elapsed="0.009083">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:50.227011" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:50.226795" elapsed="0.000310"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:50.217637" elapsed="0.009503">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:50.227716" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:50.227911" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:50.227855" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:50.227830" elapsed="0.000175"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:50.228205" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:50.228306" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:50.212448" elapsed="0.016007">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:50.228555" elapsed="0.000041"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:50.210019" elapsed="0.018693">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:50.229026" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:50.228825" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:50.228802" elapsed="0.000337"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:50.229410" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:50.229215" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:50.229193" elapsed="0.000336"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:50.208690" elapsed="0.021001">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:51.249225" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:51.248735" elapsed="0.000527"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:51.256597" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:51.256326" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:51.257044" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:51.256799" 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-08-22T23:23:51.265071" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:51.265235" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:51.265409" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:51.259494" elapsed="0.006447">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:51.257194" elapsed="0.008870">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:51.266344" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:51.266116" elapsed="0.000326"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:51.257144" elapsed="0.009334">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:51.267061" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:51.267266" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:51.267207" elapsed="0.000123"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:51.267181" elapsed="0.000180"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:51.267573" elapsed="0.000052"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:51.267700" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:51.251966" elapsed="0.015891">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:51.267960" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:51.249502" elapsed="0.018599">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:51.268431" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:51.268218" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:51.268194" elapsed="0.000357"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:51.268861" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:51.268652" elapsed="0.000292"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:51.268628" elapsed="0.000351"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:51.248155" elapsed="0.020940">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:52.287848" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:52.287358" elapsed="0.000524"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:52.295147" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:52.294887" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:52.295612" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:52.295349" 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-08-22T23:23:52.304156" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:52.304326" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:52.304522" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:52.298057" elapsed="0.006909">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:52.295738" elapsed="0.009322">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:52.305278" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:52.305097" elapsed="0.000248"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:52.295716" elapsed="0.009653">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:52.305793" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:52.305938" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:52.305896" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:52.305877" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:52.306149" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:52.306220" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:52.290528" elapsed="0.015801">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:52.306400" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:52.288116" elapsed="0.018380">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:52.306742" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:52.306589" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:52.306559" elapsed="0.000264"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:52.307019" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:52.306878" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:52.306862" elapsed="0.000236"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:52.286823" elapsed="0.020354">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:53.328217" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:53.327738" elapsed="0.000515"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:53.335877" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:53.335615" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:53.336323" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:53.336077" 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-08-22T23:23:53.345497" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:53.345917" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:53.346343" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:53.338784" elapsed="0.008622">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:53.336450" elapsed="0.011255">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:53.348378" elapsed="0.000085"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:53.347831" elapsed="0.000833"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:53.336426" elapsed="0.012336">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:53.350056" elapsed="0.000153"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:53.350660" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:53.350473" elapsed="0.000289"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:53.350409" elapsed="0.000403"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:53.351115" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:53.351258" elapsed="0.000031"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:53.330987" elapsed="0.020485">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:53.351639" elapsed="0.000032"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:53.328496" elapsed="0.023334">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:53.352279" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:53.351984" elapsed="0.000411"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:53.351951" elapsed="0.000492"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:53.352854" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:53.352548" elapsed="0.000414"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:53.352518" elapsed="0.000489"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:53.327180" elapsed="0.025988">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:54.372440" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:54.371970" elapsed="0.000505"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:54.379792" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:54.379517" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:54.380239" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:54.379992" 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-08-22T23:23:54.389744" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:54.389908" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:54.390091" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:54.382670" elapsed="0.007811">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:54.380366" elapsed="0.010199">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:54.390776" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:54.390620" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:54.380341" elapsed="0.010527">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:54.391255" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:54.391393" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:54.391353" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:54.391335" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:54.391618" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:54.391691" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:54.375157" elapsed="0.016640">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:54.391867" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:54.372738" elapsed="0.019223">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:54.392186" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:54.392042" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:54.392025" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:54.392461" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:54.392321" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:54.392305" elapsed="0.000235"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:54.371417" elapsed="0.021256">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:55.413661" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:55.413180" elapsed="0.000516"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:55.420987" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:55.420726" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:55.421437" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:55.421188" 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-08-22T23:23:55.429688" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:55.429898" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:55.430130" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:55.423846" elapsed="0.006823">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:55.421562" elapsed="0.009225">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:55.431079" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:55.430838" elapsed="0.000338"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:55.421538" elapsed="0.009672">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:55.431763" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:55.431957" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:55.431902" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:55.431878" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:55.432251" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:55.432352" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:55.416361" elapsed="0.016139">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:55.432620" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:55.413930" elapsed="0.018825">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:55.433067" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:55.432867" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:55.432844" elapsed="0.000336"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:55.433451" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:55.433257" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:55.433235" elapsed="0.000328"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:55.412630" elapsed="0.021064">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:56.446442" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:56.445969" elapsed="0.000508"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:56.453772" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:56.453482" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:56.454221" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:56.453972" 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-08-22T23:23:56.463042" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:56.463209" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:56.463405" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:56.456670" elapsed="0.007156">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:56.454345" elapsed="0.009570">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:56.464143" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:56.463956" elapsed="0.000255"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:56.454321" elapsed="0.009914">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:56.464669" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:56.464816" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:56.464776" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:56.464757" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:56.465028" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:56.465100" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:56.449169" elapsed="0.016039">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:56.465278" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:56.446732" elapsed="0.018641">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:56.465666" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:56.465472" elapsed="0.000260"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:56.465453" elapsed="0.000303"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:56.465953" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:56.465810" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:56.465794" elapsed="0.000237"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:56.445254" elapsed="0.020856">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:57.484332" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:57.483833" elapsed="0.000534"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:57.491592" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:57.491320" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:57.492044" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:57.491796" 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-08-22T23:23:57.500361" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:57.500522" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:57.500724" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:57.494435" elapsed="0.006680">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:57.492167" elapsed="0.009031">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:57.501388" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:57.501233" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:57.492144" elapsed="0.009335">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:57.501878" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:57.502014" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:57.501975" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:57.501958" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:57.502224" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:57.502294" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:57.487015" elapsed="0.015383">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:57.502467" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:57.484615" elapsed="0.017945">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:57.502799" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:57.502656" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:57.502639" elapsed="0.000239"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:57.503070" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:57.502931" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:57.502915" elapsed="0.000233"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:57.483275" elapsed="0.019949">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:58.521160" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:58.520729" elapsed="0.000466"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:58.530285" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:58.530027" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:58.530753" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:58.530488" 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-08-22T23:23:58.538464" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:58.538657" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:58.538851" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:58.532990" elapsed="0.006282">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:58.530877" elapsed="0.008483">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:58.539570" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:58.539398" elapsed="0.000259"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:58.530856" elapsed="0.008825">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:58.540081" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:58.540219" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:58.540180" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:58.540162" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:58.540431" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:58.540502" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:58.523870" elapsed="0.016752">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:58.540694" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:58.521414" elapsed="0.019374">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:58.541011" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:58.540867" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:58.540850" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:58.541282" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:58.541143" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:58.541128" elapsed="0.000233"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:58.520271" elapsed="0.021165">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:23:59.563484" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:23:59.562969" elapsed="0.000554"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:59.570943" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:59.570674" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:23:59.571388" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:23:59.571143" 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-08-22T23:23:59.579834" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:23:59.580007" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:23:59.580215" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:23:59.573858" elapsed="0.006832">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:23:59.571520" elapsed="0.009263">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:59.581008" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:59.580825" elapsed="0.000249"/>
</branch>
<status status="FAIL" start="2026-08-22T23:23:59.571491" elapsed="0.009608">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:59.581523" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:59.581707" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:23:59.581661" elapsed="0.000094"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:59.581623" elapsed="0.000155"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:59.581926" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:23:59.581996" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:23:59.566274" elapsed="0.015834">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:23:59.582177" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:23:59.563809" elapsed="0.018461">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:59.582494" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:59.582348" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:59.582332" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:23:59.582786" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:23:59.582642" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:23:59.582626" elapsed="0.000239"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:23:59.562120" elapsed="0.020821">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:00.600720" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:00.600204" elapsed="0.000550"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:00.608113" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:00.607852" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:00.608597" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:00.608314" 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-08-22T23:24:00.617825" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:00.617995" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:24:00.618201" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:24:00.611038" elapsed="0.007582">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:00.608726" elapsed="0.009985">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:00.618951" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:00.618751" elapsed="0.000267"/>
</branch>
<status status="FAIL" start="2026-08-22T23:24:00.608702" elapsed="0.010340">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:00.619462" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:00.619622" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:24:00.619564" elapsed="0.000106"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:00.619545" elapsed="0.000147"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:00.619841" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:00.619911" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:24:00.603412" elapsed="0.016609">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:00.620090" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:24:00.600989" elapsed="0.019196">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:00.620407" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:00.620263" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:00.620247" elapsed="0.000264"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:00.620722" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:00.620564" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:00.620549" elapsed="0.000257"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:00.599667" elapsed="0.021218">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:01.641087" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:01.640445" elapsed="0.000689"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:01.651087" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:01.650756" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:01.651697" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:01.651361" 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-08-22T23:24:01.662480" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:01.662740" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:24:01.663185" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:24:01.655020" elapsed="0.008741">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:01.651864" elapsed="0.012019">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:01.664203" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:01.663936" elapsed="0.000353"/>
</branch>
<status status="FAIL" start="2026-08-22T23:24:01.651832" elapsed="0.012490">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:01.664905" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:01.665093" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:24:01.665039" elapsed="0.000114"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:01.665013" elapsed="0.000169"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:01.665378" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:01.665470" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:24:01.644888" elapsed="0.020748">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:01.665731" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:24:01.641472" elapsed="0.024390">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:01.666170" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:01.665969" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:01.665946" elapsed="0.000331"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:01.666538" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:01.666348" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:01.666327" elapsed="0.000334"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:01.639713" elapsed="0.027055">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:02.685200" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:02.684705" elapsed="0.000532"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:02.692720" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:02.692435" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:02.693182" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:02.692926" 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-08-22T23:24:02.703477" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:02.703888" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:24:02.704325" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:24:02.695694" elapsed="0.009495">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:02.693325" elapsed="0.012070">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:02.705979" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:02.705487" elapsed="0.000680"/>
</branch>
<status status="FAIL" start="2026-08-22T23:24:02.693298" elapsed="0.012926">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:02.707208" elapsed="0.000063"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:02.707535" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:24:02.707442" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:02.707400" 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-08-22T23:24:02.708041" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:02.708200" elapsed="0.000035"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:24:02.687986" elapsed="0.020461">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:02.708637" elapsed="0.000038"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:24:02.685479" elapsed="0.023381">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:02.709366" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:02.709042" elapsed="0.000450"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:02.709003" elapsed="0.000543"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:02.710017" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:02.709700" elapsed="0.000492"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:02.709663" elapsed="0.000586"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:02.684136" elapsed="0.026296">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:03.730372" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:03.729886" elapsed="0.000518"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:03.737713" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:03.737436" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:03.738159" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:03.737913" 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-08-22T23:24:03.747288" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:03.747444" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:24:03.747638" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:24:03.740547" elapsed="0.007461">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:03.738278" elapsed="0.009812">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:03.748282" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:03.748125" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:24:03.738257" elapsed="0.010115">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:03.748761" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:03.748904" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:24:03.748861" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:03.748843" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:03.749130" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:03.749200" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:24:03.733099" elapsed="0.016211">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:03.749379" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:24:03.730648" elapsed="0.018825">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:03.749709" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:03.749550" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:03.749534" elapsed="0.000255"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:03.749980" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:03.749842" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:03.749827" elapsed="0.000231"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:03.729211" elapsed="0.020924">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:04.769274" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:04.768853" elapsed="0.000451"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:04.776727" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:04.776458" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:04.777184" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:04.776927" 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-08-22T23:24:04.785936" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:04.786070" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:24:04.786307" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:24:04.779522" elapsed="0.007157">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:04.777299" elapsed="0.009469">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:04.786979" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:04.786805" elapsed="0.000244"/>
</branch>
<status status="FAIL" start="2026-08-22T23:24:04.777280" elapsed="0.009793">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:04.787482" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:04.787642" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:24:04.787601" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:04.787564" elapsed="0.000143"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:04.787856" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:04.787934" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:24:04.771925" elapsed="0.016161">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:04.788160" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:24:04.769519" elapsed="0.018735">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:04.788490" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:04.788333" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:04.788317" elapsed="0.000277"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:04.788816" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:04.788652" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:04.788637" elapsed="0.000266"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:04.768230" elapsed="0.020802">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:05.801788" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:05.801316" elapsed="0.000508"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:05.809153" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:05.808897" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:05.809609" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:05.809351" 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-08-22T23:24:05.818720" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:05.818892" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:24:05.819096" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:24:05.812003" elapsed="0.007486">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:05.809737" elapsed="0.009837">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:05.819783" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:05.819627" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:24:05.809712" elapsed="0.010162">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:05.820260" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:05.820401" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:24:05.820359" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:05.820342" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:05.820629" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:05.820702" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:24:05.804556" elapsed="0.016252">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:05.820878" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:24:05.802060" elapsed="0.018917">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:05.821197" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:05.821055" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:05.821039" elapsed="0.000238"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:05.821470" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:05.821330" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:05.821315" elapsed="0.000233"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:05.800806" elapsed="0.020835">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:06.840307" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:06.839824" elapsed="0.000519"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:06.847656" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:06.847379" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:06.848108" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:06.847857" 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-08-22T23:24:06.857127" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:06.857436" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:24:06.857804" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:24:06.850521" elapsed="0.008147">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:06.848234" elapsed="0.010616">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:06.859273" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:06.858927" elapsed="0.000495"/>
</branch>
<status status="FAIL" start="2026-08-22T23:24:06.848210" elapsed="0.011266">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:06.860339" elapsed="0.000057"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:06.860671" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:24:06.860554" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:06.860516" elapsed="0.000306"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:06.861155" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:06.861312" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:24:06.843039" elapsed="0.018501">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:06.861725" elapsed="0.000035"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:24:06.840590" elapsed="0.021344">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:06.862478" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:06.862159" elapsed="0.000472"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:06.862121" elapsed="0.000564"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:06.863052" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:06.862805" elapsed="0.000329"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:06.862771" elapsed="0.000399"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:06.839273" elapsed="0.024011">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:07.883180" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:07.882699" elapsed="0.000517"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:07.890917" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:07.890651" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:07.891387" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:07.891116" 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-08-22T23:24:07.900628" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:07.900831" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:24:07.901137" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:24:07.893958" elapsed="0.007747">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:07.891515" elapsed="0.010285">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:07.902094" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:07.901839" elapsed="0.000382"/>
</branch>
<status status="FAIL" start="2026-08-22T23:24:07.891491" elapsed="0.010781">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:07.903062" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:07.903315" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:24:07.903235" elapsed="0.000167"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:07.903200" 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-08-22T23:24:07.903760" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:07.903909" elapsed="0.000032"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:24:07.886205" elapsed="0.017924">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:07.904268" elapsed="0.000032"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:24:07.883466" elapsed="0.020969">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:07.904886" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:07.904572" elapsed="0.000432"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:07.904540" elapsed="0.000537"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:07.905481" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:07.905193" elapsed="0.000430"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:07.905160" elapsed="0.000514"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:07.882117" elapsed="0.023689">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:08.924615" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:08.924106" elapsed="0.000547"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:08.931988" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:08.931724" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:08.932473" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:08.932218" 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-08-22T23:24:08.941536" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:08.941720" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:24:08.941908" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:24:08.934945" elapsed="0.007359">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:08.932618" elapsed="0.009780">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:08.942624" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:08.942438" elapsed="0.000256"/>
</branch>
<status status="FAIL" start="2026-08-22T23:24:08.932592" elapsed="0.010127">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:08.943119" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:08.943263" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:24:08.943221" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:08.943203" elapsed="0.000129"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:08.943493" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:08.943568" elapsed="0.000031"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:24:08.927356" elapsed="0.016338">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:08.943766" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:24:08.924890" elapsed="0.018972">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:08.944093" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:08.943942" elapsed="0.000234"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:08.943926" elapsed="0.000274"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:08.944407" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:08.944254" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:08.944238" elapsed="0.000255"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:08.923543" elapsed="0.021029">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:09.963434" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:09.962855" elapsed="0.000618"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:09.970739" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:09.970461" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:09.971190" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:09.970940" 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-08-22T23:24:09.980224" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:09.980390" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:24:09.980600" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:24:09.973608" elapsed="0.007385">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:09.971336" elapsed="0.009748">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:09.981281" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:09.981122" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-08-22T23:24:09.971310" elapsed="0.010064">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:09.981775" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:09.981917" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:24:09.981875" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:09.981858" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:09.982128" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:09.982200" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:24:09.966147" elapsed="0.016160">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:09.982378" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:24:09.963736" elapsed="0.018736">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:09.982713" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:09.982552" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:09.982535" elapsed="0.000260"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:09.982990" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:09.982849" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:09.982834" elapsed="0.000241"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:09.962269" elapsed="0.020885">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:11.002296" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:11.001824" elapsed="0.000508"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:11.011788" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:11.011507" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:11.012241" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:11.011990" 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-08-22T23:24:11.021346" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:11.021510" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:24:11.021738" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:24:11.014460" elapsed="0.007681">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:11.012364" elapsed="0.009865">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:11.022489" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:11.022268" elapsed="0.000297"/>
</branch>
<status status="FAIL" start="2026-08-22T23:24:11.012339" elapsed="0.010267">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:11.023024" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:11.023244" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:24:11.023182" elapsed="0.000124"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:11.023151" elapsed="0.000185"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:11.023533" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:11.023651" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:24:11.005214" elapsed="0.018586">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:11.023896" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:24:11.002607" elapsed="0.021418">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:11.024331" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:11.024133" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:11.024110" elapsed="0.000329"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:11.024725" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:11.024512" elapsed="0.000291"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:11.024491" elapsed="0.000345"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:11.001271" elapsed="0.023671">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:12.043565" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:12.043093" elapsed="0.000522"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:12.052463" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:12.052160" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:12.052976" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:12.052705" elapsed="0.000334"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:24:12.065443" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:12.065809" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:24:12.066148" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:24:12.056325" elapsed="0.010413">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:12.053149" elapsed="0.013712">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:12.067174" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:12.066916" elapsed="0.000351"/>
</branch>
<status status="FAIL" start="2026-08-22T23:24:12.053114" elapsed="0.014189">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:12.067907" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:12.068117" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:24:12.068053" elapsed="0.000130"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:12.068024" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:12.068419" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:12.068518" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:24:12.046730" elapsed="0.021959">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:12.068786" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:24:12.043853" elapsed="0.025066">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:12.069235" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:12.069030" elapsed="0.000285"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:12.069007" elapsed="0.000343"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:12.069663" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:12.069427" elapsed="0.000318"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:12.069404" elapsed="0.000375"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:12.042546" elapsed="0.027343">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:13.088850" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:13.088321" elapsed="0.000565"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:13.098155" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:13.097831" elapsed="0.000384"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:13.098737" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:13.098406" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:24:13.109197" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:13.109359" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:24:13.109556" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:24:13.101771" elapsed="0.008293">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:13.098896" elapsed="0.011255">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:13.110350" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:13.110190" elapsed="0.000229"/>
</branch>
<status status="FAIL" start="2026-08-22T23:24:13.098864" elapsed="0.011580">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:13.110870" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:13.111015" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:24:13.110973" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:13.110955" elapsed="0.000128"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:13.111227" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:13.111300" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:24:13.092293" elapsed="0.019115">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:13.111481" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:24:13.089126" elapsed="0.022468">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:13.111825" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:13.111679" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:13.111662" elapsed="0.000246"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:13.112105" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:13.111962" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:13.111947" elapsed="0.000239"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:13.087624" elapsed="0.024641">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:14.130353" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:14.129869" elapsed="0.000518"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:14.137664" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:14.137390" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:14.138108" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:14.137864" 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-08-22T23:24:14.148120" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:14.148278" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:24:14.148451" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:24:14.140517" elapsed="0.008341">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:14.138232" elapsed="0.010709">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:14.149140" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:14.148977" elapsed="0.000230"/>
</branch>
<status status="FAIL" start="2026-08-22T23:24:14.138207" elapsed="0.011025">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:14.149620" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:14.149760" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:24:14.149720" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:14.149703" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:14.149969" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:14.150041" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:24:14.133061" elapsed="0.017085">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:14.150217" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:24:14.130637" elapsed="0.019674">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:14.150534" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:14.150391" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:14.150374" elapsed="0.000256"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:14.150826" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:14.150684" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:14.150669" elapsed="0.000237"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:14.129308" elapsed="0.021676">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:15.167553" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:15.166873" elapsed="0.000748"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:15.175079" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:15.174820" elapsed="0.000382"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:15.175645" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:15.175368" 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-08-22T23:24:15.184109" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:15.184272" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:24:15.184455" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:24:15.178061" elapsed="0.006806">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:15.175778" elapsed="0.009172">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:15.185144" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:15.184986" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-08-22T23:24:15.175753" elapsed="0.009482">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:15.185631" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:15.185770" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:24:15.185731" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:15.185713" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:15.185980" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:15.186052" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:24:15.170448" elapsed="0.015709">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:15.186227" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:24:15.167945" elapsed="0.018376">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:15.186544" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:15.186400" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:15.186383" elapsed="0.000257"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:15.186836" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:15.186694" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:15.186678" elapsed="0.000237"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:15.166149" elapsed="0.020843">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:16.206103" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:16.205574" elapsed="0.000568"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:16.214655" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:16.214347" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:16.215218" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:16.214955" 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-08-22T23:24:16.224245" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:16.224436" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:24:16.224822" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:24:16.217753" elapsed="0.007550">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:16.215353" elapsed="0.010065">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:16.225730" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:16.225474" elapsed="0.000335"/>
</branch>
<status status="FAIL" start="2026-08-22T23:24:16.215326" elapsed="0.010508">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:16.226262" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:16.226441" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:24:16.226399" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:16.226378" 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-08-22T23:24:16.226687" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:16.226776" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:24:16.208949" elapsed="0.017952">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:16.226973" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:24:16.206426" elapsed="0.020644">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:16.227299" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:16.227149" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:16.227133" elapsed="0.000247"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:16.227594" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:16.227434" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:16.227418" elapsed="0.000260"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:16.204943" elapsed="0.022817">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:17.247213" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:17.246750" elapsed="0.000498"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:17.254525" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:17.254264" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:17.254991" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:17.254743" 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-08-22T23:24:17.263778" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:17.263944" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:24:17.264122" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:24:17.257463" elapsed="0.007048">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:17.255118" elapsed="0.009494">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:17.264807" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:17.264649" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:24:17.255094" elapsed="0.009804">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:17.265288" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:17.265427" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:24:17.265387" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:17.265369" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:17.265663" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:17.265735" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:24:17.249928" elapsed="0.015912">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:17.265909" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:24:17.247480" elapsed="0.018524">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:17.266226" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:17.266083" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:17.266066" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:17.266499" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:17.266360" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:17.266344" elapsed="0.000249"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:17.246113" elapsed="0.020561">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:18.287849" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:18.287302" elapsed="0.000588"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:18.296075" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:18.295707" elapsed="0.000436"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:18.296723" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:18.296356" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:24:18.310261" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:18.310437" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:24:18.310674" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:24:18.301987" elapsed="0.009115">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:18.296953" elapsed="0.014237">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:18.311385" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:18.311229" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:24:18.296910" elapsed="0.014565">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:18.311881" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:18.312026" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:24:18.311982" elapsed="0.000092"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:18.311965" elapsed="0.000131"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:18.312239" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:18.312309" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:24:18.290675" elapsed="0.021744">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:18.312488" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:24:18.288137" elapsed="0.024459">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:18.312823" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:18.312678" elapsed="0.000246"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:18.312662" elapsed="0.000286"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:18.313148" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:18.313003" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:18.312988" elapsed="0.000239"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:18.286675" elapsed="0.026631">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:19.334209" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:19.333731" elapsed="0.000514"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:19.341692" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:19.341416" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:19.342139" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:19.341894" 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-08-22T23:24:19.350748" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:19.350909" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:24:19.351094" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:24:19.344558" elapsed="0.006921">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:19.342265" elapsed="0.009297">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:19.351773" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:19.351615" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-08-22T23:24:19.342241" elapsed="0.009624">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:19.352302" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:19.352443" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:24:19.352402" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:19.352385" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:19.352669" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:19.352741" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:24:19.337099" elapsed="0.015749">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:19.352918" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:24:19.334478" elapsed="0.018535">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:19.353234" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:19.353092" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:19.353076" elapsed="0.000284"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:19.353674" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:19.353453" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:19.353425" elapsed="0.000361"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:19.333169" elapsed="0.020725">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:20.372275" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:20.371770" elapsed="0.000542"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:20.381529" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:20.381258" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:20.382008" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:20.381751" 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-08-22T23:24:20.389922" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:20.390115" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:24:20.390331" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:24:20.384466" elapsed="0.006295">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:20.382140" elapsed="0.008712">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:20.391080" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:20.390893" elapsed="0.000259"/>
</branch>
<status status="FAIL" start="2026-08-22T23:24:20.382113" elapsed="0.009064">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:20.391693" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:20.391846" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:24:20.391803" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:20.391784" elapsed="0.000129"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:20.392066" elapsed="0.000037"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:20.392162" elapsed="0.000018"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:24:20.376844" elapsed="0.015434">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:20.392350" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:24:20.372555" elapsed="0.019891">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:20.392691" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:20.392526" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:20.392509" elapsed="0.000264"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:20.392969" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:20.392827" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:20.392812" elapsed="0.000236"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:20.371139" elapsed="0.021997">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:21.411708" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:21.411173" elapsed="0.000578"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:21.419443" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:21.419161" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:21.419985" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:21.419699" elapsed="0.000334"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:24:21.429239" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:21.429417" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:24:21.429651" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:24:21.422466" elapsed="0.007624">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:21.420118" elapsed="0.010064">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:21.430412" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:21.430220" elapsed="0.000269"/>
</branch>
<status status="FAIL" start="2026-08-22T23:24:21.420093" elapsed="0.010430">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:21.430991" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:21.431179" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:24:21.431117" elapsed="0.000109"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:21.431097" elapsed="0.000151"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:21.431396" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:21.431468" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:24:21.414518" elapsed="0.017103">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:21.431697" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:24:21.412009" elapsed="0.019785">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:21.432034" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:21.431874" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:21.431857" elapsed="0.000268"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:21.432326" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:21.432182" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:21.432165" elapsed="0.000244"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:21.410499" elapsed="0.021991">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:22.450776" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:22.450287" elapsed="0.000524"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:22.458185" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:22.457905" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:22.458660" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:22.458386" 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-08-22T23:24:22.466726" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:22.466893" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:24:22.467077" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:24:22.461041" elapsed="0.006431">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:22.458785" elapsed="0.008770">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:22.467774" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:22.467614" elapsed="0.000228"/>
</branch>
<status status="FAIL" start="2026-08-22T23:24:22.458761" elapsed="0.009106">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:22.468249" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:22.468390" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:24:22.468349" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:22.468331" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:22.468616" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:22.468689" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:24:22.453461" elapsed="0.015334">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:24:22.468867" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:24:22.451047" elapsed="0.017916">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:22.469186" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:22.469044" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:22.469027" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:22.469465" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:22.469321" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:22.469306" elapsed="0.000239"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:22.449730" elapsed="0.019908">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<msg time="2026-08-22T23:24:22.469735" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>60s</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:23:22.061098" elapsed="60.408733">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<doc>Check that the modified device data make their way into the checker node.</doc>
<status status="FAIL" start="2026-08-22T23:23:21.834264" elapsed="60.635729">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</test>
<test id="s1-s2-t18" name="Check_Modified_Device_Data_Is_Visible_On_Configurer" line="188">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:24:22.473272" elapsed="0.000214"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:24:22.473008" 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-08-22T23:24:22.474719" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:24:22.474536" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:22.474510" elapsed="0.000307"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:24:22.484231" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:24:22.484078" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:22.484052" elapsed="0.000276"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:24:22.486197" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:24:22.485329" elapsed="0.000915"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:24:22.486835" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:24:22.486462" elapsed="0.000402"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:24:22.486920" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:24:22.487105" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:24:22.484687" elapsed="0.002445"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:24:22.493369" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:24:22.493260" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:22.493241" 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-08-22T23:24:22.494690" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:24:22.494557" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:22.494539" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:24:22.495226" 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-08-22T23:24:22.494901" elapsed="0.000352"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:24:22.495655" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:24:22.495409" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:24:22.522223" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:24:22.496165" elapsed="0.026181"/>
</kw>
<msg time="2026-08-22T23:24:22.522525" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:24:22.522572" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:24:22.495837" elapsed="0.026793"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:24:22.541774" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:24:22.523162" elapsed="0.018723"/>
</kw>
<msg time="2026-08-22T23:24:22.542076" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:24:22.542122" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:24:22.522812" elapsed="0.019347"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:22.542459" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:22.542236" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:22.542216" elapsed="0.000321"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:22.543006" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:22.542700" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:22.543357" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:22.543146" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:22.543127" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:24:22.543467" 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-08-22T23:24:22.546222" elapsed="0.000149"/>
</kw>
<msg time="2026-08-22T23:24:22.546488" 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-08-22T23:24:22.544990" elapsed="0.001676"/>
</kw>
<kw name="Open 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-08-22T23:24:22.547102" elapsed="0.000089"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:22.547478" elapsed="0.000087"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:24:22.544292" elapsed="0.003447"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:24:22.543759" elapsed="0.004047"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:24:22.494254" elapsed="0.053652"/>
</kw>
<msg time="2026-08-22T23:24:22.547997" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:24:22.548041" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:24:22.493601" elapsed="0.054477"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:24:22.548261" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:24:22.548154" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:22.548136" 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-08-22T23:24:22.548893" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:22.549225" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:24:22.549296" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:24:22.492919" elapsed="0.056486"/>
</kw>
<msg time="2026-08-22T23:24:22.549497" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:24:22.549540" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:24:22.487568" elapsed="0.062027"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:22.549921" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:22.549673" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:22.549656" elapsed="0.000361"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:24:22.487401" elapsed="0.062649"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:24:22.555498" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:24:22.555389" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:22.555368" 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-08-22T23:24:22.556844" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:24:22.556736" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:22.556718" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:24:22.557362" 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-08-22T23:24:22.557052" elapsed="0.000337"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:24:22.557784" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:24:22.557543" elapsed="0.000268"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:24:22.589830" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:24:22.558328" elapsed="0.031621"/>
</kw>
<msg time="2026-08-22T23:24:22.590166" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:24:22.590212" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:24:22.557968" elapsed="0.032282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:24:22.614648" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:24:22.590884" elapsed="0.023948"/>
</kw>
<msg time="2026-08-22T23:24:22.615008" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:24:22.615055" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:24:22.590443" elapsed="0.024649"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:22.615421" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:22.615184" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:22.615158" elapsed="0.000345"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:22.615979" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:22.615666" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:22.616335" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:22.616120" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:22.616102" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:24:22.616449" 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-08-22T23:24:22.619192" elapsed="0.000145"/>
</kw>
<msg time="2026-08-22T23:24:22.619400" 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-08-22T23:24:22.618039" 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-08-22T23:24:22.619867" elapsed="0.000090"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:22.620240" 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-08-22T23:24:22.617311" 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-08-22T23:24:22.616762" elapsed="0.003755"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:24:22.556301" elapsed="0.064349"/>
</kw>
<msg time="2026-08-22T23:24:22.620745" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:24:22.620791" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:24:22.555732" elapsed="0.065097"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:24:22.621015" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:24:22.620907" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:22.620888" 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-08-22T23:24:22.621738" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:22.622106" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:24:22.622181" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:24:22.555046" elapsed="0.067246"/>
</kw>
<msg time="2026-08-22T23:24:22.622388" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:24:22.622432" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:24:22.550318" elapsed="0.072152"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:22.622951" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:22.622545" elapsed="0.000461"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:22.622527" elapsed="0.000503"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:24:22.550182" elapsed="0.072872"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:24:22.628631" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:24:22.628503" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:22.628484" elapsed="0.000254"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:24:22.629901" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:24:22.629793" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:22.629775" elapsed="0.000222"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:24:22.630469" 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-08-22T23:24:22.630143" elapsed="0.000353"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:24:22.630893" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:24:22.630668" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:24:22.656225" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:24:22.631409" elapsed="0.025278"/>
</kw>
<msg time="2026-08-22T23:24:22.657168" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:24:22.657280" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:24:22.631077" elapsed="0.026289"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:24:22.674644" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:24:22.658862" elapsed="0.015907"/>
</kw>
<msg time="2026-08-22T23:24:22.674942" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:24:22.674989" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:24:22.657900" elapsed="0.017127"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:22.675397" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:22.675130" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:22.675099" elapsed="0.000385"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:22.675976" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:22.675658" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:22.676337" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:22.676121" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:22.676102" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:24:22.676455" 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-08-22T23:24:22.679382" elapsed="0.000158"/>
</kw>
<msg time="2026-08-22T23:24:22.679630" 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-08-22T23:24:22.678149" elapsed="0.001641"/>
</kw>
<kw name="Open 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-08-22T23:24:22.680098" elapsed="0.000089"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:22.680473" 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-08-22T23:24:22.677398" 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-08-22T23:24:22.676813" 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-08-22T23:24:22.629466" elapsed="0.051425"/>
</kw>
<msg time="2026-08-22T23:24:22.680991" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:24:22.681037" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:24:22.628890" elapsed="0.052191"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:24:22.681270" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:24:22.681161" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:22.681141" 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-08-22T23:24:22.681891" 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-08-22T23:24:22.682526" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:24:22.682628" 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-08-22T23:24:22.628157" elapsed="0.054587"/>
</kw>
<msg time="2026-08-22T23:24:22.682843" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:24:22.682887" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:24:22.623320" elapsed="0.059605"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:22.683255" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:22.683003" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:22.682985" elapsed="0.000347"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:24:22.623181" elapsed="0.060176"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:24:22.487199" elapsed="0.196194"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:24:22.483547" elapsed="0.199914"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:24:22.474180" elapsed="0.209344"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:24:22.473713" elapsed="0.209874"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:24:22.470825" elapsed="0.212823"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:22.696526" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:22.696126" elapsed="0.000429"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:22.703873" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:22.703616" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:22.704317" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:22.704071" 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-08-22T23:24:22.726070" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:22.726381" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:22.726649" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:22.706523" elapsed="0.020192"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:22.704438" elapsed="0.022407"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:22.727280" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:22.726911" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:22.704418" elapsed="0.023072"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:22.733795" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:22.730091" elapsed="0.003773"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:22.729452" elapsed="0.004473"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:22.729408" elapsed="0.004554"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:22.737670" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:22.734430" elapsed="0.003305"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:22.734118" elapsed="0.003667"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:22.734093" elapsed="0.003727"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:22.738667" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:22.738084" 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-08-22T23:24:22.739140" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:22.738807" elapsed="0.000415"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:22.739989" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:22.739539" elapsed="0.000489"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:22.739257" elapsed="0.000822"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:22.738781" elapsed="0.001329"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:22.740909" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:22.740333" 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-08-22T23:24:22.741373" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:22.741049" elapsed="0.000404"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:22.742181" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:22.741729" elapsed="0.000488"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:22.741488" elapsed="0.000780"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:22.741022" elapsed="0.001276"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:24:22.742459" elapsed="0.000394"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:22.743332" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:22.743017" 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-08-22T23:24:22.743512" elapsed="0.002338"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:24:22.728394" elapsed="0.017543"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:22.746125" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:24:22.746013" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:22.745994" 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-08-22T23:24:22.746367" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:22.746438" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:24:22.748866" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:22.699258" elapsed="0.049638"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:22.748955" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:24:22.749107" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:22.696789" elapsed="0.052345"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:22.749806" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:22.749415" elapsed="0.000492">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:22.749204" elapsed="0.000785">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:22.749187" elapsed="0.000836">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:22.750282" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:22.750131" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:22.750113" elapsed="0.000251"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:22.695710" elapsed="0.054742">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:23.767303" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:23.766810" elapsed="0.000530"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:23.774938" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:23.774672" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:23.775398" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:23.775142" 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-08-22T23:24:23.797098" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:23.797426" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:23.797714" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:23.777640" elapsed="0.020137"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:23.775525" elapsed="0.022354"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:23.798296" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:23.797943" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:23.775499" elapsed="0.023011"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:23.806494" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:23.800974" elapsed="0.005574"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:23.800414" elapsed="0.006188"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:23.800372" elapsed="0.006261"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:23.809326" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:23.806941" elapsed="0.002434"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:23.806702" elapsed="0.002709"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:23.806683" elapsed="0.002754"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:23.810075" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:23.809650" 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-08-22T23:24:23.810422" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:23.810176" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:23.811019" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:23.810706" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:23.810516" elapsed="0.000568"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:23.810157" elapsed="0.000949"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:23.811689" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:23.811265" 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-08-22T23:24:23.812032" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:23.811795" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:23.812618" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:23.812284" elapsed="0.000362"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:23.812117" elapsed="0.000630"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:23.811776" 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-08-22T23:24:23.812938" elapsed="0.000396"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:23.813853" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:23.813521" 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-08-22T23:24:23.814044" elapsed="0.002372"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:24:23.799385" elapsed="0.017120"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:23.816752" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-08-22T23:24:23.816615" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:23.816567" 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-08-22T23:24:23.817012" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:23.817087" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:24:23.819477" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:23.770120" elapsed="0.049389"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:23.819571" elapsed="0.000045"/>
</return>
<msg time="2026-08-22T23:24:23.819748" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:23.767593" elapsed="0.052182"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:23.820446" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:23.820065" elapsed="0.000472">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:23.819849" elapsed="0.000780">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:23.819831" elapsed="0.000836">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:23.820892" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:23.820741" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:23.820724" elapsed="0.000250"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:23.766226" elapsed="0.054833">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:24.840601" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:24.840092" elapsed="0.000547"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:24.847960" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:24.847697" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:24.848410" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:24.848162" 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-08-22T23:24:24.869043" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:24.869298" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:24.869438" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:24.850646" elapsed="0.018852"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:24.848553" elapsed="0.021091"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:24.870062" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:24.869714" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:24.848511" elapsed="0.021749"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:24.878257" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:24.872668" elapsed="0.005700"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:24.872087" elapsed="0.006366"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:24.872045" elapsed="0.006465"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:24.882906" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:24.879174" elapsed="0.003779"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:24.878674" elapsed="0.004315"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:24.878634" elapsed="0.004381"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:24.883648" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:24.883202" 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-08-22T23:24:24.883987" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:24.883748" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:24.884558" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:24.884232" elapsed="0.000370"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:24.884071" elapsed="0.000570"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:24.883730" elapsed="0.000933"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:24.885190" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:24.884821" 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-08-22T23:24:24.885521" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:24.885288" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:24.886087" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:24.885790" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:24.885629" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:24.885270" 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-08-22T23:24:24.886325" elapsed="0.000368"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:24.887168" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:24.886857" 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-08-22T23:24:24.887347" 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-08-22T23:24:24.871093" elapsed="0.018852"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:24.890128" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:24:24.890015" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:24.889997" 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-08-22T23:24:24.890377" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:24.890453" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:24:24.892854" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:24.843356" elapsed="0.049527"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:24.892978" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:24:24.893134" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:24.840875" elapsed="0.052287"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:24.893830" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:24.893442" elapsed="0.000475">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:24.893233" elapsed="0.000760">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:24.893216" elapsed="0.000812">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:24.894246" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:24.894099" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:24.894082" elapsed="0.000245"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:24.839545" elapsed="0.054868">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:25.914137" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:25.913647" elapsed="0.000527"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:25.921385" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:25.921128" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:25.921849" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:25.921602" 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-08-22T23:24:25.945223" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:25.945511" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:25.945761" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:25.924067" elapsed="0.021752"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:25.921977" elapsed="0.023938"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:25.946312" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:25.945976" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:25.921950" elapsed="0.024555"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:25.954741" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:25.948833" elapsed="0.006017"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:25.948321" elapsed="0.006608"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:25.948281" elapsed="0.006706"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:25.958426" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:25.955631" elapsed="0.002841"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:25.955112" elapsed="0.003395"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:25.955076" elapsed="0.003456"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:25.959143" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:25.958727" 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-08-22T23:24:25.959561" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:25.959318" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:25.960177" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:25.959824" elapsed="0.000382"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:25.959663" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:25.959299" elapsed="0.000965"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:25.960809" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:25.960424" 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-08-22T23:24:25.961140" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:25.960908" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:25.961692" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:25.961378" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:25.961222" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:25.960890" elapsed="0.000886"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:24:25.961929" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:25.962768" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:25.962446" 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-08-22T23:24:25.962946" 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-08-22T23:24:25.947326" elapsed="0.018174"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:25.965700" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:24:25.965570" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:25.965551" 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-08-22T23:24:25.965946" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:25.966017" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:24:25.968393" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:25.916864" elapsed="0.051561"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:25.968487" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:24:25.968655" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:25.914415" elapsed="0.054267"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:25.969320" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:25.968957" elapsed="0.000448">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:25.968751" elapsed="0.000728">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:25.968734" elapsed="0.000781">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:25.969748" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:25.969601" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:25.969568" elapsed="0.000260"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:25.913064" elapsed="0.056849">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:26.987685" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:26.987185" elapsed="0.000534"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:26.995299" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:26.995023" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:26.995769" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:26.995500" 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-08-22T23:24:27.015907" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:27.016056" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:27.016158" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:26.997987" elapsed="0.018197"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:26.995901" elapsed="0.020326"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:27.016410" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:27.016257" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:26.995877" elapsed="0.020670"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:27.024641" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:27.018970" elapsed="0.005788"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:27.018436" elapsed="0.006401"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:27.018393" elapsed="0.006500"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:27.029085" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:27.025531" elapsed="0.003601"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:27.025017" elapsed="0.004149"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:27.024980" elapsed="0.004211"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:27.029791" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:27.029370" 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-08-22T23:24:27.030142" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:27.029890" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:27.030719" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:27.030390" elapsed="0.000357"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:27.030224" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:27.029871" elapsed="0.000933"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:27.031674" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:27.030961" elapsed="0.000746"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:27.032049" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:27.031795" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:27.032652" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:27.032291" elapsed="0.000389"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:27.032132" elapsed="0.000584"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:27.031768" 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-08-22T23:24:27.032891" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:27.033895" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:27.033482" 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-08-22T23:24:27.034075" elapsed="0.002343"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:24:27.017425" elapsed="0.019064"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:27.036691" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-08-22T23:24:27.036562" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:27.036543" 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-08-22T23:24:27.036939" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:27.037010" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:24:27.039410" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:26.990378" elapsed="0.049065"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:27.039508" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:24:27.039694" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:26.987952" elapsed="0.051769"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:27.040366" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:27.040002" elapsed="0.000442">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:27.039792" elapsed="0.000735">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:27.039775" elapsed="0.000793">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:27.040804" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:27.040657" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:27.040640" elapsed="0.000244"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:26.986701" elapsed="0.054265">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:28.059270" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:28.058781" elapsed="0.000525"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:28.066603" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:28.066316" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:28.067049" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:28.066805" 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-08-22T23:24:28.087231" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:28.087393" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:28.087638" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:28.069267" elapsed="0.018434"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:28.067175" elapsed="0.020625"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:28.088210" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:28.087863" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:28.067148" elapsed="0.021255"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:28.096400" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:28.090867" elapsed="0.005643"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:28.090216" elapsed="0.006407"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:28.090174" elapsed="0.006509"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:28.100946" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:28.097306" elapsed="0.003687"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:28.096811" elapsed="0.004218"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:28.096774" elapsed="0.004280"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:28.101669" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:28.101235" 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-08-22T23:24:28.102002" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:28.101768" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:28.102597" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:28.102255" elapsed="0.000373"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:28.102085" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:28.101750" elapsed="0.000937"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:28.103215" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:28.102844" 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-08-22T23:24:28.103549" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:28.103312" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:28.104101" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:28.103806" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:28.103648" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:28.103294" 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-08-22T23:24:28.104353" elapsed="0.000489"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:28.105315" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:28.105006" 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-08-22T23:24:28.105492" 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-08-22T23:24:28.089231" elapsed="0.018829"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:28.108243" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:24:28.108130" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:28.108112" 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-08-22T23:24:28.108492" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:28.108562" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:24:28.110959" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:28.061970" elapsed="0.049018"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:28.111048" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:24:28.111197" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:28.059542" elapsed="0.051682"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:28.111925" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:28.111541" elapsed="0.000470">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:28.111332" elapsed="0.000755">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:28.111315" elapsed="0.000812">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:28.112345" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:28.112198" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:28.112180" elapsed="0.000246"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:28.058206" elapsed="0.054303">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:29.132295" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:29.131845" elapsed="0.000483"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:29.139561" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:29.139305" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:29.140021" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:29.139775" 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-08-22T23:24:29.161550" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:29.161722" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:29.161822" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:29.142208" elapsed="0.019640"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:29.140141" elapsed="0.021752"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:29.162105" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:29.161945" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:29.140119" elapsed="0.022074"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:29.167698" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:29.163226" elapsed="0.004522"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:29.163005" elapsed="0.004780"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:29.162986" elapsed="0.004824"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:29.170457" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:29.168088" elapsed="0.002424"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:29.167867" elapsed="0.002689"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:29.167850" elapsed="0.002755"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:29.171191" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:29.170794" 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-08-22T23:24:29.171546" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:29.171290" elapsed="0.000388"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:29.172170" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:29.171869" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:29.171706" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:29.171272" elapsed="0.000984"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:29.172795" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:29.172412" 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-08-22T23:24:29.173125" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:29.172893" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:29.173696" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:29.173364" elapsed="0.000359"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:29.173207" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:29.172875" 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-08-22T23:24:29.173943" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:29.174770" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:29.174457" 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-08-22T23:24:29.174948" elapsed="0.002536"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:24:29.162557" elapsed="0.014991"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:29.177746" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:24:29.177636" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:29.177617" 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-08-22T23:24:29.178010" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:29.178082" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:24:29.180383" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:29.134994" elapsed="0.045418"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:29.180471" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:24:29.180642" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:29.132570" elapsed="0.048099"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:29.181302" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:29.180945" elapsed="0.000434">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:29.180738" elapsed="0.000712">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:29.180721" elapsed="0.000763">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:29.181712" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:29.181552" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:29.181535" elapsed="0.000256"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:29.131340" elapsed="0.050532">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:30.199754" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:30.199262" elapsed="0.000670"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:30.207408" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:30.207145" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:30.207875" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:30.207626" 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-08-22T23:24:30.228160" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:30.228315" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:30.228416" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:30.210203" elapsed="0.018240"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:30.208001" elapsed="0.020487"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:30.228864" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:30.228522" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:30.207975" elapsed="0.021090"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:30.236959" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:30.231408" elapsed="0.005661"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:30.230912" elapsed="0.006235"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:30.230869" elapsed="0.006334"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:30.240277" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:30.237922" elapsed="0.002403"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:30.237373" elapsed="0.002987"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:30.237332" elapsed="0.003054"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:30.240980" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:30.240563" 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-08-22T23:24:30.241329" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:30.241079" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:30.241896" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:30.241593" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:30.241413" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:30.241061" elapsed="0.000922"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:30.242510" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:30.242140" 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-08-22T23:24:30.242861" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:30.242628" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:30.243403" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:30.243104" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:30.242943" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:30.242607" 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-08-22T23:24:30.243657" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:30.244475" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:30.244173" 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-08-22T23:24:30.244729" 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-08-22T23:24:30.229931" elapsed="0.017270"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:30.247386" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:24:30.247272" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:30.247254" 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-08-22T23:24:30.247651" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:30.247726" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:24:30.250120" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:30.202631" elapsed="0.047518"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:30.250210" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:24:30.250362" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:30.200175" elapsed="0.050214"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:30.251054" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:30.250683" elapsed="0.000453">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:30.250459" elapsed="0.000752">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:30.250442" elapsed="0.000805">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:30.251466" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:30.251318" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:30.251301" elapsed="0.000247"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:30.198727" elapsed="0.052922">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:31.272547" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:31.272031" elapsed="0.000574"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:31.279932" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:31.279668" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:31.280381" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:31.280133" 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-08-22T23:24:31.301956" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:31.302134" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:31.302238" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:31.282669" elapsed="0.019595"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:31.280508" elapsed="0.021891"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:31.302616" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:31.302438" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:31.280481" elapsed="0.022228"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:31.306252" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:31.303767" elapsed="0.002535"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:31.303519" elapsed="0.002819"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:31.303500" elapsed="0.002863"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:31.309029" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:31.306660" elapsed="0.002415"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:31.306420" elapsed="0.002691"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:31.306404" elapsed="0.002733"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:31.309766" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:31.309323" 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-08-22T23:24:31.310103" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:31.309865" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:31.310675" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:31.310349" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:31.310187" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:31.309847" elapsed="0.000915"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:31.311289" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:31.310921" 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-08-22T23:24:31.311638" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:31.311387" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:31.312181" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:31.311883" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:31.311723" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:31.311370" 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-08-22T23:24:31.312422" elapsed="0.000400"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:31.313302" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:31.312988" 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-08-22T23:24:31.313484" 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-08-22T23:24:31.303085" elapsed="0.013126"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:31.316397" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-08-22T23:24:31.316283" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:31.316264" 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-08-22T23:24:31.316686" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:31.316769" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:24:31.319131" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:31.275327" elapsed="0.043837"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:31.319227" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:24:31.319391" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:31.272877" elapsed="0.046542"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:31.320130" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:31.319737" elapsed="0.000531">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:31.319494" elapsed="0.000858">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:31.319475" elapsed="0.000917">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:31.320642" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:31.320469" elapsed="0.000251"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:31.320449" elapsed="0.000297"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:31.271427" elapsed="0.049413">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:32.339855" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:32.339338" elapsed="0.000554"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:32.347249" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:32.346987" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:32.347718" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:32.347450" 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-08-22T23:24:32.368996" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:32.369312" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:32.369534" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:32.349958" elapsed="0.019666"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:32.347847" elapsed="0.021877"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:32.370133" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:32.369789" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:32.347821" elapsed="0.022519"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:32.377891" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:32.372720" elapsed="0.005241"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:32.372190" elapsed="0.005821"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:32.372148" elapsed="0.005898"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:32.381665" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:32.378433" elapsed="0.003298"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:32.378125" elapsed="0.003654"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:32.378102" elapsed="0.003712"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:32.382640" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:32.382056" 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-08-22T23:24:32.383109" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:32.382779" elapsed="0.000409"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:32.383888" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:32.383443" elapsed="0.000484"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:32.383222" elapsed="0.000756"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:32.382754" elapsed="0.001363"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:32.384891" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:32.384353" 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-08-22T23:24:32.385353" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:32.385029" elapsed="0.000404"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:32.386127" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:32.385709" elapsed="0.000455"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:32.385467" elapsed="0.000748"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:32.385003" 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-08-22T23:24:32.386460" elapsed="0.000533"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:32.387666" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:32.387224" 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-08-22T23:24:32.387917" 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-08-22T23:24:32.371186" elapsed="0.019387"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:32.390771" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:24:32.390660" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:32.390641" 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-08-22T23:24:32.391015" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:32.391086" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:24:32.393624" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:32.342629" elapsed="0.051026"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:32.393716" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:24:32.393868" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:32.340149" elapsed="0.053746"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:32.394541" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:32.394174" elapsed="0.000469">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:32.393965" elapsed="0.000755">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:32.393948" elapsed="0.000806">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:32.394970" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:32.394823" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:32.394806" elapsed="0.000244"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:32.338766" elapsed="0.056369">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:33.418618" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:33.417959" elapsed="0.000709"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:33.429618" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:33.429098" elapsed="0.000593"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:33.430246" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:33.429911" 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-08-22T23:24:33.463144" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:33.463739" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:33.464315" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:33.433319" elapsed="0.031065"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:33.430424" elapsed="0.034118"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:33.465227" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:33.464663" elapsed="0.000722"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:33.430380" elapsed="0.035056"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:33.475190" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:33.469178" elapsed="0.006178"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:33.468481" elapsed="0.007049"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:33.468418" elapsed="0.007226"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:33.479170" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:33.476487" elapsed="0.002759"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:33.475831" elapsed="0.003465"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:33.475776" elapsed="0.003553"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:33.480234" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:33.479676" 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-08-22T23:24:33.480658" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:33.480363" elapsed="0.000355"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:33.481228" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:33.480914" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:33.480746" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:33.480334" elapsed="0.000980"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:33.481865" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:33.481475" 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-08-22T23:24:33.482199" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:33.481965" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:33.482758" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:33.482440" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:33.482281" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:33.481945" 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-08-22T23:24:33.483026" elapsed="0.000359"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:33.483917" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:33.483570" 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-08-22T23:24:33.484099" 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-08-22T23:24:33.466958" elapsed="0.019778"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:33.487055" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-08-22T23:24:33.486926" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:33.486904" 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-08-22T23:24:33.487325" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:33.487397" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:24:33.489938" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:33.422410" elapsed="0.067559"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:33.490034" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:24:33.490196" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:33.419010" elapsed="0.071213"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:33.490966" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:33.490517" elapsed="0.000543">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:33.490296" elapsed="0.000842">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:33.490279" elapsed="0.000894">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:33.491395" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:33.491244" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:33.491227" elapsed="0.000265"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:33.417159" elapsed="0.074440">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:34.513465" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:34.512973" elapsed="0.000528"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:34.520990" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:34.520730" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:34.521435" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:34.521190" 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-08-22T23:24:34.543312" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:34.543670" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:34.543908" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:34.523724" elapsed="0.020245"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:34.521561" elapsed="0.022512"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:34.544508" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:34.544140" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:34.521534" elapsed="0.023218"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:34.552596" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:34.547388" elapsed="0.005279"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:34.546807" elapsed="0.005910"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:34.546763" elapsed="0.005989"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:34.556359" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:34.553139" elapsed="0.003285"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:34.552830" elapsed="0.003643"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:34.552807" elapsed="0.003700"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:34.557331" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:34.556769" 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-08-22T23:24:34.557820" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:34.557467" elapsed="0.000434"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:34.558597" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:34.558158" elapsed="0.000479"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:34.557935" elapsed="0.000753"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:34.557442" elapsed="0.001276"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:34.559462" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:34.558953" 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-08-22T23:24:34.559941" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:34.559617" elapsed="0.000403"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:34.560709" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:34.560272" elapsed="0.000474"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:34.560054" elapsed="0.000742"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:34.559572" elapsed="0.001254"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:24:34.561036" elapsed="0.000482"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:34.562183" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:34.561766" 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-08-22T23:24:34.562432" elapsed="0.002889"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:24:34.545753" elapsed="0.019634"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:34.565566" elapsed="0.000055"/>
</return>
<status status="PASS" start="2026-08-22T23:24:34.565457" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:34.565439" 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-08-22T23:24:34.565837" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:34.565909" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:24:34.568478" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:34.516245" elapsed="0.052266"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:34.568590" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:24:34.568756" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:34.513765" elapsed="0.055017"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:34.569432" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:34.569067" elapsed="0.000453">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:34.568852" elapsed="0.000807">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:34.568835" elapsed="0.000863">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:34.569918" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:34.569770" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:34.569752" elapsed="0.000246"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:34.512372" elapsed="0.057709">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:35.589955" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:35.589263" elapsed="0.000741"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:35.598913" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:35.598652" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:35.599362" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:35.599115" 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-08-22T23:24:35.619595" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:35.619813" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:35.619949" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:35.601562" elapsed="0.018421"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:35.599489" elapsed="0.020551"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:35.620290" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:35.620081" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:35.599463" elapsed="0.020940"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:35.625321" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:35.621781" elapsed="0.003607"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:35.621464" elapsed="0.003970"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:35.621440" elapsed="0.004027"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:35.628974" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:35.625850" elapsed="0.003184"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:35.625540" elapsed="0.003538"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:35.625518" elapsed="0.003592"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:35.629904" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:35.629345" 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-08-22T23:24:35.630386" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:35.630033" elapsed="0.000431"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:35.631124" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:35.630736" elapsed="0.000423"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:35.630497" elapsed="0.000709"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:35.630009" elapsed="0.001225"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:35.631927" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:35.631442" elapsed="0.000519"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:35.632452" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:35.632144" elapsed="0.000382"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:35.633178" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:35.632789" elapsed="0.000422"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:35.632557" elapsed="0.000702"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:35.632119" elapsed="0.001168"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:24:35.633490" elapsed="0.000485"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:35.634638" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:35.634194" 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-08-22T23:24:35.634886" elapsed="0.003194"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:24:35.620919" elapsed="0.017247"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:35.638451" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-08-22T23:24:35.638300" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:35.638273" 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-08-22T23:24:35.638797" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:35.638893" elapsed="0.000022"/>
</return>
<msg time="2026-08-22T23:24:35.642054" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:35.594090" elapsed="0.048005"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:35.642177" elapsed="0.000055"/>
</return>
<msg time="2026-08-22T23:24:35.642411" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:35.590367" elapsed="0.052082"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:35.643318" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:35.642848" elapsed="0.000580">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:35.642547" elapsed="0.000979">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:35.642522" elapsed="0.001050">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:35.643880" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:35.643688" elapsed="0.000264"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:35.643664" elapsed="0.000321"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:35.588495" elapsed="0.055602">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:36.662213" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:36.661737" elapsed="0.000511"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:36.670026" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:36.669753" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:36.670485" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:36.670237" 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-08-22T23:24:36.690698" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:36.690868" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:36.690970" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:36.672956" elapsed="0.018040"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:36.670801" elapsed="0.020239"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:36.691238" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:36.691067" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:36.670777" 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-08-22T23:24:36.699189" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:36.693786" elapsed="0.005512"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:36.693243" elapsed="0.006134"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:36.693202" elapsed="0.006231"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:36.703890" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:36.700082" elapsed="0.003854"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:36.699556" elapsed="0.004415"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:36.699519" elapsed="0.004476"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:36.704600" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:36.704174" 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-08-22T23:24:36.704937" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:36.704700" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:36.705477" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:36.705178" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:36.705019" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:36.704682" elapsed="0.000879"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:36.706117" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:36.705748" 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-08-22T23:24:36.706444" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:36.706213" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:36.706998" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:36.706702" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:36.706525" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:36.706195" elapsed="0.000886"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:24:36.707233" elapsed="0.000362"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:36.708066" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:36.707759" 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-08-22T23:24:36.708244" 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-08-22T23:24:36.692262" elapsed="0.018385"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:36.710829" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:24:36.710717" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:36.710699" 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-08-22T23:24:36.711119" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:36.711193" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:24:36.713511" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:36.664917" elapsed="0.048623"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:36.713616" elapsed="0.000051"/>
</return>
<msg time="2026-08-22T23:24:36.713799" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:36.662484" elapsed="0.051342"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:36.714472" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:36.714107" elapsed="0.000448">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:36.713897" elapsed="0.000749">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:36.713879" elapsed="0.000802">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:36.714897" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:36.714750" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:36.714734" elapsed="0.000241"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:36.661176" elapsed="0.053881">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:37.733894" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:37.733321" elapsed="0.000608"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:37.741400" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:37.740950" elapsed="0.000502"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:37.741884" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:37.741624" 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-08-22T23:24:37.771239" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:37.771542" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:37.771799" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:37.744079" elapsed="0.027779"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:37.742008" elapsed="0.029947"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:37.772360" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:37.772017" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:37.741984" elapsed="0.030570"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:37.777898" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:37.774517" elapsed="0.003449"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:37.774208" elapsed="0.003883"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:37.774182" elapsed="0.003948"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:37.781760" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:37.778520" elapsed="0.003323"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:37.778211" elapsed="0.003714"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:37.778187" elapsed="0.003793"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:37.783256" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:37.782349" 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-08-22T23:24:37.784069" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:37.783500" elapsed="0.000699"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:37.785364" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:37.784634" elapsed="0.000794"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:37.784252" elapsed="0.001258"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:37.783458" elapsed="0.002099"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:37.786278" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:37.785908" 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-08-22T23:24:37.786621" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:37.786374" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:37.787275" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:37.786861" elapsed="0.000441"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:37.786703" elapsed="0.000635"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:37.786357" 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-08-22T23:24:37.787512" elapsed="0.000407"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:37.788396" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:37.788094" 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-08-22T23:24:37.788615" elapsed="0.002452"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:24:37.773504" elapsed="0.017633"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:37.791323" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:24:37.791206" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:37.791188" 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-08-22T23:24:37.791572" elapsed="0.000039"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:37.791661" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:24:37.794041" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:37.736608" elapsed="0.057462"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:37.794130" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:24:37.794280" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:37.734169" elapsed="0.060137"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:37.794966" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:37.794600" elapsed="0.000447">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:37.794377" elapsed="0.000742">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:37.794360" elapsed="0.000792">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:37.795413" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:37.795258" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:37.795241" elapsed="0.000256"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:37.732753" elapsed="0.062842">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:38.814058" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:38.813537" elapsed="0.000557"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:38.821258" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:38.821001" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:38.821749" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:38.821456" 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-08-22T23:24:38.849070" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:38.849358" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:38.849610" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:38.823930" elapsed="0.025788"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:38.821874" elapsed="0.027944"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:38.850221" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:38.849879" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:38.821851" elapsed="0.028563"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:38.860047" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:38.852730" elapsed="0.007369"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:38.852209" elapsed="0.007926"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:38.852169" elapsed="0.007991"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:38.862772" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:38.860438" elapsed="0.002381"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:38.860217" elapsed="0.002637"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:38.860200" elapsed="0.002679"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:38.863447" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:38.863054" 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-08-22T23:24:38.863799" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:38.863545" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:38.864344" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:38.864043" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:38.863882" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:38.863527" elapsed="0.000903"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:38.864967" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:38.864600" 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-08-22T23:24:38.865294" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:38.865064" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:38.865923" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:38.865612" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:38.865436" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:38.865046" 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-08-22T23:24:38.866160" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:38.866982" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:38.866685" 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-08-22T23:24:38.867159" elapsed="0.002283"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:24:38.851239" elapsed="0.018267"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:38.869724" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:24:38.869575" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:38.869556" 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-08-22T23:24:38.869964" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:38.870036" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:24:38.872354" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:38.816745" elapsed="0.055638"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:38.872442" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:24:38.872644" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:38.814329" elapsed="0.058347"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:38.873313" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:38.872954" elapsed="0.000436">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:38.872747" elapsed="0.000715">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:38.872730" elapsed="0.000766">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:38.873737" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:38.873564" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:38.873547" elapsed="0.000270"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:38.813002" elapsed="0.060896">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:39.891185" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:39.890566" elapsed="0.000655"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:39.898840" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:39.898558" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:39.899294" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:39.899043" 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-08-22T23:24:39.918693" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:39.919010" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:39.919155" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:39.901497" elapsed="0.017695"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:39.899417" elapsed="0.019838"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:39.919516" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:39.919295" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:39.899394" elapsed="0.020269"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:39.924937" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:39.921136" elapsed="0.003872"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:39.920818" elapsed="0.004241"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:39.920791" elapsed="0.004304"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:39.928939" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:39.925486" elapsed="0.003518"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:39.925174" elapsed="0.003880"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:39.925151" elapsed="0.003938"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:39.929950" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:39.929332" 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-08-22T23:24:39.930458" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:39.930125" elapsed="0.000414"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:39.931194" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:39.930856" elapsed="0.000366"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:39.930573" elapsed="0.000686"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:39.930098" elapsed="0.001182"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:39.931835" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:39.931438" 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-08-22T23:24:39.932164" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:39.931933" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:39.932722" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:39.932404" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:39.932247" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:39.931915" 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-08-22T23:24:39.932960" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:39.933804" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:39.933478" 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-08-22T23:24:39.934188" elapsed="0.002384"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:24:39.920183" elapsed="0.016472"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:39.936840" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:24:39.936727" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:39.936708" 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-08-22T23:24:39.937088" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:39.937161" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:24:39.939642" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:39.893908" elapsed="0.045765"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:39.939737" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:24:39.939913" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:39.891463" elapsed="0.048483"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:39.940615" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:39.940231" elapsed="0.000465">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:39.940022" elapsed="0.000748">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:39.940005" elapsed="0.000800">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:39.941022" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:39.940876" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:39.940859" elapsed="0.000245"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:39.889811" elapsed="0.051377">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:40.957983" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:40.957503" elapsed="0.000514"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:40.965302" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:40.965038" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:40.965771" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:40.965505" 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-08-22T23:24:40.984445" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:40.984648" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:40.984772" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:40.967991" elapsed="0.016809"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:40.965894" elapsed="0.018959"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:40.985141" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:40.984888" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:40.965871" elapsed="0.019401"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:40.990825" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:40.986976" elapsed="0.003927"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:40.986625" elapsed="0.004331"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:40.986573" elapsed="0.004420"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:40.994926" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:40.991406" elapsed="0.003568"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:40.991077" elapsed="0.004008"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:40.991052" elapsed="0.004059"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:40.995716" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:40.995293" 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-08-22T23:24:40.996057" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:40.995818" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:40.996628" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:40.996303" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:40.996141" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:40.995799" elapsed="0.000920"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:40.997246" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:40.996878" 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-08-22T23:24:40.997592" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:40.997344" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:40.998142" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:40.997835" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:40.997677" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:40.997326" 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-08-22T23:24:40.998393" elapsed="0.000372"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:40.999227" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:40.998928" 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-08-22T23:24:40.999408" elapsed="0.002529"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:24:40.985905" elapsed="0.016099"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:41.002188" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:24:41.002075" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:41.002057" 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-08-22T23:24:41.002461" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:41.002535" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:24:41.005055" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:40.960713" elapsed="0.044372"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:41.005147" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:24:41.005302" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:40.958251" elapsed="0.047078"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:41.005992" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:41.005627" elapsed="0.000445">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:41.005400" elapsed="0.000745">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:41.005383" elapsed="0.000798">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:41.006428" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:41.006252" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:41.006235" elapsed="0.000316"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:40.956916" elapsed="0.049741">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:42.022591" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:42.022072" elapsed="0.000558"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:42.032519" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:42.032165" elapsed="0.000442"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:42.033169" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:42.032826" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:24:42.054901" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:42.055118" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:42.055258" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:42.036403" elapsed="0.018890"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:42.033344" elapsed="0.022008"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:42.055645" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:42.055395" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:42.033310" elapsed="0.022469"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:42.062968" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:42.057813" elapsed="0.005250"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:42.057348" elapsed="0.005783"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:42.057312" elapsed="0.005870"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:42.067305" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:42.063752" elapsed="0.003616"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:42.063292" elapsed="0.004124"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:42.063260" elapsed="0.004191"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:42.068265" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:42.067718" 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-08-22T23:24:42.068741" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:42.068396" elapsed="0.000424"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:42.069479" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:42.069077" elapsed="0.000439"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:42.068854" elapsed="0.000712"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:42.068371" elapsed="0.001244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:42.070321" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:42.069834" 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-08-22T23:24:42.070807" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:42.070448" elapsed="0.000438"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:42.071546" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:42.071141" elapsed="0.000458"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:42.070919" elapsed="0.000814"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:42.070424" elapsed="0.001346"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:24:42.071994" elapsed="0.000508"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:42.073171" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:42.072755" elapsed="0.000453"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:24:42.073426" elapsed="0.003351"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:24:42.056523" elapsed="0.020346"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:42.077120" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-08-22T23:24:42.076972" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:42.076947" 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-08-22T23:24:42.077463" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:42.077562" elapsed="0.000039"/>
</return>
<msg time="2026-08-22T23:24:42.080925" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:42.025912" elapsed="0.055052"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:42.081047" elapsed="0.000038"/>
</return>
<msg time="2026-08-22T23:24:42.081251" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:42.022908" elapsed="0.058379"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:42.082174" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:42.081691" elapsed="0.000588">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:42.081381" elapsed="0.000991">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:42.081358" elapsed="0.001059">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:42.082704" elapsed="0.000458"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:42.082504" elapsed="0.000777"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:42.082483" elapsed="0.000858"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:42.021458" elapsed="0.062081">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:43.103089" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:43.102606" elapsed="0.000516"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:43.110621" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:43.110344" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:43.111121" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:43.110826" 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-08-22T23:24:43.131066" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:43.131451" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:43.131706" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:43.113344" elapsed="0.018423"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:43.111243" elapsed="0.020623"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:43.132264" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:43.131927" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:43.111221" elapsed="0.021242"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:43.140247" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:43.134793" elapsed="0.005525"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:43.134273" elapsed="0.006097"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:43.134233" elapsed="0.006173"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:43.144159" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:43.140817" elapsed="0.003409"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:43.140486" elapsed="0.003791"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:43.140462" elapsed="0.003851"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:43.145118" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:43.144550" 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-08-22T23:24:43.145611" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:43.145260" elapsed="0.000436"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:43.146376" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:43.145953" elapsed="0.000461"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:43.145731" elapsed="0.000736"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:43.145234" elapsed="0.001264"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:43.147400" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:43.146739" elapsed="0.000700"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:43.147906" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:43.147538" elapsed="0.000469"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:43.148494" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:43.148198" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:43.148037" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:43.147513" 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-08-22T23:24:43.148748" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:43.149555" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:43.149260" 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-08-22T23:24:43.149751" elapsed="0.002357"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:24:43.133290" elapsed="0.018882"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:43.152353" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:24:43.152243" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:43.152225" 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-08-22T23:24:43.152612" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:43.152687" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:24:43.155061" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:43.105797" elapsed="0.049294"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:43.155229" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:24:43.155388" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:43.103355" elapsed="0.052060"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:43.156077" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:43.155713" elapsed="0.000444">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:43.155486" elapsed="0.000744">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:43.155469" elapsed="0.000797">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:43.156483" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:43.156337" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:43.156320" elapsed="0.000244"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:43.102082" elapsed="0.054583">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:44.175215" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:44.174722" elapsed="0.000525"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:44.182497" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:44.182241" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:44.182957" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:44.182711" 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-08-22T23:24:44.201966" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:44.202101" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:44.202199" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:44.185148" elapsed="0.017077"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:44.183073" elapsed="0.019195"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:44.202447" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:44.202295" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:44.183052" elapsed="0.019480"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:44.205987" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:44.203571" elapsed="0.002464"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:44.203346" elapsed="0.002724"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:44.203326" elapsed="0.002768"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:44.208682" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:44.206368" elapsed="0.002360"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:44.206150" elapsed="0.002613"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:44.206133" elapsed="0.002654"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:44.209336" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:44.208953" 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-08-22T23:24:44.209742" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:44.209486" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:44.210293" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:44.209987" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:44.209826" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:44.209467" elapsed="0.000913"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:44.210923" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:44.210537" 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-08-22T23:24:44.211253" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:44.211022" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:44.211850" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:44.211533" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:44.211364" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:44.211004" elapsed="0.000932"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:24:44.212086" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:44.212906" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:44.212613" 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-08-22T23:24:44.213084" 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-08-22T23:24:44.202897" elapsed="0.012701"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:44.215784" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-08-22T23:24:44.215672" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:44.215652" 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-08-22T23:24:44.216022" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:44.216093" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:24:44.218416" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:44.177956" elapsed="0.040489"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:44.218505" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:24:44.218672" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:44.175554" elapsed="0.043146"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:44.219363" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:44.218978" elapsed="0.000466">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:44.218770" elapsed="0.000742">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:44.218753" elapsed="0.000794">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:44.219780" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:44.219633" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:44.219616" elapsed="0.000245"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:44.174261" elapsed="0.045681">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:45.239322" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:45.238863" elapsed="0.000493"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:45.246633" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:45.246359" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:45.247086" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:45.246835" 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-08-22T23:24:45.267245" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:45.267546" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:45.267853" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:45.249292" elapsed="0.018618"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:45.247207" elapsed="0.020802"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:45.268417" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:45.268070" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:45.247185" elapsed="0.021461"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:45.276597" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:45.270955" elapsed="0.005694"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:45.270427" elapsed="0.006258"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:45.270386" elapsed="0.006325"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:45.279342" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:45.276990" elapsed="0.002399"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:45.276768" elapsed="0.002657"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:45.276751" elapsed="0.002699"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:45.280065" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:45.279656" 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-08-22T23:24:45.280404" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:45.280165" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:45.280964" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:45.280663" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:45.280487" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:45.280147" elapsed="0.000903"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:45.281571" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:45.281207" 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-08-22T23:24:45.281917" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:45.281684" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:45.282510" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:45.282158" elapsed="0.000378"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:45.282000" elapsed="0.000573"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:45.281666" 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-08-22T23:24:45.282767" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:45.283687" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:45.283341" 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-08-22T23:24:45.283869" elapsed="0.002350"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:24:45.269447" elapsed="0.016837"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:45.286465" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:24:45.286355" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:45.286336" 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-08-22T23:24:45.286723" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:45.286796" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:24:45.289166" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:45.242031" elapsed="0.047164"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:45.289257" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:24:45.289409" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:45.239615" elapsed="0.049821"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:45.290093" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:45.289730" elapsed="0.000441">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:45.289507" elapsed="0.000736">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:45.289490" elapsed="0.000788">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:45.290492" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:45.290348" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:45.290331" elapsed="0.000241"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:45.238316" elapsed="0.052355">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:46.303648" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:46.303162" elapsed="0.000522"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:46.311114" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:46.310853" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:46.311566" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:46.311317" 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-08-22T23:24:46.332194" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:46.332366" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:46.332541" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:46.313796" elapsed="0.018772"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:46.311708" elapsed="0.020927"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:46.332834" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:46.332666" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:46.311684" elapsed="0.021238"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:46.336420" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:46.333993" elapsed="0.002477"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:46.333766" elapsed="0.002740"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:46.333745" elapsed="0.002786"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:46.339108" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:46.336825" elapsed="0.002329"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:46.336602" elapsed="0.002586"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:46.336571" elapsed="0.002642"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:46.339816" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:46.339388" 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-08-22T23:24:46.340155" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:46.339915" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:46.340711" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:46.340396" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:46.340236" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:46.339897" elapsed="0.000899"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:46.341311" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:46.340951" 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-08-22T23:24:46.341651" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:46.341406" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:46.342221" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:46.341889" elapsed="0.000359"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:46.341732" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:46.341389" 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-08-22T23:24:46.342456" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:46.343281" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:46.342983" 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-08-22T23:24:46.343460" elapsed="0.002343"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:24:46.333306" elapsed="0.012561"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:46.346049" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:24:46.345937" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:46.345919" 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-08-22T23:24:46.346298" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:46.346369" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:24:46.349437" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:46.306339" elapsed="0.043127"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:46.349527" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:24:46.349697" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:46.303931" elapsed="0.045793"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:46.350416" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:46.350053" elapsed="0.000444">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:46.349842" elapsed="0.000728">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:46.349824" elapsed="0.000797">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:46.350837" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:46.350691" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:46.350674" elapsed="0.000243"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:46.302628" elapsed="0.048377">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:47.369800" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:47.369277" elapsed="0.000566"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:47.377351" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:47.377081" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:47.377821" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:47.377555" 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-08-22T23:24:47.396701" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:47.396881" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:47.396991" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:47.380051" elapsed="0.016967"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:47.377949" elapsed="0.019115"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:47.397262" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:47.397094" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:47.377922" elapsed="0.019429"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:47.400997" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:47.398442" elapsed="0.002638"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:47.398206" elapsed="0.002936"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:47.398186" elapsed="0.002999"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:47.404852" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:47.401570" elapsed="0.003347"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:47.401264" elapsed="0.003702"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:47.401241" elapsed="0.003759"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:47.405845" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:47.405243" 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-08-22T23:24:47.406312" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:47.405984" elapsed="0.000530"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:47.407235" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:47.406811" elapsed="0.000463"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:47.406554" elapsed="0.000772"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:47.405959" elapsed="0.001398"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:47.408153" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:47.407596" 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-08-22T23:24:47.408637" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:47.408290" elapsed="0.000430"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:47.409348" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:47.408994" elapsed="0.000380"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:47.408754" elapsed="0.000657"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:47.408265" elapsed="0.001168"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:24:47.409600" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:47.410426" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:47.410115" 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-08-22T23:24:47.410620" 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-08-22T23:24:47.397754" elapsed="0.015424"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:47.413359" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:24:47.413249" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:47.413230" 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-08-22T23:24:47.413626" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:47.413699" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:24:47.416068" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:47.372568" elapsed="0.043530"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:47.416159" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:24:47.416311" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:47.370099" elapsed="0.046239"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:47.416993" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:47.416631" elapsed="0.000441">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:47.416408" elapsed="0.000737">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:47.416391" elapsed="0.000789">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:47.417396" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:47.417249" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:47.417232" elapsed="0.000245"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:47.368670" elapsed="0.048890">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:48.436185" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:48.435728" elapsed="0.000643"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:48.443596" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:48.443321" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:48.444056" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:48.443807" 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-08-22T23:24:48.462534" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:48.462708" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:48.462806" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:48.446256" elapsed="0.016576"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:48.444176" elapsed="0.018699"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:48.463134" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:48.462903" elapsed="0.000376"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:48.444154" elapsed="0.019173"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:48.473800" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:48.465673" elapsed="0.008178"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:48.465151" elapsed="0.008834"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:48.465110" elapsed="0.008905"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:48.476688" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:48.474300" elapsed="0.002435"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:48.474074" elapsed="0.002698"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:48.474057" elapsed="0.002741"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:48.477372" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:48.476972" 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-08-22T23:24:48.477735" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:48.477470" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:48.478281" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:48.477980" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:48.477820" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:48.477452" elapsed="0.000920"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:48.478910" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:48.478526" 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-08-22T23:24:48.479236" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:48.479008" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:48.479783" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:48.479470" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:48.479316" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:48.478990" 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-08-22T23:24:48.480014" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:48.480849" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:48.480540" 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-08-22T23:24:48.481072" 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-08-22T23:24:48.464143" elapsed="0.019478"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:48.483801" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:24:48.483691" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:48.483673" 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-08-22T23:24:48.484038" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:48.484109" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:24:48.486437" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:48.439040" elapsed="0.047426"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:48.486527" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:24:48.486701" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:48.436629" elapsed="0.050099"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:48.487362" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:48.487006" elapsed="0.000434">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:48.486799" elapsed="0.000711">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:48.486782" elapsed="0.000762">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:48.487776" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:48.487630" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:48.487613" elapsed="0.000242"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:48.435185" elapsed="0.052750">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:49.507239" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:49.506776" elapsed="0.000497"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:49.514732" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:49.514456" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:49.515189" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:49.514940" 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-08-22T23:24:49.536474" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:49.536800" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:49.537021" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:49.517399" elapsed="0.019679"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:49.515310" elapsed="0.021953"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:49.537707" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:49.537330" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:49.515287" elapsed="0.022618"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:49.545460" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:49.540232" elapsed="0.005278"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:49.539739" elapsed="0.005808"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:49.539698" elapsed="0.005875"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:49.548224" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:49.545873" elapsed="0.002399"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:49.545649" elapsed="0.002658"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:49.545631" elapsed="0.002701"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:49.548932" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:49.548519" 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-08-22T23:24:49.549268" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:49.549030" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:49.549828" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:49.549507" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:49.549350" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:49.549012" elapsed="0.000900"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:49.550428" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:49.550067" 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-08-22T23:24:49.550771" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:49.550524" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:49.551312" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:49.551018" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:49.550853" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:49.550506" 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-08-22T23:24:49.551548" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:49.552397" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:49.552079" 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-08-22T23:24:49.552595" elapsed="0.002311"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:24:49.538764" elapsed="0.016206"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:49.555153" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:24:49.555044" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:49.555023" 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-08-22T23:24:49.555394" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:49.555464" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:24:49.557820" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:49.509948" elapsed="0.047901"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:49.557909" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:24:49.558061" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:49.507502" elapsed="0.050585"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:49.558747" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:49.558367" elapsed="0.000502">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:49.558158" elapsed="0.000786">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:49.558141" elapsed="0.000838">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:49.559203" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:49.559056" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:49.559039" elapsed="0.000246"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:49.506259" elapsed="0.053110">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:50.577307" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:50.576845" elapsed="0.000496"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:50.584841" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:50.584556" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:50.585297" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:50.585045" 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-08-22T23:24:50.604942" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:50.605230" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:50.605449" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:50.587517" elapsed="0.017991"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:50.585419" elapsed="0.020224"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:50.606050" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:50.605707" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:50.585396" elapsed="0.020854"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:50.613819" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:50.608617" elapsed="0.005272"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:50.608074" elapsed="0.005867"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:50.608031" elapsed="0.005946"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:50.617637" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:50.614370" elapsed="0.003334"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:50.614057" elapsed="0.003697"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:50.614034" elapsed="0.003755"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:50.618570" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:50.618026" 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-08-22T23:24:50.619065" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:50.618730" elapsed="0.000420"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:50.619845" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:50.619404" elapsed="0.000478"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:50.619184" elapsed="0.000750"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:50.618705" elapsed="0.001330"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:50.620846" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:50.620260" 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-08-22T23:24:50.621310" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:50.620982" elapsed="0.000386"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:50.621866" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:50.621551" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:50.621392" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:50.620957" 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-08-22T23:24:50.622103" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:50.622936" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:50.622635" 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-08-22T23:24:50.623114" 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-08-22T23:24:50.607087" elapsed="0.018557"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:50.625826" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:24:50.625715" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:50.625696" 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-08-22T23:24:50.626066" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:50.626137" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:24:50.628485" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:50.580182" elapsed="0.048332"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:50.628604" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:24:50.628757" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:50.577590" elapsed="0.051194"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:50.629419" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:50.629060" elapsed="0.000438">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:50.628854" elapsed="0.000716">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:50.628837" elapsed="0.000785">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:50.629837" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:50.629692" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:50.629676" elapsed="0.000241"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:50.576299" elapsed="0.053699">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:51.648651" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:51.648104" elapsed="0.000600"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:51.656302" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:51.655899" elapsed="0.000453"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:51.656818" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:51.656509" 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-08-22T23:24:51.677054" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:51.677365" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:51.677616" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:51.659033" elapsed="0.018647"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:51.656951" elapsed="0.020829"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:51.678191" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:51.677842" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:51.656924" elapsed="0.021461"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:51.686324" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:51.680823" elapsed="0.005577"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:51.680222" elapsed="0.006233"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:51.680182" elapsed="0.006312"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:51.690331" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:51.686933" elapsed="0.003463"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:51.686600" elapsed="0.003845"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:51.686553" elapsed="0.003927"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:51.691511" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:51.690898" 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-08-22T23:24:51.692014" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:51.691679" elapsed="0.000418"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:51.692857" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:51.692363" elapsed="0.000534"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:51.692136" elapsed="0.000812"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:51.691652" elapsed="0.001327"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:51.693614" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:51.693198" 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-08-22T23:24:51.693948" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:51.693714" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:51.694487" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:51.694190" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:51.694032" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:51.693696" elapsed="0.000875"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:24:51.694745" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:51.695598" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:51.695265" 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-08-22T23:24:51.695782" 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-08-22T23:24:51.679247" elapsed="0.019149"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:51.698664" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-08-22T23:24:51.698525" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:51.698505" 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-08-22T23:24:51.698918" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:51.698990" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:24:51.701395" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:51.651408" elapsed="0.050017"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:51.701487" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:24:51.701658" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:51.648956" elapsed="0.052730"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:51.702378" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:51.701966" elapsed="0.000505">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:51.701758" elapsed="0.000791">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:51.701740" elapsed="0.000861">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:51.702821" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:51.702674" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:51.702657" elapsed="0.000245"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:51.647483" elapsed="0.055505">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:52.718039" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:52.717519" elapsed="0.000557"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:52.725772" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:52.725485" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:52.726231" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:52.725976" 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-08-22T23:24:52.746525" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:52.746881" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:52.747128" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:52.728532" elapsed="0.018656"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:52.726359" elapsed="0.020938"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:52.747779" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:52.747363" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:52.726332" elapsed="0.021645"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:52.756269" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:52.750569" elapsed="0.005823"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:52.750061" elapsed="0.006420"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:52.750018" elapsed="0.006521"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:52.759601" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:52.757166" elapsed="0.002484"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:52.756710" elapsed="0.002976"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:52.756668" elapsed="0.003043"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:52.760364" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:52.759906" 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-08-22T23:24:52.760840" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:52.760464" elapsed="0.000440"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:52.761402" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:52.761095" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:52.760930" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:52.760446" elapsed="0.001045"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:52.762042" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:52.761670" 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-08-22T23:24:52.762374" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:52.762141" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:52.762932" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:52.762633" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:52.762457" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:52.762123" 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-08-22T23:24:52.763172" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:52.764020" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:52.763710" 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-08-22T23:24:52.764235" 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-08-22T23:24:52.749011" elapsed="0.017807"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:52.767009" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-08-22T23:24:52.766893" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:52.766874" 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-08-22T23:24:52.767266" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:52.767339" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:24:52.769768" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:52.720835" elapsed="0.048963"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:52.769864" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:24:52.770020" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:52.718347" elapsed="0.051700"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:52.770729" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:52.770339" elapsed="0.000473">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:52.770125" elapsed="0.000845">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:52.770107" elapsed="0.000901">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:52.771231" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:52.771081" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:52.771063" elapsed="0.000250"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:52.716907" elapsed="0.054492">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:53.789555" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:53.789044" elapsed="0.000560"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:53.796968" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:53.796686" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:53.797417" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:53.797171" 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-08-22T23:24:53.816897" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:53.817195" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:53.817414" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:53.799631" elapsed="0.017840"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:53.797543" elapsed="0.020024"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:53.818011" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:53.817664" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:53.797518" elapsed="0.020692"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:53.824228" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:53.820496" elapsed="0.003799"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:53.820006" elapsed="0.004338"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:53.819965" elapsed="0.004413"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:53.827976" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:53.824782" elapsed="0.003258"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:53.824455" elapsed="0.003632"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:53.824433" elapsed="0.003688"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:53.828937" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:53.828360" 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-08-22T23:24:53.829395" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:53.829073" elapsed="0.000401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:53.830168" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:53.829748" elapsed="0.000456"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:53.829507" elapsed="0.000746"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:53.829048" elapsed="0.001235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:53.831023" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:53.830497" 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-08-22T23:24:53.831602" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:53.831251" elapsed="0.000435"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:53.832357" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:53.831942" elapsed="0.000451"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:53.831720" elapsed="0.000722"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:53.831225" 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-08-22T23:24:53.832705" elapsed="0.000526"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:53.833808" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:53.833481" 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-08-22T23:24:53.833986" 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-08-22T23:24:53.819029" elapsed="0.017510"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:53.836741" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:24:53.836628" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:53.836608" 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-08-22T23:24:53.837010" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:53.837085" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:24:53.839406" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:53.792293" elapsed="0.047142"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:53.839494" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:24:53.839660" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:53.789845" elapsed="0.049842"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:53.840325" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:53.839965" elapsed="0.000440">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:53.839758" elapsed="0.000718">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:53.839741" elapsed="0.000770">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:53.840743" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:53.840594" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:53.840564" elapsed="0.000259"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:53.788464" elapsed="0.052452">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:54.859498" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:54.859032" elapsed="0.000501"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:54.866803" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:54.866517" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:54.867247" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:54.867004" 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-08-22T23:24:54.894279" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:54.894610" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:54.894841" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:54.869565" elapsed="0.025334"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:54.867472" elapsed="0.027527"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:54.895412" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:54.895059" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:54.867447" elapsed="0.028193"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:54.901769" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:54.898022" elapsed="0.003895"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:54.897493" elapsed="0.004477"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:54.897451" elapsed="0.004556"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:54.905903" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:54.902444" elapsed="0.003525"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:54.902087" elapsed="0.003933"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:54.902063" elapsed="0.003992"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:54.906763" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:54.906317" 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-08-22T23:24:54.907103" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:54.906863" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:54.907666" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:54.907346" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:54.907186" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:54.906845" elapsed="0.000909"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:54.908501" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:54.908131" 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-08-22T23:24:54.908846" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:54.908615" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:54.909394" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:54.909099" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:54.908927" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:54.908596" 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-08-22T23:24:54.909647" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:54.910460" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:54.910162" 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-08-22T23:24:54.910655" elapsed="0.002295"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:24:54.896451" elapsed="0.016576"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:54.913212" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:24:54.913097" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:54.913079" 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-08-22T23:24:54.913511" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:54.913600" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:24:54.915922" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:54.862202" elapsed="0.053749"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:54.916012" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:24:54.916164" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:54.859786" elapsed="0.056404"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:54.916845" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:54.916466" elapsed="0.000459">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:54.916260" elapsed="0.000763">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:54.916244" elapsed="0.000814">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:54.917280" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:54.917131" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:54.917112" elapsed="0.000247"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:54.858484" elapsed="0.058956">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:55.935949" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:55.935457" elapsed="0.000527"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:55.943414" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:55.943153" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:55.943878" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:55.943631" 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-08-22T23:24:55.969430" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:55.969608" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:55.969712" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:55.946119" elapsed="0.023619"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:55.944003" elapsed="0.025778"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:55.969963" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:55.969809" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:55.943978" elapsed="0.026070"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:55.973517" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:55.971084" elapsed="0.002483"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:55.970862" elapsed="0.002872"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:55.970844" elapsed="0.002922"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:55.976336" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:55.974049" elapsed="0.002334"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:55.973824" elapsed="0.002595"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:55.973807" elapsed="0.002636"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:55.977061" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:55.976634" 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-08-22T23:24:55.977398" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:55.977163" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:55.977962" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:55.977658" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:55.977481" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:55.977144" elapsed="0.000905"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:55.978573" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:55.978210" 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-08-22T23:24:55.978917" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:55.978688" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:55.979445" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:55.979152" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:55.978997" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:55.978670" elapsed="0.000858"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:24:55.979695" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:55.980513" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:55.980215" 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-08-22T23:24:55.980706" elapsed="0.002293"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:24:55.970420" elapsed="0.012644"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:55.983242" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:24:55.983133" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:55.983115" 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-08-22T23:24:55.983485" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:55.983555" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:24:55.985887" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:55.938646" elapsed="0.047270"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:55.985976" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:24:55.986126" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:55.936216" elapsed="0.049936"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:55.986803" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:55.986428" elapsed="0.000453">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:55.986222" elapsed="0.000730">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:55.986205" elapsed="0.000780">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:55.987242" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:55.987090" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:55.987072" elapsed="0.000250"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:55.934916" elapsed="0.052489">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:57.005979" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:57.005505" elapsed="0.000508"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:57.013331" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:57.013056" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:57.013828" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:57.013532" 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-08-22T23:24:57.035396" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:57.035552" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:57.035674" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:57.016010" elapsed="0.019690"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:57.013950" elapsed="0.021801"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:57.035929" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:57.035778" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:57.013927" elapsed="0.022089"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:57.039509" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:57.037031" elapsed="0.002527"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:57.036809" elapsed="0.002805"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:57.036791" elapsed="0.002849"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:57.042258" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:57.039919" elapsed="0.002385"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:57.039697" elapsed="0.002642"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:57.039680" elapsed="0.002684"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:57.042965" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:57.042541" 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-08-22T23:24:57.043304" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:57.043063" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:57.043875" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:57.043547" elapsed="0.000356"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:57.043388" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:57.043045" elapsed="0.000916"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:57.044485" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:57.044119" 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-08-22T23:24:57.044830" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:57.044597" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:57.045501" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:57.045200" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:57.045001" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:57.044565" 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-08-22T23:24:57.045759" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:57.046600" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:57.046276" 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-08-22T23:24:57.046784" 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-08-22T23:24:57.036370" elapsed="0.012942"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:57.049494" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:24:57.049382" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:57.049364" 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-08-22T23:24:57.049757" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:57.049834" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:24:57.052194" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:57.008659" elapsed="0.043564"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:57.052284" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:24:57.052436" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:57.006244" elapsed="0.046219"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:57.053156" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:57.052758" elapsed="0.000479">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:57.052533" elapsed="0.000783">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:57.052516" elapsed="0.000834">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:57.053567" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:57.053420" elapsed="0.000231"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:57.053403" elapsed="0.000272"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:57.004976" elapsed="0.048781">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:58.070855" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:58.070362" elapsed="0.000529"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:58.078136" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:58.077875" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:58.078598" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:58.078337" 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-08-22T23:24:58.097912" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:58.098329" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:58.098553" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:58.080789" elapsed="0.017857"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:58.078728" elapsed="0.020018"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:58.099149" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:58.098809" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:58.078703" elapsed="0.020644"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:58.110807" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:58.101729" elapsed="0.009145"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:58.101196" elapsed="0.009727"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:58.101154" elapsed="0.009806"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:58.114490" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:58.111354" elapsed="0.003195"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:58.111041" elapsed="0.003572"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:58.111017" elapsed="0.003631"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:58.115465" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:58.114897" 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-08-22T23:24:58.115938" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:58.115609" elapsed="0.000415"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:58.116700" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:58.116288" elapsed="0.000449"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:58.116060" elapsed="0.000727"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:58.115566" elapsed="0.001252"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:58.117564" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:58.117043" 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-08-22T23:24:58.118043" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:58.117716" elapsed="0.000410"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:58.118806" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:58.118385" elapsed="0.000460"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:58.118164" elapsed="0.000733"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:58.117691" 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-08-22T23:24:58.119147" elapsed="0.000523"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:58.120186" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:58.119862" 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-08-22T23:24:58.120414" elapsed="0.003222"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:24:58.100179" elapsed="0.023557"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:58.123977" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-08-22T23:24:58.123834" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:58.123809" 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-08-22T23:24:58.124316" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:58.124419" elapsed="0.000024"/>
</return>
<msg time="2026-08-22T23:24:58.127068" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:58.073567" elapsed="0.053531"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:58.127160" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:24:58.127315" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:58.071124" elapsed="0.056218"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:58.128019" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:58.127645" elapsed="0.000459">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:58.127415" elapsed="0.000765">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:58.127397" elapsed="0.000817">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:58.128455" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:58.128285" elapsed="0.000231"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:58.128268" elapsed="0.000271"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:58.069806" elapsed="0.058838">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:59.145288" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:59.144765" elapsed="0.000559"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:59.152877" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:59.152608" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:59.153344" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:59.153081" 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-08-22T23:24:59.172987" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:24:59.173330" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:24:59.173566" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:24:59.155561" elapsed="0.018101"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:59.153466" elapsed="0.020302"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:59.174200" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:59.173833" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:59.153442" elapsed="0.020963"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:59.182206" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:59.176750" elapsed="0.005538"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:59.176223" elapsed="0.006101"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:59.176182" elapsed="0.006166"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:24:59.184962" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:24:59.182640" elapsed="0.002367"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:59.182404" elapsed="0.002707"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:59.182387" elapsed="0.002769"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:59.185755" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:59.185335" 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-08-22T23:24:59.186089" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:59.185853" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:59.186688" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:59.186348" elapsed="0.000375"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:59.186169" elapsed="0.000599"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:59.185835" elapsed="0.000962"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:24:59.187350" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:59.186976" 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-08-22T23:24:59.187695" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:59.187446" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:24:59.188233" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:24:59.187937" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:24:59.187778" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:59.187429" 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-08-22T23:24:59.188468" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:24:59.189340" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:24:59.188996" 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-08-22T23:24:59.189521" 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-08-22T23:24:59.175239" elapsed="0.016751"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:24:59.192174" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:24:59.192061" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:24:59.192042" 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-08-22T23:24:59.192416" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:24:59.192486" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:24:59.194829" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:24:59.148034" elapsed="0.046824"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:24:59.194918" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:24:59.195070" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:24:59.145560" elapsed="0.049536"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:24:59.195757" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:24:59.195378" elapsed="0.000458">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:24:59.195165" elapsed="0.000741">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:24:59.195148" elapsed="0.000792">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:24:59.196157" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:24:59.196009" elapsed="0.000240"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:24:59.195993" elapsed="0.000281"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:24:59.144197" elapsed="0.052161">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:00.215734" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:00.215250" elapsed="0.000517"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:00.223070" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:00.222809" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:00.223519" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:00.223272" 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-08-22T23:25:00.249503" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:00.249860" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:25:00.250080" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:25:00.225808" elapsed="0.024330"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:00.223660" elapsed="0.026574"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:00.250673" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:00.250295" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:00.223636" elapsed="0.027233"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:00.258618" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:00.253192" elapsed="0.005477"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:00.252671" elapsed="0.006034"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:00.252628" elapsed="0.006102"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:00.261308" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:00.259011" elapsed="0.002347"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:00.258787" elapsed="0.002607"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:00.258770" elapsed="0.002648"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:00.262015" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:00.261612" 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-08-22T23:25:00.262352" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:00.262114" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:00.262914" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:00.262610" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:00.262434" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:00.262096" elapsed="0.000905"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:00.263530" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:00.263156" 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-08-22T23:25:00.263878" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:00.263644" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:00.264411" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:00.264116" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:00.263959" elapsed="0.000578"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:00.263626" elapsed="0.000936"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:25:00.264734" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:25:00.265615" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:00.265286" 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-08-22T23:25:00.265797" 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-08-22T23:25:00.251696" elapsed="0.016617"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:25:00.268495" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:25:00.268383" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:00.268365" 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-08-22T23:25:00.268761" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:00.268832" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:25:00.271189" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:25:00.218470" elapsed="0.052748"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:25:00.271278" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:25:00.271434" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:25:00.216013" elapsed="0.055447"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:25:00.272128" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:25:00.271759" elapsed="0.000454">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:00.271530" elapsed="0.000759">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:25:00.271513" elapsed="0.000810">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:00.272543" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:00.272394" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:00.272377" elapsed="0.000263"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:00.214705" elapsed="0.058021">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:01.289227" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:01.288710" elapsed="0.000553"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:01.296869" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:01.296564" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:01.297354" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:01.297078" 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-08-22T23:25:01.314927" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:01.315190" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:25:01.315309" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:25:01.299679" elapsed="0.015657"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:01.297482" elapsed="0.017904"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:01.315610" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:01.315418" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:01.297456" elapsed="0.018245"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:01.319623" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:01.316814" elapsed="0.002864"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:01.316552" elapsed="0.003162"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:01.316532" elapsed="0.003208"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:01.322381" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:01.320023" elapsed="0.002405"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:01.319798" elapsed="0.002666"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:01.319781" elapsed="0.002707"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:01.323114" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:01.322686" 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-08-22T23:25:01.323452" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:01.323214" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:01.324039" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:01.323729" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:01.323535" elapsed="0.000569"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:01.323195" elapsed="0.000931"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:01.324676" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:01.324286" 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-08-22T23:25:01.325009" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:01.324775" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:01.325601" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:01.325281" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:01.325091" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:01.324757" 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-08-22T23:25:01.325841" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:25:01.326698" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:01.326359" 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-08-22T23:25:01.326881" elapsed="0.002370"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:25:01.316095" elapsed="0.013223"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:25:01.329502" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:25:01.329389" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:01.329371" 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-08-22T23:25:01.329813" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:01.329887" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:25:01.332308" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:25:01.291994" elapsed="0.040343"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:25:01.332510" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:25:01.332685" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:25:01.289511" elapsed="0.043201"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:25:01.333409" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:25:01.332994" elapsed="0.000500">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:01.332785" elapsed="0.000806">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:25:01.332767" elapsed="0.000877">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:01.333864" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:01.333716" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:01.333699" elapsed="0.000245"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:01.288123" elapsed="0.045906">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:02.353234" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:02.352740" elapsed="0.000528"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:02.360894" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:02.360629" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:02.361396" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:02.361122" 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-08-22T23:25:02.379672" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:02.379875" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:25:02.380016" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:25:02.363663" elapsed="0.016390"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:02.361520" elapsed="0.018594"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:02.380369" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:02.380153" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:02.361496" elapsed="0.018995"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:02.387901" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:02.382307" elapsed="0.005705"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:02.381786" elapsed="0.006306"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:02.381731" elapsed="0.006416"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:02.391465" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:02.388828" elapsed="0.002684"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:02.388277" elapsed="0.003271"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:02.388239" elapsed="0.003352"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:02.392180" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:02.391774" 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-08-22T23:25:02.392601" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:02.392341" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:02.393171" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:02.392850" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:02.392687" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:02.392321" elapsed="0.000940"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:02.393837" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:02.393428" 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-08-22T23:25:02.394169" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:02.393936" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:02.394763" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:02.394435" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:02.394251" elapsed="0.000576"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:02.393918" 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-08-22T23:25:02.395001" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:25:02.395840" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:02.395518" 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-08-22T23:25:02.396032" 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-08-22T23:25:02.381023" elapsed="0.017448"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:25:02.398671" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:25:02.398542" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:02.398523" 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-08-22T23:25:02.398916" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:02.398988" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:25:02.401338" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:25:02.356020" elapsed="0.045347"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:25:02.401428" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:25:02.401597" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:25:02.353506" elapsed="0.048120"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:25:02.402269" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:25:02.401907" elapsed="0.000439">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:02.401697" elapsed="0.000720">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:25:02.401680" elapsed="0.000772">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:02.402686" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:02.402521" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:02.402504" elapsed="0.000264"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:02.352161" elapsed="0.050689">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:03.416135" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:03.415661" elapsed="0.000508"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:03.423470" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:03.423210" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:03.423935" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:03.423687" 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-08-22T23:25:03.442673" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:03.442843" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:25:03.442952" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:25:03.426158" elapsed="0.016820"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:03.424057" elapsed="0.018967"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:03.443216" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:03.443053" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:03.424035" elapsed="0.019267"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:03.446798" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:03.444354" elapsed="0.002493"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:03.444128" elapsed="0.002755"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:03.444109" elapsed="0.002798"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:03.449466" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:03.447183" elapsed="0.002329"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:03.446962" elapsed="0.002586"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:03.446946" elapsed="0.002627"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:03.450184" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:03.449776" 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-08-22T23:25:03.450519" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:03.450283" elapsed="0.000342"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:03.451119" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:03.450819" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:03.450653" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:03.450264" elapsed="0.000941"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:03.451743" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:03.451363" 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-08-22T23:25:03.452071" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:03.451839" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:03.452619" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:03.452308" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:03.452152" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:03.451822" 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-08-22T23:25:03.452856" elapsed="0.000383"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:25:03.453863" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:03.453541" 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-08-22T23:25:03.454042" 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-08-22T23:25:03.443695" elapsed="0.012838"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:25:03.456733" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:25:03.456622" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:03.456601" 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-08-22T23:25:03.456975" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:03.457060" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:25:03.459383" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:25:03.418892" elapsed="0.040520"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:25:03.459472" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:25:03.459640" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:25:03.416417" elapsed="0.043251"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:25:03.460306" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:25:03.459946" elapsed="0.000438">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:03.459739" elapsed="0.000718">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:25:03.459722" elapsed="0.000769">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:03.460722" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:03.460560" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:03.460543" elapsed="0.000259"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:03.415122" elapsed="0.045762">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:04.482698" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:04.482209" elapsed="0.000524"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:04.490015" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:04.489753" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:04.490459" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:04.490214" 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-08-22T23:25:04.508506" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:04.508841" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:25:04.509211" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:25:04.492678" elapsed="0.016594"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:04.490595" elapsed="0.018779"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:04.509819" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:04.509437" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:04.490557" elapsed="0.019463"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:04.517828" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:04.512354" elapsed="0.005526"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:04.511862" elapsed="0.006055"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:04.511820" elapsed="0.006123"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:04.520637" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:04.518222" elapsed="0.002463"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:04.518001" elapsed="0.002720"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:04.517984" elapsed="0.002762"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:04.521350" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:04.520925" 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-08-22T23:25:04.521704" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:04.521450" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:04.522248" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:04.521948" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:04.521788" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:04.521432" elapsed="0.000902"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:04.522872" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:04.522491" 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-08-22T23:25:04.523199" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:04.522968" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:04.523750" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:04.523437" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:04.523281" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:04.522951" 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-08-22T23:25:04.523988" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:25:04.524817" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:04.524501" 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-08-22T23:25:04.525011" 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-08-22T23:25:04.510874" elapsed="0.016591"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:25:04.527661" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:25:04.527535" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:04.527517" 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-08-22T23:25:04.527904" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:04.527975" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:25:04.530374" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:25:04.485419" elapsed="0.044984"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:25:04.530464" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:25:04.530633" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:25:04.482985" elapsed="0.047675"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:25:04.531366" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:25:04.530999" elapsed="0.000447">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:04.530788" elapsed="0.000732">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:25:04.530769" elapsed="0.000787">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:04.531792" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:04.531644" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:04.531627" elapsed="0.000246"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:04.481624" elapsed="0.050334">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:05.549607" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:05.549126" elapsed="0.000517"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:05.557344" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:05.557062" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:05.557815" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:05.557551" 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-08-22T23:25:05.578114" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:05.578434" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:25:05.578706" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:25:05.560024" elapsed="0.018747"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:05.557936" elapsed="0.020943"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:05.579323" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:05.578945" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:05.557913" elapsed="0.021617"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:05.588065" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:05.582205" elapsed="0.005977"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:05.581657" elapsed="0.006611"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:05.581569" elapsed="0.006758"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:05.591664" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:05.589050" elapsed="0.002662"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:05.588468" elapsed="0.003278"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:05.588425" elapsed="0.003345"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:05.592338" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:05.591944" 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-08-22T23:25:05.592686" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:05.592435" elapsed="0.000371"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:05.593320" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:05.593013" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:05.592833" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:05.592417" elapsed="0.000989"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:05.593946" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:05.593563" 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-08-22T23:25:05.594277" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:05.594045" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:05.594835" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:05.594522" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:05.594358" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:05.594027" 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-08-22T23:25:05.595070" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:25:05.595892" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:05.595593" 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-08-22T23:25:05.596069" 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-08-22T23:25:05.580486" elapsed="0.018009"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:25:05.598699" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:25:05.598568" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:05.598549" 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-08-22T23:25:05.598942" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:05.599014" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:25:05.601353" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:25:05.552458" elapsed="0.048925"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:25:05.601442" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:25:05.601609" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:25:05.549889" elapsed="0.051748"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:25:05.602275" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:25:05.601915" elapsed="0.000439">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:05.601707" elapsed="0.000720">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:25:05.601690" elapsed="0.000771">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:05.602691" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:05.602530" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:05.602513" elapsed="0.000258"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:05.548537" elapsed="0.054316">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:06.621094" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:06.620615" elapsed="0.000568"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:06.628444" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:06.628179" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:06.628931" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:06.628667" 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-08-22T23:25:06.652965" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:06.653255" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:25:06.653482" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:25:06.631244" elapsed="0.022298"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:06.629052" elapsed="0.024622"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:06.654079" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:06.653736" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:06.629029" elapsed="0.025246"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:06.660408" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:06.656554" elapsed="0.003924"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:06.656056" elapsed="0.004472"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:06.656014" elapsed="0.004551"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:06.664450" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:06.661009" elapsed="0.003507"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:06.660673" elapsed="0.003893"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:06.660644" elapsed="0.003985"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:06.665449" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:06.664902" 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-08-22T23:25:06.665802" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:06.665547" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:06.666341" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:06.666042" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:06.665885" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:06.665530" elapsed="0.000895"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:06.666956" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:06.666594" 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-08-22T23:25:06.667278" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:06.667051" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:06.667825" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:06.667513" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:06.667359" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:06.667034" 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-08-22T23:25:06.668054" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:25:06.668875" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:06.668556" 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-08-22T23:25:06.669098" 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-08-22T23:25:06.655085" elapsed="0.016487"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:25:06.671766" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:25:06.671657" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:06.671639" 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-08-22T23:25:06.672003" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:06.672073" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:25:06.674509" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:25:06.623848" elapsed="0.050690"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:25:06.674614" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:25:06.674766" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:25:06.621418" elapsed="0.053374"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:25:06.675426" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:25:06.675068" elapsed="0.000436">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:06.674862" elapsed="0.000729">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:25:06.674845" elapsed="0.000783">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:06.675843" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:06.675698" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:06.675681" elapsed="0.000242"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:06.620093" elapsed="0.055911">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:07.693386" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:07.692926" elapsed="0.000493"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:07.700642" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:07.700368" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:07.701103" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:07.700855" 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-08-22T23:25:07.720681" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:07.720851" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:25:07.720951" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:25:07.703292" elapsed="0.017684"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:07.701226" elapsed="0.019855"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:07.721267" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:07.721112" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:07.701203" elapsed="0.020150"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:07.730765" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:07.723543" elapsed="0.007272"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:07.723062" elapsed="0.007789"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:07.723021" elapsed="0.007855"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:07.733479" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:07.731156" elapsed="0.002368"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:07.730934" elapsed="0.002625"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:07.730916" elapsed="0.002682"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:07.734171" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:07.733773" 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-08-22T23:25:07.734501" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:07.734268" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:07.735061" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:07.734759" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:07.734598" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:07.734250" elapsed="0.000896"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:07.735690" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:07.735303" 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-08-22T23:25:07.736018" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:07.735787" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:07.736552" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:07.736256" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:07.736098" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:07.735769" 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-08-22T23:25:07.736907" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:25:07.737753" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:07.737427" 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-08-22T23:25:07.737932" elapsed="0.002325"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:25:07.722062" elapsed="0.018260"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:25:07.740503" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:25:07.740392" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:07.740374" 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-08-22T23:25:07.740763" elapsed="0.000038"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:07.740851" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:25:07.743180" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:25:07.696069" elapsed="0.047140"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:25:07.743268" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:25:07.743417" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:25:07.693666" elapsed="0.049777"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:25:07.744101" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:25:07.743737" elapsed="0.000486">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:07.743512" elapsed="0.000788">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:25:07.743495" elapsed="0.000839">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:07.744549" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:07.744404" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:07.744387" elapsed="0.000258"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:07.692374" elapsed="0.052355">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:08.763728" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:08.763232" elapsed="0.000532"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:08.771445" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:08.771179" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:08.771914" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:08.771664" 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-08-22T23:25:08.791489" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:08.791856" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:25:08.792098" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:25:08.774302" elapsed="0.017858"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:08.772040" elapsed="0.020226"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:08.792768" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:08.792334" elapsed="0.000597"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:08.772015" elapsed="0.020969"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:08.801507" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:08.795510" elapsed="0.006054"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:08.794977" elapsed="0.006639"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:08.794932" elapsed="0.006710"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:08.804211" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:08.801925" elapsed="0.002332"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:08.801702" elapsed="0.002589"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:08.801685" elapsed="0.002630"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:08.804947" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:08.804499" 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-08-22T23:25:08.805282" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:08.805046" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:08.805848" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:08.805528" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:08.805364" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:08.805028" elapsed="0.000975"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:08.806530" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:08.806164" 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-08-22T23:25:08.806880" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:08.806645" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:08.807415" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:08.807117" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:08.806961" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:08.806626" 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-08-22T23:25:08.807667" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:25:08.808496" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:08.808183" 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-08-22T23:25:08.808703" elapsed="0.002299"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:25:08.793915" elapsed="0.017155"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:25:08.811256" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:25:08.811143" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:08.811124" 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-08-22T23:25:08.811500" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:08.811572" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:25:08.813940" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:25:08.766483" elapsed="0.047486"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:25:08.814031" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:25:08.814186" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:25:08.764002" elapsed="0.050211"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:25:08.814892" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:25:08.814498" elapsed="0.000478">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:08.814284" elapsed="0.000767">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:25:08.814267" elapsed="0.000818">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:08.815303" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:08.815154" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:08.815137" elapsed="0.000246"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:08.762671" elapsed="0.052797">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:09.835606" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:09.835084" elapsed="0.000562"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:09.843205" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:09.842807" elapsed="0.000449"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:09.843689" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:09.843414" 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-08-22T23:25:09.869117" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:09.869426" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:25:09.869697" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:25:09.845940" elapsed="0.023819"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:09.843819" elapsed="0.026045"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:09.870296" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:09.869929" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:09.843792" elapsed="0.026702"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:09.879902" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:09.873145" elapsed="0.006852"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:09.872376" elapsed="0.007686"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:09.872333" elapsed="0.007776"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:09.885323" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:09.880740" elapsed="0.004682"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:09.880217" elapsed="0.005300"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:09.880184" elapsed="0.005390"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:09.886441" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:09.885935" 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-08-22T23:25:09.886809" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:09.886544" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:09.887383" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:09.887056" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:09.886893" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:09.886526" elapsed="0.000947"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:09.888036" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:09.887661" 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-08-22T23:25:09.888459" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:09.888141" elapsed="0.000401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:09.889282" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:09.888957" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:09.888709" elapsed="0.000639"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:09.888118" 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-08-22T23:25:09.889527" elapsed="0.000383"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:25:09.890514" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:09.890094" 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-08-22T23:25:09.890732" elapsed="0.003384"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:25:09.871360" elapsed="0.022833"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:25:09.894461" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-08-22T23:25:09.894340" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:09.894320" 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-08-22T23:25:09.894737" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:09.894812" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:25:09.897223" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:25:09.838410" elapsed="0.058844"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:25:09.897316" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:25:09.897473" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:25:09.835906" elapsed="0.061594"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:25:09.898201" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:25:09.897807" elapsed="0.000487">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:09.897571" elapsed="0.000801">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:25:09.897553" elapsed="0.000854">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:09.898648" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:09.898477" elapsed="0.000231"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:09.898461" elapsed="0.000271"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:09.834465" elapsed="0.064356">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:10.918388" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:10.917907" elapsed="0.000516"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:10.925865" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:10.925595" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:10.926325" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:10.926072" 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-08-22T23:25:10.947999" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:10.948300" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:25:10.948551" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:25:10.928564" elapsed="0.020077"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:10.926453" elapsed="0.022289"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:10.949153" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:10.948804" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:10.926429" 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-08-22T23:25:10.956753" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:10.951828" elapsed="0.004976"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:10.951296" elapsed="0.005544"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:10.951254" elapsed="0.005612"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:10.959451" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:10.957150" elapsed="0.002348"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:10.956924" elapsed="0.002610"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:10.956907" elapsed="0.002652"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:10.960172" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:10.959753" 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-08-22T23:25:10.960524" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:10.960271" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:10.961093" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:10.960787" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:10.960625" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:10.960253" elapsed="0.000925"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:10.961733" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:10.961334" 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-08-22T23:25:10.962064" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:10.961832" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:10.962613" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:10.962301" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:10.962145" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:10.961813" 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-08-22T23:25:10.962850" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:25:10.963707" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:10.963367" 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-08-22T23:25:10.963888" elapsed="0.002354"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:25:10.950309" elapsed="0.016000"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:25:10.966494" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:25:10.966381" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:10.966362" 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-08-22T23:25:10.966757" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:10.966829" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:25:10.969241" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:25:10.921158" elapsed="0.048113"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:25:10.969332" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:25:10.969484" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:25:10.918678" elapsed="0.050833"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:25:10.970176" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:25:10.969806" elapsed="0.000454">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:10.969595" elapsed="0.000777">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:25:10.969563" elapsed="0.000846">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:10.970644" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:10.970481" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:10.970464" elapsed="0.000262"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:10.917170" elapsed="0.053639">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:11.992051" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:11.991542" elapsed="0.000545"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:11.999784" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:11.999499" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:12.000235" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:11.999985" 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-08-22T23:25:12.020275" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:12.020700" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:25:12.020945" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:25:12.002499" elapsed="0.018504"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:12.000399" elapsed="0.020706"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:12.021516" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:12.021169" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:12.000367" elapsed="0.021415"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:12.027970" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:12.024155" elapsed="0.003884"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:12.023635" elapsed="0.004454"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:12.023552" elapsed="0.004573"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:12.031805" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:12.028533" elapsed="0.003338"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:12.028203" elapsed="0.003717"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:12.028180" elapsed="0.003775"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:12.032833" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:12.032194" elapsed="0.000678"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:12.033308" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:12.032972" elapsed="0.000418"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:12.034093" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:12.033669" elapsed="0.000462"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:12.033424" elapsed="0.000759"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:12.032947" elapsed="0.001266"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:12.034976" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:12.034438" 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-08-22T23:25:12.035528" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:12.035195" elapsed="0.000438"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:12.036315" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:12.035894" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:12.035669" elapsed="0.000777"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:12.035168" 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-08-22T23:25:12.036726" elapsed="0.000362"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:25:12.037555" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:12.037251" 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-08-22T23:25:12.037753" 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-08-22T23:25:12.022635" elapsed="0.017538"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:25:12.040369" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:25:12.040245" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:12.040225" 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-08-22T23:25:12.040635" elapsed="0.000049"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:12.040739" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:25:12.043114" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:25:11.994915" elapsed="0.048237"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:25:12.043214" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:25:12.043366" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:25:11.992325" elapsed="0.051067"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:25:12.044064" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:25:12.043695" elapsed="0.000448">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:12.043463" elapsed="0.000753">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:25:12.043446" elapsed="0.000806">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:12.044482" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:12.044333" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:12.044305" elapsed="0.000258"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:11.990970" elapsed="0.053692">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:13.062231" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:13.061747" elapsed="0.000531"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:13.069955" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:13.069665" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:13.070417" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:13.070164" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:25:13.089349" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:13.089694" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:25:13.089923" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:25:13.072862" elapsed="0.017122"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:13.070643" 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-08-22T23:25:13.090488" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:13.090146" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:13.070615" elapsed="0.020141"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:13.098178" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:13.093266" elapsed="0.005015"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:13.092673" elapsed="0.005668"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:13.092630" elapsed="0.005752"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:13.102451" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:13.098908" elapsed="0.003609"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:13.098481" elapsed="0.004127"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:13.098453" elapsed="0.004201"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:13.103462" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:13.102913" 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-08-22T23:25:13.104005" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:13.103645" elapsed="0.000442"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:13.104828" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:13.104391" elapsed="0.000465"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:13.104121" elapsed="0.000771"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:13.103612" elapsed="0.001301"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:13.105432" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:13.105068" 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-08-22T23:25:13.105801" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:13.105528" elapsed="0.000334"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:13.106343" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:13.106046" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:13.105887" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:13.105510" 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-08-22T23:25:13.106595" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:25:13.107432" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:13.107113" 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-08-22T23:25:13.107652" 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-08-22T23:25:13.091569" elapsed="0.018700"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:25:13.110465" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-08-22T23:25:13.110340" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:13.110322" 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-08-22T23:25:13.110886" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:13.110977" elapsed="0.000019"/>
</return>
<msg time="2026-08-22T23:25:13.113587" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:25:13.065177" elapsed="0.048441"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:25:13.113679" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:25:13.113830" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:25:13.062545" elapsed="0.051312"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:25:13.114506" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:25:13.114134" elapsed="0.000483">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:13.113926" elapsed="0.000781">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:25:13.113909" elapsed="0.000841">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:13.115014" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:13.114820" elapsed="0.000268"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:13.114803" elapsed="0.000316"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:13.061176" elapsed="0.054048">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:14.132628" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:14.132147" elapsed="0.000515"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:14.139876" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:14.139608" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:14.140347" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:14.140095" 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-08-22T23:25:14.157976" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:14.158140" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:25:14.158249" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:25:14.142525" elapsed="0.015750"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:14.140469" elapsed="0.017854"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:14.158518" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:14.158353" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:14.140447" elapsed="0.018215"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:14.166960" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:14.161021" elapsed="0.006052"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:14.160488" elapsed="0.006785"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:14.160447" elapsed="0.006891"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:14.170752" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:14.168005" elapsed="0.002795"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:14.167471" elapsed="0.003365"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:14.167432" elapsed="0.003430"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:14.171437" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:14.171039" 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-08-22T23:25:14.171794" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:14.171536" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:14.172353" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:14.172037" elapsed="0.000443"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:14.171877" elapsed="0.000644"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:14.171518" elapsed="0.001024"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:14.173086" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:14.172718" 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-08-22T23:25:14.173416" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:14.173184" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:14.173971" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:14.173673" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:14.173500" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:14.173166" 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-08-22T23:25:14.174207" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:25:14.175029" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:14.174733" 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-08-22T23:25:14.175209" 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-08-22T23:25:14.159465" elapsed="0.018207"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:25:14.177854" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:25:14.177742" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:14.177724" 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-08-22T23:25:14.178095" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:14.178168" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:25:14.180539" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:25:14.135291" elapsed="0.045278"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:25:14.180660" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:25:14.180837" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:25:14.132895" elapsed="0.047968"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:25:14.181502" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:25:14.181141" elapsed="0.000454">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:14.180933" elapsed="0.000747">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:25:14.180916" elapsed="0.000800">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:14.182086" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:14.181825" elapsed="0.000322"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:14.181807" elapsed="0.000365"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:14.131615" elapsed="0.050642">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:15.201696" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:15.201188" elapsed="0.000546"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:15.209184" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:15.208923" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:15.209650" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:15.209385" 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-08-22T23:25:15.228526" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:15.228744" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:25:15.228963" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:25:15.211927" elapsed="0.017093"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:15.209775" elapsed="0.019342"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:15.229514" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:15.229178" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:15.209751" elapsed="0.019987"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:15.237987" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:15.232032" elapsed="0.006072"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:15.231482" elapsed="0.006707"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:15.231443" elapsed="0.006807"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:15.242394" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:15.238942" elapsed="0.003499"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:15.238383" elapsed="0.004093"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:15.238343" elapsed="0.004157"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:15.243096" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:15.242693" 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-08-22T23:25:15.243429" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:15.243194" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:15.244006" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:15.243687" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:15.243512" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:15.243177" elapsed="0.000915"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:15.244627" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:15.244248" 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-08-22T23:25:15.244955" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:15.244725" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:15.245559" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:15.245259" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:15.245096" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:15.244707" 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-08-22T23:25:15.245821" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:25:15.246650" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:15.246333" 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-08-22T23:25:15.246828" 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-08-22T23:25:15.230514" elapsed="0.018782"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:25:15.249477" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:25:15.249367" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:15.249349" 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-08-22T23:25:15.249742" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:15.249813" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:25:15.252136" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:25:15.204418" elapsed="0.047748"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:25:15.252225" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:25:15.252375" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:25:15.201976" elapsed="0.050425"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:25:15.253058" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:25:15.252697" elapsed="0.000440">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:15.252472" elapsed="0.000737">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:25:15.252455" elapsed="0.000788">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:15.253457" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:15.253312" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:15.253295" elapsed="0.000242"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:15.200633" elapsed="0.053003">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:16.272793" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:16.272292" elapsed="0.000537"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:16.280130" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:16.279868" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:16.280589" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:16.280331" 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-08-22T23:25:16.300220" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:16.300680" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:25:16.300911" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:25:16.282855" elapsed="0.018115"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:16.280715" elapsed="0.020353"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:16.301553" elapsed="0.000089"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:16.301130" elapsed="0.000645"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:16.280691" elapsed="0.021138"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:16.309520" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:16.304251" elapsed="0.005358"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:16.303705" elapsed="0.005957"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:16.303661" elapsed="0.006036"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:16.313430" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:16.310089" elapsed="0.003408"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:16.309777" elapsed="0.003770"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:16.309754" elapsed="0.003857"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:16.314422" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:16.313865" 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-08-22T23:25:16.314919" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:16.314559" elapsed="0.000442"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:16.315705" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:16.315262" elapsed="0.000503"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:16.315035" elapsed="0.000783"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:16.314534" elapsed="0.001314"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:16.316607" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:16.316070" 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-08-22T23:25:16.317126" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:16.316779" elapsed="0.000428"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:16.318075" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:16.317466" elapsed="0.000652"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:16.317242" elapsed="0.000929"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:16.316748" elapsed="0.001453"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:25:16.318420" elapsed="0.000484"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:25:16.319373" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:16.319070" 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-08-22T23:25:16.319554" 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-08-22T23:25:16.302693" elapsed="0.019476"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:25:16.322356" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:25:16.322244" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:16.322224" 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-08-22T23:25:16.322616" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:16.322688" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:25:16.325113" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:25:16.275487" elapsed="0.049655"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:25:16.325203" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:25:16.325356" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:25:16.273072" elapsed="0.052310"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:25:16.326061" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:25:16.325680" elapsed="0.000462">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:16.325453" elapsed="0.000763">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:25:16.325436" elapsed="0.000815">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:16.326468" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:16.326321" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:16.326304" elapsed="0.000245"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:16.271720" elapsed="0.054929">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:17.345520" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:17.345040" elapsed="0.000516"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:17.353092" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:17.352825" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:17.353548" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:17.353298" 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-08-22T23:25:17.373313" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:17.373492" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:25:17.373637" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:25:17.355884" elapsed="0.017784"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:17.353709" elapsed="0.020010"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:17.373959" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:17.373751" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:17.353683" elapsed="0.020371"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:17.381009" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:17.375197" elapsed="0.005885"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:17.374940" elapsed="0.006192"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:17.374917" elapsed="0.006252"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:17.384946" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:17.381605" elapsed="0.003410"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:17.381249" elapsed="0.003950"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:17.381225" elapsed="0.004013"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:17.386109" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:17.385483" 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-08-22T23:25:17.386607" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:17.386250" elapsed="0.000443"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:17.387411" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:17.386951" elapsed="0.000499"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:17.386727" elapsed="0.000775"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:17.386224" elapsed="0.001307"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:17.388345" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:17.387803" 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-08-22T23:25:17.388838" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:17.388485" elapsed="0.000435"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:17.389652" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:17.389174" elapsed="0.000519"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:17.388954" elapsed="0.000790"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:17.388460" 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-08-22T23:25:17.390016" elapsed="0.000525"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:25:17.391217" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:17.390797" 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-08-22T23:25:17.391496" elapsed="0.002822"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:25:17.374456" elapsed="0.019932"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:25:17.394573" elapsed="0.000069"/>
</return>
<status status="PASS" start="2026-08-22T23:25:17.394459" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:17.394441" elapsed="0.000283"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:17.394881" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:17.394954" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:25:17.397469" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:25:17.348333" elapsed="0.049175"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:25:17.397605" elapsed="0.000038"/>
</return>
<msg time="2026-08-22T23:25:17.397804" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:25:17.345815" elapsed="0.052024"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:25:17.398818" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:25:17.398224" elapsed="0.000717">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:17.397930" elapsed="0.001123">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:25:17.397908" elapsed="0.001203">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:17.399457" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:17.399229" elapsed="0.000521"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:17.399200" elapsed="0.000597"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:17.344455" elapsed="0.055477">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:18.421742" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:18.421235" elapsed="0.000543"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:18.429339" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:18.429072" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:18.429813" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:18.429544" 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-08-22T23:25:18.447781" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:18.448104" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:25:18.448344" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:25:18.432026" elapsed="0.016382"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:18.429938" elapsed="0.018578"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:18.448992" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:18.448615" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:18.429914" elapsed="0.019293"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:18.456745" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:18.451806" elapsed="0.004991"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:18.451193" elapsed="0.005641"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:18.451149" elapsed="0.005710"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:18.459507" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:18.457141" elapsed="0.002413"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:18.456916" elapsed="0.002689"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:18.456900" elapsed="0.002732"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:18.460217" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:18.459814" 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-08-22T23:25:18.460555" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:18.460317" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:18.461122" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:18.460816" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:18.460655" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:18.460299" elapsed="0.000911"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:18.461749" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:18.461368" 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-08-22T23:25:18.462077" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:18.461847" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:18.462632" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:18.462318" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:18.462160" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:18.461829" 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-08-22T23:25:18.463098" elapsed="0.000370"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:25:18.463950" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:18.463649" 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-08-22T23:25:18.464130" 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-08-22T23:25:18.450122" elapsed="0.016440"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:25:18.466766" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:25:18.466651" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:18.466632" 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-08-22T23:25:18.467014" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:18.467087" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:25:18.469511" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:25:18.424451" elapsed="0.045089"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:25:18.469620" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:25:18.469777" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:25:18.422018" elapsed="0.047786"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:25:18.470470" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:25:18.470090" elapsed="0.000462">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:18.469877" elapsed="0.000768">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:25:18.469860" elapsed="0.000820">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:18.470900" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:18.470751" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:18.470734" elapsed="0.000247"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:18.420673" elapsed="0.050393">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:19.489651" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:19.489142" elapsed="0.000545"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:19.497190" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:19.496918" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:19.497687" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:19.497398" 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-08-22T23:25:19.517385" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:19.517747" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:25:19.517936" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:25:19.499933" elapsed="0.018043"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:19.497816" elapsed="0.020239"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:19.518386" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:19.518104" elapsed="0.000386"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:19.497790" elapsed="0.020735"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:19.525425" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:19.520703" elapsed="0.004797"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:19.520124" elapsed="0.005429"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:19.520080" elapsed="0.005530"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:19.529624" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:19.526090" elapsed="0.003604"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:19.525758" elapsed="0.003989"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:19.525671" elapsed="0.004112"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:19.530669" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:19.530040" elapsed="0.000671"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:19.531165" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:19.530817" elapsed="0.000448"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:19.532004" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:19.531539" elapsed="0.000505"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:19.531302" elapsed="0.000796"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:19.530790" elapsed="0.001339"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:19.532918" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:19.532360" 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-08-22T23:25:19.533402" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:19.533060" elapsed="0.000426"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:19.534221" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:19.533780" elapsed="0.000480"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:19.533521" elapsed="0.000792"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:19.533033" elapsed="0.001312"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:25:19.534569" elapsed="0.000607"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:25:19.535878" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:19.535452" elapsed="0.000453"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:25:19.536058" elapsed="0.002511"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:25:19.519174" elapsed="0.019481"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:25:19.538848" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:25:19.538733" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:19.538711" 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-08-22T23:25:19.539097" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:19.539168" elapsed="0.000039"/>
</return>
<msg time="2026-08-22T23:25:19.541623" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:25:19.492407" elapsed="0.049247"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:25:19.541791" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:25:19.541952" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:25:19.489939" elapsed="0.052040"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:25:19.542679" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:25:19.542268" elapsed="0.000490">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:19.542052" elapsed="0.000779">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:25:19.542035" elapsed="0.000831">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:19.543086" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:19.542937" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:19.542920" elapsed="0.000247"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:19.488623" elapsed="0.054642">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:20.562530" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:20.562058" elapsed="0.000508"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:20.569868" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:20.569603" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:20.570420" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:20.570175" 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-08-22T23:25:20.589330" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:20.589535" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:25:20.589721" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:25:20.572647" elapsed="0.017113"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:20.570543" elapsed="0.019284"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:20.590102" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:20.589872" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:20.570520" elapsed="0.019708"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:20.595961" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:20.591839" elapsed="0.004214"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:20.591486" elapsed="0.004630"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:20.591455" elapsed="0.004704"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:20.600356" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:20.596688" elapsed="0.003718"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:20.596264" elapsed="0.004178"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:20.596232" elapsed="0.004235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:20.601087" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:20.600665" 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-08-22T23:25:20.601528" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:20.601269" elapsed="0.000338"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:20.602111" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:20.601800" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:20.601633" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:20.601248" elapsed="0.000950"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:20.602768" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:20.602355" elapsed="0.000441"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:20.603148" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:20.602877" elapsed="0.000332"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:20.603728" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:20.603392" elapsed="0.000364"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:20.603233" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:20.602854" elapsed="0.000960"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:25:20.603980" elapsed="0.000362"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:25:20.604850" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:20.604506" 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-08-22T23:25:20.605033" 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-08-22T23:25:20.590815" elapsed="0.016761"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:25:20.607781" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:25:20.607668" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:20.607649" 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-08-22T23:25:20.608054" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:20.608128" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:25:20.610493" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:25:20.565276" elapsed="0.045254"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:25:20.610624" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:25:20.610799" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:25:20.562821" elapsed="0.048006"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:25:20.611515" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:25:20.611139" elapsed="0.000480">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:20.610898" elapsed="0.000797">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:25:20.610882" elapsed="0.000847">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:20.611960" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:20.611799" elapsed="0.000239"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:20.611782" elapsed="0.000288"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:20.561502" elapsed="0.050655">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:21.631531" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:21.631061" elapsed="0.000505"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:21.639295" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:21.638964" elapsed="0.000391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:21.639819" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:21.639517" 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-08-22T23:25:21.664322" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:21.664525" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:25:21.664709" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:25:21.642057" elapsed="0.022681"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:21.639947" elapsed="0.024859"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:21.665075" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:21.664844" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:21.639922" elapsed="0.025247"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:21.669035" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:21.666402" elapsed="0.002684"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:21.666154" elapsed="0.002970"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:21.666131" elapsed="0.003019"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:21.671810" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:21.669427" elapsed="0.002430"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:21.669206" elapsed="0.002687"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:21.669189" elapsed="0.002729"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:21.672517" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:21.672107" 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-08-22T23:25:21.672876" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:21.672636" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:21.673435" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:21.673125" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:21.672961" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:21.672617" elapsed="0.000907"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:21.674069" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:21.673699" 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-08-22T23:25:21.674399" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:21.674167" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:21.674989" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:21.674656" elapsed="0.000360"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:21.674482" elapsed="0.000572"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:21.674149" 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-08-22T23:25:21.675248" elapsed="0.000371"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:25:21.676164" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:21.675859" 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-08-22T23:25:21.676344" 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-08-22T23:25:21.665629" elapsed="0.013235"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:25:21.679058" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:25:21.678941" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:21.678921" 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-08-22T23:25:21.679307" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:21.679380" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:25:21.681804" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:25:21.634287" elapsed="0.047547"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:25:21.681897" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:25:21.682055" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:25:21.631831" elapsed="0.050252"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:25:21.682772" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:25:21.682368" elapsed="0.000518">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:21.682155" elapsed="0.000808">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:25:21.682138" elapsed="0.000860">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:21.683220" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:21.683070" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:21.683053" elapsed="0.000248"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:21.630474" elapsed="0.052914">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:22.701965" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:22.701478" elapsed="0.000522"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:22.709261" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:22.709000" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:22.709727" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:22.709460" 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-08-22T23:25:22.734712" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:22.734999" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:25:22.735330" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:25:22.711948" elapsed="0.023442"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:22.709847" elapsed="0.025642"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:22.735934" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:22.735551" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:22.709824" elapsed="0.026303"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:22.742246" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:22.738436" elapsed="0.003884"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:22.737941" elapsed="0.004431"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:22.737899" elapsed="0.004511"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:22.746324" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:22.742867" elapsed="0.003527"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:22.742493" elapsed="0.003953"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:22.742468" elapsed="0.004015"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:22.747357" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:22.746776" 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-08-22T23:25:22.747875" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:22.747501" elapsed="0.000458"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:22.748700" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:22.748231" elapsed="0.000509"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:22.747994" elapsed="0.000799"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:22.747475" elapsed="0.001349"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:22.749612" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:22.749056" 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-08-22T23:25:22.750099" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:22.749756" elapsed="0.000426"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:22.750894" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:22.750447" elapsed="0.000474"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:22.750217" elapsed="0.000740"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:22.749730" 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-08-22T23:25:22.751132" elapsed="0.000406"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:25:22.752020" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:22.751719" 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-08-22T23:25:22.752199" 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-08-22T23:25:22.736955" elapsed="0.017776"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:25:22.754912" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:25:22.754801" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:22.754783" 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-08-22T23:25:22.755158" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:22.755229" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:25:22.757615" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:25:22.704695" elapsed="0.052950"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:25:22.757706" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:25:22.757858" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:25:22.702233" elapsed="0.055652"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:25:22.758597" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:25:22.758207" elapsed="0.000473">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:22.757997" elapsed="0.000757">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:25:22.757979" elapsed="0.000809">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:22.759003" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:22.758857" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:22.758841" elapsed="0.000242"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:22.700954" elapsed="0.058211">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<msg time="2026-08-22T23:25:22.759261" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>60s</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:24:22.683828" elapsed="60.075532">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<doc>Check that the modified device data make their way into the configurer node.</doc>
<status status="FAIL" start="2026-08-22T23:24:22.470238" elapsed="60.289291">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</test>
<test id="s1-s2-t19" name="Delete_Device_Data" line="192">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:25:22.762766" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:25:22.762461" elapsed="0.000569"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:25:22.764021" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:22.763912" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:22.763893" 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-08-22T23:25:22.768935" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:22.768828" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:22.768809" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:25:22.770000" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:25:22.769611" elapsed="0.000416"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:25:22.770487" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:25:22.770185" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:25:22.770557" elapsed="0.000056"/>
</return>
<msg time="2026-08-22T23:25:22.770741" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:25:22.769224" 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-08-22T23:25:22.776364" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:22.776257" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:22.776238" 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-08-22T23:25:22.777638" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:22.777505" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:22.777487" elapsed="0.000252"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:25:22.778208" 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-08-22T23:25:22.777887" elapsed="0.000348"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:25:22.778790" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:25:22.778393" elapsed="0.000429"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:25:22.810447" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:25:22.779338" elapsed="0.031287"/>
</kw>
<msg time="2026-08-22T23:25:22.810831" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:25:22.810878" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:22.778981" elapsed="0.031936"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:25:22.827646" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:25:22.811498" elapsed="0.016249"/>
</kw>
<msg time="2026-08-22T23:25:22.827917" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:25:22.827963" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m        ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:22.811117" elapsed="0.016884"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:22.828332" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:22.828093" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:22.828067" elapsed="0.000347"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:22.828900" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:22.828559" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:22.829249" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:22.829034" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:22.829015" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:25:22.829363" 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-08-22T23:25:22.832180" elapsed="0.000145"/>
</kw>
<msg time="2026-08-22T23:25:22.832390" 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-08-22T23:25:22.830980" elapsed="0.001562"/>
</kw>
<kw name="Open 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-08-22T23:25:22.832869" elapsed="0.000091"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:22.833243" 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-08-22T23:25:22.830227" elapsed="0.003227"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:25:22.829675" elapsed="0.003848"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:25:22.777205" elapsed="0.056453"/>
</kw>
<msg time="2026-08-22T23:25:22.833755" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:25:22.833800" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m        ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:22.776602" elapsed="0.057237"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:25:22.834024" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:25:22.833917" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:22.833899" 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-08-22T23:25:22.834516" 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-08-22T23:25:22.834887" elapsed="0.000079"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:25:22.835018" 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-08-22T23:25:22.775914" elapsed="0.059217"/>
</kw>
<msg time="2026-08-22T23:25:22.835229" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:25:22.835273" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m        ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:22.771149" elapsed="0.064164"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:22.835805" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:22.835391" elapsed="0.000470"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:22.835373" elapsed="0.000512"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:25:22.771009" elapsed="0.064901"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:25:22.841567" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:22.841460" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:22.841440" 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-08-22T23:25:22.842832" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:22.842725" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:22.842706" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:25:22.843355" 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-08-22T23:25:22.843041" elapsed="0.000340"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:25:22.843771" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:25:22.843533" elapsed="0.000264"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:25:22.880435" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:25:22.844282" elapsed="0.036264"/>
</kw>
<msg time="2026-08-22T23:25:22.880800" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:25:22.880849" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:22.843953" elapsed="0.036933"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:25:22.896537" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:25:22.881426" elapsed="0.015241"/>
</kw>
<msg time="2026-08-22T23:25:22.896863" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:25:22.896911" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m        ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:22.881069" elapsed="0.015880"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:22.897259" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:22.897030" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:22.897008" elapsed="0.000333"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:22.897831" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:22.897488" 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-08-22T23:25:22.898215" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:22.897994" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:22.897975" elapsed="0.000319"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:25:22.898327" 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-08-22T23:25:22.901649" elapsed="0.000208"/>
</kw>
<msg time="2026-08-22T23:25:22.901948" 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-08-22T23:25:22.900204" elapsed="0.001922"/>
</kw>
<kw name="Open 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-08-22T23:25:22.902622" elapsed="0.000115"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:22.903150" elapsed="0.000110"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:25:22.899255" elapsed="0.004161"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:25:22.898647" elapsed="0.004857"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:25:22.842369" elapsed="0.061287"/>
</kw>
<msg time="2026-08-22T23:25:22.903753" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:25:22.903797" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m        ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:22.841799" elapsed="0.062050"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:25:22.904054" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:25:22.903942" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:22.903922" 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-08-22T23:25:22.904550" elapsed="0.000076"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:22.904953" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:25:22.905028" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:25:22.841108" elapsed="0.064032"/>
</kw>
<msg time="2026-08-22T23:25:22.905257" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:25:22.905315" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m        ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:22.836181" elapsed="0.069186"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:22.905837" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:22.905450" elapsed="0.000443"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:22.905431" elapsed="0.000486"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:25:22.836044" elapsed="0.069898"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:25:22.911876" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:22.911762" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:22.911742" 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-08-22T23:25:22.913243" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:22.913133" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:22.913115" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:25:22.913821" 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-08-22T23:25:22.913450" elapsed="0.000399"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:25:22.914237" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:25:22.914005" elapsed="0.000257"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:25:22.945277" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:25:22.914809" elapsed="0.030578"/>
</kw>
<msg time="2026-08-22T23:25:22.945571" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:25:22.945642" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:22.914416" elapsed="0.031266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:25:22.961441" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:25:22.946218" elapsed="0.015631"/>
</kw>
<msg time="2026-08-22T23:25:22.962466" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:25:22.962626" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m        ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:22.945852" elapsed="0.016869"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:22.963567" elapsed="0.000096"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:22.962942" elapsed="0.000798"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:22.962881" elapsed="0.000916"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:22.964978" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:22.964143" elapsed="0.000975"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:22.965796" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:22.965270" elapsed="0.000653"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:22.965229" elapsed="0.000749"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:25:22.966059" elapsed="0.000075"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<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-08-22T23:25:22.969335" elapsed="0.000150"/>
</kw>
<msg time="2026-08-22T23:25:22.969551" 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-08-22T23:25:22.968160" elapsed="0.001568"/>
</kw>
<kw name="Open 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-08-22T23:25:22.970035" elapsed="0.000090"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:22.970414" 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-08-22T23:25:22.967435" 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-08-22T23:25:22.966799" elapsed="0.003937"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:25:22.912820" elapsed="0.058015"/>
</kw>
<msg time="2026-08-22T23:25:22.970931" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:25:22.970975" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m        ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:22.912118" elapsed="0.058898"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:25:22.971200" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:25:22.971093" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:22.971074" 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-08-22T23:25:22.971722" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:22.972075" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:25:22.972147" 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-08-22T23:25:22.911367" elapsed="0.060896"/>
</kw>
<msg time="2026-08-22T23:25:22.972362" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:25:22.972406" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m        ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:22.906242" elapsed="0.066210"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:22.972945" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:22.972531" elapsed="0.000468"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:22.972513" elapsed="0.000510"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:25:22.906100" elapsed="0.066948"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:25:22.770825" elapsed="0.202258"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:25:22.768452" elapsed="0.204699"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:25:22.763620" elapsed="0.209631"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:22.763178" elapsed="0.210124"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:25:22.760325" elapsed="0.213036"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:25:22.974010" level="INFO">${template_as_string} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${template_as_string}</var>
<arg>DEVICE_NAME=${device_name}</arg>
<arg>RESTCONF_ROOT=${RESTCONF_ROOT}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:25:22.973539" elapsed="0.000498"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:23.016436" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:23.016058" elapsed="0.000407"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:25:23.017263" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:25:23.016991" elapsed="0.000356">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:25:23.017442" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:25:23.016649" elapsed="0.000817"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:25:23.018027" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:25:23.017644" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:25:23.018351" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:25:23.018535" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:25:23.018214" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:23.018989" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:23.018737" 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-08-22T23:25:23.019981" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:23.019727" elapsed="0.000299"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:25:23.020439" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:25:23.020180" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:25:23.021150" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:25:23.020852" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:25:23.021936" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:25:23.021694" elapsed="0.000268"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:25:23.022012" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:25:23.022164" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:25:23.021360" elapsed="0.000829"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:25:23.022340" elapsed="0.000288"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:25:23.020716" elapsed="0.001954"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:25:23.023209" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:25:23.022912" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:25:23.025819" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:25:23.023763" elapsed="0.002083"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:25:23.025897" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:25:23.026050" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:25:23.023415" elapsed="0.002660"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:25:23.026305" elapsed="0.000246"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:25:23.022783" elapsed="0.003828"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:25:23.020517" elapsed="0.006130"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:25:23.026691" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:25:23.026855" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:25:23.019395" elapsed="0.007485"/>
</kw>
<status status="PASS" start="2026-08-22T23:25:23.019101" elapsed="0.007812"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.027084" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:23.026937" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.019082" elapsed="0.008079"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:25:23.027917" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:25:23.027302" elapsed="0.000644"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:25:23.027996" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:25:23.015437" elapsed="0.012682"/>
</kw>
<msg time="2026-08-22T23:25:23.028173" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:25:23.003044" elapsed="0.025175"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.040715" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.053050" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.065435" 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-08-22T23:25:23.065639" 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-08-22T23:25:23.065814" 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-08-22T23:25:23.066190" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:23.066045" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:23.066024" 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-08-22T23:25:23.066406" 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-08-22T23:25:23.066595" 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-08-22T23:25:23.066761" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:25:23.065995" elapsed="0.000867"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:25:23.065891" 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-08-22T23:25:23.067037" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:23.067114" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:25:23.067234" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:25:22.998729" elapsed="0.068531"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:23.068355" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:23.068105" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:25:23.079209" level="INFO">DELETE Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:23.079526" level="INFO">DELETE Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/yang-data+xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:23.079837" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:23.070531" elapsed="0.010158">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:23.068466" elapsed="0.012401">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.081281" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:23.080942" elapsed="0.000477"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:23.068449" elapsed="0.013024">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.082316" elapsed="0.000058"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:23.082480" elapsed="0.000062"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="FAIL" start="2026-08-22T23:25:23.067522" elapsed="0.015245">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:23.082908" elapsed="0.000034"/>
</return>
<arg>${directory_with_template_folders}${/}datamod1</arg>
<arg>${template_as_string}</arg>
<arg>session=${NODE_SETTER}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-08-22T23:25:22.974259" elapsed="0.108855">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<doc>Send a request to delete the sample test data on the device and check that the request went OK.</doc>
<status status="FAIL" start="2026-08-22T23:25:22.759771" elapsed="0.323663">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</test>
<test id="s1-s2-t20" name="Check_Device_Data_Is_Deleted" line="202">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:25:23.140170" elapsed="0.000294"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:25:23.139825" elapsed="0.000720"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:25:23.141699" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:23.141534" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.141505" elapsed="0.000277"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:25:23.146739" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:23.146630" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.146611" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:25:23.147954" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:25:23.147452" elapsed="0.000533"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:25:23.148451" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:25:23.148144" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:25:23.148522" elapsed="0.000041"/>
</return>
<msg time="2026-08-22T23:25:23.148714" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:25:23.147033" elapsed="0.001707"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:25:23.154327" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:23.154219" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.154201" 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-08-22T23:25:23.155661" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:23.155528" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.155510" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:25:23.156204" 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-08-22T23:25:23.155873" elapsed="0.000358"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:25:23.156637" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:25:23.156386" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:25:23.189076" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:25:23.157150" elapsed="0.032037"/>
</kw>
<msg time="2026-08-22T23:25:23.189367" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:25:23.189414" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:23.156818" elapsed="0.032634"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:25:23.209256" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:25:23.189983" elapsed="0.019382"/>
</kw>
<msg time="2026-08-22T23:25:23.209538" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:25:23.209604" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:23.189641" elapsed="0.020002"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.209961" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:23.209728" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.209706" elapsed="0.000333"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:23.210505" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:23.210181" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.210870" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:23.210658" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.210639" elapsed="0.000376"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:25:23.211052" 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-08-22T23:25:23.213850" elapsed="0.000146"/>
</kw>
<msg time="2026-08-22T23:25:23.214060" 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-08-22T23:25:23.212639" elapsed="0.001571"/>
</kw>
<kw name="Open 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-08-22T23:25:23.214541" elapsed="0.000113"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.214938" 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-08-22T23:25:23.211922" 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-08-22T23:25:23.211351" elapsed="0.003870"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:25:23.155225" elapsed="0.060094"/>
</kw>
<msg time="2026-08-22T23:25:23.215413" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:25:23.215457" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:23.154570" elapsed="0.060925"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:25:23.215702" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:25:23.215571" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.215553" 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-08-22T23:25:23.216189" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.216525" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:25:23.216757" 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-08-22T23:25:23.153881" elapsed="0.062989"/>
</kw>
<msg time="2026-08-22T23:25:23.216963" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:25:23.217006" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:23.149122" elapsed="0.067923"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.217366" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:23.217120" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.217103" elapsed="0.000341"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:25:23.148981" elapsed="0.068487"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:25:23.223096" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:23.222988" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.222968" 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-08-22T23:25:23.224303" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:23.224196" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.224178" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:25:23.224854" 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-08-22T23:25:23.224511" elapsed="0.000369"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:25:23.225256" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:25:23.225036" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:25:23.256349" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:25:23.225788" elapsed="0.030666"/>
</kw>
<msg time="2026-08-22T23:25:23.256660" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:25:23.256710" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:23.225438" elapsed="0.031350"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:25:23.273875" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:25:23.257345" elapsed="0.016639"/>
</kw>
<msg time="2026-08-22T23:25:23.274160" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:25:23.274208" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:23.256994" elapsed="0.017250"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.274619" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:23.274328" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.274305" elapsed="0.000398"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:23.275164" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:23.274844" 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-08-22T23:25:23.275511" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:23.275297" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.275279" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:25:23.275643" 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-08-22T23:25:23.278332" elapsed="0.000158"/>
</kw>
<msg time="2026-08-22T23:25:23.278557" 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-08-22T23:25:23.277183" 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-08-22T23:25:23.279023" elapsed="0.000086"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.279389" 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-08-22T23:25:23.276465" elapsed="0.003160"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:25:23.275926" 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="PASS" start="2026-08-22T23:25:23.223894" elapsed="0.055898"/>
</kw>
<msg time="2026-08-22T23:25:23.279885" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:25:23.279929" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:23.223312" elapsed="0.056654"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:25:23.280149" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:25:23.280044" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.280025" 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-08-22T23:25:23.280657" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.280993" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:25:23.281064" 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-08-22T23:25:23.222638" elapsed="0.058536"/>
</kw>
<msg time="2026-08-22T23:25:23.281268" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:25:23.281311" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:23.217759" elapsed="0.063591"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.281831" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:23.281425" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.281408" elapsed="0.000543"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:25:23.217620" elapsed="0.064355"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:25:23.287621" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:23.287499" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.287480" 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-08-22T23:25:23.288838" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:23.288731" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.288713" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:25:23.289356" 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-08-22T23:25:23.289045" elapsed="0.000338"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:25:23.289772" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:25:23.289536" elapsed="0.000261"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:25:23.319571" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:25:23.290286" elapsed="0.029401"/>
</kw>
<msg time="2026-08-22T23:25:23.319857" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:25:23.319904" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:23.289958" elapsed="0.029983"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:25:23.337299" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:25:23.320440" elapsed="0.017108"/>
</kw>
<msg time="2026-08-22T23:25:23.337997" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:25:23.338101" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:23.320106" elapsed="0.018078"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.338949" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:23.338364" elapsed="0.000713"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.338316" elapsed="0.000816"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:23.340201" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:23.339443" 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-08-22T23:25:23.341021" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:23.340498" elapsed="0.000645"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.340457" elapsed="0.000738"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:25:23.341270" 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-08-22T23:25:23.344892" elapsed="0.000145"/>
</kw>
<msg time="2026-08-22T23:25:23.345101" 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-08-22T23:25:23.343745" elapsed="0.001504"/>
</kw>
<kw name="Open 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-08-22T23:25:23.345544" elapsed="0.000110"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.345935" 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-08-22T23:25:23.343024" 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-08-22T23:25:23.341893" elapsed="0.004318"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:25:23.288407" elapsed="0.057905"/>
</kw>
<msg time="2026-08-22T23:25:23.346404" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:25:23.346464" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:23.287840" elapsed="0.058713"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:25:23.346768" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:25:23.346659" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.346639" 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-08-22T23:25:23.347256" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.347753" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:25:23.347828" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:25:23.287149" elapsed="0.060790"/>
</kw>
<msg time="2026-08-22T23:25:23.348037" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:25:23.348081" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:23.282246" elapsed="0.065873"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.348442" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:23.348195" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.348178" elapsed="0.000341"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:25:23.282108" elapsed="0.066435"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:25:23.148797" elapsed="0.199798"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:25:23.146241" elapsed="0.202420"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:25:23.141204" elapsed="0.207517"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:23.140720" elapsed="0.208048"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:25:23.085008" elapsed="0.263821"/>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:23.361064" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:23.360666" elapsed="0.000426"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:23.368433" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:23.368185" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:23.368899" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:23.368646" 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-08-22T23:25:23.379456" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:23.379655" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:23.379792" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:23.371085" elapsed="0.009124">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:23.369010" elapsed="0.011318">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.380520" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:23.380364" elapsed="0.000238"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:23.368992" elapsed="0.011636">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.381002" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:23.381136" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:23.381099" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:23.381082" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.381340" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:23.381410" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:23.363850" elapsed="0.017665">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:23.381598" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:23.361304" elapsed="0.020390">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.381921" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:23.381772" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:23.381756" elapsed="0.000243"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.382191" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:23.382051" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:23.382036" elapsed="0.000232"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:23.360253" elapsed="0.022091">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<doc>Get the device data and make sure it is empty again.</doc>
<status status="FAIL" start="2026-08-22T23:25:23.083926" elapsed="0.298600">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</test>
<test id="s1-s2-t21" name="Check_Device_Data_Deletion_Is_Visible_On_Checker" line="206">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:25:23.387141" elapsed="0.000297"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:25:23.386774" elapsed="0.000741"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:25:23.388911" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:23.388759" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.388733" elapsed="0.000271"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:25:23.395709" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:23.395600" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.395569" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:25:23.396779" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:25:23.396377" elapsed="0.000429"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:25:23.397269" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:25:23.396966" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:25:23.397340" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:25:23.397495" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:25:23.395999" 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-08-22T23:25:23.403171" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:23.403061" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.403043" 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-08-22T23:25:23.404385" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:23.404279" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.404260" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:25:23.404930" 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-08-22T23:25:23.404613" elapsed="0.000344"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:25:23.405338" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:25:23.405111" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:25:23.442752" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:25:23.405870" elapsed="0.037007"/>
</kw>
<msg time="2026-08-22T23:25:23.443065" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:25:23.443112" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:23.405519" elapsed="0.037630"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:25:23.482950" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:25:23.443908" elapsed="0.039296"/>
</kw>
<msg time="2026-08-22T23:25:23.483638" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:25:23.483750" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:23.443335" elapsed="0.040498"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.484523" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:23.484017" elapsed="0.000666"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.483968" elapsed="0.000774"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:23.485787" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:23.485062" elapsed="0.000887"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.486674" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:23.486098" elapsed="0.000705"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.486058" elapsed="0.000787"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:25:23.486882" 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-08-22T23:25:23.489631" elapsed="0.000147"/>
</kw>
<msg time="2026-08-22T23:25:23.489845" 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-08-22T23:25:23.488441" elapsed="0.001553"/>
</kw>
<kw name="Open 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-08-22T23:25:23.490295" elapsed="0.000088"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.490699" 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-08-22T23:25:23.487757" elapsed="0.003154"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:25:23.487179" elapsed="0.003801"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:25:23.403978" elapsed="0.087099"/>
</kw>
<msg time="2026-08-22T23:25:23.491171" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:25:23.491216" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:23.403388" elapsed="0.087865"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:25:23.491484" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:25:23.491377" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.491357" 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-08-22T23:25:23.492005" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.492340" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:25:23.492412" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:25:23.402722" elapsed="0.089797"/>
</kw>
<msg time="2026-08-22T23:25:23.492781" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:25:23.492827" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:23.397958" elapsed="0.094905"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.493190" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:23.492941" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.492923" elapsed="0.000343"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:25:23.397811" elapsed="0.095480"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:25:23.498817" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:23.498709" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.498691" 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-08-22T23:25:23.500041" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:23.499934" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.499916" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:25:23.500568" 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-08-22T23:25:23.500251" elapsed="0.000361"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:25:23.500987" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:25:23.500767" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:25:23.532176" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:25:23.501498" elapsed="0.030781"/>
</kw>
<msg time="2026-08-22T23:25:23.532464" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:25:23.532511" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:23.501169" elapsed="0.031379"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:25:23.563728" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:25:23.533074" elapsed="0.030768"/>
</kw>
<msg time="2026-08-22T23:25:23.564015" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:25:23.564061" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:23.532737" elapsed="0.031361"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.564403" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:23.564178" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.564157" elapsed="0.000327"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:23.564961" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:23.564646" 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-08-22T23:25:23.565430" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:23.565213" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.565194" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:25:23.565543" 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-08-22T23:25:23.568250" elapsed="0.000145"/>
</kw>
<msg time="2026-08-22T23:25:23.568459" 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-08-22T23:25:23.567101" elapsed="0.001524"/>
</kw>
<kw name="Open 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-08-22T23:25:23.568926" elapsed="0.000088"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.569292" 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-08-22T23:25:23.566371" 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-08-22T23:25:23.565832" elapsed="0.003733"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:25:23.499628" elapsed="0.070068"/>
</kw>
<msg time="2026-08-22T23:25:23.569788" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:25:23.569832" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:23.499040" elapsed="0.070829"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:25:23.570050" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:25:23.569945" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.569927" 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-08-22T23:25:23.570600" 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-08-22T23:25:23.570946" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:25:23.571018" 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-08-22T23:25:23.498326" elapsed="0.072804"/>
</kw>
<msg time="2026-08-22T23:25:23.571225" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:25:23.571270" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:23.493561" elapsed="0.077746"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.571825" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:23.571384" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.571366" elapsed="0.000557"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:25:23.493423" elapsed="0.078525"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:25:23.577836" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:23.577700" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.577676" 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-08-22T23:25:23.579211" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:23.579081" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.579061" elapsed="0.000220"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:25:23.579772" 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-08-22T23:25:23.579425" elapsed="0.000374"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:25:23.580185" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:25:23.579955" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:25:23.606110" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:25:23.580744" elapsed="0.025542"/>
</kw>
<msg time="2026-08-22T23:25:23.606497" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:25:23.606548" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:23.580387" elapsed="0.026222"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:25:23.631526" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:25:23.607138" elapsed="0.024629"/>
</kw>
<msg time="2026-08-22T23:25:23.632026" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:25:23.632089" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:23.606782" elapsed="0.025348"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.632607" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:23.632249" elapsed="0.000422"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.632211" elapsed="0.000488"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:23.633284" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:23.632859" 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-08-22T23:25:23.633713" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:23.633468" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.633445" elapsed="0.000350"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:25:23.633836" 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-08-22T23:25:23.637085" elapsed="0.000195"/>
</kw>
<msg time="2026-08-22T23:25:23.637350" 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-08-22T23:25:23.635700" elapsed="0.001819"/>
</kw>
<kw name="Open 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-08-22T23:25:23.637861" elapsed="0.000089"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.638245" elapsed="0.000105"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:25:23.634875" 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-08-22T23:25:23.634189" elapsed="0.004423"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:25:23.578766" elapsed="0.059973"/>
</kw>
<msg time="2026-08-22T23:25:23.638854" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:25:23.638900" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:23.578117" elapsed="0.060823"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:25:23.639128" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:25:23.639019" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.639000" 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-08-22T23:25:23.639830" 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-08-22T23:25:23.640178" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:25:23.640249" 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-08-22T23:25:23.577251" elapsed="0.063112"/>
</kw>
<msg time="2026-08-22T23:25:23.640476" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:25:23.640525" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:23.572230" elapsed="0.068334"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.641041" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:23.640778" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-08-22T23:25:23.640756" elapsed="0.000366"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:25:23.572083" elapsed="0.069063"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:25:23.397627" elapsed="0.243554"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:25:23.395228" elapsed="0.246018"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:25:23.388337" elapsed="0.252968"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:25:23.387745" elapsed="0.253609"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:25:23.383523" elapsed="0.257900"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:23.654665" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:23.654201" elapsed="0.000496"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:23.663070" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:23.662806" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:23.663524" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:23.663276" 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-08-22T23:25:23.671485" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:23.671684" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:23.671807" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:23.665705" elapsed="0.006564">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:23.663654" elapsed="0.008705">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.672571" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:23.672396" elapsed="0.000260"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:23.663635" elapsed="0.009046">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.673101" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:23.673237" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:23.673198" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:23.673180" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.673443" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:23.673563" elapsed="0.000031"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:23.657597" elapsed="0.016095">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:23.673762" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:23.654918" elapsed="0.018938">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.674086" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:23.673941" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:23.673924" elapsed="0.000242"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:23.674361" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:23.674219" elapsed="0.000234"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:23.674203" elapsed="0.000273"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:23.653794" elapsed="0.020761">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:24.695219" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:24.694738" elapsed="0.000517"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:24.702830" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:24.702555" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:24.703276" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:24.703031" 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-08-22T23:25:24.710244" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:24.710409" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:24.710530" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:24.705527" elapsed="0.005423">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:24.703400" elapsed="0.007633">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:24.711225" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:24.711069" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:24.703376" elapsed="0.007940">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:24.711707" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:24.711912" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:24.711865" elapsed="0.000092"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:24.711847" elapsed="0.000132"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:24.712125" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:24.712196" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:24.698192" elapsed="0.014109">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:24.712371" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:24.695489" elapsed="0.016977">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:24.712704" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:24.712545" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:24.712529" elapsed="0.000255"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:24.712983" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:24.712838" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:24.712822" elapsed="0.000237"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:24.694181" elapsed="0.018955">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:25.732473" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:25.731848" elapsed="0.000668"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:25.742269" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:25.741898" elapsed="0.000435"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:25.742857" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:25.742530" 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-08-22T23:25:25.752166" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:25.752464" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:25.752736" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:25.745525" elapsed="0.007944">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:25.743018" elapsed="0.010634">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:25.754065" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:25.753723" elapsed="0.000467"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:25.742985" elapsed="0.011251">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:25.755131" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:25.755398" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:25.755320" elapsed="0.000161"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:25.755286" 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-08-22T23:25:25.755821" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:25.755958" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:25.736272" elapsed="0.019902">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:25.756320" elapsed="0.000032"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:25.732849" elapsed="0.023663">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:25.757025" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:25.756711" elapsed="0.000436"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:25.756673" elapsed="0.000527"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:25.757657" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:25.757317" elapsed="0.000465"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:25.757282" elapsed="0.000552"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:25.731150" elapsed="0.026879">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:26.777674" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:26.777161" elapsed="0.000550"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:26.786956" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:26.786687" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:26.787406" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:26.787158" 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-08-22T23:25:26.795719" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:26.795893" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:26.796024" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:26.789613" elapsed="0.006819">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:26.787527" elapsed="0.008990">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:26.796727" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:26.796553" elapsed="0.000305"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:26.787503" elapsed="0.009381">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:26.797270" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:26.797410" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:26.797369" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:26.797351" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:26.797668" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:26.797795" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:26.782191" elapsed="0.015715">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:26.797981" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:26.777979" elapsed="0.020095">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:26.798297" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:26.798154" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:26.798137" elapsed="0.000239"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:26.798567" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:26.798429" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:26.798414" elapsed="0.000249"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:26.776594" elapsed="0.022147">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:27.817955" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:27.817442" elapsed="0.000548"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:27.825726" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:27.825426" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:27.826204" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:27.825930" 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-08-22T23:25:27.833960" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:27.834188" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:27.834343" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:27.828430" elapsed="0.006376">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:27.826329" elapsed="0.008661">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:27.835245" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:27.835041" elapsed="0.000275"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:27.826306" elapsed="0.009035">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:27.835794" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:27.835941" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:27.835900" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:27.835880" elapsed="0.000131"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:27.836156" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:27.836227" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:27.820756" elapsed="0.015583">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:27.836409" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:27.818250" elapsed="0.018254">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:27.836748" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:27.836600" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:27.836566" elapsed="0.000262"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:27.837023" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:27.836881" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:27.836866" elapsed="0.000237"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:27.816871" elapsed="0.020313">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:28.855077" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:28.854572" elapsed="0.000545"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:28.862784" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:28.862485" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:28.863263" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:28.862999" 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-08-22T23:25:28.872075" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:28.872414" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:28.872807" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:28.865589" elapsed="0.008173">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:28.863394" elapsed="0.010568">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:28.874431" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:28.874047" elapsed="0.000580"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:28.863369" elapsed="0.011321">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:28.875662" elapsed="0.000064"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:28.875995" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:28.875901" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:28.875858" elapsed="0.000297"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:28.876497" elapsed="0.000053"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:28.876709" elapsed="0.000037"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:28.857800" elapsed="0.019162">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:28.877134" elapsed="0.000036"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:28.855355" elapsed="0.022052">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:28.877987" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:28.877631" elapsed="0.000479"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:28.877560" elapsed="0.000584"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:28.878415" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:28.878222" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:28.878201" elapsed="0.000325"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:28.854026" elapsed="0.024629">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:29.897543" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:29.897068" elapsed="0.000524"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:29.905256" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:29.904973" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:29.905744" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:29.905463" 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-08-22T23:25:29.914105" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:29.914279" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:29.914481" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:29.907972" elapsed="0.006936">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:29.905868" elapsed="0.009134">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:29.915233" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:29.915041" elapsed="0.000261"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:29.905844" elapsed="0.009483">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:29.915757" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:29.915900" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:29.915859" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:29.915840" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:29.916112" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:29.916183" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:29.900276" elapsed="0.016019">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:29.916367" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:29.897829" elapsed="0.018636">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:29.916706" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:29.916544" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:29.916527" elapsed="0.000260"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:29.916983" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:29.916842" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:29.916825" elapsed="0.000261"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:29.896498" elapsed="0.020665">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:30.935109" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:30.934640" elapsed="0.000511"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:30.942630" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:30.942355" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:30.943080" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:30.942833" 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-08-22T23:25:30.950806" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:30.950971" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:30.951159" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:30.945314" elapsed="0.006248">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:30.943205" elapsed="0.008458">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:30.951856" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:30.951700" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:30.943180" elapsed="0.008767">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:30.952326" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:30.952465" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:30.952424" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:30.952406" elapsed="0.000128"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:30.952694" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:30.952812" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:30.937842" elapsed="0.015079">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:30.952990" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:30.935384" elapsed="0.017739">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:30.953434" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:30.953233" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:30.953211" elapsed="0.000334"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:30.953835" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:30.953641" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:30.953618" elapsed="0.000327"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:30.934076" elapsed="0.019976">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:31.966912" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:31.966430" elapsed="0.000517"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:31.974495" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:31.974233" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:31.974972" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:31.974714" 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-08-22T23:25:31.983228" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:31.983382" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:31.983555" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:31.977190" elapsed="0.006795">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:31.975094" elapsed="0.008976">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:31.984259" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:31.984105" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:31.975072" elapsed="0.009275">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:31.984772" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:31.984910" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:31.984871" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:31.984854" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:31.985169" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:31.985265" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:31.969728" elapsed="0.015682">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:31.985504" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:31.967179" elapsed="0.018475">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:31.985965" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:31.985765" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:31.985742" elapsed="0.000333"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:31.986341" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:31.986149" elapsed="0.000268"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:31.986128" elapsed="0.000321"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:31.965906" elapsed="0.020648">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:33.005093" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:33.004616" elapsed="0.000512"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:33.012825" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:33.012506" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:33.013272" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:33.013027" 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-08-22T23:25:33.021564" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:33.021759" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:33.021943" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:33.015467" elapsed="0.006859">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:33.013394" elapsed="0.009014">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:33.022614" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:33.022443" elapsed="0.000237"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:33.013371" elapsed="0.009333">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:33.023081" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:33.023218" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:33.023178" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:33.023160" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:33.023426" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:33.023497" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:33.007785" elapsed="0.015831">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:33.023686" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:33.005364" elapsed="0.018416">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:33.024000" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:33.023858" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:33.023842" elapsed="0.000237"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:33.024289" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:33.024132" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:33.024117" elapsed="0.000253"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:33.004033" elapsed="0.020414">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:34.043841" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:34.043352" elapsed="0.000526"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:34.051448" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:34.051179" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:34.051928" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:34.051671" 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-08-22T23:25:34.060599" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:34.060764" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:34.060944" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:34.054175" elapsed="0.007184">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:34.052075" elapsed="0.009370">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:34.061653" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:34.061480" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:34.052052" elapsed="0.009693">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:34.062125" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:34.062263" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:34.062224" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:34.062207" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:34.062473" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:34.062545" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:34.046608" elapsed="0.016061">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:34.062740" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:34.044139" elapsed="0.018698">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:34.063062" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:34.062917" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:34.062901" elapsed="0.000246"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:34.063342" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:34.063201" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:34.063185" elapsed="0.000236"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:34.042805" elapsed="0.020695">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:35.080961" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:35.080482" elapsed="0.000515"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:35.088496" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:35.088237" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:35.088961" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:35.088713" 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-08-22T23:25:35.097182" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:35.097347" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:35.097539" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:35.091180" elapsed="0.006777">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:35.089086" elapsed="0.008956">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:35.098247" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:35.098079" elapsed="0.000235"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:35.089060" elapsed="0.009278">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:35.098753" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:35.098893" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:35.098853" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:35.098836" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:35.099102" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:35.099172" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:35.083686" elapsed="0.015593">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:35.099348" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:35.081231" elapsed="0.018210">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:35.099677" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:35.099518" elapsed="0.000242"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:35.099502" elapsed="0.000287"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:35.100009" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:35.099855" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:35.099836" elapsed="0.000250"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:35.079944" elapsed="0.020219">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:36.119778" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:36.119237" elapsed="0.000579"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:36.128130" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:36.127819" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:36.128612" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:36.128339" 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-08-22T23:25:36.137033" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:36.137200" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:36.137386" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:36.130833" elapsed="0.006962">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:36.128746" elapsed="0.009132">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:36.138072" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:36.137916" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:36.128718" elapsed="0.009444">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:36.138539" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:36.138697" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:36.138656" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:36.138638" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:36.138907" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:36.138978" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:36.122501" elapsed="0.016583">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:36.139153" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:36.120057" elapsed="0.019189">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:36.139492" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:36.139325" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:36.139308" elapsed="0.000264"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:36.139785" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:36.139643" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:36.139627" elapsed="0.000237"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:36.118533" elapsed="0.021409">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:37.159564" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:37.159032" elapsed="0.000587"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:37.167134" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:37.166862" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:37.167630" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:37.167361" 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-08-22T23:25:37.176010" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:37.176224" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:37.176482" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:37.169921" elapsed="0.007029">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:37.167761" elapsed="0.009285">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:37.177278" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:37.177086" elapsed="0.000261"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:37.167736" elapsed="0.009637">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:37.177815" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:37.177963" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:37.177921" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:37.177902" elapsed="0.000129"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:37.178182" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:37.178255" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:37.162293" elapsed="0.016075">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:37.178439" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:37.159867" elapsed="0.018666">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:37.178781" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:37.178631" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:37.178614" elapsed="0.000248"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:37.179062" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:37.178918" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:37.178902" elapsed="0.000283"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:37.158443" elapsed="0.020828">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:38.205070" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:38.204559" elapsed="0.000549"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:38.212646" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:38.212357" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:38.213106" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:38.212858" 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-08-22T23:25:38.220899" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:38.221064" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:38.221260" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:38.215343" elapsed="0.006336">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:38.213234" elapsed="0.008533">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:38.221982" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:38.221806" elapsed="0.000244"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:38.213208" elapsed="0.008866">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:38.222489" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:38.222653" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:38.222609" elapsed="0.000092"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:38.222571" elapsed="0.000152"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:38.222904" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:38.222980" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:38.207824" elapsed="0.015267">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:38.223162" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:38.205351" elapsed="0.017949">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:38.223653" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:38.223416" elapsed="0.000322"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:38.223392" elapsed="0.000382"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:38.224087" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:38.223856" elapsed="0.000319"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:38.223833" elapsed="0.000381"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:38.204008" elapsed="0.020323">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:39.242387" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:39.241910" elapsed="0.000512"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:39.251981" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:39.251706" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:39.252569" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:39.252208" 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-08-22T23:25:39.261159" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:39.261326" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:39.261515" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:39.255303" elapsed="0.006650">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:39.252753" elapsed="0.009285">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:39.262236" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:39.262077" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:39.252722" elapsed="0.009606">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:39.262764" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:39.262907" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:39.262867" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:39.262849" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:39.263117" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:39.263190" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:39.245169" elapsed="0.018128">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:39.263368" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:39.242695" elapsed="0.020827">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:39.263906" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:39.263701" elapsed="0.000286"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:39.263673" elapsed="0.000347"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:39.264290" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:39.264095" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:39.264073" elapsed="0.000327"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:39.241338" elapsed="0.023171">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:40.285026" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:40.284412" elapsed="0.000658"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:40.294247" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:40.293929" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:40.294862" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:40.294529" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:25:40.305544" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:40.305763" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:40.305973" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:40.298123" elapsed="0.008340">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:40.295030" elapsed="0.011540">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:40.306861" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:40.306635" elapsed="0.000301"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:40.294995" elapsed="0.011968">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:40.307555" elapsed="0.000067"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:40.307794" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:40.307736" elapsed="0.000121"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:40.307708" elapsed="0.000179"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:40.308088" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:40.308185" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:40.288473" elapsed="0.019866">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:40.308435" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:40.285372" elapsed="0.023194">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:40.308901" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:40.308700" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:40.308676" elapsed="0.000335"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:40.309279" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:40.309085" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:40.309064" elapsed="0.000323"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:40.283733" elapsed="0.025762">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:41.326890" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:41.326388" elapsed="0.000537"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:41.334486" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:41.334220" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:41.334960" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:41.334709" 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-08-22T23:25:41.343817" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:41.343974" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:41.344154" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:41.337360" elapsed="0.007232">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:41.335087" elapsed="0.009592">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:41.344872" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:41.344715" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:41.335063" elapsed="0.009900">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:41.345352" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:41.345491" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:41.345450" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:41.345433" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:41.345719" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:41.345791" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:41.329710" elapsed="0.016187">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:41.345967" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:41.327161" elapsed="0.018918">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:41.346324" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:41.346159" elapsed="0.000234"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:41.346143" elapsed="0.000280"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:41.346633" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:41.346477" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:41.346461" elapsed="0.000252"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:41.325843" elapsed="0.020947">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:42.365633" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:42.365143" elapsed="0.000528"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:42.373008" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:42.372745" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:42.373459" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:42.373211" 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-08-22T23:25:42.382281" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:42.382444" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:42.382640" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:42.375874" elapsed="0.007153">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:42.373599" elapsed="0.009509">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:42.383301" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:42.383144" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:42.373561" elapsed="0.009834">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:42.383784" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:42.383921" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:42.383881" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:42.383863" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:42.384129" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:42.384198" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:42.368375" elapsed="0.015926">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:42.384370" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:42.365949" elapsed="0.018514">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:42.384700" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:42.384541" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:42.384525" elapsed="0.000255"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:42.384973" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:42.384833" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:42.384818" elapsed="0.000234"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:42.364565" elapsed="0.020564">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:43.403858" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:43.403352" elapsed="0.000541"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:43.411376" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:43.411115" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:43.411840" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:43.411592" 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-08-22T23:25:43.420406" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:43.420571" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:43.420787" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:43.414334" elapsed="0.006853">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:43.411968" elapsed="0.009304">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:43.421508" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:43.421309" elapsed="0.000284"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:43.411944" elapsed="0.009677">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:43.421998" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:43.422137" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:43.422097" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:43.422080" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:43.422346" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:43.422417" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:43.406656" elapsed="0.015866">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:43.422607" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:43.404132" elapsed="0.018572">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:43.422926" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:43.422783" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:43.422767" elapsed="0.000237"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:43.423195" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:43.423058" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:43.423042" elapsed="0.000231"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:43.402805" elapsed="0.020550">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:44.441678" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:44.441163" elapsed="0.000553"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:44.449153" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:44.448865" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:44.449624" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:44.449354" 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-08-22T23:25:44.457550" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:44.457759" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:44.457996" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:44.452196" elapsed="0.006257">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:44.449757" elapsed="0.008792">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:44.458806" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:44.458610" elapsed="0.000263"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:44.449731" elapsed="0.009166">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:44.459363" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:44.459513" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:44.459472" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:44.459452" elapsed="0.000146"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:44.459746" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:44.459815" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:44.444382" elapsed="0.015544">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:44.459995" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:44.441956" elapsed="0.018133">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:44.460310" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:44.460167" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:44.460150" elapsed="0.000239"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:44.460595" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:44.460442" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:44.460427" elapsed="0.000248"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:44.440539" elapsed="0.020215">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:45.480134" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:45.479652" elapsed="0.000520"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:45.487592" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:45.487320" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:45.488043" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:45.487796" 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-08-22T23:25:45.496202" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:45.496378" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:45.496657" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:45.490438" elapsed="0.006787">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:45.488171" elapsed="0.009175">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:45.497647" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:45.497398" elapsed="0.000346"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:45.488146" elapsed="0.009634">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:45.498329" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:45.498527" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:45.498471" elapsed="0.000140"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:45.498446" elapsed="0.000199"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:45.498860" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:45.498967" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:45.482998" elapsed="0.016123">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:45.499226" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:45.480409" elapsed="0.018951">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:45.499698" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:45.499472" elapsed="0.000308"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:45.499449" elapsed="0.000365"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:45.500090" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:45.499891" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:45.499869" elapsed="0.000335"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:45.479078" elapsed="0.021236">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:46.513095" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:46.512571" elapsed="0.000562"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:46.520619" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:46.520325" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:46.521072" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:46.520822" 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-08-22T23:25:46.529763" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:46.529926" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:46.530106" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:46.523516" elapsed="0.006983">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:46.521201" elapsed="0.009400">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:46.530798" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:46.530638" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:46.521176" elapsed="0.009714">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:46.531273" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:46.531413" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:46.531372" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:46.531354" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:46.531636" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:46.531706" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:46.515858" elapsed="0.015953">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:46.531880" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:46.513399" elapsed="0.018573">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:46.532192" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:46.532050" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:46.532034" elapsed="0.000236"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:46.532465" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:46.532324" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:46.532309" elapsed="0.000244"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:46.511972" elapsed="0.020674">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:47.549974" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:47.549245" elapsed="0.000783"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:47.558464" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:47.558193" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:47.558960" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:47.558689" 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-08-22T23:25:47.567994" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:47.568197" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:47.568390" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:47.561505" elapsed="0.007499">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:47.559097" elapsed="0.010031">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:47.569403" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:47.569179" elapsed="0.000320"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:47.559072" elapsed="0.010472">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:47.570134" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:47.570338" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:47.570282" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:47.570258" 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-08-22T23:25:47.570669" elapsed="0.000046"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:47.570795" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:47.553741" elapsed="0.017206">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:47.571047" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:47.550395" elapsed="0.020784">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:47.571521" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:47.571293" elapsed="0.000336"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:47.571269" elapsed="0.000394"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:47.571978" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:47.571749" elapsed="0.000328"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:47.571719" elapsed="0.000393"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:47.548473" elapsed="0.023775">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:48.589260" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:48.588680" elapsed="0.000623"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:48.599243" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:48.598910" elapsed="0.000397"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:48.599901" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:48.599521" elapsed="0.000446"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:25:48.609680" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:48.609876" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:48.610099" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:48.603182" elapsed="0.007445">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:48.600067" elapsed="0.010669">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:48.611005" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:48.610785" elapsed="0.000305"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:48.600037" elapsed="0.011085">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:48.611668" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:48.611875" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:48.611800" elapsed="0.000137"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:48.611775" elapsed="0.000190"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:48.612163" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:48.612254" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:48.592985" elapsed="0.019407">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:48.612482" elapsed="0.000020"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:48.589640" elapsed="0.022983">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:48.612919" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:48.612726" elapsed="0.000264"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:48.612705" elapsed="0.000316"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:48.613276" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:48.613090" elapsed="0.000256"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:48.613070" elapsed="0.000306"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:48.587968" elapsed="0.025508">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:49.631454" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:49.630930" elapsed="0.000573"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:49.640056" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:49.639780" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:49.640519" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:49.640262" 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-08-22T23:25:49.649247" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:49.649415" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:49.649633" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:49.643118" elapsed="0.006917">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:49.640675" elapsed="0.009445">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:49.650315" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:49.650157" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:49.640647" elapsed="0.009759">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:49.650812" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:49.650957" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:49.650915" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:49.650897" elapsed="0.000129"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:49.651172" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:49.651245" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:49.634568" elapsed="0.016786">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:49.651434" elapsed="0.000018"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:49.631849" elapsed="0.019715">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:49.651820" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:49.651667" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:49.651648" elapsed="0.000256"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:49.652106" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:49.651961" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:49.651944" elapsed="0.000244"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:49.630272" elapsed="0.021996">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:50.673230" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:50.672545" elapsed="0.000723"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:50.680562" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:50.680304" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:50.681044" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:50.680796" 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-08-22T23:25:50.689572" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:50.689765" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:50.689969" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:50.683469" elapsed="0.006899">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:50.681171" elapsed="0.009284">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:50.690687" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:50.690494" elapsed="0.000262"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:50.681146" elapsed="0.009635">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:50.691172" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:50.691351" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:50.691309" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:50.691290" elapsed="0.000128"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:50.691617" elapsed="0.000037"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:50.691727" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:50.675977" elapsed="0.015907">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:50.691987" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:50.673523" elapsed="0.018609">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:50.692476" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:50.692262" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:50.692238" elapsed="0.000378"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:50.692904" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:50.692697" elapsed="0.000290"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:50.692674" elapsed="0.000347"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:50.671953" elapsed="0.021182">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:51.712268" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:51.711805" elapsed="0.000498"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:51.721523" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:51.721264" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:51.721990" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:51.721743" 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-08-22T23:25:51.730192" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:51.730352" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:51.730538" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:51.724218" elapsed="0.006766">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:51.722112" elapsed="0.008959">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:51.731260" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:51.731106" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:51.722089" elapsed="0.009261">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:51.731831" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:51.732023" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:51.731968" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:51.731944" elapsed="0.000170"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:51.732313" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:51.732410" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:51.714970" elapsed="0.017585">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:51.732674" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:51.712534" elapsed="0.020272">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:51.733115" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:51.732915" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:51.732892" elapsed="0.000336"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:51.733497" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:51.733302" elapsed="0.000293"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:51.733280" elapsed="0.000350"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:51.711198" elapsed="0.022540">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:52.753221" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:52.752754" elapsed="0.000501"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:52.760593" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:52.760317" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:52.761044" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:52.760797" 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-08-22T23:25:52.769253" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:52.769411" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:52.769615" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:52.763465" elapsed="0.006540">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:52.761168" elapsed="0.008920">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:52.770280" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:52.770123" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:52.761145" elapsed="0.009226">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:52.770801" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:52.770943" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:52.770902" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:52.770885" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:52.771155" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:52.771227" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:52.755958" elapsed="0.015376">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:52.771406" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:52.753489" elapsed="0.018012">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:52.771840" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:52.771626" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:52.771600" elapsed="0.000361"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:52.772248" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:52.772041" elapsed="0.000291"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:52.772018" elapsed="0.000349"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:52.752214" elapsed="0.020268">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:53.790931" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:53.790416" elapsed="0.000551"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:53.798293" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:53.798010" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:53.798764" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:53.798496" 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-08-22T23:25:53.807096" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:53.807254" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:53.807432" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:53.801160" elapsed="0.006801">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:53.798892" elapsed="0.009191">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:53.808364" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:53.808134" elapsed="0.000329"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:53.798868" elapsed="0.009630">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:53.809066" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:53.809268" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:53.809211" elapsed="0.000122"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:53.809186" elapsed="0.000180"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:53.809597" elapsed="0.000036"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:53.809708" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:53.793648" elapsed="0.016214">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:53.809967" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:53.791207" elapsed="0.018899">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:53.810463" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:53.810245" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:53.810201" elapsed="0.000404"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:53.810899" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:53.810689" elapsed="0.000293"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:53.810665" elapsed="0.000352"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:53.789836" elapsed="0.021296">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:54.830431" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:54.829941" elapsed="0.000527"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:54.837771" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:54.837490" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:54.838238" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:54.837987" 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-08-22T23:25:54.846258" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:54.846423" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:54.846684" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:54.840644" elapsed="0.006436">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:54.838365" elapsed="0.008801">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:54.847370" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:54.847203" elapsed="0.000233"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:54.838341" elapsed="0.009119">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:54.847882" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:54.848024" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:54.847983" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:54.847964" elapsed="0.000128"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:54.848236" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:54.848306" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:54.833145" elapsed="0.015269">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:54.848483" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:54.830720" elapsed="0.017872">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:54.848817" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:54.848673" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:54.848656" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:54.849091" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:54.848950" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:54.848935" elapsed="0.000234"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:54.829360" elapsed="0.019888">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:55.868195" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:55.867708" elapsed="0.000522"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:55.875527" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:55.875251" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:55.875992" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:55.875744" 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-08-22T23:25:55.884733" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:55.884897" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:55.885074" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:55.878439" elapsed="0.007026">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:55.876120" elapsed="0.009430">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:55.885809" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:55.885645" elapsed="0.000231"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:55.876096" elapsed="0.009803">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:55.886278" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:55.886417" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:55.886376" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:55.886359" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:55.886660" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:55.886774" elapsed="0.000026"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:55.870922" elapsed="0.016016">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:55.887035" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:55.868466" elapsed="0.018700">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:55.887476" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:55.887276" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:55.887253" elapsed="0.000355"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:55.887883" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:55.887685" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:55.887663" elapsed="0.000330"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:55.867139" elapsed="0.020960">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:56.908128" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:56.907599" elapsed="0.000567"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:56.915418" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:56.915159" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:56.915881" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:56.915632" 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-08-22T23:25:56.924463" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:56.924644" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:56.924894" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:56.918290" elapsed="0.007141">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:56.916010" elapsed="0.009534">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:56.925836" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:56.925615" elapsed="0.000314"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:56.915986" elapsed="0.009976">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:56.926523" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:56.926741" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:56.926685" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:56.926660" elapsed="0.000172"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:56.927032" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:56.927130" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:56.910857" elapsed="0.016421">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:56.927375" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:56.908404" elapsed="0.019103">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:56.927838" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:56.927637" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:56.927612" elapsed="0.000337"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:56.928217" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:56.928023" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:56.928002" elapsed="0.000326"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:56.907052" elapsed="0.021382">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:57.946213" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:57.945734" elapsed="0.000516"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:57.953597" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:57.953323" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:57.954044" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:57.953799" 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-08-22T23:25:57.962218" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:57.962377" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:57.962559" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:57.956470" elapsed="0.006515">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:57.954172" elapsed="0.008897">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:57.963269" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:57.963107" elapsed="0.000228"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:57.954147" elapsed="0.009212">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:57.963766" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:57.963908" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:57.963866" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:57.963849" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:57.964117" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:57.964187" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:57.948969" elapsed="0.015323">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:57.964361" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:57.946485" elapsed="0.017969">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:57.964693" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:57.964533" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:57.964517" elapsed="0.000257"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:57.965010" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:57.964827" elapsed="0.000242"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:57.964812" elapsed="0.000281"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:57.945180" elapsed="0.019991">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:25:58.984899" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:25:58.984359" elapsed="0.000577"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:58.992984" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:58.992653" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:25:58.993471" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:25:58.993217" 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-08-22T23:25:59.001948" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:25:59.002121" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:25:59.002328" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:25:58.995977" elapsed="0.006793">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:25:58.993635" elapsed="0.009224">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:59.003066" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:59.002897" elapsed="0.000238"/>
</branch>
<status status="FAIL" start="2026-08-22T23:25:58.993607" elapsed="0.009553">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:59.003607" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:59.003760" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:25:59.003713" elapsed="0.000092"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:59.003695" elapsed="0.000132"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:59.003973" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:25:59.004045" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:25:58.987747" elapsed="0.016407">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:25:59.004223" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:25:58.985177" elapsed="0.019143">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:59.004601" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:59.004404" elapsed="0.000257"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:59.004382" elapsed="0.000304"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:25:59.004883" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:25:59.004740" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:25:59.004725" elapsed="0.000237"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:25:58.983784" elapsed="0.021257">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:00.023071" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:00.022607" elapsed="0.000499"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:00.030362" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:00.030103" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:00.030830" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:00.030564" 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-08-22T23:26:00.039782" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:00.039947" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:26:00.040127" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:26:00.033246" elapsed="0.007297">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:26:00.030952" elapsed="0.009690">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:00.040914" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:00.040678" elapsed="0.000338"/>
</branch>
<status status="FAIL" start="2026-08-22T23:26:00.030930" elapsed="0.010120">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:00.041595" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:00.041790" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:00.041735" elapsed="0.000115"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:00.041710" elapsed="0.000170"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:00.042081" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:26:00.042180" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:26:00.025792" elapsed="0.016534">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:00.042421" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:26:00.023340" elapsed="0.019213">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:00.042886" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:00.042686" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:00.042662" elapsed="0.000336"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:00.043267" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:00.043073" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:00.043051" elapsed="0.000327"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:26:00.022053" elapsed="0.021434">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:01.062211" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:01.061733" elapsed="0.000512"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:01.069614" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:01.069343" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:01.070068" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:01.069825" 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-08-22T23:26:01.078834" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:01.079064" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:26:01.079289" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:26:01.072449" elapsed="0.007373">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:26:01.070192" elapsed="0.009764">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:01.080225" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:01.080005" elapsed="0.000312"/>
</branch>
<status status="FAIL" start="2026-08-22T23:26:01.070169" elapsed="0.010182">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:01.080908" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:01.081100" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:01.081045" elapsed="0.000115"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:01.081021" elapsed="0.000170"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:01.081391" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:26:01.081490" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:26:01.064941" elapsed="0.016715">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:01.081755" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:26:01.062480" elapsed="0.019407">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:01.082199" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:01.081998" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:01.081975" elapsed="0.000334"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:01.082597" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:01.082385" elapsed="0.000292"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:01.082363" elapsed="0.000347"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:26:01.061189" elapsed="0.021628">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:02.101390" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:02.100917" elapsed="0.000509"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:02.108736" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:02.108456" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:02.109176" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:02.108934" 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-08-22T23:26:02.117509" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:02.117691" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:26:02.117865" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:26:02.111559" elapsed="0.006693">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:26:02.109302" elapsed="0.009033">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:02.118529" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:02.118371" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-08-22T23:26:02.109278" elapsed="0.009360">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:02.119015" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:02.119152" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:02.119113" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:02.119095" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:02.119359" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:26:02.119430" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:26:02.104195" elapsed="0.015370">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:02.119652" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:26:02.101685" elapsed="0.018067">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:02.120107" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:02.119878" elapsed="0.000307"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:02.119849" elapsed="0.000370"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:02.120488" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:02.120294" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:02.120272" elapsed="0.000349"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:26:02.100347" elapsed="0.020385">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:03.141289" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:03.140855" elapsed="0.000466"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:03.148533" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:03.148279" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:03.148997" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:03.148752" 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-08-22T23:26:03.157328" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:03.157473" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:26:03.157650" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:26:03.151334" elapsed="0.006806">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:26:03.149116" elapsed="0.009137">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:03.158520" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:03.158302" elapsed="0.000340"/>
</branch>
<status status="FAIL" start="2026-08-22T23:26:03.149094" elapsed="0.009583">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:03.159219" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:03.159411" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:03.159357" elapsed="0.000113"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:03.159332" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:03.159727" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:26:03.159827" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:26:03.143970" elapsed="0.016001">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:03.160066" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:26:03.141545" elapsed="0.018651">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:03.160503" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:03.160304" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:03.160281" elapsed="0.000354"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:03.160908" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:03.160711" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:03.160689" elapsed="0.000329"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:26:03.140380" elapsed="0.020744">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:04.182045" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:04.181551" elapsed="0.000529"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:04.191418" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:04.191111" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:04.191894" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:04.191644" 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-08-22T23:26:04.200418" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:04.200787" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:26:04.201145" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:26:04.194093" elapsed="0.007894">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:26:04.192014" elapsed="0.010154">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:04.202629" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:04.202246" elapsed="0.000555"/>
</branch>
<status status="FAIL" start="2026-08-22T23:26:04.191991" elapsed="0.010912">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:04.203791" elapsed="0.000062"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:04.204103" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:04.204014" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:04.203975" 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-08-22T23:26:04.204570" elapsed="0.000083"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:26:04.204786" elapsed="0.000036"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:26:04.184748" elapsed="0.020275">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:04.205175" elapsed="0.000034"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:26:04.182316" elapsed="0.023082">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:04.205957" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:04.205609" elapsed="0.000483"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:04.205540" elapsed="0.000606"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:04.206620" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:04.206270" elapsed="0.000507"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:04.206235" elapsed="0.000659"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:26:04.181008" elapsed="0.026084">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:05.226705" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:05.226156" elapsed="0.000586"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:05.233948" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:05.233687" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:05.234392" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:05.234149" 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-08-22T23:26:05.242080" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:05.242243" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:26:05.242425" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:26:05.236823" elapsed="0.006025">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:26:05.234530" elapsed="0.008401">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:05.243124" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:05.242966" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-08-22T23:26:05.234505" elapsed="0.008710">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:05.243611" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:05.243750" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:05.243710" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:05.243693" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:05.243959" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:26:05.244030" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:26:05.229386" elapsed="0.014749">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:05.244204" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:26:05.226977" elapsed="0.017320">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:05.244518" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:05.244375" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:05.244359" elapsed="0.000254"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:05.244807" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:05.244667" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:05.244651" elapsed="0.000240"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:26:05.225622" elapsed="0.019351">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:06.263098" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:06.262619" elapsed="0.000514"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:06.270442" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:06.270179" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:06.270922" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:06.270666" 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-08-22T23:26:06.279297" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:06.279456" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:26:06.279654" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:26:06.273323" elapsed="0.006725">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:26:06.271049" elapsed="0.009082">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:06.280326" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:06.280167" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-08-22T23:26:06.271025" elapsed="0.009394">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:06.280827" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:06.280966" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:06.280926" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:06.280908" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:06.281177" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:26:06.281247" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:26:06.265833" elapsed="0.015519">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:06.281420" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:26:06.263381" elapsed="0.018133">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:06.281753" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:06.281607" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:06.281589" elapsed="0.000245"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:06.282035" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:06.281888" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:06.281873" elapsed="0.000271"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:26:06.261839" elapsed="0.020387">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:07.301735" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:07.301256" elapsed="0.000527"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:07.309060" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:07.308800" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:07.309511" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:07.309263" 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-08-22T23:26:07.318147" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:07.318309" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:26:07.318541" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:26:07.311923" elapsed="0.007034">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:26:07.309652" elapsed="0.009388">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:07.319236" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:07.319076" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-08-22T23:26:07.309628" elapsed="0.009698">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:07.319727" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:07.319867" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:07.319827" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:07.319809" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:07.320077" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:26:07.320147" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:26:07.304461" elapsed="0.015790">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:07.320319" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:26:07.302021" elapsed="0.018390">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:07.320648" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:07.320489" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:07.320473" elapsed="0.000256"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:07.320930" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:07.320789" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:07.320773" elapsed="0.000236"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:26:07.300730" elapsed="0.020355">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:08.339537" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:08.339055" elapsed="0.000534"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:08.346983" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:08.346718" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:08.347430" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:08.347183" 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-08-22T23:26:08.356300" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:08.356487" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:26:08.356742" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:26:08.349871" elapsed="0.007424">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:26:08.347560" elapsed="0.009880">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:08.357771" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:08.357500" elapsed="0.000369"/>
</branch>
<status status="FAIL" start="2026-08-22T23:26:08.347532" elapsed="0.010372">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:08.358469" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:08.358691" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:08.358632" elapsed="0.000123"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:08.358605" elapsed="0.000181"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:08.358997" elapsed="0.000036"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:26:08.359106" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:26:08.342305" elapsed="0.016952">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:08.359353" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:26:08.339829" elapsed="0.019657">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:08.359834" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:08.359620" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:08.359594" elapsed="0.000357"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:08.360230" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:08.360029" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:08.360008" elapsed="0.000330"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:26:08.338435" elapsed="0.022015">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:09.379339" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:09.378876" elapsed="0.000498"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:09.386665" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:09.386383" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:09.387108" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:09.386864" 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-08-22T23:26:09.396043" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:09.396202" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:26:09.396388" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:26:09.389520" elapsed="0.007353">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:26:09.387232" elapsed="0.009726">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:09.397200" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:09.396999" elapsed="0.000268"/>
</branch>
<status status="FAIL" start="2026-08-22T23:26:09.387209" elapsed="0.010083">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:09.397688" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:09.397828" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:09.397787" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:09.397770" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:09.398075" elapsed="0.000036"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:26:09.398196" elapsed="0.000024"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:26:09.382072" elapsed="0.016272">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:09.398439" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:26:09.379623" elapsed="0.018945">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:09.398907" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:09.398709" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:09.398686" elapsed="0.000329"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:09.399279" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:09.399088" elapsed="0.000266"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:09.399067" elapsed="0.000319"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:26:09.378328" elapsed="0.021164">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:10.417404" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:10.416912" elapsed="0.000528"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:10.424774" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:10.424475" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:10.425219" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:10.424973" 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-08-22T23:26:10.433570" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:10.433767" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:26:10.433953" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:26:10.427643" elapsed="0.006710">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:26:10.425348" elapsed="0.009088">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:10.434648" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:10.434473" elapsed="0.000242"/>
</branch>
<status status="FAIL" start="2026-08-22T23:26:10.425322" elapsed="0.009417">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:10.435132" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:10.435272" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:10.435231" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:10.435213" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:10.435483" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:26:10.435554" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:26:10.420129" elapsed="0.015551">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:10.435750" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:26:10.417694" elapsed="0.018151">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:10.436069" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:10.435924" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:10.435907" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:10.436342" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:10.436201" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:10.436186" elapsed="0.000235"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:26:10.416317" elapsed="0.020181">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:11.454906" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:11.454425" elapsed="0.000516"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:11.462450" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:11.462188" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:11.462916" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:11.462668" 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-08-22T23:26:11.471674" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:11.471840" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:26:11.472033" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:26:11.465333" elapsed="0.007282">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:26:11.463040" elapsed="0.009692">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:11.472998" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:11.472781" elapsed="0.000315"/>
</branch>
<status status="FAIL" start="2026-08-22T23:26:11.463017" elapsed="0.010113">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:11.473666" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:11.473862" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:11.473807" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:11.473782" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:11.474155" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:26:11.474254" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:26:11.457754" elapsed="0.016644">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:11.474496" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:26:11.455174" elapsed="0.019474">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:11.474964" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:11.474762" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:11.474738" elapsed="0.000338"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:11.475350" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:11.475156" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:11.475134" elapsed="0.000326"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:26:11.453884" elapsed="0.021685">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:12.494589" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:12.494109" elapsed="0.000518"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:12.501860" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:12.501596" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:12.502325" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:12.502077" 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-08-22T23:26:12.510531" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:12.510708" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:26:12.510893" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:26:12.504777" elapsed="0.006505">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:26:12.502452" elapsed="0.008914">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:12.511557" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:12.511401" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-08-22T23:26:12.502429" elapsed="0.009238">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:12.512100" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:12.512241" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:12.512201" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:12.512183" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:12.512451" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:26:12.512523" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:26:12.497285" elapsed="0.015360">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:12.512716" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:26:12.494859" elapsed="0.017951">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:12.513035" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:12.512890" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:12.512873" elapsed="0.000276"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:12.513423" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:12.513226" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:12.513204" elapsed="0.000330"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:26:12.493562" elapsed="0.020103">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:13.532850" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:13.532380" elapsed="0.000503"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:13.540054" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:13.539801" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:13.540494" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:13.540252" 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-08-22T23:26:13.548719" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:13.548877" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:26:13.549060" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:26:13.542966" elapsed="0.006480">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:26:13.540629" elapsed="0.008900">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:13.549746" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:13.549563" elapsed="0.000251"/>
</branch>
<status status="FAIL" start="2026-08-22T23:26:13.540607" elapsed="0.009231">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:13.550224" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:13.550363" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:13.550323" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:13.550306" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:13.550588" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:26:13.550661" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:26:13.535498" elapsed="0.015268">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:13.550834" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:26:13.533109" elapsed="0.017818">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:13.551149" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:13.551005" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:13.550989" elapsed="0.000239"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:13.551423" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:13.551282" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:13.551266" elapsed="0.000236"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:26:13.531838" elapsed="0.019782">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:14.571688" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:14.571033" elapsed="0.000697"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:14.579092" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:14.578840" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:14.579558" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:14.579312" 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-08-22T23:26:14.588316" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:14.588465" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:26:14.588673" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:26:14.581873" elapsed="0.007167">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:26:14.579690" elapsed="0.009432">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:14.589315" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:14.589158" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:26:14.579671" elapsed="0.009733">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:14.589797" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:14.589932" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:14.589895" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:14.589877" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:14.590138" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:26:14.590208" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:26:14.574506" elapsed="0.015805">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:14.590379" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:26:14.572032" elapsed="0.018439">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:14.590708" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:14.590549" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:14.590533" elapsed="0.000255"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:14.590980" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:14.590841" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:14.590826" elapsed="0.000232"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:26:14.570433" elapsed="0.020702">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:15.603993" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:15.603488" elapsed="0.000541"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:15.611302" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:15.611045" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:15.611765" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:15.611503" 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-08-22T23:26:15.620260" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:15.620425" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:26:15.620636" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:26:15.614150" elapsed="0.006882">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:26:15.611891" elapsed="0.009225">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:15.621316" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:15.621152" elapsed="0.000230"/>
</branch>
<status status="FAIL" start="2026-08-22T23:26:15.611867" elapsed="0.009540">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:15.621810" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:15.621949" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:15.621909" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:15.621891" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:15.622157" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:26:15.622227" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:26:15.606687" elapsed="0.015644">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:15.622399" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:26:15.604264" elapsed="0.018228">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:15.622729" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:15.622571" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:15.622554" elapsed="0.000254"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:15.623020" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:15.622879" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:15.622846" elapsed="0.000251"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:26:15.602919" elapsed="0.020254">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:16.641185" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:16.640706" elapsed="0.000514"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:16.650520" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:16.650240" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:16.650990" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:16.650740" 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-08-22T23:26:16.659559" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:16.659741" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:26:16.659925" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:26:16.653272" elapsed="0.007042">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:26:16.651110" elapsed="0.009285">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:16.660600" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:16.660430" elapsed="0.000237"/>
</branch>
<status status="FAIL" start="2026-08-22T23:26:16.651086" elapsed="0.009605">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:16.661066" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:16.661203" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:16.661163" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:16.661146" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:16.661411" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:26:16.661481" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:26:16.643897" elapsed="0.017703">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:16.661670" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:26:16.641453" elapsed="0.020310">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:16.661985" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:16.661841" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:16.661824" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:16.662263" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:16.662121" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:16.662103" elapsed="0.000238"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:26:16.640160" elapsed="0.022257">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:17.679630" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:17.679131" elapsed="0.000535"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:17.687042" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:17.686783" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:17.687494" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:17.687248" 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-08-22T23:26:17.695920" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:17.696074" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:26:17.696280" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:26:17.689909" elapsed="0.006909">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:26:17.687632" elapsed="0.009301">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:17.697198" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:17.696982" elapsed="0.000310"/>
</branch>
<status status="FAIL" start="2026-08-22T23:26:17.687609" elapsed="0.009718">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:17.697869" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:17.698061" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:17.698006" elapsed="0.000138"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:17.697982" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:17.698376" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:26:17.698475" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:26:17.682339" elapsed="0.016302">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:17.698740" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:26:17.679902" elapsed="0.018970">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:17.699183" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:17.698983" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:17.698960" elapsed="0.000337"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:17.699565" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:17.699372" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:17.699350" elapsed="0.000354"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:26:17.678430" elapsed="0.021383">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:18.719542" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:18.718885" elapsed="0.000726"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:18.729024" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:18.728686" elapsed="0.000408"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:18.729573" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:18.729316" 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-08-22T23:26:18.739354" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:18.739542" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:26:18.739770" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:26:18.732121" elapsed="0.008070">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:26:18.729727" elapsed="0.010558">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:18.740484" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:18.740325" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-08-22T23:26:18.729698" elapsed="0.010892">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:18.741000" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:18.741142" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:18.741099" elapsed="0.000091"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:18.741082" elapsed="0.000130"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:18.741356" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:26:18.741426" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:26:18.723381" elapsed="0.018152">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:18.741618" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:26:18.719940" elapsed="0.021776">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:18.741980" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:18.741833" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:18.741814" elapsed="0.000247"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:18.742255" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:18.742115" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:18.742099" elapsed="0.000235"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:26:18.718114" elapsed="0.024299">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:19.759435" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:19.758932" elapsed="0.000543"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:19.766885" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:19.766624" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:19.767329" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:19.767085" 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-08-22T23:26:19.776702" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:19.776861" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:26:19.777052" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:26:19.769884" elapsed="0.007676">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:26:19.767459" elapsed="0.010242">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:19.777970" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:19.777753" elapsed="0.000310"/>
</branch>
<status status="FAIL" start="2026-08-22T23:26:19.767432" elapsed="0.010665">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:19.778643" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:19.778837" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:19.778782" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:19.778758" elapsed="0.000172"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:19.779127" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:26:19.779226" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:26:19.762212" elapsed="0.017159">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:19.779468" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:26:19.759735" elapsed="0.019883">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:19.779931" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:19.779731" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:19.779708" elapsed="0.000334"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:19.780310" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:19.780116" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:19.780095" elapsed="0.000324"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:26:19.758345" elapsed="0.022180">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:20.798750" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:20.798257" elapsed="0.000529"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:20.806136" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:20.805875" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:20.806630" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:20.806343" 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-08-22T23:26:20.815437" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:20.815698" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:26:20.815960" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:26:20.809096" elapsed="0.007403">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:26:20.806774" elapsed="0.009869">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:20.816923" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:20.816698" elapsed="0.000350"/>
</branch>
<status status="FAIL" start="2026-08-22T23:26:20.806748" elapsed="0.010338">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:20.817670" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:20.817869" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:20.817811" elapsed="0.000121"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:20.817786" elapsed="0.000177"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:20.818163" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:26:20.818263" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:26:20.801502" elapsed="0.016909">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:20.818508" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:26:20.799026" elapsed="0.019637">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:20.818978" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:20.818777" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:20.818754" elapsed="0.000338"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:20.819364" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:20.819166" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:20.819145" elapsed="0.000329"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:26:20.797703" elapsed="0.021898">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:21.839638" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:21.839121" elapsed="0.000556"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:21.847124" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:21.846857" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:21.847571" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:21.847326" 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-08-22T23:26:21.857965" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:21.858145" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:26:21.858347" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:26:21.850040" elapsed="0.008737">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:26:21.847719" elapsed="0.011146">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:21.859059" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:21.858903" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:26:21.847692" elapsed="0.011459">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:21.859529" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:21.859687" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:21.859645" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:21.859627" elapsed="0.000128"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:21.859897" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:26:21.859968" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:26:21.842393" elapsed="0.017682">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:21.860144" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:26:21.839920" elapsed="0.020318">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:21.860460" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:21.860317" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:21.860300" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:21.860828" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:21.860611" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:21.860594" elapsed="0.000321"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:26:21.838534" elapsed="0.022462">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:22.880438" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:22.879932" elapsed="0.000542"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:22.887906" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:22.887645" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:22.888385" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:22.888107" 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-08-22T23:26:22.896312" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:22.896473" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:26:22.896705" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:26:22.890834" elapsed="0.006260">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:26:22.888513" elapsed="0.008664">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:22.897373" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:22.897213" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-08-22T23:26:22.888488" elapsed="0.008976">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:22.897860" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:22.897998" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:22.897958" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:22.897940" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:22.898205" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:26:22.898276" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:26:22.883276" elapsed="0.015105">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:22.898450" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:26:22.880727" elapsed="0.017816">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:22.898785" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:22.898640" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:22.898623" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:22.899059" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:22.898918" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:22.898902" elapsed="0.000236"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:26:22.879347" elapsed="0.019868">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:23.912339" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:23.911847" elapsed="0.000528"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:23.919647" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:23.919373" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:23.920123" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:23.919849" 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-08-22T23:26:23.928586" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:23.928750" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:26:23.928947" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:26:23.922564" elapsed="0.006774">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:26:23.920253" elapsed="0.009166">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:23.929630" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:23.929455" elapsed="0.000242"/>
</branch>
<status status="FAIL" start="2026-08-22T23:26:23.920228" elapsed="0.009493">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:23.930096" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:23.930235" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:23.930195" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:23.930177" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:23.930444" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:26:23.930514" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:26:23.915056" elapsed="0.015600">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:23.930728" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:26:23.912626" elapsed="0.018196">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:23.931047" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:23.930902" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:23.930885" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:23.931320" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:23.931179" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:23.931164" elapsed="0.000233"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="FAIL" start="2026-08-22T23:26:23.911285" elapsed="0.020189">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<msg time="2026-08-22T23:26:23.931571" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>60s</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:25:23.641641" elapsed="60.290042">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<doc>Check that the device data deletion makes its way into the checker node.</doc>
<status status="FAIL" start="2026-08-22T23:25:23.382763" elapsed="60.549088">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</test>
<test id="s1-s2-t22" name="Check_Device_Data_Deletion_Is_Visible_On_Configurer" line="210">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:26:23.935115" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:26:23.934832" 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-08-22T23:26:23.936410" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:23.936300" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:23.936281" 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-08-22T23:26:23.941613" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:23.941471" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:23.941453" elapsed="0.000237"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:23.942703" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:23.942295" elapsed="0.000436"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:26:23.943195" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:26:23.942890" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:26:23.943267" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:26:23.943426" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:26:23.941918" elapsed="0.001533"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:26:23.948982" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:23.948875" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:23.948856" 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-08-22T23:26:23.950232" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:23.950126" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:23.950108" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:23.950796" 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-08-22T23:26:23.950442" elapsed="0.000381"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:23.951218" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:26:23.950982" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:26:23.983060" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:26:23.951757" elapsed="0.031409"/>
</kw>
<msg time="2026-08-22T23:26:23.983341" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:26:23.983387" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:23.951402" elapsed="0.032022"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:26:24.008051" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:26:23.983983" elapsed="0.024289"/>
</kw>
<msg time="2026-08-22T23:26:24.008637" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:26:24.008730" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:23.983617" elapsed="0.025189"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.009400" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.008958" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.008919" elapsed="0.000637"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.010477" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:24.009894" elapsed="0.000756"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.011105" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.010762" elapsed="0.000433"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.010733" elapsed="0.000507"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:26:24.011292" 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-08-22T23:26:24.014569" elapsed="0.000353"/>
</kw>
<msg time="2026-08-22T23:26:24.015034" 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-08-22T23:26:24.013312" elapsed="0.001870"/>
</kw>
<kw name="Open 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-08-22T23:26:24.015494" elapsed="0.000110"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.015946" elapsed="0.000105"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:26:24.012594" elapsed="0.003590"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:26:24.011741" elapsed="0.004512"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:26:23.949825" elapsed="0.066529"/>
</kw>
<msg time="2026-08-22T23:26:24.016447" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:24.016491" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:23.949202" elapsed="0.067326"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:26:24.016753" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:26:24.016640" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.016619" 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-08-22T23:26:24.017263" 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-08-22T23:26:24.017683" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:26:24.017759" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:26:23.948522" elapsed="0.069357"/>
</kw>
<msg time="2026-08-22T23:26:24.017974" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:24.018020" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:23.943849" elapsed="0.074224"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.018418" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.018162" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.018143" elapsed="0.000355"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:26:23.943708" elapsed="0.074814"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:26:24.024091" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:24.023978" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.023959" 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-08-22T23:26:24.025374" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:24.025264" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.025245" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:24.026057" 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-08-22T23:26:24.025722" elapsed="0.000362"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:24.026465" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:26:24.026241" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:26:24.060234" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:26:24.027036" elapsed="0.033307"/>
</kw>
<msg time="2026-08-22T23:26:24.060573" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:26:24.060655" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.026664" elapsed="0.034030"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:26:24.084641" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:26:24.061199" elapsed="0.023605"/>
</kw>
<msg time="2026-08-22T23:26:24.084984" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:26:24.085032" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.060860" elapsed="0.024210"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.085381" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.085152" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.085131" elapsed="0.000331"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.085960" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:24.085635" 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-08-22T23:26:24.086320" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.086103" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.086085" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:26:24.086432" 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-08-22T23:26:24.089272" elapsed="0.000148"/>
</kw>
<msg time="2026-08-22T23:26:24.089487" 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-08-22T23:26:24.088041" 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-08-22T23:26:24.090177" elapsed="0.000089"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.090555" elapsed="0.000113"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:26:24.087288" elapsed="0.003505"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:26:24.086728" elapsed="0.004134"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:26:24.024954" elapsed="0.066008"/>
</kw>
<msg time="2026-08-22T23:26:24.091061" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:24.091116" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.024314" elapsed="0.066841"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:26:24.091343" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:26:24.091234" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.091215" 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-08-22T23:26:24.091997" 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-08-22T23:26:24.092349" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:26:24.092424" 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-08-22T23:26:24.023594" elapsed="0.068941"/>
</kw>
<msg time="2026-08-22T23:26:24.092649" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:24.092694" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.018809" elapsed="0.073921"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.093056" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.092805" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.092788" elapsed="0.000345"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:26:24.018668" elapsed="0.074489"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:26:24.098929" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:24.098789" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.098763" elapsed="0.000306"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:26:24.100541" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:24.100405" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.100382" elapsed="0.000271"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:24.101239" 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-08-22T23:26:24.100838" elapsed="0.000437"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:24.101794" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:26:24.101486" elapsed="0.000341"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:26:24.130904" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:26:24.102466" elapsed="0.028645"/>
</kw>
<msg time="2026-08-22T23:26:24.131349" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:26:24.131398" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.102033" elapsed="0.029404"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:26:24.153807" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:26:24.132182" elapsed="0.021823"/>
</kw>
<msg time="2026-08-22T23:26:24.154230" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:26:24.154277" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.131709" elapsed="0.022606"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.154753" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.154425" elapsed="0.000389"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.154394" elapsed="0.000446"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.155353" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:24.154983" elapsed="0.000447"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.155733" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.155497" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.155479" elapsed="0.000361"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:26:24.155879" 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-08-22T23:26:24.158682" elapsed="0.000147"/>
</kw>
<msg time="2026-08-22T23:26:24.158892" 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-08-22T23:26:24.157492" elapsed="0.001553"/>
</kw>
<kw name="Open 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-08-22T23:26:24.159345" elapsed="0.000089"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.159739" elapsed="0.000105"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:26:24.156794" 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-08-22T23:26:24.156198" 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-08-22T23:26:24.100022" elapsed="0.060115"/>
</kw>
<msg time="2026-08-22T23:26:24.160233" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:24.160278" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.099274" elapsed="0.061042"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:26:24.160500" elapsed="0.000277"/>
</return>
<status status="PASS" start="2026-08-22T23:26:24.160394" elapsed="0.000471"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.160375" elapsed="0.000517"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.161292" 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-08-22T23:26:24.161791" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:26:24.161865" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:26:24.098323" elapsed="0.063652"/>
</kw>
<msg time="2026-08-22T23:26:24.162071" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:24.162115" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.093452" elapsed="0.068699"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.162474" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.162226" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.162209" elapsed="0.000343"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:26:24.093306" elapsed="0.069284"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:26:23.943506" elapsed="0.219118"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:26:23.941103" elapsed="0.221582"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:26:23.936011" elapsed="0.226731"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:23.935537" elapsed="0.227252"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:26:23.932693" elapsed="0.230151"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.175184" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:24.174793" elapsed="0.000419"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.182517" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:24.182268" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.182974" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:24.182731" 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-08-22T23:26:24.203566" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:24.203912" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:26:24.204125" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:26:24.185148" elapsed="0.019034"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:24.183084" elapsed="0.021192"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.204701" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.204334" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.183065" elapsed="0.021829"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.214027" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:24.207152" elapsed="0.006926"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:24.206670" elapsed="0.007444"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.206629" elapsed="0.007512"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.216887" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:24.214507" elapsed="0.002428"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:24.214277" elapsed="0.002694"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.214258" elapsed="0.002738"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.217559" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:26:24.217165" 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-08-22T23:26:24.217916" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.217677" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.218466" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:24.218162" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:24.218002" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.217658" elapsed="0.000896"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.219095" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:26:24.218728" 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-08-22T23:26:24.219425" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.219192" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.219997" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:24.219683" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:24.219508" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.219175" 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-08-22T23:26:24.220230" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:26:24.221057" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:26:24.220762" 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-08-22T23:26:24.221237" elapsed="0.002361"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:26:24.205706" elapsed="0.017958"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:26:24.223870" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-08-22T23:26:24.223736" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.223718" 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-08-22T23:26:24.224105" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:26:24.224178" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:26:24.226545" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:26:24.177882" elapsed="0.048706"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:26:24.226651" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:26:24.226804" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:26:24.175425" elapsed="0.051406"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:26:24.227110" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:24.226902" elapsed="0.000572"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.226885" elapsed="0.000615"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.227772" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.227556" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.227539" elapsed="0.000331"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${empty_data}</arg>
<doc>Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.</doc>
<status status="PASS" start="2026-08-22T23:26:24.174380" elapsed="0.053537"/>
</kw>
<arg>60s</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${NODE_CONFIGURER}</arg>
<arg>${empty_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:26:24.163016" elapsed="0.064952"/>
</kw>
<doc>Check that the device data deletion makes its way into the checker node.</doc>
<status status="PASS" start="2026-08-22T23:26:23.932098" elapsed="0.296024"/>
</test>
<test id="s1-s2-t23" name="Deconfigure_Device_In_Netconf" line="214">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:26:24.231294" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:26:24.231032" elapsed="0.000526"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:26:24.232560" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:24.232451" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.232433" elapsed="0.000215"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:26:24.237637" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:24.237515" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.237497" elapsed="0.000209"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.238699" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:24.238303" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.239192" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:26:24.238885" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:26:24.239264" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:26:24.239418" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:26:24.237928" 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-08-22T23:26:24.245163" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:24.245055" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.245036" 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-08-22T23:26:24.246393" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:24.246285" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.246267" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:24.246943" 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-08-22T23:26:24.246626" elapsed="0.000344"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:24.247352" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:26:24.247127" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:26:24.277779" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:26:24.247919" elapsed="0.029968"/>
</kw>
<msg time="2026-08-22T23:26:24.278063" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:26:24.278110" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.247539" elapsed="0.030609"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:26:24.295986" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:26:24.278682" elapsed="0.017418"/>
</kw>
<msg time="2026-08-22T23:26:24.296279" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:26:24.296327" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.278321" elapsed="0.018047"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.296727" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.296456" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.296431" elapsed="0.000379"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.297276" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:24.296954" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.297709" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.297476" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.297458" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:26:24.297826" 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-08-22T23:26:24.300608" elapsed="0.000152"/>
</kw>
<msg time="2026-08-22T23:26:24.300827" 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-08-22T23:26:24.299400" 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-08-22T23:26:24.301279" elapsed="0.000092"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.301676" 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-08-22T23:26:24.298700" elapsed="0.003187"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:26:24.298118" elapsed="0.003837"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:26:24.245982" elapsed="0.056074"/>
</kw>
<msg time="2026-08-22T23:26:24.302154" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:24.302199" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.245383" elapsed="0.056857"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:26:24.302431" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:26:24.302320" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.302301" 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-08-22T23:26:24.302957" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.303300" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:26:24.303374" 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-08-22T23:26:24.244715" elapsed="0.058771"/>
</kw>
<msg time="2026-08-22T23:26:24.303792" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:24.303843" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.239842" elapsed="0.064043"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.304219" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.303965" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.303947" elapsed="0.000352"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:26:24.239688" elapsed="0.064635"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:26:24.310162" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:24.310053" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.310033" 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-08-22T23:26:24.311387" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:24.311274" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.311256" elapsed="0.000200"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:24.311967" 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-08-22T23:26:24.311623" elapsed="0.000371"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:24.312383" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:26:24.312154" elapsed="0.000255"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:26:24.345082" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:26:24.312921" elapsed="0.032471"/>
</kw>
<msg time="2026-08-22T23:26:24.345643" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:26:24.345692" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.312568" elapsed="0.033162"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:26:24.363060" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:26:24.346396" elapsed="0.016835"/>
</kw>
<msg time="2026-08-22T23:26:24.363441" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:26:24.363488" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.345967" elapsed="0.017559"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.364008" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.363657" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.363626" elapsed="0.000478"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.364650" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:24.364252" 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-08-22T23:26:24.365006" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.364790" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.364771" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:26:24.365123" 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-08-22T23:26:24.367967" elapsed="0.000148"/>
</kw>
<msg time="2026-08-22T23:26:24.368180" 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-08-22T23:26:24.366772" elapsed="0.001558"/>
</kw>
<kw name="Open 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-08-22T23:26:24.368653" elapsed="0.000090"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.369027" 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-08-22T23:26:24.366045" elapsed="0.003193"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:26:24.365441" elapsed="0.003867"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:26:24.310970" elapsed="0.058438"/>
</kw>
<msg time="2026-08-22T23:26:24.369506" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:24.369552" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.310379" elapsed="0.059235"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:26:24.369804" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:26:24.369695" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.369676" 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-08-22T23:26:24.370296" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.370815" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:26:24.370887" 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-08-22T23:26:24.309692" elapsed="0.061308"/>
</kw>
<msg time="2026-08-22T23:26:24.371099" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:24.371145" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.304621" elapsed="0.066605"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.371635" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.371366" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.371347" elapsed="0.000369"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:26:24.304459" elapsed="0.067323"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:26:24.377493" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:24.377381" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.377362" 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-08-22T23:26:24.378764" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:24.378656" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.378638" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:24.379295" 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-08-22T23:26:24.378974" elapsed="0.000351"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:24.379780" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:26:24.379485" elapsed="0.000323"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:26:24.407017" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:26:24.380299" elapsed="0.026951"/>
</kw>
<msg time="2026-08-22T23:26:24.407492" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:26:24.407543" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.379967" elapsed="0.027640"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:26:24.422457" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:26:24.408334" elapsed="0.014349"/>
</kw>
<msg time="2026-08-22T23:26:24.422912" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:26:24.422961" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.407879" elapsed="0.015121"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.423420" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.423110" elapsed="0.000368"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.423078" elapsed="0.000426"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.424083" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:24.423670" 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-08-22T23:26:24.424436" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.424220" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.424202" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:26:24.424553" 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">
<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-08-22T23:26:24.427383" elapsed="0.000156"/>
</kw>
<msg time="2026-08-22T23:26:24.427673" 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-08-22T23:26:24.426194" elapsed="0.001692"/>
</kw>
<kw name="Open 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-08-22T23:26:24.428237" elapsed="0.000091"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.428638" 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-08-22T23:26:24.425467" elapsed="0.003387"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:26:24.424898" elapsed="0.004025"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:26:24.378332" elapsed="0.050761"/>
</kw>
<msg time="2026-08-22T23:26:24.429196" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:24.429243" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.377731" elapsed="0.051551"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:26:24.429483" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:26:24.429366" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.429345" 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-08-22T23:26:24.430057" 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-08-22T23:26:24.430405" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:26:24.430477" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:26:24.377021" elapsed="0.053624"/>
</kw>
<msg time="2026-08-22T23:26:24.430746" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:24.430792" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.372059" elapsed="0.058771"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.431161" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.430908" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.430890" elapsed="0.000348"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:26:24.371917" elapsed="0.059346"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:26:24.239496" elapsed="0.191799"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:26:24.237151" elapsed="0.194209"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:26:24.232164" elapsed="0.199257"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.231727" elapsed="0.199742"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:26:24.228859" elapsed="0.202665"/>
</kw>
<kw name="Remove_Device_From_Netconf" owner="NetconfKeywords">
<kw name="Pop From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:24.432666" level="INFO">${device_type} = bug8086</msg>
<var>${device_type}</var>
<arg>${NetconfKeywords__mounted_device_types}</arg>
<arg>${device_name}</arg>
<doc>Pops the given ``key`` from the ``dictionary`` and returns its value.</doc>
<status status="PASS" start="2026-08-22T23:26:24.432379" elapsed="0.000315"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.433304" level="INFO">${mapping} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping}</var>
<arg>DEVICE_NAME=${device_name}</arg>
<arg>RESTCONF_ROOT=${RESTCONF_ROOT}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:26:24.432858" elapsed="0.000474"/>
</kw>
<kw name="Set_Variable_If_At_Least_Scandium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Set_Variable_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Set Variable If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:24.452312" elapsed="0.000468"/>
</kw>
<msg time="2026-08-22T23:26:24.452849" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>BuiltIn.Set_Variable_If</arg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:24.451901" elapsed="0.001008"/>
</kw>
<arg>scandium</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Compare ${lower_bound} to titanium and return scandium if titanium is at least ${lower_bound},
return calcium otherwise.</doc>
<status status="PASS" start="2026-08-22T23:26:24.451405" elapsed="0.001584"/>
</kw>
<msg time="2026-08-22T23:26:24.453034" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Set_Variable_If_At_Least</arg>
<arg>scandium</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:24.442659" elapsed="0.010419"/>
</kw>
<msg time="2026-08-22T23:26:24.453187" level="INFO">${version} = scandium</msg>
<var>${version}</var>
<arg>scandium</arg>
<arg>calcium</arg>
<doc>Compare scandium to titanium and return ${value_if_true} if titanium is at least scandium, return ${value_if_false} otherwise.</doc>
<status status="PASS" start="2026-08-22T23:26:24.442227" elapsed="0.010986"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.505909" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:24.505483" elapsed="0.000463"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:26:24.506769" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/bug8086.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:26:24.506465" elapsed="0.000386">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/bug8086.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:26:24.506949" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:26:24.506123" elapsed="0.000852"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.507527" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:24.507139" elapsed="0.000416"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:26:24.507904" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/bug8086/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/bug8086/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:26:24.508069" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:26:24.507751" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.508502" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:24.508249" 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-08-22T23:26:24.509538" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:24.509281" elapsed="0.000318"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.510031" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:26:24.509758" elapsed="0.000299"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.510949" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:26:24.510424" elapsed="0.000551"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:26:24.511757" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:26:24.511486" elapsed="0.000297"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:26:24.511840" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:26:24.512006" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:26:24.511164" elapsed="0.000867"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:26:24.512183" elapsed="0.000239"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:26:24.510290" elapsed="0.002175"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.513026" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:26:24.512726" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:26:24.513776" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:26:24.513546" elapsed="0.000255"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:26:24.513852" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:26:24.514003" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:26:24.513234" elapsed="0.000793"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:26:24.514175" elapsed="0.000222"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:26:24.512595" elapsed="0.001844"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:26:24.510111" elapsed="0.004363"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:26:24.514519" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:26:24.514692" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:26:24.508960" elapsed="0.005758"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:24.508647" elapsed="0.006103"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.514923" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.514775" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.508620" elapsed="0.006429"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.515808" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:26:24.515195" elapsed="0.000641"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:26:24.515885" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:26:24.504755" elapsed="0.011257"/>
</kw>
<msg time="2026-08-22T23:26:24.516066" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:24.491886" elapsed="0.024227"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.528600" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.540991" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/bug8086/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.553325" 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-08-22T23:26:24.553517" 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-08-22T23:26:24.553710" 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-08-22T23:26:24.554073" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.553931" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:24.553916" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.554292" 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-08-22T23:26:24.554459" 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-08-22T23:26:24.554641" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:26:24.553888" elapsed="0.000808"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:26:24.553786" 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-08-22T23:26:24.554868" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:24.554944" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:26:24.555063" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:26:24.487328" elapsed="0.067761"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.556247" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:24.555995" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:26:24.571001" level="INFO">DELETE Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:24.571088" level="INFO">DELETE Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:24.571255" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:26:24.558601" elapsed="0.012705"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:24.556360" elapsed="0.015035"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.571910" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.571455" elapsed="0.000606"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.556342" elapsed="0.015769"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.579752" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:24.574369" elapsed="0.005485"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:24.573879" elapsed="0.006053"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.573838" elapsed="0.006151"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.582766" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:24.580453" elapsed="0.002360"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:24.580114" elapsed="0.002733"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.580077" elapsed="0.002794"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.583425" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:26:24.583043" 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-08-22T23:26:24.583800" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.583521" elapsed="0.000336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.584337" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:24.584040" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:24.583881" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.583504" elapsed="0.000916"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.584956" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:26:24.584591" 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-08-22T23:26:24.585280" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.585051" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.585829" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:24.585516" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:24.585360" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.585034" 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-08-22T23:26:24.586059" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:26:24.586865" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:26:24.586568" 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-08-22T23:26:24.587043" elapsed="0.002329"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_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-08-22T23:26:24.572929" elapsed="0.016506"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:26:24.589482" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:26:24.591766" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-08-22T23:26:24.555390" elapsed="0.036404"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:26:24.591891" elapsed="0.000029"/>
</return>
<arg>${DIRECTORY_WITH_DEVICE_TEMPLATES}${/}${version}${/}${device_type}</arg>
<arg>${mapping}</arg>
<arg>session=${session}</arg>
<arg>location=${location}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-08-22T23:26:24.453453" elapsed="0.138565"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${NODE_CONFIGURER}</arg>
<doc>Tell Netconf to deconfigure the specified device</doc>
<status status="PASS" start="2026-08-22T23:26:24.431915" elapsed="0.160167"/>
</kw>
<doc>Make request to deconfigure the device on Netconf connector.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-08-22T23:26:24.228327" elapsed="0.363991"/>
</test>
<test id="s1-s2-t24" name="Check_Device_Deconfigured_On_Configurer" 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-08-22T23:26:24.596040" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:26:24.595778" 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-08-22T23:26:24.597297" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:24.597188" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.597169" 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-08-22T23:26:24.602454" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:24.602347" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.602328" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.603514" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:24.603136" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.604051" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:26:24.603740" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:26:24.604121" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:26:24.604275" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:26:24.602762" 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-08-22T23:26:24.609777" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:24.609670" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.609650" 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-08-22T23:26:24.611032" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:24.610925" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.610906" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:24.611564" 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-08-22T23:26:24.611244" elapsed="0.000364"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:24.612010" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:26:24.611777" elapsed="0.000259"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:26:24.641862" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:26:24.612524" elapsed="0.029444"/>
</kw>
<msg time="2026-08-22T23:26:24.642144" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:26:24.642190" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.612192" elapsed="0.030035"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:26:24.663548" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:26:24.642759" elapsed="0.021187"/>
</kw>
<msg time="2026-08-22T23:26:24.664488" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:26:24.664693" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.642396" elapsed="0.022427"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.666056" elapsed="0.000071"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.665070" elapsed="0.001165"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.665004" elapsed="0.001307"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.667190" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:24.666604" elapsed="0.000722"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.667921" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.667453" elapsed="0.000570"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.667419" elapsed="0.000649"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:26:24.668131" 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-08-22T23:26:24.671246" elapsed="0.000312"/>
</kw>
<msg time="2026-08-22T23:26:24.671665" 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-08-22T23:26:24.670077" elapsed="0.001789"/>
</kw>
<kw name="Open 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-08-22T23:26:24.672179" elapsed="0.000090"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.672550" elapsed="0.000105"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:26:24.669279" elapsed="0.003501"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:26:24.668540" elapsed="0.004308"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:26:24.610620" elapsed="0.062328"/>
</kw>
<msg time="2026-08-22T23:26:24.673040" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:24.673084" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.609995" elapsed="0.063127"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:26:24.673307" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:26:24.673199" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.673180" 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-08-22T23:26:24.673827" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.674162" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:26:24.674235" 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-08-22T23:26:24.609317" elapsed="0.065028"/>
</kw>
<msg time="2026-08-22T23:26:24.674441" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:24.674486" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.604672" elapsed="0.069855"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.674887" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.674636" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.674618" elapsed="0.000346"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:26:24.604518" elapsed="0.070470"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:26:24.680529" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:24.680422" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.680403" 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-08-22T23:26:24.681764" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:24.681656" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.681637" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:24.682288" 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-08-22T23:26:24.681973" elapsed="0.000378"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:24.682753" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:26:24.682512" elapsed="0.000268"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:26:24.714809" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:26:24.683271" elapsed="0.031643"/>
</kw>
<msg time="2026-08-22T23:26:24.715087" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:26:24.715134" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.682937" elapsed="0.032235"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:26:24.733741" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:26:24.715731" elapsed="0.018117"/>
</kw>
<msg time="2026-08-22T23:26:24.734019" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:26:24.734064" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.715340" elapsed="0.018761"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.734396" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.734177" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.734158" elapsed="0.000315"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.734944" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:24.734639" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.735290" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.735079" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.735061" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:26:24.735405" 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-08-22T23:26:24.738191" elapsed="0.000143"/>
</kw>
<msg time="2026-08-22T23:26:24.738395" 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-08-22T23:26:24.737060" elapsed="0.001477"/>
</kw>
<kw name="Open 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-08-22T23:26:24.738858" elapsed="0.000087"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.739219" elapsed="0.000245"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:26:24.736227" elapsed="0.003401"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:26:24.735699" elapsed="0.004003"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:26:24.681328" elapsed="0.058473"/>
</kw>
<msg time="2026-08-22T23:26:24.739890" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:24.739932" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.680763" elapsed="0.059206"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:26:24.740152" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:26:24.740045" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.740027" 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-08-22T23:26:24.740791" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.741123" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:26:24.741232" 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-08-22T23:26:24.680080" elapsed="0.061265"/>
</kw>
<msg time="2026-08-22T23:26:24.741438" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:24.741482" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.675252" elapsed="0.066266"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.741857" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.741608" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.741589" elapsed="0.000351"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:26:24.675115" elapsed="0.066849"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:26:24.747256" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:24.747147" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.747128" 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-08-22T23:26:24.748489" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:24.748381" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.748363" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:24.749031" 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-08-22T23:26:24.748721" elapsed="0.000337"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:24.749432" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:26:24.749211" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:26:24.777030" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:26:24.749958" elapsed="0.027199"/>
</kw>
<msg time="2026-08-22T23:26:24.777341" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:26:24.777389" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.749629" elapsed="0.027801"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:26:24.797439" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:26:24.777950" elapsed="0.019597"/>
</kw>
<msg time="2026-08-22T23:26:24.797741" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:26:24.797787" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.777615" elapsed="0.020210"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.798124" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.797902" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.797882" elapsed="0.000319"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.798663" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:24.798340" 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-08-22T23:26:24.799011" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.798800" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.798782" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:26:24.799121" 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-08-22T23:26:24.801780" elapsed="0.000143"/>
</kw>
<msg time="2026-08-22T23:26:24.801988" 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-08-22T23:26:24.800647" 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-08-22T23:26:24.802464" elapsed="0.000085"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.802854" 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-08-22T23:26:24.799959" 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-08-22T23:26:24.799375" 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-08-22T23:26:24.748077" elapsed="0.055147"/>
</kw>
<msg time="2026-08-22T23:26:24.803317" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:24.803361" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.747478" elapsed="0.055920"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:26:24.803614" elapsed="0.000197"/>
</return>
<status status="PASS" start="2026-08-22T23:26:24.803474" elapsed="0.000373"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.803456" elapsed="0.000416"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.804262" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.804761" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:26:24.804836" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:26:24.746808" elapsed="0.058138"/>
</kw>
<msg time="2026-08-22T23:26:24.805040" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:24.805084" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.742220" elapsed="0.062901"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.805442" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.805196" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.805179" elapsed="0.000340"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:26:24.742084" elapsed="0.063459"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:26:24.604350" elapsed="0.201222"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:26:24.601984" elapsed="0.203667"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:26:24.596900" elapsed="0.208810"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.596454" elapsed="0.209303"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:26:24.593620" elapsed="0.212193"/>
</kw>
<kw name="Wait_Device_Fully_Removed" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Completely_Gone" owner="NetconfKeywords">
<kw name="Check_Device_Has_No_Netconf_Connector" owner="NetconfKeywords">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.818521" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:24.816332" elapsed="0.002215"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.818888" elapsed="0.000021"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-22T23:26:24.818737" elapsed="0.000209"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-22T23:26:24.818616" elapsed="0.000356"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.819272" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.819034" elapsed="0.000295"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.820088" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:24.819613" elapsed="0.000501"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:24.819353" elapsed="0.000834"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.820377" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.820213" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.819017" elapsed="0.001436"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:26:24.820488" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:26:24.820655" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:26:24.815883" elapsed="0.004799"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:26:24.820729" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:26:24.820871" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:26:24.815364" elapsed="0.005532"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.828179" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:24.827927" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.828635" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:24.828375" 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-08-22T23:26:24.838918" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:24.839086" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1011'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}} 
 </msg>
<msg time="2026-08-22T23:26:24.839189" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:26:24.830792" elapsed="0.008423"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:24.828747" elapsed="0.010512"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.839439" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.839285" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.828729" elapsed="0.010797"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.843294" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:24.840570" elapsed="0.002780"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:24.840348" elapsed="0.003037"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.840329" elapsed="0.003081"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.849029" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:24.843733" elapsed="0.005363"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:24.843468" elapsed="0.005678"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.843451" elapsed="0.005730"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.849978" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:26:24.849405" 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-08-22T23:26:24.850448" elapsed="0.000072"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.850115" elapsed="0.000487"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.851293" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:24.850867" elapsed="0.000463"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:24.850641" elapsed="0.000741"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.850090" elapsed="0.001322"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.852188" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:26:24.851674" 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-08-22T23:26:24.852680" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.852325" elapsed="0.000437"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.853434" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:24.853016" elapsed="0.000455"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:24.852796" elapsed="0.000725"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.852299" 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-08-22T23:26:24.853782" elapsed="0.000478"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:26:24.854905" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:26:24.854483" 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-08-22T23:26:24.855151" 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-08-22T23:26:24.839926" elapsed="0.017998"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:24.858099" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:24.857993" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.857975" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:26:24.861364" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:26:24.858307" elapsed="0.003087"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:26:24.861448" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:26:24.861630" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:26:24.823524" elapsed="0.038134"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:26:24.861717" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:26:24.861865" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:26:24.821109" elapsed="0.040783"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.862303" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:24.862051" elapsed="0.000308"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.862920" level="INFO">${actual_count} = 0</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:26:24.862511" elapsed="0.000472"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-22T23:26:24.863033" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:26:24.863185" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-22T23:26:24.808068" elapsed="0.055143"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.863675" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:26:24.863366" elapsed="0.000365"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="PASS" start="2026-08-22T23:26:24.807622" elapsed="0.056168"/>
</kw>
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.874306" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:24.872221" elapsed="0.002112"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.875003" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:24.874682" elapsed="0.000347"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:26:24.874516" elapsed="0.000550"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.875651" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:24.875293" elapsed="0.000385"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:26:24.875146" elapsed="0.000569"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:26:24.874385" elapsed="0.001359"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.876505" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:24.876044" elapsed="0.000488"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:24.875808" elapsed="0.000760"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.876776" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.876608" elapsed="0.000224"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.877012" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.876856" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.875790" elapsed="0.001298"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:26:24.877122" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:26:24.877268" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:26:24.871769" elapsed="0.005524"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:26:24.877339" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:26:24.877479" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>config</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:26:24.871189" elapsed="0.006315"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:26:24.884977" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0afxxpbax79om1otjriu1np42s1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:24.885090" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:26:24.885186" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:26:24.878274" elapsed="0.006937"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} == 404 or ${resp.status_code} == 409">
<return>
<status status="PASS" start="2026-08-22T23:26:24.890476" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:26:24.885290" elapsed="0.005269"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.885271" elapsed="0.005342"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.890822" elapsed="0.000031"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The request failed with code ${resp.status_code}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.891052" elapsed="0.000028"/>
</kw>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config in node1 using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="PASS" start="2026-08-22T23:26:24.877874" elapsed="0.013334"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device has no Netconf connectors nor associated data.</doc>
<status status="PASS" start="2026-08-22T23:26:24.807076" elapsed="0.084209"/>
</kw>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Completely_Gone</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:26:24.806491" elapsed="0.084863"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${NODE_CONFIGURER}</arg>
<doc>Wait until all netconf connectors for the device with the given name disappear.
Call of Remove_Device_From_Netconf returns before netconf gets
around deleting the device's connector. To ensure the device is
really gone from netconf, use this keyword to make sure all
connectors disappear. If a call to Remove_Device_From_Netconf
is not made before using this keyword, the wait will fail.
Using this keyword is more readable than putting the WUKS below
into a test case.</doc>
<status status="PASS" start="2026-08-22T23:26:24.806023" elapsed="0.085415"/>
</kw>
<doc>Check that the device is really going to be gone. Fail if still there after one minute.
This is an expected behavior as the unmount request is sent to the config subsystem which
then triggers asynchronous disconnection of the device which is reflected in the operational
data once completed. This test makes sure this asynchronous operation does not take
unreasonable amount of time.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-08-22T23:26:24.592534" elapsed="0.299096"/>
</test>
<test id="s1-s2-t25" name="Check_Device_Deconfigured_On_Checker" line="229">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:26:24.896158" elapsed="0.000299"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:26:24.895782" elapsed="0.000752"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:26:24.898077" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:24.897919" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.897891" elapsed="0.000282"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:26:24.903113" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:24.903007" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.902989" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.904175" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:24.903798" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.904686" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:26:24.904367" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:26:24.904756" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:26:24.904908" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:26:24.903398" 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-08-22T23:26:24.910483" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:24.910375" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.910356" 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-08-22T23:26:24.911748" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:24.911638" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.911617" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:24.912279" 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-08-22T23:26:24.911964" elapsed="0.000341"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:24.912702" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:26:24.912460" elapsed="0.000268"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:26:24.943342" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:26:24.913219" elapsed="0.030226"/>
</kw>
<msg time="2026-08-22T23:26:24.943685" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:26:24.943733" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.912886" elapsed="0.030885"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:26:24.963115" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:26:24.944315" elapsed="0.019190"/>
</kw>
<msg time="2026-08-22T23:26:24.964116" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:26:24.964224" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.943976" elapsed="0.020334"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.965033" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.964498" elapsed="0.000623"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.964442" elapsed="0.000722"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:24.965987" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:24.965379" elapsed="0.000713"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.966497" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.966190" elapsed="0.000405"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.966163" elapsed="0.000468"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:26:24.966688" 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">
<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-08-22T23:26:24.970862" elapsed="0.000223"/>
</kw>
<msg time="2026-08-22T23:26:24.971177" 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-08-22T23:26:24.969062" elapsed="0.002332"/>
</kw>
<kw name="Open 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-08-22T23:26:24.971884" elapsed="0.000122"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.972401" 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-08-22T23:26:24.967992" elapsed="0.004733"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:26:24.967139" elapsed="0.005682"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:26:24.911290" elapsed="0.061672"/>
</kw>
<msg time="2026-08-22T23:26:24.973099" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:24.973163" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.910714" elapsed="0.062507"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:26:24.973485" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:26:24.973332" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.973306" elapsed="0.000340"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.974245" 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-08-22T23:26:24.974870" elapsed="0.000035"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:26:24.974971" 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-08-22T23:26:24.910037" elapsed="0.065095"/>
</kw>
<msg time="2026-08-22T23:26:24.975270" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:24.975333" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.905287" elapsed="0.070103"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:24.975905" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:24.975498" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.975474" elapsed="0.000621"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:26:24.905148" elapsed="0.070988"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:26:24.982337" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:24.982227" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.982207" 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-08-22T23:26:24.983575" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:24.983451" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:24.983432" elapsed="0.000237"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:24.984142" 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-08-22T23:26:24.983820" elapsed="0.000349"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:24.984541" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:26:24.984323" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:26:25.013216" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:26:24.985074" elapsed="0.028244"/>
</kw>
<msg time="2026-08-22T23:26:25.013510" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:26:25.013556" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.984743" elapsed="0.028870"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:26:25.032345" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:26:25.014124" elapsed="0.018324"/>
</kw>
<msg time="2026-08-22T23:26:25.032635" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:26:25.032681" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:25.013786" elapsed="0.018932"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.033013" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:25.032795" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.032775" elapsed="0.000316"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.033540" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:25.033235" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.033904" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:25.033693" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.033675" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:26:25.034013" 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-08-22T23:26:25.036685" elapsed="0.000143"/>
</kw>
<msg time="2026-08-22T23:26:25.036892" 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-08-22T23:26:25.035519" elapsed="0.001521"/>
</kw>
<kw name="Open 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-08-22T23:26:25.037335" elapsed="0.000087"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.037722" 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-08-22T23:26:25.034832" 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-08-22T23:26:25.034277" 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-08-22T23:26:24.983149" elapsed="0.054949"/>
</kw>
<msg time="2026-08-22T23:26:25.038190" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:25.038234" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.982556" elapsed="0.055753"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:26:25.038496" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:26:25.038389" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.038370" 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-08-22T23:26:25.038998" 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-08-22T23:26:25.039342" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:26:25.039415" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:26:24.981864" elapsed="0.057687"/>
</kw>
<msg time="2026-08-22T23:26:25.039812" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:25.039858" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.976654" elapsed="0.063241"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.040223" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:25.039973" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.039955" elapsed="0.000345"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:26:24.976420" elapsed="0.063905"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:26:25.045957" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:25.045846" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.045827" 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-08-22T23:26:25.047225" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:25.047118" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.047100" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:25.047776" 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-08-22T23:26:25.047435" elapsed="0.000367"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:25.048176" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:26:25.047958" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:26:25.075138" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:26:25.048717" elapsed="0.026536"/>
</kw>
<msg time="2026-08-22T23:26:25.075424" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:26:25.075487" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:25.048358" elapsed="0.027167"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:26:25.091430" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:26:25.076054" elapsed="0.015497"/>
</kw>
<msg time="2026-08-22T23:26:25.091741" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:26:25.091787" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:25.075714" elapsed="0.016111"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.092120" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:25.091901" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.091882" elapsed="0.000317"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.092683" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:25.092344" 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-08-22T23:26:25.093078" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:25.092862" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.092842" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:26:25.093190" 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-08-22T23:26:25.095819" elapsed="0.000145"/>
</kw>
<msg time="2026-08-22T23:26:25.096027" 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-08-22T23:26:25.094667" 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-08-22T23:26:25.096464" elapsed="0.000088"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.096868" 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-08-22T23:26:25.093989" elapsed="0.003087"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:26:25.093446" 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-08-22T23:26:25.046815" elapsed="0.050426"/>
</kw>
<msg time="2026-08-22T23:26:25.097333" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:25.097376" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:25.046173" elapsed="0.051240"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:26:25.097627" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-08-22T23:26:25.097489" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.097470" elapsed="0.000243"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.098122" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.098462" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:26:25.098533" 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-08-22T23:26:25.045488" elapsed="0.053203"/>
</kw>
<msg time="2026-08-22T23:26:25.098786" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:25.098830" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:25.040615" elapsed="0.058253"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.099192" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:25.098944" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.098926" elapsed="0.000344"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:26:25.040456" elapsed="0.058838"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:26:24.904981" elapsed="0.194343"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:26:24.902651" elapsed="0.196741"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:26:24.897350" elapsed="0.202104"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:24.896763" elapsed="0.202756"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:26:24.892762" elapsed="0.206830"/>
</kw>
<kw name="Wait_Device_Fully_Removed" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Completely_Gone" owner="NetconfKeywords">
<kw name="Check_Device_Has_No_Netconf_Connector" owner="NetconfKeywords">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.112854" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:25.110694" elapsed="0.002187"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.113264" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-22T23:26:25.113111" elapsed="0.000213"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-22T23:26:25.112982" elapsed="0.000367"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.113674" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:25.113413" elapsed="0.000321"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.114477" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:25.113996" elapsed="0.000509"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:25.113759" elapsed="0.000784"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.114752" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:25.114568" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.113396" elapsed="0.001436"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:26:25.114867" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:26:25.115018" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:26:25.110224" elapsed="0.004820"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:26:25.115091" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:26:25.115233" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:26:25.109736" elapsed="0.005523"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.122594" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:25.122320" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.123044" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:25.122798" 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-08-22T23:26:25.132770" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:25.132955" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1011'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}} 
 </msg>
<msg time="2026-08-22T23:26:25.133059" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:26:25.125249" elapsed="0.007836"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:25.123156" elapsed="0.009973"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.133310" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:25.133155" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.123138" elapsed="0.010264"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.137808" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:25.134440" elapsed="0.003448"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:25.134212" elapsed="0.003772"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.134194" elapsed="0.003828"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.141846" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:25.138419" elapsed="0.003494"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:25.138103" elapsed="0.003862"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.138079" elapsed="0.003922"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.142830" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:26:25.142234" 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-08-22T23:26:25.143300" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:25.142969" elapsed="0.000414"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.144103" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:25.143676" elapsed="0.000464"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:25.143417" elapsed="0.000775"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.142944" elapsed="0.001278"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.144999" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:26:25.144443" 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-08-22T23:26:25.145459" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:25.145136" elapsed="0.000404"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.146267" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:25.145851" elapsed="0.000453"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:25.145625" elapsed="0.000730"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.145111" 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-08-22T23:26:25.146612" elapsed="0.000493"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:26:25.147807" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:26:25.147332" 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-08-22T23:26:25.148057" elapsed="0.002484"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:26:25.133789" elapsed="0.016832"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:25.150802" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:25.150692" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.150674" elapsed="0.000197"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:26:25.154110" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:26:25.151015" elapsed="0.003125"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:26:25.154192" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:26:25.154351" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:26:25.117943" elapsed="0.036435"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:26:25.154436" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:26:25.154610" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:26:25.115506" elapsed="0.039133"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.155053" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:25.154801" elapsed="0.000344"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.155729" level="INFO">${actual_count} = 0</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:26:25.155300" elapsed="0.000456"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-22T23:26:25.155804" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:26:25.155961" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-22T23:26:25.102100" elapsed="0.053886"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.156404" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:26:25.156143" elapsed="0.000316"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="PASS" start="2026-08-22T23:26:25.101401" elapsed="0.055118"/>
</kw>
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.167293" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:25.164945" elapsed="0.002375"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.168037" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:25.167709" elapsed="0.000355"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:26:25.167538" elapsed="0.000564"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.168678" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:25.168339" elapsed="0.000366"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:26:25.168190" elapsed="0.000552"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:26:25.167374" elapsed="0.001397"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.169546" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:25.169074" elapsed="0.000499"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:25.168837" elapsed="0.000790"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.169822" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:25.169652" elapsed="0.000227"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.170060" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:25.169903" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.168819" elapsed="0.001318"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:26:25.170172" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:26:25.170327" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:26:25.164456" elapsed="0.005896"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:26:25.170399" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:26:25.170540" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>config</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:26:25.163886" elapsed="0.006679"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:26:25.176497" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node07rpaq3lwi2zw13q83roqcskvl1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:25.176747" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:26:25.176848" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:26:25.171345" elapsed="0.005528"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} == 404 or ${resp.status_code} == 409">
<return>
<status status="PASS" start="2026-08-22T23:26:25.181903" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-08-22T23:26:25.176957" elapsed="0.005031"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.176936" elapsed="0.005086"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.182245" elapsed="0.000088"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The request failed with code ${resp.status_code}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.182541" elapsed="0.000030"/>
</kw>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config in node3 using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="PASS" start="2026-08-22T23:26:25.170941" elapsed="0.011737"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device has no Netconf connectors nor associated data.</doc>
<status status="PASS" start="2026-08-22T23:26:25.100896" elapsed="0.081861"/>
</kw>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Completely_Gone</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:26:25.100296" elapsed="0.082532"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${NODE_CHECKER}</arg>
<doc>Wait until all netconf connectors for the device with the given name disappear.
Call of Remove_Device_From_Netconf returns before netconf gets
around deleting the device's connector. To ensure the device is
really gone from netconf, use this keyword to make sure all
connectors disappear. If a call to Remove_Device_From_Netconf
is not made before using this keyword, the wait will fail.
Using this keyword is more readable than putting the WUKS below
into a test case.</doc>
<status status="PASS" start="2026-08-22T23:26:25.099817" elapsed="0.083100"/>
</kw>
<doc>Check that the device is going to be gone from the checker node. Fail if still there after one minute.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-08-22T23:26:24.891910" elapsed="0.291179"/>
</test>
<test id="s1-s2-t26" name="Check_Device_Deconfigured_On_Setter" line="234">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:26:25.187805" elapsed="0.000308"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:26:25.187390" elapsed="0.000799"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:26:25.189606" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:25.189432" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.189407" 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-08-22T23:26:25.195635" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:25.195452" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.195419" elapsed="0.000291"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.196723" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:25.196316" elapsed="0.000435"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.197217" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:26:25.196909" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:26:25.197289" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:26:25.197444" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:26:25.195940" 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-08-22T23:26:25.203048" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:25.202921" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.202899" 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-08-22T23:26:25.204458" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:25.204349" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.204331" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:25.205022" 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-08-22T23:26:25.204697" elapsed="0.000351"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:25.205438" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:26:25.205206" elapsed="0.000258"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:26:25.234978" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:26:25.205968" elapsed="0.029116"/>
</kw>
<msg time="2026-08-22T23:26:25.235262" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:26:25.235309" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:25.205636" elapsed="0.029710"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:26:25.251737" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e "t "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-08-22T23:26:25.236026" elapsed="0.015817"/>
</kw>
<msg time="2026-08-22T23:26:25.252013" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:26:25.252059" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:25.235681" elapsed="0.016416"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.252393" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:25.252174" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.252154" elapsed="0.000318"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.252952" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e "t "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-08-22T23:26:25.252643" 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-08-22T23:26:25.253303" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:25.253088" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.253070" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:26:25.253416" 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-08-22T23:26:25.256149" elapsed="0.000148"/>
</kw>
<msg time="2026-08-22T23:26:25.256361" 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-08-22T23:26:25.254934" 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-08-22T23:26:25.256971" elapsed="0.000091"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.257347" elapsed="0.000087"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:26:25.254237" elapsed="0.003321"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:26:25.253705" elapsed="0.003943"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:26:25.204044" elapsed="0.053704"/>
</kw>
<msg time="2026-08-22T23:26:25.257839" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:25.257883" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:25.203310" elapsed="0.054611"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:26:25.258103" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:26:25.257996" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.257978" 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-08-22T23:26:25.258609" 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-08-22T23:26:25.258943" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:26:25.259014" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:26:25.202507" elapsed="0.056616"/>
</kw>
<msg time="2026-08-22T23:26:25.259216" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:25.259260" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:25.197860" elapsed="0.061437"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.259665" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:25.259370" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.259353" elapsed="0.000424"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:26:25.197718" elapsed="0.062087"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:26:25.265311" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:25.265203" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.265183" 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-08-22T23:26:25.266524" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:25.266416" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.266398" elapsed="0.000221"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:25.267071" 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-08-22T23:26:25.266761" elapsed="0.000337"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:25.267506" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:26:25.267251" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:26:25.299648" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:26:25.268041" elapsed="0.031710"/>
</kw>
<msg time="2026-08-22T23:26:25.299946" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:26:25.299993" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:25.267712" elapsed="0.032318"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:26:25.320072" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e "t "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-08-22T23:26:25.300530" elapsed="0.019649"/>
</kw>
<msg time="2026-08-22T23:26:25.320349" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:26:25.320394" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:25.300195" elapsed="0.020236"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.320748" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:25.320507" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.320487" elapsed="0.000340"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.321266" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e "t "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-08-22T23:26:25.320966" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.321629" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:25.321400" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.321382" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:26:25.321741" 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-08-22T23:26:25.324395" elapsed="0.000145"/>
</kw>
<msg time="2026-08-22T23:26:25.324627" 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-08-22T23:26:25.323203" elapsed="0.001565"/>
</kw>
<kw name="Open 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-08-22T23:26:25.325061" elapsed="0.000087"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.325427" elapsed="0.000087"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:26:25.322512" 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-08-22T23:26:25.321991" 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-08-22T23:26:25.266116" elapsed="0.059706"/>
</kw>
<msg time="2026-08-22T23:26:25.325914" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:25.325958" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:25.265529" elapsed="0.060499"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:26:25.326380" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:26:25.326108" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.326089" elapsed="0.000376"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.326880" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.327817" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:26:25.327892" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:26:25.264864" elapsed="0.063137"/>
</kw>
<msg time="2026-08-22T23:26:25.328095" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:25.328139" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:25.260070" elapsed="0.068105"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.328498" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:25.328250" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.328233" elapsed="0.000357"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:26:25.259932" elapsed="0.068685"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:26:25.334016" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:25.333908" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.333889" 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-08-22T23:26:25.335219" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:25.335112" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.335094" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:25.335787" 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-08-22T23:26:25.335450" elapsed="0.000363"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:25.336188" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:26:25.335968" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:26:25.365423" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:26:25.336721" elapsed="0.028820"/>
</kw>
<msg time="2026-08-22T23:26:25.365743" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:26:25.365790" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:25.336371" elapsed="0.029456"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:26:25.382490" level="INFO">"t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e "t "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-08-22T23:26:25.366342" elapsed="0.016281"/>
</kw>
<msg time="2026-08-22T23:26:25.382798" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:26:25.382844" level="INFO">${message_wait} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:25.365995" elapsed="0.016885"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.383182" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:25.382956" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.382936" elapsed="0.000325"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.383739" level="INFO"> "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e "t "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-08-22T23:26:25.383419" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.384129" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:25.383914" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.383894" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:26:25.384242" 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-08-22T23:26:25.387233" elapsed="0.000164"/>
</kw>
<msg time="2026-08-22T23:26:25.387464" 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-08-22T23:26:25.385885" elapsed="0.001759"/>
</kw>
<kw name="Open 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-08-22T23:26:25.387942" elapsed="0.000088"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.388307" 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-08-22T23:26:25.385178" elapsed="0.003332"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:26:25.384492" elapsed="0.004105"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:26:25.334815" elapsed="0.053884"/>
</kw>
<msg time="2026-08-22T23:26:25.388793" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:25.388837" level="INFO">${message} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:25.334233" elapsed="0.054640"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:26:25.389062" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:26:25.388952" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.388932" 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-08-22T23:26:25.389894" 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-08-22T23:26:25.390228" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:26:25.390301" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:26:25.333558" elapsed="0.056852"/>
</kw>
<msg time="2026-08-22T23:26:25.390504" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:25.390548" level="INFO">${output} =  "t "x "t ". "B "u "g "8 "0 "8 "6 ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:25.328874" elapsed="0.061731"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.390932" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:25.390684" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.390667" elapsed="0.000342"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:26:25.328738" elapsed="0.062295"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:26:25.197521" elapsed="0.193541"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:26:25.195072" elapsed="0.196050"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:26:25.189027" elapsed="0.202152"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:25.188403" elapsed="0.202823"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:26:25.184296" elapsed="0.206984"/>
</kw>
<kw name="Wait_Device_Fully_Removed" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Completely_Gone" owner="NetconfKeywords">
<kw name="Check_Device_Has_No_Netconf_Connector" owner="NetconfKeywords">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.403976" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:25.401887" elapsed="0.002116"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.404371" elapsed="0.000021"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-22T23:26:25.404220" elapsed="0.000209"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-22T23:26:25.404095" elapsed="0.000360"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.404771" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:25.404517" elapsed="0.000312"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.405550" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:25.405082" elapsed="0.000510"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:25.404853" elapsed="0.000778"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.405815" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:25.405655" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.404501" elapsed="0.001391"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:26:25.405926" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:26:25.406074" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:26:25.401419" elapsed="0.004681"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:26:25.406146" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:26:25.406287" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:26:25.400941" elapsed="0.005371"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.415542" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:25.415252" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.416002" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:25.415757" 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-08-22T23:26:25.433144" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:25.433394" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1011'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}} 
 </msg>
<msg time="2026-08-22T23:26:25.433684" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:26:25.418177" elapsed="0.015569"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:25.416113" elapsed="0.017733"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.434247" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:25.433904" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.416094" elapsed="0.018350"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.443021" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:25.436787" elapsed="0.006360"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:25.436263" elapsed="0.007032"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.436222" elapsed="0.007179"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.446675" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:25.444083" elapsed="0.002639"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:25.443536" elapsed="0.003223"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.443497" elapsed="0.003287"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.447368" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:26:25.446945" 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-08-22T23:26:25.447733" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:25.447471" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.448276" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:25.447975" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:25.447817" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.447453" elapsed="0.000906"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.448906" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:26:25.448515" 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-08-22T23:26:25.449236" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:25.449004" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.449797" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:25.449473" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:25.449316" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.448985" 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-08-22T23:26:25.450027" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:26:25.450849" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:26:25.450532" 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-08-22T23:26:25.451026" elapsed="0.002312"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:26:25.435263" elapsed="0.018138"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:25.453591" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:25.453470" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.453452" elapsed="0.000208"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:26:25.456892" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:26:25.453804" elapsed="0.003118"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:26:25.456987" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:26:25.457147" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:26:25.410827" elapsed="0.046347"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:26:25.457231" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:26:25.457379" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:26:25.406566" elapsed="0.050839"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.457861" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:25.457562" elapsed="0.000391"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.458498" level="INFO">${actual_count} = 0</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:26:25.458109" elapsed="0.000415"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-22T23:26:25.458570" elapsed="0.000051"/>
</return>
<msg time="2026-08-22T23:26:25.458746" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-22T23:26:25.393539" elapsed="0.065232"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.459181" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:26:25.458923" elapsed="0.000312"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="PASS" start="2026-08-22T23:26:25.393096" elapsed="0.066196"/>
</kw>
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.469773" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:25.467704" elapsed="0.002095"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.470459" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:25.470134" elapsed="0.000351"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:26:25.469984" elapsed="0.000537"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.471084" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:25.470766" elapsed="0.000345"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:26:25.470616" elapsed="0.000530"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:26:25.469852" elapsed="0.001323"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.471970" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:25.471489" elapsed="0.000508"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:25.471239" elapsed="0.000795"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.472225" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:25.472059" elapsed="0.000221"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.472463" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:25.472303" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.471221" elapsed="0.001317"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:26:25.472572" elapsed="0.000042"/>
</return>
<msg time="2026-08-22T23:26:25.472736" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:26:25.467204" elapsed="0.005557"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:26:25.472808" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:26:25.472948" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>config</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:26:25.466645" elapsed="0.006328"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:26:25.480251" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tw9kohm67kn5canr4dcrsjo11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:25.480368" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:26:25.480476" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:26:25.473743" elapsed="0.006759"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} == 404 or ${resp.status_code} == 409">
<return>
<status status="PASS" start="2026-08-22T23:26:25.485079" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:26:25.480606" elapsed="0.004531"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:25.480565" elapsed="0.004597"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.485311" elapsed="0.000067"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The request failed with code ${resp.status_code}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:25.485528" elapsed="0.000022"/>
</kw>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config in node2 using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="PASS" start="2026-08-22T23:26:25.473326" elapsed="0.012298"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device has no Netconf connectors nor associated data.</doc>
<status status="PASS" start="2026-08-22T23:26:25.392597" elapsed="0.093084"/>
</kw>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Completely_Gone</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:26:25.392010" elapsed="0.093721"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${NODE_SETTER}</arg>
<doc>Wait until all netconf connectors for the device with the given name disappear.
Call of Remove_Device_From_Netconf returns before netconf gets
around deleting the device's connector. To ensure the device is
really gone from netconf, use this keyword to make sure all
connectors disappear. If a call to Remove_Device_From_Netconf
is not made before using this keyword, the wait will fail.
Using this keyword is more readable than putting the WUKS below
into a test case.</doc>
<status status="PASS" start="2026-08-22T23:26:25.391517" elapsed="0.094277"/>
</kw>
<doc>Check that the device is going to be gone from the setter node. Fail if still there after one minute.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-08-22T23:26:25.183392" elapsed="0.302519"/>
</test>
<kw name="Teardown_Everything" type="TEARDOWN">
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-08-22T23:26:25.486973" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-08-22T23:26:25.486898" elapsed="0.000226"/>
</kw>
<kw name="Stop_Testtool" owner="NetconfKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:26:25.488154" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:26:25.487839" elapsed="0.000343"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-08-22T23:26:25.488335" elapsed="0.000340"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-08-22T23:26:25.487631" elapsed="0.001140"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-08-22T23:26:25.827133" level="INFO">[?2004l^C[?2004h[jenkins@releng-63244-201-1-mininet-ovs-217-0 ~]&gt;</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-08-22T23:26:25.488983" elapsed="0.338360"/>
</kw>
<kw name="Get File" owner="SSHLibrary">
<msg time="2026-08-22T23:26:25.884699" level="INFO">'testtool--netconf-clustering-txt-Bug8086.1787440897.016.log' -&gt; '/w/workspace/netconf-csit-3node-clustering-only-titanium/testtool--netconf-clustering-txt-Bug8086.1787440897.016.log'</msg>
<arg>${testtool_log}</arg>
<doc>Downloads file(s) from the remote machine to the local machine.</doc>
<status status="PASS" start="2026-08-22T23:26:25.827693" elapsed="0.057148"/>
</kw>
<doc>Stop testtool and download its log.</doc>
<status status="PASS" start="2026-08-22T23:26:25.487356" elapsed="0.397639"/>
</kw>
<doc>Teardown the test infrastructure, perform cleanup and release all resources.</doc>
<status status="PASS" start="2026-08-22T23:26:25.486684" elapsed="0.398428"/>
</kw>
<doc>Simplified netconf clustered CRUD test suite in Bug 8086 setup.

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

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


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

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

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

The suite checks the integrity of the presence of the device and the data
seen on the device only for nodes that have at least one of the roles
("CONFIGURER", "SETTER" and "CHECKER") assigned. A better design would have
a "checker list" of sorts and have only one checking test case that runs
through the check list and performs the test on each node listed. However
this currently has fairly low priority due to Beryllium delivery date so
it was left out.</doc>
<status status="FAIL" start="2026-08-22T23:21:28.353171" elapsed="297.532016"/>
</suite>
<suite id="s1-s3" name="Restart Odl With Tell Based False" source="/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/controller/dom_data_broker/restart_odl_with_tell_based_false.robot">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils" type="SETUP">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:26.057517" 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-08-22T23:26:26.052981" elapsed="0.004589"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-08-22T23:26:26.052739" elapsed="0.004916"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-08-22T23:26:26.062972" 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-08-22T23:26:26.058748" elapsed="0.004253"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-08-22T23:26:26.063254" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:26.063095" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:26.063066" elapsed="0.000264"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:26.063858" 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-08-22T23:26:26.063495" elapsed="0.000486"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-08-22T23:26:26.064469" 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-08-22T23:26:26.064153" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-08-22T23:26:26.065035" elapsed="0.000289"/>
</kw>
<msg time="2026-08-22T23:26:26.065428" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:26.065475" 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-08-22T23:26:26.064683" elapsed="0.000815"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:26.066066" 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-08-22T23:26:26.065687" elapsed="0.000406"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:26:26.067276" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:26:26.066993" elapsed="0.000311"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:26:26.067736" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:26:26.067457" elapsed="0.000306"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:26:26.068217" 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-08-22T23:26:26.067926" elapsed="0.000319"/>
</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-08-22T23:26:26.071672" elapsed="0.000223"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:26.072385" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:26:26.072057" elapsed="0.000354"/>
</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-08-22T23:26:26.072566" elapsed="0.000253"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:26.073621" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:26.073309" elapsed="0.000340"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:26:26.073696" elapsed="0.000038"/>
</return>
<msg time="2026-08-22T23:26:26.073858" 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-08-22T23:26:26.073014" elapsed="0.000870"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:26:26.074494" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.200:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396b884c650&gt;, timeout=125, 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-08-22T23:26:26.074045" elapsed="0.000616"/>
</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-08-22T23:26:26.074825" 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-08-22T23:26:26.071075" elapsed="0.004002"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:26:26.070879" elapsed="0.004267"/>
</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-08-22T23:26:26.076023" elapsed="0.000191"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:26.076711" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:26:26.076370" 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-08-22T23:26:26.076889" elapsed="0.000221"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:26.077913" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:26.077615" elapsed="0.000324"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:26:26.077985" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:26:26.078148" 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-08-22T23:26:26.077300" elapsed="0.000873"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:26:26.078753" level="INFO">Creating Session using : alias=ClusterManagement__session_2, url=http://10.30.170.12:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396b875df90&gt;, timeout=125, 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-08-22T23:26:26.078329" elapsed="0.000572"/>
</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-08-22T23:26:26.079068" elapsed="0.000207"/>
</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-08-22T23:26:26.075413" elapsed="0.003923"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:26:26.075234" elapsed="0.004146"/>
</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-08-22T23:26:26.080238" elapsed="0.000190"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:26.080967" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:26:26.080629" elapsed="0.000365"/>
</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-08-22T23:26:26.081149" elapsed="0.000223"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:26.082366" 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-08-22T23:26:26.081881" elapsed="0.000513"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:26:26.082441" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:26:26.082610" 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-08-22T23:26:26.081566" elapsed="0.001071"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:26:26.083217" level="INFO">Creating Session using : alias=ClusterManagement__session_3, url=http://10.30.170.79:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396bbaa89d0&gt;, timeout=125, 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-08-22T23:26:26.082793" elapsed="0.000529"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-08-22T23:26:26.083486" elapsed="0.000209"/>
</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-08-22T23:26:26.079665" elapsed="0.004090"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:26:26.079462" elapsed="0.004336"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-08-22T23:26:26.068306" elapsed="0.015521"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:26.084378" 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-08-22T23:26:26.083994" elapsed="0.000427"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:26.084984" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.200', 2: '10.30.170.12', 3: '10.30.170.79'}</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-08-22T23:26:26.084599" elapsed="0.000427"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:26:26.085559" 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-08-22T23:26:26.085190" elapsed="0.000428"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-08-22T23:26:26.066517" elapsed="0.019159"/>
</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-08-22T23:26:26.058379" elapsed="0.027353"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:26:26.085911" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:26.085797" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:26.085778" elapsed="0.000198"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:26.089257" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:26.088880" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:26:26.089763" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:26:26.089444" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:26:26.089833" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:26:26.089986" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:26:26.088536" elapsed="0.001475"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:26.091094" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:26:26.090827" elapsed="0.000319"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:26.091902" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:26.091761" 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-08-22T23:26:26.094818" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:26.094385" elapsed="0.000633"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:26.094367" elapsed="0.000679"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:26.095376" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:26:26.095509" level="INFO">${current_ssh_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:26.095212" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:26.096808" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.200" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:26.095708" elapsed="0.001149"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:26.097776" 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-08-22T23:26:26.097017" elapsed="0.000786"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:26.099431" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:26.099689" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:26.098763" elapsed="0.000983"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:26:26.100063" elapsed="0.000846"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:26.102539" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:26.674701" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.08               Processes:             121
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:21:36 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:26.102130" elapsed="0.572923"/>
</kw>
<msg time="2026-08-22T23:26:26.675187" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:26.101273" elapsed="0.574145"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:26:26.098020" elapsed="0.577733"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:26.676383" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-08-22T23:26:26.689378" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-08-22T23:26:26.689653" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:26:26.689719" 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-08-22T23:26:26.676023" elapsed="0.013731"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:26.690020" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:26.692249" 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-08-22T23:26:26.690913" elapsed="0.001619"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:26:26.693163" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:26.692772" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:26.692717" 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-08-22T23:26:26.693832" elapsed="0.000070"/>
</return>
<status status="PASS" start="2026-08-22T23:26:26.693467" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:26.693431" elapsed="0.000609"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:26:26.694122" 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-08-22T23:26:26.701802" elapsed="0.000365"/>
</kw>
<msg time="2026-08-22T23:26:26.702273" 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-08-22T23:26:26.700393" elapsed="0.002057"/>
</kw>
<kw name="Open 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-08-22T23:26:26.702709" elapsed="0.000084"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:26.702997" elapsed="0.000081"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:26:26.695001" elapsed="0.008176"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:26:26.093907" elapsed="0.609364"/>
</kw>
<msg time="2026-08-22T23:26:26.703324" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:26.093203" elapsed="0.610171"/>
</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-08-22T23:26:26.092719" elapsed="0.610735"/>
</kw>
<msg time="2026-08-22T23:26:26.703495" 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-08-22T23:26:26.092191" elapsed="0.611350"/>
</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-08-22T23:26:26.707542" elapsed="0.000161"/>
</kw>
<msg time="2026-08-22T23:26:26.707746" 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-08-22T23:26:26.707051" elapsed="0.000756"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:26.707966" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:26.708129" 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-08-22T23:26:26.704002" elapsed="0.004208"/>
</kw>
<msg time="2026-08-22T23:26:26.708302" 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-08-22T23:26:26.091368" elapsed="0.616960"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:26.708792" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:26.708525" elapsed="0.000309"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:26:26.708929" 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-08-22T23:26:26.090447" elapsed="0.618616"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:26:26.090262" elapsed="0.618839"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:26.710046" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:26:26.709770" elapsed="0.000302"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:26.710784" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:26.710662" 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-08-22T23:26:26.713663" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:26.713329" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:26.713309" elapsed="0.000591"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:26.714159" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:26:26.714286" level="INFO">${current_ssh_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:26.714051" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:26.715570" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.12" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:26.714463" elapsed="0.001176"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:26.716534" level="INFO">${conn_id} = 29</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:26:26.715797" elapsed="0.000763"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:26.718061" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:26.718297" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:26.717370" elapsed="0.000985"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:26:26.718800" elapsed="0.000690"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:26.721191" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:27.308362" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.02               Processes:             118
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:21:33 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:26.720783" elapsed="0.587762"/>
</kw>
<msg time="2026-08-22T23:26:27.308672" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:26.719876" elapsed="0.588985"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:26:26.716803" elapsed="0.592323"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:27.309701" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-08-22T23:26:27.322368" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-08-22T23:26:27.322539" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:26:27.322606" 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-08-22T23:26:27.309354" elapsed="0.013280"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:27.322817" elapsed="0.000243"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:27.324352" 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-08-22T23:26:27.323269" elapsed="0.001189"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:26:27.325005" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:27.324667" elapsed="0.000447"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:27.324613" 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-08-22T23:26:27.325572" elapsed="0.000104"/>
</return>
<status status="PASS" start="2026-08-22T23:26:27.325284" elapsed="0.000469"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:27.325249" elapsed="0.000557"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:26:27.325882" 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-08-22T23:26:27.333454" elapsed="0.000366"/>
</kw>
<msg time="2026-08-22T23:26:27.333972" 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-08-22T23:26:27.332200" elapsed="0.001935"/>
</kw>
<kw name="Open 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-08-22T23:26:27.334371" elapsed="0.000096"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:27.334705" elapsed="0.000081"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:26:27.326570" elapsed="0.008313"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:26:26.712847" elapsed="0.622129"/>
</kw>
<msg time="2026-08-22T23:26:27.335031" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:26.712099" elapsed="0.622983"/>
</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-08-22T23:26:26.711614" elapsed="0.623549"/>
</kw>
<msg time="2026-08-22T23:26:27.335204" 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-08-22T23:26:26.711102" elapsed="0.624147"/>
</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-08-22T23:26:27.338968" elapsed="0.000142"/>
</kw>
<msg time="2026-08-22T23:26:27.339151" 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-08-22T23:26:27.338446" elapsed="0.000765"/>
</kw>
<kw name="Open 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-08-22T23:26:27.339374" elapsed="0.000026"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:27.339563" elapsed="0.000037"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:26:27.335694" elapsed="0.003969"/>
</kw>
<msg time="2026-08-22T23:26:27.339751" 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-08-22T23:26:26.710286" elapsed="0.629490"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:27.340246" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:27.339952" elapsed="0.000338"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:26:27.340333" 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-08-22T23:26:26.709390" elapsed="0.631068"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:26:26.709203" elapsed="0.631292"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:27.341424" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:26:27.341153" elapsed="0.000297"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:27.342160" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:27.342042" elapsed="0.000244"/>
</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-08-22T23:26:27.345188" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:27.344875" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:27.344855" elapsed="0.000550"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:27.345683" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:26:27.345810" level="INFO">${current_ssh_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:27.345556" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:27.347089" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.79" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:27.345987" elapsed="0.001151"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:27.348028" 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-08-22T23:26:27.347297" elapsed="0.000758"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:27.349452" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:27.349708" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:27.348846" elapsed="0.000917"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:26:27.350066" elapsed="0.000841"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:27.352489" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:27.960442" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:27 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:21:34 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:27.352090" elapsed="0.608605"/>
</kw>
<msg time="2026-08-22T23:26:27.960811" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:27.351260" elapsed="0.609761"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:26:27.348272" elapsed="0.613046"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:27.961938" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-08-22T23:26:27.973735" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-08-22T23:26:27.973909" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:26:27.973955" 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-08-22T23:26:27.961574" elapsed="0.012406"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:27.974148" elapsed="0.000236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:27.975228" 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-08-22T23:26:27.974649" elapsed="0.000626"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:26:27.975547" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:27.975363" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:27.975335" elapsed="0.000308"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:26:27.975831" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:26:27.975697" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:27.975682" elapsed="0.000234"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:26:27.975949" 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-08-22T23:26:27.980694" elapsed="0.000365"/>
</kw>
<msg time="2026-08-22T23:26:27.981161" 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-08-22T23:26:27.979341" elapsed="0.001984"/>
</kw>
<kw name="Open 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-08-22T23:26:27.981559" elapsed="0.000116"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:27.981869" 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-08-22T23:26:27.976280" elapsed="0.005767"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:26:27.344366" elapsed="0.637772"/>
</kw>
<msg time="2026-08-22T23:26:27.982339" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:27.343708" elapsed="0.638685"/>
</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-08-22T23:26:27.343195" elapsed="0.639318"/>
</kw>
<msg time="2026-08-22T23:26:27.982556" 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-08-22T23:26:27.342439" elapsed="0.640178"/>
</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-08-22T23:26:27.986196" elapsed="0.000144"/>
</kw>
<msg time="2026-08-22T23:26:27.986382" 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-08-22T23:26:27.985688" 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="NOT RUN" start="2026-08-22T23:26:27.986635" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:27.986801" 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-08-22T23:26:27.982918" elapsed="0.003962"/>
</kw>
<msg time="2026-08-22T23:26:27.986971" 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-08-22T23:26:27.341683" elapsed="0.645313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:27.987494" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:27.987188" elapsed="0.000349"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:26:27.987596" 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-08-22T23:26:27.340793" elapsed="0.646931"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:26:27.340608" elapsed="0.647153"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:26:26.090113" elapsed="1.897687"/>
</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-08-22T23:26:26.086198" elapsed="1.901664"/>
</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-08-22T23:26:27.988022" elapsed="0.000212"/>
</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-08-22T23:26:28.002339" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:28.002226" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:28.002205" elapsed="0.000219"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:28.002723" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:26:28.002829" level="INFO">${current_ssh_connection_object} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:28.002597" elapsed="0.000259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:28.003269" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:28.003009" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:28.003732" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:28.003467" elapsed="0.000309"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:28.004527" 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-08-22T23:26:28.004299" elapsed="0.000363">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-08-22T23:26:28.004771" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:26:28.004816" 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-08-22T23:26:28.003934" 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-08-22T23:26:28.005142" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:28.004914" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:28.004895" elapsed="0.000345"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:28.006002" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:26:28.005734" elapsed="0.000294"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:26:28.006121" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:26:28.006275" level="INFO">${odl_ip} = 10.30.170.200</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:26:28.005442" 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-08-22T23:26:28.006479" elapsed="0.000453"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:28.007210" level="INFO">index=31
host=10.30.170.200
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-08-22T23:26:28.007525" level="INFO">${karaf_connection_object} = index=31
host=10.30.170.200
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-08-22T23:26:28.007104" elapsed="0.000448"/>
</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-08-22T23:26:28.007725" elapsed="0.002427"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:26:28.010624" level="INFO">Logging into '10.30.170.200:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:26:28.171718" 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-08-22T23:26:28.010322" elapsed="0.161568"/>
</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-08-22T23:26:28.176211" elapsed="0.000210"/>
</kw>
<msg time="2026-08-22T23:26:28.176465" 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-08-22T23:26:28.175648" elapsed="0.000892"/>
</kw>
<kw name="Open 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-08-22T23:26:28.176722" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:28.176888" 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-08-22T23:26:28.173134" elapsed="0.003837"/>
</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-08-22T23:26:28.172369" elapsed="0.004650"/>
</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-08-22T23:26:28.001938" elapsed="0.175134"/>
</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-08-22T23:26:27.988974" elapsed="0.188147"/>
</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-08-22T23:26:27.988604" elapsed="0.188569"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:26:27.988447" elapsed="0.188768"/>
</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-08-22T23:26:28.191651" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:28.191509" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:28.191483" elapsed="0.000248"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:28.192017" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:26:28.192127" level="INFO">${current_ssh_connection_object} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:28.191892" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:28.192590" level="INFO">{1: 31}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:28.192310" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:28.193102" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:28.192792" elapsed="0.000353"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:28.193932" 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-08-22T23:26:28.193704" elapsed="0.000339">Dictionary does not contain key '2'.</status>
</kw>
<msg time="2026-08-22T23:26:28.194152" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:26:28.194197" 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-08-22T23:26:28.193306" elapsed="0.000913"/>
</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-08-22T23:26:28.194537" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:28.194294" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:28.194276" elapsed="0.000377"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:28.195397" level="INFO">${ip_address} = 10.30.170.12</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:26:28.195131" elapsed="0.000291"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:26:28.195470" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:26:28.195635" level="INFO">${odl_ip} = 10.30.170.12</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:26:28.194858" elapsed="0.000802"/>
</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-08-22T23:26:28.195814" elapsed="0.000428"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:28.196517" level="INFO">index=32
host=10.30.170.12
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-08-22T23:26:28.196633" level="INFO">${karaf_connection_object} = index=32
host=10.30.170.12
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:28.196412" 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-08-22T23:26:28.196810" elapsed="0.002419"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:26:28.199674" level="INFO">Logging into '10.30.170.12:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:26:28.356076" 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-08-22T23:26:28.199392" elapsed="0.156819"/>
</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-08-22T23:26:28.360740" elapsed="0.000195"/>
</kw>
<msg time="2026-08-22T23:26:28.360982" 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-08-22T23:26:28.360093" elapsed="0.000962"/>
</kw>
<kw name="Open 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-08-22T23:26:28.361216" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:28.361382" 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-08-22T23:26:28.357320" elapsed="0.004146"/>
</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-08-22T23:26:28.356624" elapsed="0.004889"/>
</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-08-22T23:26:28.191208" elapsed="0.170356"/>
</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-08-22T23:26:28.177863" elapsed="0.183771"/>
</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-08-22T23:26:28.177469" elapsed="0.184265"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:26:28.177320" elapsed="0.184457"/>
</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-08-22T23:26:28.375812" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:28.375689" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:28.375664" elapsed="0.000224"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:28.376248" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:26:28.376359" level="INFO">${current_ssh_connection_object} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:28.376122" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:28.376827" level="INFO">{1: 31, 2: 32}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:28.376542" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:28.377266" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:28.377025" elapsed="0.000283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:28.378070" 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-08-22T23:26:28.377850" elapsed="0.000330">Dictionary does not contain key '3'.</status>
</kw>
<msg time="2026-08-22T23:26:28.378321" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:26:28.378374" 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-08-22T23:26:28.377465" elapsed="0.000933"/>
</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-08-22T23:26:28.378716" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:28.378475" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:28.378456" elapsed="0.000359"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:28.379553" level="INFO">${ip_address} = 10.30.170.79</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:26:28.379289" elapsed="0.000304"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:26:28.379643" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:26:28.379793" level="INFO">${odl_ip} = 10.30.170.79</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:26:28.379017" elapsed="0.000800"/>
</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-08-22T23:26:28.379972" elapsed="0.000422"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:28.380685" level="INFO">index=33
host=10.30.170.79
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-08-22T23:26:28.380784" level="INFO">${karaf_connection_object} = index=33
host=10.30.170.79
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:28.380564" elapsed="0.000246"/>
</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-08-22T23:26:28.380960" elapsed="0.004126"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:26:28.385524" level="INFO">Logging into '10.30.170.79:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:26:28.539164" 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-08-22T23:26:28.385255" elapsed="0.154077"/>
</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-08-22T23:26:28.543774" elapsed="0.000196"/>
</kw>
<msg time="2026-08-22T23:26:28.544015" 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-08-22T23:26:28.543205" 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="NOT RUN" start="2026-08-22T23:26:28.544253" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:28.544420" 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-08-22T23:26:28.540567" elapsed="0.003938"/>
</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-08-22T23:26:28.539820" elapsed="0.004733"/>
</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-08-22T23:26:28.375383" elapsed="0.169251"/>
</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-08-22T23:26:28.362459" elapsed="0.182226"/>
</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-08-22T23:26:28.362030" elapsed="0.182710"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:26:28.361887" elapsed="0.182895"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-08-22T23:26:27.988293" elapsed="0.556532"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-08-22T23:26:26.057941" elapsed="2.486953"/>
</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-08-22T23:26:28.547789" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:28.547664" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:28.547638" elapsed="0.000227"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:26:28.553097" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:28.552987" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:28.552968" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:28.554158" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:28.553761" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:26:28.554708" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:26:28.554380" elapsed="0.000355"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:26:28.554781" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:26:28.554940" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:26:28.553399" 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-08-22T23:26:28.560557" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:28.560372" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:28.560353" 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-08-22T23:26:28.561693" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:28.561568" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:28.561550" elapsed="0.000210"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:28.562185" level="INFO">${karaf_connection_index} = 31</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:26:28.561907" elapsed="0.000320"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:28.562613" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:26:28.562388" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:26:28.593395" 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 "/ "n "e "t "[78Cc "[A[78Co</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:26:28.563134" elapsed="0.030404"/>
</kw>
<msg time="2026-08-22T23:26:28.593667" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:26:28.593713" 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-08-22T23:26:28.562799" elapsed="0.030951"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:26:28.643548" level="INFO">"n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "c "o "n "t "r "o "l "l "e "r "/ "d "o "m "_ "d "a "t "a "_ "b "r "[78Co "[A[78Ck
 "e "r "/ "r "e "s "t "a "r "t "_ "o "d "l "_ "w "i "t "h "_ "t "e "l "l "_ "b "a "s "e "d "_ "f "a "l "s "e ". "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-08-22T23:26:28.594447" elapsed="0.049288"/>
</kw>
<msg time="2026-08-22T23:26:28.643837" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:26:28.643882" level="INFO">${message_wait} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:26:28.594076" elapsed="0.049844"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:28.644223" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:28.643995" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:28.643976" elapsed="0.000325"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:28.644750" level="INFO"> "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "c "o "n "t "r "o "l "l "e "r "/ "d "o "m "_ "d "a "t "a "_ "b "r "[78Co "[A[78Ck
 "e "r "/ "r "e "s "t "a "r "t "_ "o "d "l "_ "w "i "t "h "_ "t "e "l "l "_ "b "a "s "e "d "_ "f "a "l "s "e ". "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-08-22T23:26:28.644446" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:28.645130" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:28.644911" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:28.644894" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:26:28.645241" 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-08-22T23:26:28.647392" elapsed="0.000239"/>
</kw>
<msg time="2026-08-22T23:26:28.647708" 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-08-22T23:26:28.646486" elapsed="0.001349"/>
</kw>
<kw name="Open 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-08-22T23:26:28.648123" elapsed="0.000047"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:28.648423" elapsed="0.000045"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:26:28.646056" elapsed="0.002570"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:26:28.645514" elapsed="0.003161"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:26:28.561317" elapsed="0.087454"/>
</kw>
<msg time="2026-08-22T23:26:28.648862" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:28.648905" level="INFO">${message} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:26:28.560798" elapsed="0.088145"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:26:28.649285" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:26:28.649017" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:28.648999" elapsed="0.000372"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:28.649803" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:28.650135" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:26:28.650236" 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-08-22T23:26:28.560085" elapsed="0.090264"/>
</kw>
<msg time="2026-08-22T23:26:28.650443" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:28.650486" level="INFO">${output} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:26:28.555347" elapsed="0.095176"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:28.650918" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:28.650661" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:28.650639" elapsed="0.000356"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:26:28.555202" elapsed="0.095817"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:26:28.656491" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:28.656384" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:28.656365" 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-08-22T23:26:28.657614" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:28.657492" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:28.657475" elapsed="0.000207"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:28.658083" level="INFO">${karaf_connection_index} = 32</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:26:28.657828" elapsed="0.000281"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:28.658479" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:26:28.658285" elapsed="0.000220"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:26:28.690510" 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 "/ "n "e "t "[78Cc "[A[78Co</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:26:28.659026" elapsed="0.031642"/>
</kw>
<msg time="2026-08-22T23:26:28.690773" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:26:28.690819" 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-08-22T23:26:28.658687" elapsed="0.032169"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:26:28.732157" level="INFO">"n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "c "o "n "t "r "o "l "l "e "r "/ "d "o "m "_ "d "a "t "a "_ "b "r "[78Co "[A[78Ck
 "e "r "/ "r "e "s "t "a "r "t "_ "o "d "l "_ "w "i "t "h "_ "t "e "l "l "_ "b "a "s "e "d "_ "f "a "l "s "e ". "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-08-22T23:26:28.691377" elapsed="0.040949"/>
</kw>
<msg time="2026-08-22T23:26:28.732428" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:26:28.732474" level="INFO">${message_wait} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:26:28.691029" elapsed="0.041482"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:28.732845" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:28.732612" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:28.732570" elapsed="0.000355"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:28.733345" level="INFO"> "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "c "o "n "t "r "o "l "l "e "r "/ "d "o "m "_ "d "a "t "a "_ "b "r "[78Co "[A[78Ck
 "e "r "/ "r "e "s "t "a "r "t "_ "o "d "l "_ "w "i "t "h "_ "t "e "l "l "_ "b "a "s "e "d "_ "f "a "l "s "e ". "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-08-22T23:26:28.733069" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:28.733742" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:28.733505" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:28.733487" elapsed="0.000334"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:26:28.733854" 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">
<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-08-22T23:26:28.736044" elapsed="0.000217"/>
</kw>
<msg time="2026-08-22T23:26:28.736338" 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-08-22T23:26:28.735143" elapsed="0.001324"/>
</kw>
<kw name="Open 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-08-22T23:26:28.736783" elapsed="0.000046"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:28.737080" elapsed="0.000045"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:26:28.734724" elapsed="0.002589"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:26:28.734161" elapsed="0.003202"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:26:28.657242" elapsed="0.080218"/>
</kw>
<msg time="2026-08-22T23:26:28.737556" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:28.737621" level="INFO">${message} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:26:28.656728" elapsed="0.080932"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:26:28.737843" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:26:28.737736" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:28.737718" 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-08-22T23:26:28.738547" 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-08-22T23:26:28.738912" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:26:28.738985" 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-08-22T23:26:28.656093" elapsed="0.083003"/>
</kw>
<msg time="2026-08-22T23:26:28.739191" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:28.739236" level="INFO">${output} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:26:28.651280" elapsed="0.087994"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:28.739673" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:28.739351" elapsed="0.000377"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:28.739333" elapsed="0.000420"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:26:28.651140" elapsed="0.088637"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:26:28.745567" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:28.745458" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:28.745440" 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-08-22T23:26:28.746839" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:28.746730" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:28.746711" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:28.747306" level="INFO">${karaf_connection_index} = 33</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:26:28.747050" elapsed="0.000283"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:28.747703" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:26:28.747490" elapsed="0.000239"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:26:28.777178" 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 "/ "n "e "t "[78Cc "[A[78Co</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:26:28.748225" elapsed="0.029084"/>
</kw>
<msg time="2026-08-22T23:26:28.777410" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:26:28.777456" 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-08-22T23:26:28.747889" elapsed="0.029604"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:26:28.818681" level="INFO">"n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "c "o "n "t "r "o "l "l "e "r "/ "d "o "m "_ "d "a "t "a "_ "b "r "[78Co "[A[78Ck
 "e "r "/ "r "e "s "t "a "r "t "_ "o "d "l "_ "w "i "t "h "_ "t "e "l "l "_ "b "a "s "e "d "_ "f "a "l "s "e ". "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-08-22T23:26:28.778022" elapsed="0.040825"/>
</kw>
<msg time="2026-08-22T23:26:28.818945" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:26:28.818990" level="INFO">${message_wait} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:26:28.777683" elapsed="0.041378"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:28.819362" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:28.819138" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:28.819119" elapsed="0.000349"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:28.819904" level="INFO"> "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "c "o "n "t "r "o "l "l "e "r "/ "d "o "m "_ "d "a "t "a "_ "b "r "[78Co "[A[78Ck
 "e "r "/ "r "e "s "t "a "r "t "_ "o "d "l "_ "w "i "t "h "_ "t "e "l "l "_ "b "a "s "e "d "_ "f "a "l "s "e ". "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-08-22T23:26:28.819626" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:28.820279" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:28.820062" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:28.820045" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:26:28.820390" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<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-08-22T23:26:28.822521" elapsed="0.000239"/>
</kw>
<msg time="2026-08-22T23:26:28.822837" 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-08-22T23:26:28.821628" elapsed="0.001336"/>
</kw>
<kw name="Open 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-08-22T23:26:28.823253" elapsed="0.000048"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:28.823554" 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-08-22T23:26:28.821198" elapsed="0.002585"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:26:28.820671" elapsed="0.003161"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:26:28.746351" elapsed="0.077576"/>
</kw>
<msg time="2026-08-22T23:26:28.824018" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:28.824062" level="INFO">${message} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:26:28.745811" elapsed="0.078288"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:26:28.824280" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:26:28.824174" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:28.824155" 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-08-22T23:26:28.824815" 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-08-22T23:26:28.825150" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:26:28.825222" 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-08-22T23:26:28.745165" elapsed="0.080167"/>
</kw>
<msg time="2026-08-22T23:26:28.825425" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:28.825469" level="INFO">${output} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:26:28.740045" elapsed="0.085460"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:28.826072" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:28.825631" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:28.825562" elapsed="0.000613"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:26:28.739904" elapsed="0.086295"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:26:28.555021" elapsed="0.271207"/>
</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-08-22T23:26:28.552689" elapsed="0.273600"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-08-22T23:26:28.545501" elapsed="0.280911"/>
</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-08-22T23:26:28.545054" elapsed="0.281404"/>
</kw>
<arg>http_timeout=125</arg>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-08-22T23:26:26.052294" elapsed="2.774217"/>
</kw>
<test id="s1-s3-t1" name="Stop_All_Members" line="30">
<kw name="Stop_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:28.832248" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:28.831864" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:26:28.832764" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:26:28.832439" elapsed="0.000352"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:26:28.832836" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:26:28.832991" level="INFO">${stop_index_list} = [1, 2, 3]</msg>
<var>${stop_index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:26:28.831466" elapsed="0.001550"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:28.833989" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:28.833612" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:26:28.834521" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:26:28.834209" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:26:28.834608" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:26:28.834764" 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-08-22T23:26:28.833221" elapsed="0.001568"/>
</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-08-22T23:26:28.836310" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:28.835881" elapsed="0.000457"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:26:28.836821" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:26:28.836500" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:26:28.836892" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:26:28.837046" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:26:28.835494" elapsed="0.001577"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:28.838126" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:26:28.837848" elapsed="0.000305"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:28.838916" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:26:28.842288" level="INFO">${current_ssh_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:28.842054" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:28.842995" level="INFO">Attempting to execute command "/tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/stop" on remote system "10.30.170.200" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:28.842503" elapsed="0.000540"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:28.843659" level="INFO">${conn_id} = 34</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:26:28.843202" elapsed="0.000483"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:28.844888" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:28.845017" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:28.844335" elapsed="0.000709"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:26:28.845236" elapsed="0.000695"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:28.848122" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:29.174950" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.08               Processes:             121
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:26 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:28.847541" elapsed="0.327578"/>
</kw>
<msg time="2026-08-22T23:26:29.175233" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:28.846192" elapsed="0.329199"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:26:28.843902" elapsed="0.331645"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:29.175954" level="INFO">Executing command '/tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/stop'.</msg>
<msg time="2026-08-22T23:26:29.553074" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:26:29.553329" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:26:29.553430" 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-08-22T23:26:29.175747" elapsed="0.377736"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:29.553926" elapsed="0.000462"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:29.555488" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:29.554849" elapsed="0.000776"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:26:29.556055" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:29.555789" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:29.555744" elapsed="0.000460"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:26:29.556549" elapsed="0.000091"/>
</return>
<status status="PASS" start="2026-08-22T23:26:29.556319" elapsed="0.000397"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:29.556286" elapsed="0.000483"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:26:29.556845" 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-08-22T23:26:29.576726" elapsed="0.000419"/>
</kw>
<msg time="2026-08-22T23:26:29.577240" 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-08-22T23:26:29.575807" elapsed="0.001596"/>
</kw>
<kw name="Open 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-08-22T23:26:29.577573" elapsed="0.000041"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:29.577758" 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-08-22T23:26:29.557512" elapsed="0.020341"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:26:28.840993" elapsed="0.736953"/>
</kw>
<msg time="2026-08-22T23:26:29.578036" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:28.840239" elapsed="0.737852"/>
</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-08-22T23:26:28.839710" elapsed="0.738459"/>
</kw>
<msg time="2026-08-22T23:26:29.578210" 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-08-22T23:26:28.839197" elapsed="0.739057"/>
</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-08-22T23:26:29.581884" elapsed="0.000146"/>
</kw>
<msg time="2026-08-22T23:26:29.582073" 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-08-22T23:26:29.581356" elapsed="0.000778"/>
</kw>
<kw name="Open 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-08-22T23:26:29.582293" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:29.582457" 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-08-22T23:26:29.578553" elapsed="0.003984"/>
</kw>
<msg time="2026-08-22T23:26:29.582643" 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-08-22T23:26:28.838370" elapsed="0.744298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:29.583091" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:29.582845" elapsed="0.000287"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:26:29.583175" 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-08-22T23:26:28.837428" elapsed="0.745868"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:26:28.837253" elapsed="0.746079"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:29.584285" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:26:29.584019" elapsed="0.000292"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:29.585057" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:29.584947" elapsed="0.000236"/>
</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-08-22T23:26:29.587812" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:29.587516" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:29.587498" elapsed="0.000395"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:29.588151" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:26:29.588250" level="INFO">${current_ssh_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:29.588043" elapsed="0.000234"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:29.588916" level="INFO">Attempting to execute command "/tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/stop" on remote system "10.30.170.12" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:29.588427" elapsed="0.000537"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:29.589536" 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-08-22T23:26:29.589119" elapsed="0.000443"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:29.591004" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:29.591141" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:29.590420" elapsed="0.000747"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:26:29.591360" elapsed="0.000740"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:29.594485" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:29.926766" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.02               Processes:             118
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:27 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:29.593881" elapsed="0.333082"/>
</kw>
<msg time="2026-08-22T23:26:29.927086" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:29.592380" elapsed="0.334876"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:26:29.589797" elapsed="0.337628"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:29.927912" level="INFO">Executing command '/tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/stop'.</msg>
<msg time="2026-08-22T23:26:30.304706" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:26:30.304968" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:26:30.305065" 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-08-22T23:26:29.927664" elapsed="0.377452"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:30.305496" elapsed="0.000534"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:30.307149" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:30.306440" elapsed="0.000803"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:26:30.307748" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:30.307412" elapsed="0.000446"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:30.307362" elapsed="0.000548"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:26:30.308266" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-08-22T23:26:30.308030" elapsed="0.000368"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:30.307995" elapsed="0.000456"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:26:30.308527" 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-08-22T23:26:30.328462" elapsed="0.000605"/>
</kw>
<msg time="2026-08-22T23:26:30.329163" 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-08-22T23:26:30.327614" elapsed="0.001714"/>
</kw>
<kw name="Open 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-08-22T23:26:30.329491" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:30.329685" 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-08-22T23:26:30.309253" elapsed="0.020515"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:26:29.586993" elapsed="0.742868"/>
</kw>
<msg time="2026-08-22T23:26:30.329915" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:29.586409" elapsed="0.743555"/>
</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-08-22T23:26:29.585872" elapsed="0.744172"/>
</kw>
<msg time="2026-08-22T23:26:30.330084" 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-08-22T23:26:29.585335" elapsed="0.744793"/>
</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-08-22T23:26:30.333974" elapsed="0.000144"/>
</kw>
<msg time="2026-08-22T23:26:30.334161" 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-08-22T23:26:30.333441" 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="NOT RUN" start="2026-08-22T23:26:30.334376" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:30.334609" 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-08-22T23:26:30.330418" elapsed="0.004275"/>
</kw>
<msg time="2026-08-22T23:26:30.334784" 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-08-22T23:26:29.584524" elapsed="0.750285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:30.335235" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:30.334987" elapsed="0.000289"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:26:30.335318" 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-08-22T23:26:29.583612" elapsed="0.751828"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:26:29.583419" elapsed="0.752056"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:30.336452" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:26:30.336182" elapsed="0.000296"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:30.337237" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:30.337117" elapsed="0.000245"/>
</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-08-22T23:26:30.340009" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:30.339736" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:30.339717" elapsed="0.000374"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:30.340350" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:26:30.340451" level="INFO">${current_ssh_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:30.340241" elapsed="0.000237"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:30.341126" level="INFO">Attempting to execute command "/tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/stop" on remote system "10.30.170.79" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:30.340647" elapsed="0.000527"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:30.341806" level="INFO">${conn_id} = 36</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:26:30.341332" elapsed="0.000501"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:30.343070" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:30.343204" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:30.342479" elapsed="0.000751"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:26:30.343420" elapsed="0.000738"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:30.346473" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:30.671712" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:27 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:27 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:30.345880" elapsed="0.326072"/>
</kw>
<msg time="2026-08-22T23:26:30.672089" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:30.344395" elapsed="0.327880"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:26:30.342048" elapsed="0.330478"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:30.673067" level="INFO">Executing command '/tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/stop'.</msg>
<msg time="2026-08-22T23:26:31.039437" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:26:31.039738" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:26:31.039841" 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-08-22T23:26:30.672790" elapsed="0.367106"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:31.040279" elapsed="0.000487"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:31.041935" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:31.041193" 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-08-22T23:26:31.042499" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:31.042205" elapsed="0.000443"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:31.042154" elapsed="0.000548"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:26:31.043058" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-08-22T23:26:31.042823" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:31.042788" elapsed="0.000455"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:26:31.043319" 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-08-22T23:26:31.061892" elapsed="0.000388"/>
</kw>
<msg time="2026-08-22T23:26:31.062368" 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-08-22T23:26:31.060903" elapsed="0.001620"/>
</kw>
<kw name="Open 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-08-22T23:26:31.062714" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:31.062878" 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-08-22T23:26:31.044050" elapsed="0.018910"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:26:30.339189" elapsed="0.723862"/>
</kw>
<msg time="2026-08-22T23:26:31.063103" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:30.338609" elapsed="0.724543"/>
</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-08-22T23:26:30.338064" elapsed="0.725165"/>
</kw>
<msg time="2026-08-22T23:26:31.063269" 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-08-22T23:26:30.337518" elapsed="0.725796"/>
</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-08-22T23:26:31.066908" elapsed="0.000149"/>
</kw>
<msg time="2026-08-22T23:26:31.067099" 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-08-22T23:26:31.066404" 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="NOT RUN" start="2026-08-22T23:26:31.067316" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:31.067476" 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-08-22T23:26:31.063657" elapsed="0.003898"/>
</kw>
<msg time="2026-08-22T23:26:31.067667" 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-08-22T23:26:30.336710" elapsed="0.730983"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:31.068121" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:31.067874" elapsed="0.000289"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:26:31.068205" 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-08-22T23:26:30.335773" elapsed="0.732555"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:26:30.335571" elapsed="0.732792"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:26:28.837123" elapsed="2.231277"/>
</for>
<arg>command=${NODE_STOP_COMMAND}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-08-22T23:26:28.834996" elapsed="2.233465"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:26:31.068990" 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-08-22T23:26:31.068675" elapsed="0.000341"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${updated_index_list}</arg>
<arg>@{stop_index_list}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:26:31.069171" elapsed="0.000239"/>
</kw>
<if>
<branch type="IF" condition="not ${confirm}">
<return>
<value>${updated_index_list}</value>
<status status="NOT RUN" start="2026-08-22T23:26:31.069604" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:31.069483" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:31.069465" elapsed="0.000206"/>
</if>
<for flavor="IN">
<iter>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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-08-22T23:26:31.071838" 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-08-22T23:26:31.071524" elapsed="0.000342"/>
</kw>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:31.072769" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:26:31.072479" elapsed="0.000317"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:31.073559" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:31.073442" 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-08-22T23:26:31.077392" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:31.076938" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:31.076885" elapsed="0.000651"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:31.078980" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:26:31.079227" level="INFO">${current_ssh_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:31.078540" elapsed="0.000789"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:31.081074" level="INFO">Attempting to execute command "ps axf | grep org.apache.karaf | grep -v grep | wc -l" on remote system "10.30.170.200" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:31.080333" elapsed="0.000852"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:31.083008" level="INFO">${conn_id} = 37</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:26:31.082215" elapsed="0.000892"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:31.085508" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:31.085600" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:31.085210" elapsed="0.000416"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:26:31.085839" elapsed="0.000321"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:31.087187" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:31.421796" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.08               Processes:             121
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:29 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:31.086867" elapsed="0.335112"/>
</kw>
<msg time="2026-08-22T23:26:31.422066" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:31.086382" elapsed="0.335788"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:26:31.084335" elapsed="0.338233"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:31.424142" level="INFO">Executing command 'ps axf | grep org.apache.karaf | grep -v grep | wc -l'.</msg>
<msg time="2026-08-22T23:26:31.446855" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:26:31.447374" level="INFO">${stdout} = 1</msg>
<msg time="2026-08-22T23:26:31.447770" 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-08-22T23:26:31.423739" elapsed="0.024251"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:31.450345" elapsed="0.000931"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:31.453854" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:31.452827" elapsed="0.001260"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:26:31.455044" elapsed="0.000068"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:31.454443" elapsed="0.000770"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:31.454317" elapsed="0.001027"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:26:31.456167" elapsed="0.000111"/>
</return>
<status status="PASS" start="2026-08-22T23:26:31.455713" elapsed="0.000672"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:31.455560" elapsed="0.000955"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:26:31.456777" elapsed="0.000085"/>
</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-08-22T23:26:31.462504" elapsed="0.000168"/>
</kw>
<msg time="2026-08-22T23:26:31.462716" 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-08-22T23:26:31.461872" elapsed="0.000909"/>
</kw>
<kw name="Open 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-08-22T23:26:31.462990" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:31.463201" 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-08-22T23:26:31.458570" elapsed="0.004800"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:26:31.075553" elapsed="0.388085"/>
</kw>
<msg time="2026-08-22T23:26:31.463952" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:31.074914" elapsed="0.389092"/>
</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-08-22T23:26:31.074362" elapsed="0.389727"/>
</kw>
<msg time="2026-08-22T23:26:31.464131" 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-08-22T23:26:31.073860" elapsed="0.390317"/>
</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-08-22T23:26:31.467673" elapsed="0.000189"/>
</kw>
<msg time="2026-08-22T23:26:31.467904" 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-08-22T23:26:31.467167" 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="NOT RUN" start="2026-08-22T23:26:31.468125" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:31.468289" 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-08-22T23:26:31.464468" elapsed="0.003903"/>
</kw>
<msg time="2026-08-22T23:26:31.468463" level="INFO">${output} = 1</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-08-22T23:26:31.073013" elapsed="0.395477"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:31.468961" level="INFO">1</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:31.468707" elapsed="0.000300"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:26:31.469050" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:26:31.469225" level="INFO">${count} = 1</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-08-22T23:26:31.072068" elapsed="0.397184"/>
</kw>
<return>
<value>${count}</value>
<status status="PASS" start="2026-08-22T23:26:31.469300" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:26:31.469450" level="INFO">${count} = 1</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-08-22T23:26:31.070944" elapsed="0.398531"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-08-22T23:26:31.470095" level="FAIL">Found running Karaf count: 1: 0 != 1</msg>
<arg>0</arg>
<arg>${count}</arg>
<arg>Found running Karaf count: ${count}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-08-22T23:26:31.469690" elapsed="0.000486">Found running Karaf count: 1: 0 != 1</status>
</kw>
<arg>member_index=${index}</arg>
<doc>Fail if non-zero karaf instances are counted on member of given index.</doc>
<status status="FAIL" start="2026-08-22T23:26:31.070533" elapsed="0.399758">Found running Karaf count: 1: 0 != 1</status>
</kw>
<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-08-22T23:26:33.473990" 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-08-22T23:26:33.473182" elapsed="0.000879"/>
</kw>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:33.479019" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:26:33.475465" elapsed="0.003593"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:33.480210" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:33.480018" elapsed="0.000409"/>
</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-08-22T23:26:33.486075" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:33.485380" elapsed="0.000812"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:33.485294" elapsed="0.000998"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:33.488466" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:26:33.489018" level="INFO">${current_ssh_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:33.487809" elapsed="0.001358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:33.491008" level="INFO">Attempting to execute command "ps axf | grep org.apache.karaf | grep -v grep | wc -l" on remote system "10.30.170.200" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:33.490390" elapsed="0.000734"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:33.493014" level="INFO">${conn_id} = 38</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:26:33.492161" elapsed="0.000957"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:33.495600" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:33.495681" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:33.495288" elapsed="0.000417"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:26:33.495921" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:33.497318" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:33.822859" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.08               Processes:             121
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:31 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:33.496981" elapsed="0.326045"/>
</kw>
<msg time="2026-08-22T23:26:33.823114" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:33.496495" elapsed="0.326713"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:26:33.494398" elapsed="0.329114"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:33.866890" level="INFO">Executing command 'ps axf | grep org.apache.karaf | grep -v grep | wc -l'.</msg>
<msg time="2026-08-22T23:26:33.889370" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:26:33.889947" level="INFO">${stdout} = 0</msg>
<msg time="2026-08-22T23:26:33.890293" 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-08-22T23:26:33.824711" elapsed="0.065803"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:33.892934" elapsed="0.000990"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:33.896430" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:33.895207" elapsed="0.001542"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:26:33.897673" elapsed="0.000072"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:33.897114" elapsed="0.000740"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:33.896986" elapsed="0.000998"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:26:33.898818" elapsed="0.000124"/>
</return>
<status status="PASS" start="2026-08-22T23:26:33.898311" elapsed="0.000740"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:33.898200" elapsed="0.000985"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:26:33.899372" elapsed="0.000089"/>
</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-08-22T23:26:33.905458" elapsed="0.000169"/>
</kw>
<msg time="2026-08-22T23:26:33.905671" 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-08-22T23:26:33.904879" elapsed="0.000860"/>
</kw>
<kw name="Open 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-08-22T23:26:33.905945" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:33.906152" 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-08-22T23:26:33.901659" elapsed="0.004661"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:26:33.483297" elapsed="0.423249"/>
</kw>
<msg time="2026-08-22T23:26:33.906877" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:33.482317" elapsed="0.424616"/>
</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-08-22T23:26:33.481451" elapsed="0.425564"/>
</kw>
<msg time="2026-08-22T23:26:33.907055" 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-08-22T23:26:33.480697" elapsed="0.426403"/>
</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-08-22T23:26:33.910670" elapsed="0.000189"/>
</kw>
<msg time="2026-08-22T23:26:33.910902" 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-08-22T23:26:33.910115" elapsed="0.000848"/>
</kw>
<kw name="Open 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-08-22T23:26:33.911120" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:33.911281" 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-08-22T23:26:33.907388" elapsed="0.003973"/>
</kw>
<msg time="2026-08-22T23:26:33.911450" 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-08-22T23:26:33.479401" elapsed="0.432074"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:33.911920" level="INFO">0</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:33.911671" elapsed="0.000294"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:26:33.912007" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:26:33.912158" 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-08-22T23:26:33.474523" elapsed="0.437660"/>
</kw>
<return>
<value>${count}</value>
<status status="PASS" start="2026-08-22T23:26:33.912228" elapsed="0.000051"/>
</return>
<msg time="2026-08-22T23:26:33.912400" 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-08-22T23:26:33.472284" elapsed="0.440140"/>
</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-08-22T23:26:33.912597" elapsed="0.000370"/>
</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-08-22T23:26:33.471168" elapsed="0.441899"/>
</kw>
<arg>${timeout}</arg>
<arg>2s</arg>
<arg>Verify_Karaf_Is_Not_Running_On_Member</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:26:31.070002" elapsed="2.843113"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:26:31.069856" elapsed="2.843296"/>
</iter>
<iter>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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-08-22T23:26:33.915004" 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-08-22T23:26:33.914708" elapsed="0.000323"/>
</kw>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:33.916112" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:26:33.915831" elapsed="0.000308"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:33.916915" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:33.916800" elapsed="0.000242"/>
</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-08-22T23:26:33.920761" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:33.920307" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:33.920251" elapsed="0.000654"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:33.922344" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:26:33.922618" level="INFO">${current_ssh_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:33.921924" elapsed="0.000800"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:33.924344" level="INFO">Attempting to execute command "ps axf | grep org.apache.karaf | grep -v grep | wc -l" on remote system "10.30.170.12" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:33.923775" elapsed="0.000680"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:33.926390" level="INFO">${conn_id} = 39</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:26:33.925672" elapsed="0.000821"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:33.929061" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:33.929139" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:33.928780" 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-08-22T23:26:33.929377" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:33.930873" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:34.239654" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.02               Processes:             118
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:29 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:33.930461" elapsed="0.309283"/>
</kw>
<msg time="2026-08-22T23:26:34.239809" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:33.929980" elapsed="0.309895"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:26:33.927831" elapsed="0.312318"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:34.241534" level="INFO">Executing command 'ps axf | grep org.apache.karaf | grep -v grep | wc -l'.</msg>
<msg time="2026-08-22T23:26:34.264388" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:26:34.264941" level="INFO">${stdout} = 0</msg>
<msg time="2026-08-22T23:26:34.265285" 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-08-22T23:26:34.241199" elapsed="0.024304"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:34.267867" elapsed="0.000951"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:34.271331" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:34.270211" elapsed="0.001357"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:26:34.272470" elapsed="0.000066"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:34.271957" elapsed="0.000756"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:34.271833" elapsed="0.001011"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:26:34.273675" elapsed="0.000118"/>
</return>
<status status="PASS" start="2026-08-22T23:26:34.273173" elapsed="0.000733"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:34.273060" elapsed="0.000979"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:26:34.274222" elapsed="0.000088"/>
</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-08-22T23:26:34.280901" elapsed="0.000151"/>
</kw>
<msg time="2026-08-22T23:26:34.281118" 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-08-22T23:26:34.280348" 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="NOT RUN" start="2026-08-22T23:26:34.281393" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:34.281618" elapsed="0.000023"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:26:34.277053" elapsed="0.004736"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:26:33.918901" elapsed="0.363113"/>
</kw>
<msg time="2026-08-22T23:26:34.282330" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:33.918245" elapsed="0.364140"/>
</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-08-22T23:26:33.917717" elapsed="0.364753"/>
</kw>
<msg time="2026-08-22T23:26:34.282513" 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-08-22T23:26:33.917197" elapsed="0.365363"/>
</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-08-22T23:26:34.286186" elapsed="0.000188"/>
</kw>
<msg time="2026-08-22T23:26:34.286417" 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-08-22T23:26:34.285663" 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-08-22T23:26:34.286660" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:34.286826" 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-08-22T23:26:34.282883" elapsed="0.004023"/>
</kw>
<msg time="2026-08-22T23:26:34.286996" 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-08-22T23:26:33.916372" elapsed="0.370649"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:34.287443" level="INFO">0</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:34.287196" elapsed="0.000292"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:26:34.287530" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:26:34.287704" 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-08-22T23:26:33.915230" elapsed="0.372499"/>
</kw>
<return>
<value>${count}</value>
<status status="PASS" start="2026-08-22T23:26:34.287777" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:26:34.287924" 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-08-22T23:26:33.914342" elapsed="0.373606"/>
</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-08-22T23:26:34.288126" elapsed="0.000355"/>
</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-08-22T23:26:33.913952" elapsed="0.374593"/>
</kw>
<arg>${timeout}</arg>
<arg>2s</arg>
<arg>Verify_Karaf_Is_Not_Running_On_Member</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:26:33.913392" elapsed="0.375267"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:26:33.913249" elapsed="0.375450"/>
</iter>
<iter>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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-08-22T23:26:34.290501" 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-08-22T23:26:34.290211" elapsed="0.000317"/>
</kw>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:34.291420" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:26:34.291151" elapsed="0.000295"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:34.292428" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:34.292311" elapsed="0.000248"/>
</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-08-22T23:26:34.296413" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:34.295949" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:34.295894" elapsed="0.000661"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:34.298027" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:26:34.298275" level="INFO">${current_ssh_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:34.297600" elapsed="0.000777"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:34.299976" level="INFO">Attempting to execute command "ps axf | grep org.apache.karaf | grep -v grep | wc -l" on remote system "10.30.170.79" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:34.299417" elapsed="0.000672"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:34.302029" 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-08-22T23:26:34.301316" elapsed="0.000814"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:34.304832" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:34.304913" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:34.304439" elapsed="0.000499"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:26:34.305154" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:34.306412" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:34.629001" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:27 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:30 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:34.306095" elapsed="0.323069"/>
</kw>
<msg time="2026-08-22T23:26:34.629251" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:34.305731" elapsed="0.323610"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:26:34.303395" elapsed="0.326260"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:34.631230" level="INFO">Executing command 'ps axf | grep org.apache.karaf | grep -v grep | wc -l'.</msg>
<msg time="2026-08-22T23:26:34.654082" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:26:34.654761" level="INFO">${stdout} = 0</msg>
<msg time="2026-08-22T23:26:34.655111" 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-08-22T23:26:34.630813" elapsed="0.024517"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:34.657723" elapsed="0.000985"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:34.661094" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:34.660055" elapsed="0.001282"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:26:34.662379" elapsed="0.000071"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:34.661859" elapsed="0.000698"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:34.661571" elapsed="0.001391"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:26:34.663943" elapsed="0.000142"/>
</return>
<status status="PASS" start="2026-08-22T23:26:34.663300" elapsed="0.000900"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:34.663186" elapsed="0.001148"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:26:34.664518" elapsed="0.000123"/>
</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-08-22T23:26:34.669887" elapsed="0.000156"/>
</kw>
<msg time="2026-08-22T23:26:34.670087" 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-08-22T23:26:34.669199" elapsed="0.000952"/>
</kw>
<kw name="Open 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-08-22T23:26:34.670356" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:34.670564" elapsed="0.000039"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:26:34.665996" elapsed="0.004755"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:26:34.294547" elapsed="0.376426"/>
</kw>
<msg time="2026-08-22T23:26:34.671286" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:34.293892" elapsed="0.377447"/>
</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-08-22T23:26:34.293241" elapsed="0.378179"/>
</kw>
<msg time="2026-08-22T23:26:34.671462" 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-08-22T23:26:34.292736" elapsed="0.378771"/>
</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-08-22T23:26:34.675084" elapsed="0.000186"/>
</kw>
<msg time="2026-08-22T23:26:34.675313" 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-08-22T23:26:34.674536" 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="NOT RUN" start="2026-08-22T23:26:34.675531" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:34.675717" 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-08-22T23:26:34.671839" elapsed="0.003959"/>
</kw>
<msg time="2026-08-22T23:26:34.675886" 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-08-22T23:26:34.291680" elapsed="0.384231"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:34.676352" level="INFO">0</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:34.676104" elapsed="0.000292"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:26:34.676437" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:26:34.676604" 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-08-22T23:26:34.290744" elapsed="0.385886"/>
</kw>
<return>
<value>${count}</value>
<status status="PASS" start="2026-08-22T23:26:34.676677" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:26:34.676825" 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-08-22T23:26:34.289862" elapsed="0.386987"/>
</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-08-22T23:26:34.677006" elapsed="0.000356"/>
</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-08-22T23:26:34.289451" elapsed="0.387977"/>
</kw>
<arg>${timeout}</arg>
<arg>2s</arg>
<arg>Verify_Karaf_Is_Not_Running_On_Member</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:26:34.288943" elapsed="0.388571"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:26:34.288798" elapsed="0.388756"/>
</iter>
<var>${index}</var>
<value>@{stop_index_list}</value>
<status status="PASS" start="2026-08-22T23:26:31.069715" elapsed="3.607899"/>
</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-08-22T23:26:34.680914" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:34.680515" elapsed="0.000426"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:26:34.681405" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:26:34.681101" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:26:34.681477" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:26:34.681647" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:26:34.680134" elapsed="0.001539"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:34.682734" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:26:34.682445" elapsed="0.000315"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:34.683504" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:34.683385" 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-08-22T23:26:34.686505" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:34.686231" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:34.686212" elapsed="0.000391"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:34.686864" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:26:34.686963" level="INFO">${current_ssh_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:34.686755" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:34.687629" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.200" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:34.687140" elapsed="0.000536"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:34.688272" level="INFO">${conn_id} = 41</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:26:34.687833" elapsed="0.000466"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:34.689498" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:34.689650" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:34.688963" elapsed="0.000712"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:26:34.689867" elapsed="0.000674"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:34.692753" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:35.036692" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.08               Processes:             121
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:33 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:34.692149" elapsed="0.344727"/>
</kw>
<msg time="2026-08-22T23:26:35.037050" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:34.690797" elapsed="0.346413"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:26:34.688514" elapsed="0.348855"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:35.037843" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-08-22T23:26:35.050500" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-08-22T23:26:35.050777" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:26:35.050875" 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-08-22T23:26:35.037576" elapsed="0.013352"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:35.051299" elapsed="0.000498"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:35.052906" 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-08-22T23:26:35.052228" 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-08-22T23:26:35.053459" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:35.053176" elapsed="0.000390"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:35.053126" elapsed="0.000539"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:26:35.054026" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-08-22T23:26:35.053789" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:35.053753" elapsed="0.000454"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:26:35.054283" 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-08-22T23:26:35.073485" elapsed="0.000623"/>
</kw>
<msg time="2026-08-22T23:26:35.074198" 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-08-22T23:26:35.072673" elapsed="0.001676"/>
</kw>
<kw name="Open 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-08-22T23:26:35.074513" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:35.074695" 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-08-22T23:26:35.055004" elapsed="0.019774"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:26:34.685703" elapsed="0.389167"/>
</kw>
<msg time="2026-08-22T23:26:35.074923" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:34.685094" elapsed="0.389877"/>
</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-08-22T23:26:34.684543" elapsed="0.390506"/>
</kw>
<msg time="2026-08-22T23:26:35.075089" 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-08-22T23:26:34.683805" elapsed="0.391329"/>
</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-08-22T23:26:35.078713" elapsed="0.000143"/>
</kw>
<msg time="2026-08-22T23:26:35.078898" 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-08-22T23:26:35.078186" 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-08-22T23:26:35.079117" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:35.079277" 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-08-22T23:26:35.075421" elapsed="0.003936"/>
</kw>
<msg time="2026-08-22T23:26:35.079445" 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-08-22T23:26:34.682976" elapsed="0.396494"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:35.079937" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:35.079661" elapsed="0.000318"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:26:35.080022" 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-08-22T23:26:34.682042" elapsed="0.398142"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:26:34.681865" elapsed="0.398357"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:35.081207" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:26:35.080936" elapsed="0.000298"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:35.082004" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:26:35.085216" level="INFO">${current_ssh_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:35.085008" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:35.085879" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.12" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:35.085393" elapsed="0.000533"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:35.086507" 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-08-22T23:26:35.086084" elapsed="0.000449"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:35.087945" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:35.088072" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:35.087378" elapsed="0.000719"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:26:35.088290" elapsed="0.000692"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:35.091135" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:35.416920" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.02               Processes:             118
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:34 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:35.090550" elapsed="0.327015"/>
</kw>
<msg time="2026-08-22T23:26:35.417973" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:35.089213" elapsed="0.329135"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:26:35.086770" elapsed="0.332037"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:35.420019" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-08-22T23:26:35.433190" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-08-22T23:26:35.433458" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:26:35.433557" 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-08-22T23:26:35.419314" elapsed="0.014348"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:35.434074" elapsed="0.000537"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:35.435902" 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-08-22T23:26:35.435099" elapsed="0.000909"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:26:35.436708" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:35.436333" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:35.436271" elapsed="0.000609"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:26:35.437248" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-08-22T23:26:35.437003" elapsed="0.000379"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:35.436967" elapsed="0.000469"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:26:35.437513" 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-08-22T23:26:35.456967" elapsed="0.000395"/>
</kw>
<msg time="2026-08-22T23:26:35.457453" 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-08-22T23:26:35.456024" elapsed="0.001631"/>
</kw>
<kw name="Open 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-08-22T23:26:35.457825" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:35.457990" 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-08-22T23:26:35.438283" elapsed="0.019789"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:26:35.083957" elapsed="0.374209"/>
</kw>
<msg time="2026-08-22T23:26:35.458223" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:35.083357" elapsed="0.374916"/>
</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-08-22T23:26:35.082825" elapsed="0.375531"/>
</kw>
<msg time="2026-08-22T23:26:35.458398" 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-08-22T23:26:35.082286" elapsed="0.376160"/>
</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-08-22T23:26:35.462353" elapsed="0.000146"/>
</kw>
<msg time="2026-08-22T23:26:35.462543" 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-08-22T23:26:35.461853" 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-08-22T23:26:35.462788" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:35.462951" 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-08-22T23:26:35.458790" elapsed="0.004242"/>
</kw>
<msg time="2026-08-22T23:26:35.463127" 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-08-22T23:26:35.081449" elapsed="0.381703"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:35.463602" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:35.463333" elapsed="0.000313"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:26:35.463701" 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-08-22T23:26:35.080507" elapsed="0.383323"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:26:35.080321" elapsed="0.383548"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:35.464895" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:26:35.464612" elapsed="0.000309"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:35.465706" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:35.465556" 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-08-22T23:26:35.468596" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:35.468295" elapsed="0.000360"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:35.468275" elapsed="0.000404"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:35.468939" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:26:35.469040" level="INFO">${current_ssh_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:35.468829" elapsed="0.000238"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:35.469741" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.79" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:35.469218" elapsed="0.000571"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:35.470403" level="INFO">${conn_id} = 43</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:26:35.469946" elapsed="0.000483"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:35.471693" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:35.471827" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:35.471106" elapsed="0.000747"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:26:35.472047" elapsed="0.000692"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:35.474914" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:35.780883" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:27 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:34 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:35.474284" elapsed="0.307000"/>
</kw>
<msg time="2026-08-22T23:26:35.781535" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:35.472973" elapsed="0.308948"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:26:35.470668" elapsed="0.311594"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:35.783156" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-08-22T23:26:35.796428" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-08-22T23:26:35.796903" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:26:35.797005" 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-08-22T23:26:35.782703" elapsed="0.014358"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:35.797627" elapsed="0.000613"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:35.799518" 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-08-22T23:26:35.798756" elapsed="0.000945"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:26:35.800223" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:35.799897" elapsed="0.000442"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:35.799835" elapsed="0.000557"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:26:35.800795" elapsed="0.000072"/>
</return>
<status status="PASS" start="2026-08-22T23:26:35.800513" elapsed="0.000429"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:35.800478" elapsed="0.000517"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:26:35.801075" 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-08-22T23:26:35.820231" elapsed="0.000421"/>
</kw>
<msg time="2026-08-22T23:26:35.820742" 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-08-22T23:26:35.819140" elapsed="0.001765"/>
</kw>
<kw name="Open 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-08-22T23:26:35.821074" elapsed="0.000097"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:35.821323" 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-08-22T23:26:35.801859" elapsed="0.019551"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:26:35.467755" elapsed="0.353750"/>
</kw>
<msg time="2026-08-22T23:26:35.821561" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:35.467058" elapsed="0.354652"/>
</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-08-22T23:26:35.466497" elapsed="0.355303"/>
</kw>
<msg time="2026-08-22T23:26:35.821843" 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-08-22T23:26:35.465993" elapsed="0.355898"/>
</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-08-22T23:26:35.825424" elapsed="0.000144"/>
</kw>
<msg time="2026-08-22T23:26:35.825627" 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-08-22T23:26:35.824933" elapsed="0.000756"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:35.825847" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:35.826007" 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-08-22T23:26:35.822190" elapsed="0.003898"/>
</kw>
<msg time="2026-08-22T23:26:35.826183" 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-08-22T23:26:35.465140" elapsed="0.361068"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:35.826654" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:35.826388" elapsed="0.000308"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:26:35.826738" 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-08-22T23:26:35.464182" elapsed="0.362684"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:26:35.463991" elapsed="0.362915"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:26:34.681728" elapsed="1.145223"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-08-22T23:26:34.677838" elapsed="1.149186"/>
</kw>
<return>
<value>${updated_index_list}</value>
<status status="PASS" start="2026-08-22T23:26:35.827068" elapsed="0.000027"/>
</return>
<doc>If the list is empty, stops all ODL instances. Otherwise stop members based on ${stop_index_list}
If ${confirm} is True, verify stopped instances are not there anymore.
The KW will return a list of available members: ${updated index_list}=${original_index_list}-${member_index_list}</doc>
<status status="PASS" start="2026-08-22T23:26:28.827271" elapsed="6.999929"/>
</kw>
<doc>Stop every odl node.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-08-22T23:26:28.826606" elapsed="7.000720"/>
</test>
<test id="s1-s3-t2" name="Unset_Tell_Based_Protocol_Usage" line="34">
<kw name="Change_Use_Tell_Based_Protocol" owner="DdbCommons">
<kw name="Check_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:35.832875" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:35.832461" elapsed="0.000441"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:26:35.833373" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:26:35.833067" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:26:35.833444" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:26:35.833614" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:26:35.832073" elapsed="0.001568"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:35.835953" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:35.835822" elapsed="0.000494"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:35.838167" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:26:35.837843" elapsed="0.000351"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:26:35.838243" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:26:35.838392" level="INFO">${member_ip} = 10.30.170.200</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:26:35.837504" elapsed="0.000912"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:35.842107" level="INFO">${odl_connection} = 44</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:26:35.841336" elapsed="0.000875"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:35.845284" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:35.845361" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:35.844991" elapsed="0.000394"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:35.845545" elapsed="0.000336"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:35.846753" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:36.187114" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.08               Processes:             121
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:34 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:35.846410" elapsed="0.340811"/>
</kw>
<msg time="2026-08-22T23:26:36.187286" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:35.846052" elapsed="0.341301"/>
</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-08-22T23:26:35.844345" elapsed="0.343109"/>
</kw>
<msg time="2026-08-22T23:26:36.187503" 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-08-22T23:26:35.843799" elapsed="0.343751"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:26:35.842808" elapsed="0.344922"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:26:36.187821" elapsed="0.000052"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.200 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:26:35.840128" elapsed="0.347982"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:36.191165" level="INFO">Executing command 'sed -ie "s/^#use-tell-based-protocol=true/use-tell-based-protocol=true/g" //tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/org.opendaylight.controller.cluster.datastore.cfg'.</msg>
<msg time="2026-08-22T23:26:36.204288" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:26:36.204623" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:26:36.204729" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:26:36.204819" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:36.190966" elapsed="0.013902"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:26:36.206922" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:26:36.206265" elapsed="0.000759"/>
</kw>
<msg time="2026-08-22T23:26:36.207237" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:26:36.207335" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:36.205427" elapsed="0.001957"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:36.209005" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:36.207948" elapsed="0.001117"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:36.211920" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:36.211237" elapsed="0.000744"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:36.215042" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:36.212197" elapsed="0.002906"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:36.215710" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:36.215327" elapsed="0.000445"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:26:36.210289" elapsed="0.005560"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:36.209372" elapsed="0.006525"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:36.209319" elapsed="0.006614"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:26:36.216241" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:36.216095" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:36.216067" elapsed="0.000266"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:26:36.216639" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-08-22T23:26:36.216479" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:36.216455" elapsed="0.000313"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:36.217047" elapsed="0.000033"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:26:36.190044" elapsed="0.027360"/>
</kw>
<msg time="2026-08-22T23:26:36.217637" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:36.217739" level="INFO">${result} = </msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:36.188362" elapsed="0.029429"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:36.218154" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:26:36.218924" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:26:36.218664" elapsed="0.000442"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:36.218636" elapsed="0.000508"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:36.219350" elapsed="0.000031"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:26:35.839141" elapsed="0.380519"/>
</kw>
<msg time="2026-08-22T23:26:36.219742" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:35.838572" elapsed="0.381237"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:26:35.836981" elapsed="0.382943"/>
</kw>
<msg time="2026-08-22T23:26:36.219979" 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-08-22T23:26:35.836487" elapsed="0.383552"/>
</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-08-22T23:26:36.224794" elapsed="0.000145"/>
</kw>
<msg time="2026-08-22T23:26:36.224981" 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-08-22T23:26:36.224262" 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="NOT RUN" start="2026-08-22T23:26:36.225199" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:36.225360" 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-08-22T23:26:36.220441" elapsed="0.005000"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:26:35.835149" elapsed="0.390348"/>
</kw>
<msg time="2026-08-22T23:26:36.225550" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:35.834705" elapsed="0.390907"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:26:35.834000" elapsed="0.391696"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:26:35.833842" elapsed="0.391935"/>
</iter>
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:36.227956" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:36.227836" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:36.229888" level="INFO">${ip_address} = 10.30.170.12</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:26:36.229556" elapsed="0.000359"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:26:36.229964" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:26:36.230113" level="INFO">${member_ip} = 10.30.170.12</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:26:36.229236" elapsed="0.000902"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:36.233698" level="INFO">${odl_connection} = 45</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:26:36.232953" elapsed="0.000847"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:36.236830" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:36.236911" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:36.236391" elapsed="0.000545"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:36.237094" elapsed="0.000319"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:36.238272" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:36.562697" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.02               Processes:             118
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:35 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:36.237958" elapsed="0.324925"/>
</kw>
<msg time="2026-08-22T23:26:36.562975" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:36.237598" elapsed="0.325476"/>
</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-08-22T23:26:36.235900" elapsed="0.327304"/>
</kw>
<msg time="2026-08-22T23:26:36.563279" 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-08-22T23:26:36.235477" elapsed="0.327858"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:26:36.234353" elapsed="0.329209"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:26:36.563697" elapsed="0.000078"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.12 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:26:36.231787" elapsed="0.332274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:36.567639" level="INFO">Executing command 'sed -ie "s/^#use-tell-based-protocol=true/use-tell-based-protocol=true/g" //tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/org.opendaylight.controller.cluster.datastore.cfg'.</msg>
<msg time="2026-08-22T23:26:36.579937" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:26:36.580062" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:26:36.580105" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:26:36.580146" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:36.567398" elapsed="0.012770"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:26:36.581171" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:26:36.580787" elapsed="0.000430"/>
</kw>
<msg time="2026-08-22T23:26:36.581313" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:26:36.581357" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:36.580411" elapsed="0.000968"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:36.582088" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:36.581626" elapsed="0.000488"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:36.583339" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:36.583057" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:36.584041" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:36.583543" elapsed="0.000540"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:36.584482" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:36.584240" elapsed="0.000286"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:26:36.582643" elapsed="0.001959"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:36.582263" elapsed="0.002379"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:36.582235" elapsed="0.002436"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:26:36.584896" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:36.584789" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:36.584769" elapsed="0.000194"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:26:36.585168" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:26:36.585074" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:36.585056" elapsed="0.000197"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:36.585458" elapsed="0.000023"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:26:36.566347" elapsed="0.019399"/>
</kw>
<msg time="2026-08-22T23:26:36.585910" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:36.585986" level="INFO">${result} = </msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:36.564392" elapsed="0.021632"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:36.586295" elapsed="0.000220"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:26:36.586852" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:26:36.586660" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:36.586637" elapsed="0.000379"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:36.587165" elapsed="0.000022"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:26:36.230841" elapsed="0.356531"/>
</kw>
<msg time="2026-08-22T23:26:36.587432" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:36.230294" elapsed="0.357190"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:26:36.228719" elapsed="0.358853"/>
</kw>
<msg time="2026-08-22T23:26:36.587637" 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-08-22T23:26:36.228237" elapsed="0.359447"/>
</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-08-22T23:26:36.591512" elapsed="0.000164"/>
</kw>
<msg time="2026-08-22T23:26:36.591720" 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-08-22T23:26:36.590948" elapsed="0.000832"/>
</kw>
<kw name="Open 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-08-22T23:26:36.591942" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:36.592104" 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-08-22T23:26:36.587995" elapsed="0.004188"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:26:36.227191" elapsed="0.365052"/>
</kw>
<msg time="2026-08-22T23:26:36.592336" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:36.226744" elapsed="0.365643"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:26:36.226030" elapsed="0.366447"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:26:36.225875" elapsed="0.366649"/>
</iter>
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:36.594739" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:36.594612" elapsed="0.000256"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:36.596703" level="INFO">${ip_address} = 10.30.170.79</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:26:36.596366" elapsed="0.000364"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:26:36.596779" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:26:36.596930" level="INFO">${member_ip} = 10.30.170.79</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:26:36.596046" elapsed="0.000909"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:36.600708" level="INFO">${odl_connection} = 46</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:26:36.599930" elapsed="0.000887"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:36.604088" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:36.604167" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:36.603814" 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-08-22T23:26:36.604350" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:36.605542" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:36.925303" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:27 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:35 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:36.605224" elapsed="0.320250"/>
</kw>
<msg time="2026-08-22T23:26:36.925563" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:36.604864" elapsed="0.320815"/>
</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-08-22T23:26:36.602991" elapsed="0.322817"/>
</kw>
<msg time="2026-08-22T23:26:36.925860" 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-08-22T23:26:36.602565" elapsed="0.323348"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:26:36.601398" elapsed="0.324720"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:26:36.926226" elapsed="0.000071"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.79 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:26:36.598689" elapsed="0.327914"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:36.930106" level="INFO">Executing command 'sed -ie "s/^#use-tell-based-protocol=true/use-tell-based-protocol=true/g" //tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/org.opendaylight.controller.cluster.datastore.cfg'.</msg>
<msg time="2026-08-22T23:26:36.943338" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:26:36.943627" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:26:36.943733" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:26:36.943825" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:36.929903" elapsed="0.013972"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:26:36.945878" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:26:36.945220" elapsed="0.000762"/>
</kw>
<msg time="2026-08-22T23:26:36.946195" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:26:36.946293" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:36.944395" elapsed="0.001950"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:36.947856" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:36.946886" elapsed="0.001008"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:36.949541" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:36.949191" elapsed="0.000439"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:36.950483" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:36.949845" elapsed="0.000698"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:36.951197" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:36.950837" elapsed="0.000423"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:26:36.948609" elapsed="0.002729"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:36.948095" elapsed="0.003293"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:36.948057" elapsed="0.003370"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:26:36.951768" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:36.951619" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:36.951560" elapsed="0.000302"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:26:36.952138" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:26:36.952008" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:36.951982" elapsed="0.000273"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:36.952532" elapsed="0.000032"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:26:36.928898" elapsed="0.024022"/>
</kw>
<msg time="2026-08-22T23:26:36.953132" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:36.953236" level="INFO">${result} = </msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:36.927009" elapsed="0.026280"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:36.953685" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:26:36.954417" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:26:36.954161" elapsed="0.000466"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:36.954134" elapsed="0.000533"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:36.954873" elapsed="0.000031"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:26:36.597656" elapsed="0.357493"/>
</kw>
<msg time="2026-08-22T23:26:36.955233" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:36.597112" elapsed="0.358189"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:26:36.595510" elapsed="0.359912"/>
</kw>
<msg time="2026-08-22T23:26:36.955479" 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-08-22T23:26:36.595022" elapsed="0.360520"/>
</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-08-22T23:26:36.960724" elapsed="0.000149"/>
</kw>
<msg time="2026-08-22T23:26:36.960916" 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-08-22T23:26:36.960024" 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="NOT RUN" start="2026-08-22T23:26:36.961136" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:36.961299" 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-08-22T23:26:36.955992" elapsed="0.005388"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:26:36.593982" elapsed="0.367457"/>
</kw>
<msg time="2026-08-22T23:26:36.961494" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:36.593516" elapsed="0.368026"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:26:36.592813" elapsed="0.368836"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:26:36.592651" elapsed="0.369048"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:26:35.833699" elapsed="1.128038"/>
</for>
<arg>sed -ie "s/^#use-tell-based-protocol=true/use-tell-based-protocol=true/g" ${DATASTORE_CFG}</arg>
<doc>Cycle through indices (or all), run bash command on each, using temporary SSH session and restoring the previously active one.</doc>
<status status="PASS" start="2026-08-22T23:26:35.829337" elapsed="1.132485"/>
</kw>
<kw name="Check_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:36.965359" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:36.964977" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:26:36.965873" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:26:36.965548" elapsed="0.000351"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:26:36.965945" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:26:36.966098" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:26:36.964555" elapsed="0.001568"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:36.968396" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:36.968273" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:36.970328" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:26:36.970016" elapsed="0.000339"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:26:36.970405" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:26:36.970555" level="INFO">${member_ip} = 10.30.170.200</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:26:36.969694" elapsed="0.000906"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:36.974430" level="INFO">${odl_connection} = 47</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:26:36.973703" elapsed="0.000830"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:36.977251" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:36.977329" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:36.976981" elapsed="0.000372"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:36.977557" elapsed="0.000488"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:36.978915" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:37.322272" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.08               Processes:             121
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:36 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:36.978593" elapsed="0.343772"/>
</kw>
<msg time="2026-08-22T23:26:37.322428" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:36.978217" elapsed="0.344275"/>
</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-08-22T23:26:36.976456" elapsed="0.346141"/>
</kw>
<msg time="2026-08-22T23:26:37.322649" 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-08-22T23:26:36.976063" elapsed="0.346636"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:26:36.975132" elapsed="0.347739"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:26:37.322962" elapsed="0.000067"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.200 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:26:36.972486" elapsed="0.350784"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:37.326348" level="INFO">Executing command 'sed -ie "s/^#use-tell-based-protocol=false/use-tell-based-protocol=false/g" //tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/org.opendaylight.controller.cluster.datastore.cfg'.</msg>
<msg time="2026-08-22T23:26:37.339259" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:26:37.339377" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:26:37.339422" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:26:37.339463" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:37.326156" elapsed="0.013331"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:26:37.340756" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:26:37.340327" elapsed="0.000498"/>
</kw>
<msg time="2026-08-22T23:26:37.340967" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:26:37.341033" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:37.339811" elapsed="0.001255"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:37.342067" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:37.341401" elapsed="0.000705"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:37.343868" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:37.343470" elapsed="0.000460"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:37.344503" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:37.344156" elapsed="0.000407"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:37.345163" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:37.344817" elapsed="0.000409"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:26:37.342845" elapsed="0.002460"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:37.342309" elapsed="0.003047"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:37.342275" elapsed="0.003119"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:26:37.345743" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:37.345562" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:37.345534" elapsed="0.000310"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:26:37.346137" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:26:37.346001" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:37.345975" elapsed="0.000284"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:37.346555" elapsed="0.000063"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:26:37.325209" elapsed="0.021768"/>
</kw>
<msg time="2026-08-22T23:26:37.347263" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:37.347370" level="INFO">${result} = </msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:37.323510" elapsed="0.023916"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:37.347845" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:26:37.348633" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-08-22T23:26:37.348331" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:37.348302" elapsed="0.000571"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:37.349089" elapsed="0.000033"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:26:36.971533" elapsed="0.377825"/>
</kw>
<msg time="2026-08-22T23:26:37.349445" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:36.970758" elapsed="0.378759"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:26:36.969158" elapsed="0.380513"/>
</kw>
<msg time="2026-08-22T23:26:37.349732" 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-08-22T23:26:36.968698" elapsed="0.381099"/>
</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-08-22T23:26:37.354167" elapsed="0.000143"/>
</kw>
<msg time="2026-08-22T23:26:37.354352" 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-08-22T23:26:37.353527" elapsed="0.000886"/>
</kw>
<kw name="Open 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-08-22T23:26:37.354572" elapsed="0.000040"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:37.354761" 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-08-22T23:26:37.350224" elapsed="0.004618"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:26:36.967654" elapsed="0.387245"/>
</kw>
<msg time="2026-08-22T23:26:37.354954" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:36.967193" elapsed="0.387819"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:26:36.966473" elapsed="0.388623"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:26:36.966318" elapsed="0.388823"/>
</iter>
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:37.357293" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:37.357182" elapsed="0.000239"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:37.359218" level="INFO">${ip_address} = 10.30.170.12</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:26:37.358895" elapsed="0.000349"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:26:37.359292" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:26:37.359442" level="INFO">${member_ip} = 10.30.170.12</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:26:37.358559" elapsed="0.000908"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:37.363484" level="INFO">${odl_connection} = 48</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:26:37.362738" elapsed="0.000872"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:37.366310" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:37.366389" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:37.366049" elapsed="0.000364"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:37.366570" elapsed="0.000502"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:37.367930" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:37.687058" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.02               Processes:             118
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:36 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:37.367616" elapsed="0.319527"/>
</kw>
<msg time="2026-08-22T23:26:37.687202" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:37.367243" elapsed="0.320017"/>
</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-08-22T23:26:37.365517" elapsed="0.321828"/>
</kw>
<msg time="2026-08-22T23:26:37.687393" 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-08-22T23:26:37.365130" elapsed="0.322312"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:26:37.364180" elapsed="0.323450"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:26:37.687723" elapsed="0.000050"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.12 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:26:37.361518" elapsed="0.326530"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:37.691109" level="INFO">Executing command 'sed -ie "s/^#use-tell-based-protocol=false/use-tell-based-protocol=false/g" //tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/org.opendaylight.controller.cluster.datastore.cfg'.</msg>
<msg time="2026-08-22T23:26:37.703617" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:26:37.703888" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:26:37.703983" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:26:37.704072" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:37.690912" elapsed="0.013210"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:26:37.706059" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:26:37.705436" elapsed="0.000722"/>
</kw>
<msg time="2026-08-22T23:26:37.706366" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:26:37.706461" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:37.704677" elapsed="0.001834"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:37.708052" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:37.707073" elapsed="0.001036"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:37.710724" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:37.710141" elapsed="0.000674"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:37.711741" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:37.711173" elapsed="0.000658"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:37.712731" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:37.712163" elapsed="0.000673"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:26:37.709196" elapsed="0.003758"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:37.708400" elapsed="0.004632"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:37.708353" elapsed="0.004735"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:26:37.713681" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:37.713335" elapsed="0.000456"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:37.713291" elapsed="0.000550"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:26:37.714285" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-08-22T23:26:37.714075" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:37.714035" elapsed="0.000434"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:37.714997" elapsed="0.000054"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:26:37.689945" elapsed="0.025623"/>
</kw>
<msg time="2026-08-22T23:26:37.715801" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:37.715872" level="INFO">${result} = </msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:37.688288" elapsed="0.027622"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:37.716170" elapsed="0.000219"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:26:37.716719" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:26:37.716512" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:37.716493" elapsed="0.000386"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:37.717026" elapsed="0.000022"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:26:37.360569" elapsed="0.356643"/>
</kw>
<msg time="2026-08-22T23:26:37.717271" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:37.359702" elapsed="0.357619"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:26:37.358047" elapsed="0.359360"/>
</kw>
<msg time="2026-08-22T23:26:37.717447" 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-08-22T23:26:37.357589" elapsed="0.359902"/>
</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-08-22T23:26:37.721114" elapsed="0.000140"/>
</kw>
<msg time="2026-08-22T23:26:37.721296" 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-08-22T23:26:37.720647" elapsed="0.000710"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:37.721516" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:37.721814" 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-08-22T23:26:37.717808" elapsed="0.004094"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:26:37.356551" elapsed="0.365409"/>
</kw>
<msg time="2026-08-22T23:26:37.722014" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:37.356107" elapsed="0.365954"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:26:37.355390" elapsed="0.366753"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:26:37.355235" elapsed="0.366953"/>
</iter>
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:37.724350" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:37.724239" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:37.726473" level="INFO">${ip_address} = 10.30.170.79</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:26:37.726158" elapsed="0.000342"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:26:37.726549" elapsed="0.000052"/>
</return>
<msg time="2026-08-22T23:26:37.726728" level="INFO">${member_ip} = 10.30.170.79</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:26:37.725787" elapsed="0.000966"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:37.730514" level="INFO">${odl_connection} = 49</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:26:37.729800" elapsed="0.000839"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:37.733366" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:37.733443" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:37.733107" elapsed="0.000360"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:37.733785" elapsed="0.000321"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:37.734993" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:38.058400" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:27 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:36 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:37.734652" elapsed="0.323831"/>
</kw>
<msg time="2026-08-22T23:26:38.058546" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:37.734275" elapsed="0.324345"/>
</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-08-22T23:26:37.732615" elapsed="0.326120"/>
</kw>
<msg time="2026-08-22T23:26:38.058787" 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-08-22T23:26:37.732204" elapsed="0.326633"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:26:37.731269" elapsed="0.327737"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:26:38.059098" elapsed="0.000048"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.79 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:26:37.728619" elapsed="0.330764"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:38.062432" level="INFO">Executing command 'sed -ie "s/^#use-tell-based-protocol=false/use-tell-based-protocol=false/g" //tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/org.opendaylight.controller.cluster.datastore.cfg'.</msg>
<msg time="2026-08-22T23:26:38.074805" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:26:38.074964" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:26:38.075024" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:26:38.075079" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:38.062243" elapsed="0.012866"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:26:38.076339" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:26:38.075966" elapsed="0.000437"/>
</kw>
<msg time="2026-08-22T23:26:38.076535" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:26:38.076624" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:38.075444" elapsed="0.001214"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:38.077569" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:38.076976" elapsed="0.000662"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:38.079353" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:38.078947" elapsed="0.000465"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:38.080002" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:38.079660" elapsed="0.000399"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:38.080638" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:38.080273" elapsed="0.000427"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:26:38.078314" elapsed="0.002462"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:38.077831" elapsed="0.002995"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:38.077799" elapsed="0.003061"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:26:38.081169" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:38.081023" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:38.080995" elapsed="0.000266"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:26:38.081540" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:26:38.081410" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:38.081385" elapsed="0.000302"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:38.081966" elapsed="0.000033"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:26:38.061305" elapsed="0.021023"/>
</kw>
<msg time="2026-08-22T23:26:38.082540" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:38.082674" level="INFO">${result} = </msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:38.059645" elapsed="0.023099"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:38.083116" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:26:38.083893" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-08-22T23:26:38.083608" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:38.083553" elapsed="0.000579"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:38.084349" elapsed="0.000033"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:26:37.727673" elapsed="0.357029"/>
</kw>
<msg time="2026-08-22T23:26:38.084791" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:37.726926" elapsed="0.357935"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:26:37.725161" elapsed="0.359818"/>
</kw>
<msg time="2026-08-22T23:26:38.085035" 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-08-22T23:26:37.724697" elapsed="0.360398"/>
</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-08-22T23:26:38.090239" elapsed="0.000199"/>
</kw>
<msg time="2026-08-22T23:26:38.090497" 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-08-22T23:26:38.089389" elapsed="0.001210"/>
</kw>
<kw name="Open 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-08-22T23:26:38.090852" elapsed="0.000031"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:38.091081" 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-08-22T23:26:38.085501" elapsed="0.005690"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:26:37.723623" elapsed="0.367646"/>
</kw>
<msg time="2026-08-22T23:26:38.091343" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:37.723162" elapsed="0.368245"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:26:37.722437" elapsed="0.369082"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:26:37.722283" elapsed="0.369372"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:26:36.966179" elapsed="1.125515"/>
</for>
<arg>sed -ie "s/^#use-tell-based-protocol=false/use-tell-based-protocol=false/g" ${DATASTORE_CFG}</arg>
<doc>Cycle through indices (or all), run bash command on each, using temporary SSH session and restoring the previously active one.</doc>
<status status="PASS" start="2026-08-22T23:26:36.962065" elapsed="1.129688"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"${status}" == "True"</arg>
<arg>ClusterManagement.Check_Bash_Command_On_List_Or_All</arg>
<arg>sed -ie "s/^use-tell-based-protocol=false/use-tell-based-protocol=true/g" ${DATASTORE_CFG}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:38.091914" elapsed="0.000309"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Check_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:38.096171" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:38.095792" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:26:38.096679" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:26:38.096359" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:26:38.096749" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:26:38.096903" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:26:38.095293" elapsed="0.001635"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:38.099171" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:38.099061" elapsed="0.000237"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:38.101541" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:26:38.101083" elapsed="0.000546"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:26:38.101869" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:26:38.102029" level="INFO">${member_ip} = 10.30.170.200</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:26:38.100681" elapsed="0.001373"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:38.105884" level="INFO">${odl_connection} = 50</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:26:38.105479" elapsed="0.000431"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:38.107802" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:38.107881" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:38.107521" elapsed="0.000384"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:38.108062" elapsed="0.000317"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:38.109237" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:38.441415" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.08               Processes:             121
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:37 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:38.108922" elapsed="0.332595"/>
</kw>
<msg time="2026-08-22T23:26:38.441600" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:38.108546" elapsed="0.333127"/>
</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-08-22T23:26:38.107037" elapsed="0.334804"/>
</kw>
<msg time="2026-08-22T23:26:38.441890" 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-08-22T23:26:38.106488" elapsed="0.335452"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:26:38.106110" elapsed="0.335907"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:26:38.442102" elapsed="0.000039"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.200 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:26:38.104786" elapsed="0.337585"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:38.445060" level="INFO">Executing command 'sed -ie "s/^use-tell-based-protocol=true/use-tell-based-protocol=false/g" //tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/org.opendaylight.controller.cluster.datastore.cfg'.</msg>
<msg time="2026-08-22T23:26:38.457860" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:26:38.457977" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:26:38.458021" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:26:38.458062" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:38.444866" elapsed="0.013219"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:26:38.458923" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:26:38.458650" elapsed="0.000320"/>
</kw>
<msg time="2026-08-22T23:26:38.459065" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:26:38.459109" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:38.458266" elapsed="0.000866"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:38.459758" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:38.459301" elapsed="0.000484"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:38.460896" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:38.460644" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:38.461331" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:38.461091" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:38.461780" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:38.461524" elapsed="0.000300"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:26:38.460221" elapsed="0.001658"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:38.459873" elapsed="0.002042"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:38.459848" elapsed="0.002094"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:26:38.462102" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:38.461999" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:38.461982" elapsed="0.000186"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:26:38.462311" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:26:38.462220" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:38.462204" elapsed="0.000190"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:38.462541" elapsed="0.000046"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:26:38.444302" elapsed="0.018389"/>
</kw>
<msg time="2026-08-22T23:26:38.462943" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:38.463028" level="INFO">${result} = </msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:38.443492" elapsed="0.019579"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:38.464132" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:26:38.464891" elapsed="0.000062"/>
</return>
<status status="PASS" start="2026-08-22T23:26:38.464696" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:38.464631" elapsed="0.000412"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:38.466113" elapsed="0.000040"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:26:38.102778" elapsed="0.363559"/>
</kw>
<msg time="2026-08-22T23:26:38.466804" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:38.102212" elapsed="0.364686"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:26:38.100140" elapsed="0.366860"/>
</kw>
<msg time="2026-08-22T23:26:38.467046" 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-08-22T23:26:38.099452" elapsed="0.367640"/>
</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-08-22T23:26:38.471168" elapsed="0.000202"/>
</kw>
<msg time="2026-08-22T23:26:38.471414" 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-08-22T23:26:38.470458" elapsed="0.001018"/>
</kw>
<kw name="Open 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-08-22T23:26:38.471656" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:38.471822" 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-08-22T23:26:38.467403" elapsed="0.004518"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:26:38.098422" elapsed="0.373557"/>
</kw>
<msg time="2026-08-22T23:26:38.472034" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:38.097978" elapsed="0.374103"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:26:38.097265" elapsed="0.374901"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:26:38.097114" elapsed="0.375099"/>
</iter>
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:38.474531" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:38.474411" elapsed="0.000295"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:38.477017" level="INFO">${ip_address} = 10.30.170.12</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:26:38.476535" elapsed="0.000544"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:26:38.477311" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:26:38.477470" level="INFO">${member_ip} = 10.30.170.12</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:26:38.476133" elapsed="0.001363"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:38.481305" level="INFO">${odl_connection} = 51</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:26:38.480912" elapsed="0.000420"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:38.483268" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:38.483346" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:38.483002" elapsed="0.000368"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:38.483529" elapsed="0.000333"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:38.484726" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:38.805408" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.02               Processes:             118
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:37 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:38.484390" elapsed="0.321171"/>
</kw>
<msg time="2026-08-22T23:26:38.805641" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:38.484033" elapsed="0.321672"/>
</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-08-22T23:26:38.482381" elapsed="0.323414"/>
</kw>
<msg time="2026-08-22T23:26:38.805845" 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-08-22T23:26:38.481990" elapsed="0.323905"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:26:38.481533" elapsed="0.324440"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:26:38.806044" elapsed="0.000034"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.12 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:26:38.480197" elapsed="0.326103"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:38.808934" level="INFO">Executing command 'sed -ie "s/^use-tell-based-protocol=true/use-tell-based-protocol=false/g" //tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/org.opendaylight.controller.cluster.datastore.cfg'.</msg>
<msg time="2026-08-22T23:26:38.821679" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:26:38.821793" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:26:38.821837" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:26:38.821877" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:38.808748" elapsed="0.013151"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:26:38.822762" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:26:38.822439" elapsed="0.000370"/>
</kw>
<msg time="2026-08-22T23:26:38.822903" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:26:38.822946" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:38.822081" elapsed="0.000887"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:38.824321" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:38.823343" elapsed="0.001035"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:38.826866" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:38.826259" elapsed="0.000699"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:38.827860" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:38.827296" elapsed="0.000654"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:38.828840" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:38.828285" elapsed="0.000650"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:26:38.825338" elapsed="0.003715"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:38.824556" elapsed="0.004574"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:38.824509" elapsed="0.004679"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:26:38.829539" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:38.829316" elapsed="0.000354"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:38.829276" elapsed="0.000443"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:26:38.830037" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-08-22T23:26:38.829837" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:38.829802" elapsed="0.000419"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:38.830617" elapsed="0.000056"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:26:38.808216" elapsed="0.022677"/>
</kw>
<msg time="2026-08-22T23:26:38.831167" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:38.831252" level="INFO">${result} = </msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:38.807443" elapsed="0.023851"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:38.832382" elapsed="0.000443"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:26:38.833162" elapsed="0.000063"/>
</return>
<status status="PASS" start="2026-08-22T23:26:38.832966" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:38.832902" elapsed="0.000413"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:38.834393" elapsed="0.000054"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:26:38.478201" elapsed="0.356473"/>
</kw>
<msg time="2026-08-22T23:26:38.835161" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:38.477671" elapsed="0.357547"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:26:38.475601" elapsed="0.359710"/>
</kw>
<msg time="2026-08-22T23:26:38.835355" 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-08-22T23:26:38.474863" elapsed="0.360538"/>
</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-08-22T23:26:38.839442" elapsed="0.000227"/>
</kw>
<msg time="2026-08-22T23:26:38.839713" 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-08-22T23:26:38.838856" 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="NOT RUN" start="2026-08-22T23:26:38.839935" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:38.840099" 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-08-22T23:26:38.835732" elapsed="0.004449"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:26:38.473788" elapsed="0.366450"/>
</kw>
<msg time="2026-08-22T23:26:38.840291" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:38.473316" elapsed="0.367023"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:26:38.472473" elapsed="0.367949"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:26:38.472313" elapsed="0.368154"/>
</iter>
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:38.842762" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:38.842649" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:38.845203" level="INFO">${ip_address} = 10.30.170.79</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:26:38.844740" elapsed="0.000526"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:26:38.845503" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:26:38.845681" level="INFO">${member_ip} = 10.30.170.79</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:26:38.844307" elapsed="0.001399"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:38.849504" level="INFO">${odl_connection} = 52</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:26:38.849121" elapsed="0.000410"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:38.851450" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:38.851527" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:38.851189" elapsed="0.000362"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:38.851728" elapsed="0.000317"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:38.852960" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:39.179687" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:27 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:37 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:38.852639" elapsed="0.327144"/>
</kw>
<msg time="2026-08-22T23:26:39.179852" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:38.852257" elapsed="0.327668"/>
</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-08-22T23:26:38.850550" elapsed="0.329468"/>
</kw>
<msg time="2026-08-22T23:26:39.180070" 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-08-22T23:26:38.850135" elapsed="0.329986"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:26:38.849756" elapsed="0.330443"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:26:39.180270" elapsed="0.000036"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.79 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:26:38.848400" elapsed="0.332132"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:39.183132" level="INFO">Executing command 'sed -ie "s/^use-tell-based-protocol=true/use-tell-based-protocol=false/g" //tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/org.opendaylight.controller.cluster.datastore.cfg'.</msg>
<msg time="2026-08-22T23:26:39.195523" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:26:39.195808" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:26:39.195905" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:26:39.195994" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:39.182943" elapsed="0.013102"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:26:39.197842" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:26:39.197239" elapsed="0.000704"/>
</kw>
<msg time="2026-08-22T23:26:39.198153" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:26:39.198250" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:39.196440" elapsed="0.001913"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:39.199354" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:39.198724" elapsed="0.000669"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:39.201007" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:39.200640" elapsed="0.000429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:39.201667" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:39.201294" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:39.202317" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:39.201951" elapsed="0.000430"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:26:39.200030" elapsed="0.002430"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:39.199511" elapsed="0.003001"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:39.199479" elapsed="0.003070"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:26:39.202802" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:39.202655" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:39.202628" elapsed="0.000271"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:26:39.203104" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:26:39.202975" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:39.202953" elapsed="0.000272"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:39.203437" elapsed="0.000031"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:26:39.182406" elapsed="0.021227"/>
</kw>
<msg time="2026-08-22T23:26:39.204000" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:39.204121" level="INFO">${result} = </msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:39.181620" elapsed="0.022564"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:39.205803" elapsed="0.000687"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:26:39.207012" elapsed="0.000091"/>
</return>
<status status="PASS" start="2026-08-22T23:26:39.206730" elapsed="0.000446"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:39.206635" elapsed="0.000597"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:39.208830" elapsed="0.000056"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:26:38.846393" elapsed="0.362752"/>
</kw>
<msg time="2026-08-22T23:26:39.209964" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:38.845864" elapsed="0.364183"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:26:38.843780" elapsed="0.366400"/>
</kw>
<msg time="2026-08-22T23:26:39.210243" 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-08-22T23:26:38.843044" elapsed="0.367298"/>
</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-08-22T23:26:39.214200" elapsed="0.000216"/>
</kw>
<msg time="2026-08-22T23:26:39.214460" 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-08-22T23:26:39.213567" elapsed="0.000954"/>
</kw>
<kw name="Open 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-08-22T23:26:39.214705" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:39.214872" 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-08-22T23:26:39.210771" elapsed="0.004182"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:26:38.841997" elapsed="0.373012"/>
</kw>
<msg time="2026-08-22T23:26:39.215063" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:38.841527" elapsed="0.373583"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:26:38.840826" elapsed="0.374366"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:26:38.840560" elapsed="0.374677"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:26:38.096981" elapsed="1.118291"/>
</for>
<arg>sed -ie "s/^use-tell-based-protocol=true/use-tell-based-protocol=false/g" ${DATASTORE_CFG}</arg>
<doc>Cycle through indices (or all), run bash command on each, using temporary SSH session and restoring the previously active one.</doc>
<status status="PASS" start="2026-08-22T23:26:38.092894" elapsed="1.122438"/>
</kw>
<msg time="2026-08-22T23:26:39.215370" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>"${status}" == "False"</arg>
<arg>ClusterManagement.Check_Bash_Command_On_List_Or_All</arg>
<arg>sed -ie "s/^use-tell-based-protocol=true/use-tell-based-protocol=false/g" ${DATASTORE_CFG}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:38.092391" elapsed="1.123025"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>Failure in status. Status can be True or False.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:39.215575" elapsed="0.000038"/>
</kw>
<arg>False</arg>
<arg>${DATASTORE_CFG}</arg>
<doc>Change status use-tell-based-protocol to True or False</doc>
<status status="PASS" start="2026-08-22T23:26:35.828899" elapsed="3.386782"/>
</kw>
<kw name="Check_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:39.219369" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:39.218985" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:26:39.219886" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:26:39.219560" elapsed="0.000352"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:26:39.219994" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:26:39.220152" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:26:39.218602" elapsed="0.001575"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:39.222434" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:39.222321" elapsed="0.000240"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:39.224411" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:26:39.224140" elapsed="0.000297"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:26:39.224485" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:26:39.224653" level="INFO">${member_ip} = 10.30.170.200</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:26:39.223725" elapsed="0.000953"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:39.227269" level="INFO">${odl_connection} = 53</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:26:39.226510" elapsed="0.000801"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:39.230662" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:39.230743" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:39.230325" elapsed="0.000442"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:39.230929" elapsed="0.000321"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:39.232236" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:39.553915" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.08               Processes:             121
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:38 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:39.231917" elapsed="0.322081"/>
</kw>
<msg time="2026-08-22T23:26:39.554058" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:39.231420" elapsed="0.322697"/>
</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-08-22T23:26:39.229676" elapsed="0.324544"/>
</kw>
<msg time="2026-08-22T23:26:39.554297" 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-08-22T23:26:39.228930" elapsed="0.325440"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:26:39.227600" elapsed="0.326896"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:26:39.554610" elapsed="0.000034"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.200 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:26:39.226081" elapsed="0.328676"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:39.558001" level="INFO">Executing command 'cat //tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/org.opendaylight.controller.cluster.datastore.cfg'.</msg>
<msg time="2026-08-22T23:26:39.570351" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:26:39.570658" level="INFO">${stdout} = # This file specifies property settings for the clustered data store to control its behavior. A
# property may be applied to every data store type ("config" and "operational") or can be customized
# d...</msg>
<msg time="2026-08-22T23:26:39.570944" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:26:39.571386" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:39.557648" elapsed="0.014005"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:26:39.576261" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:26:39.575410" elapsed="0.000952"/>
</kw>
<msg time="2026-08-22T23:26:39.576885" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:26:39.577230" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:39.574126" elapsed="0.003325"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:39.581736" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:39.579963" elapsed="0.002006"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:39.584339" level="INFO"># This file specifies property settings for the clustered data store to control its behavior. A
# property may be applied to every data store type ("config" and "operational") or can be customized
# differently for each data store type by prefixing the data store type + '.'. For example, specifying
# the "shard-election-timeout-factor" property would be applied to both data stores whereas specifying
# "operational.shard-election-timeout-factor" would only apply to the "operational" data store. Similarly,
# specifying "config.shard-election-timeout-factor" would only apply to the "config" data store.
# Overall flexibility goes even further, as these overrides can also be combined with per-shard specification,
# so that you can also use:
#   &lt;shard-name&gt;.&lt;setting&gt;
#   &lt;datastore-name&gt;.&lt;shard-name&gt;.&lt;setting&gt;
# for example:
#   topology.shard-election-timeout-factor=2             # override both config/operational for topology shard
#   config.topology.shard-election-timeout-factor=5      # override config for topology shard
#   operational.topology.shard-election-timeout-factor=7 # override operational for topology shard
#

# The multiplication factor to be used to determine shard election timeout. The shard election timeout
# is determined by multiplying shardHeartbeatIntervalInMillis with the shardElectionTimeoutFactor.
shard-election-timeout-factor=20

# The interval at which a shard will send a heart beat message to its remote shard.
#shard-heartbeat-interval-in-millis=500

# The amount by which to divide election timeout in case of a candidate. This serves as a counter-balance
# to shard-election-timeout-factor. The default value is 1, i.e. election timeout is the same in all
# situations.
#shard-candidate-election-timeout-divisor=1

# The maximum amount of time to wait for a shard to elect a leader before failing an operation (eg transaction create).
#shard-leader-election-timeout-in-seconds=30

# Enable or disable data persistence.
#persistent=true

# Disable persistence for the operational data store by default.
operational.persistent=false

# The maximum amount of time a shard transaction can be idle without receiving any messages before it self-destructs.
#shard-transaction-idle-timeout-in-minutes=10

# The maximum amount of time a shard transaction three-phase commit can be idle without receiving the
# next messages before it aborts the transaction.
#shard-transaction-commit-timeout-in-seconds=30

# The maximum allowed capacity for each shard's transaction commit queue.
#shard-transaction-commit-queue-capacity=20000

# The maximum amount of time to wait for a shard to initialize from persistence on startup before
# failing an operation (eg transaction create and change listener registration).
#shard-initialization-timeout-in-seconds=300

# The minimum number of entries to be present in the in-memory journal log before a snapshot is to be taken.
#shard-snapshot-batch-count=20000

# The percentage of Runtime.totalMemory() used by the in-memory journal log before a snapshot is to be taken.
# Disabled, if direct threshold is enabled.
#shard-snapshot-data-threshold-percentage=12

# The max size of in-memory journal(in MB), after reaching the limit, snapshot will be taken. Should be not less then 1.
# If set to 0, direct threshold is disabled and percentage is used instead.
#shard-snapshot-data-threshold=0

# The interval at which the leader of the shard will check if its majority followers are active and
# term itself as isolated.
#shard-isolated-leader-check-interval-in-millis=5000

# The number of transaction modification operations (put, merge, delete) to batch before sending to the
# shard transaction actor. Batching improves performance as less modifications messages are sent to the
# actor and thus lessens the chance that the transaction actor's mailbox queue could get full.
#shard-batched-modification-count=1000

# The maximum amount of time for akka operations (remote or local) to complete before failing.
#operation-timeout-in-seconds=5

# Obsolete: this knob will be removed in a future release.
#
# The initial number of transactions per second that are allowed before the data store should begin
# applying back pressure. This number is only used as an initial guidance, subsequently the datastore
# measures the latency for a commit and auto-adjusts the rate limit.
#transaction-creation-initial-rate-limit=100

# A fully qualified java class name. The class should implement
# org.opendaylight.controller.cluster.raft.policy.RaftPolicy. This java class should be
# accessible to the distributed data store OSGi module so that it can be dynamically loaded via
# reflection. For now let's assume that these classes to customize raft behaviors should be
# present in the distributed data store module itself. If this property is set to a class which
# cannot be found then the default raft policy will be applied
#custom-raft-policy-implementation=

# When fragmenting messages thru the akka remoting framework, this is the maximum size in bytes
# for a message slice. This needs to be below Akka's maximum-frame-size and defaults to 480KiB.
maximum-message-slice-size=491520

# Tune the maximum number of entries a follower is allowed to lag behind the leader before it is
# considered out-of-sync. This flag may require tuning in face of a large number of small transactions.
#sync-index-threshold=10

# Record new transaction allocation stack trace, useful for debugging.  This makes the log include
# the stack trace of the creator of the Tx when there is an exception when the transaction is submitted 
# (e.g. for a failed validation).  Defaults to false due to performance impact.
#transaction-debug-context-enabled=true

# Multiplicator of shard-leader-election-timeout-in-seconds for the purposes of initial datastore
# convergence. Each frontend datastore instance will wait specified amount of time before becoming
# exposed as a service. A value of 0 indicates waiting forever. Defaults to 3.
#initial-settle-timeout-multiplier=3

#Interval after which a snapshot should be taken during the recovery process.
#recovery-snapshot-interval-seconds=0

# Option to take a snapshot when the entire DataTree root or top-level container is overwritten
snapshot-on-root-overwrite=false

# Enable lz4 compression for snapshots sent from leader to followers
#use-lz4-compression=true

# Export snapshot and journal content after recovery, possible modes: off, json
#
# Journal Json structure:
#       Entries : [
#            Entry : [
#                Node: [
#                   Path : {},
#                   ModificationType : {},
#                   Data : {}
#                ]
#            ]
#        ]
#
# Snapshot Json structure:
#       RootNode : {}
#
export-on-recovery=off

# Directory name for export files
#recovery-export-base-dir=persistence-export</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:39.584084" elapsed="0.000400"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:39.584921" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:39.584677" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:39.585352" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:39.585115" elapsed="0.000281"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:26:39.583627" elapsed="0.001869"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:39.582390" elapsed="0.003151"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:39.582261" elapsed="0.003360"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:26:39.586011" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:39.585790" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:39.585736" elapsed="0.000421"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:26:39.586533" elapsed="0.000076"/>
</return>
<status status="PASS" start="2026-08-22T23:26:39.586321" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:39.586269" elapsed="0.000455"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:39.587907" elapsed="0.000063"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:26:39.555658" elapsed="0.032548"/>
</kw>
<msg time="2026-08-22T23:26:39.588461" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:39.588507" level="INFO">${result} = # This file specifies property settings for the clustered data store to control its behavior. A
# property may be applied to every data store type ("config" and "operational") or can be customized
# d...</msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:39.554929" elapsed="0.033603"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:39.588760" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:26:39.589223" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:26:39.589110" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:39.589091" elapsed="0.000217"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:39.589454" elapsed="0.000022"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:26:39.225360" elapsed="0.364324"/>
</kw>
<msg time="2026-08-22T23:26:39.589791" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:39.224833" elapsed="0.365009"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:26:39.223191" elapsed="0.366870"/>
</kw>
<msg time="2026-08-22T23:26:39.590158" 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-08-22T23:26:39.222734" elapsed="0.367470"/>
</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-08-22T23:26:39.594094" elapsed="0.000173"/>
</kw>
<msg time="2026-08-22T23:26:39.594311" 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-08-22T23:26:39.593492" elapsed="0.000880"/>
</kw>
<kw name="Open 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-08-22T23:26:39.594534" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:39.594718" 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-08-22T23:26:39.590496" elapsed="0.004304"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:26:39.221685" elapsed="0.373304"/>
</kw>
<msg time="2026-08-22T23:26:39.595083" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:39.221225" elapsed="0.373904"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:26:39.220521" elapsed="0.374860"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:26:39.220367" elapsed="0.375061"/>
</iter>
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:39.597599" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:39.597471" elapsed="0.000380"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:39.599643" level="INFO">${ip_address} = 10.30.170.12</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:26:39.599357" elapsed="0.000313"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:26:39.599719" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:26:39.599871" level="INFO">${member_ip} = 10.30.170.12</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:26:39.599034" elapsed="0.000861"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:39.602501" level="INFO">${odl_connection} = 54</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:26:39.601728" elapsed="0.000815"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:39.605950" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:39.606029" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:39.605669" elapsed="0.000384"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:39.606245" elapsed="0.000324"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:39.607538" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:39.933717" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.02               Processes:             118
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:38 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:39.607223" elapsed="0.326577"/>
</kw>
<msg time="2026-08-22T23:26:39.933860" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:39.606858" elapsed="0.327058"/>
</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-08-22T23:26:39.604964" elapsed="0.329036"/>
</kw>
<msg time="2026-08-22T23:26:39.934102" 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-08-22T23:26:39.604198" elapsed="0.329978"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:26:39.602841" elapsed="0.331460"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:26:39.934390" elapsed="0.000035"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.12 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:26:39.601295" elapsed="0.333235"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:39.937682" level="INFO">Executing command 'cat //tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/org.opendaylight.controller.cluster.datastore.cfg'.</msg>
<msg time="2026-08-22T23:26:39.950517" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:26:39.950981" level="INFO">${stdout} = # This file specifies property settings for the clustered data store to control its behavior. A
# property may be applied to every data store type ("config" and "operational") or can be customized
# d...</msg>
<msg time="2026-08-22T23:26:39.951199" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:26:39.951411" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:39.937318" elapsed="0.014231"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:26:39.954316" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:26:39.953895" elapsed="0.000486"/>
</kw>
<msg time="2026-08-22T23:26:39.954732" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:26:39.955065" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:39.953109" elapsed="0.002177"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:39.959757" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:39.957913" elapsed="0.002071"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:39.964342" level="INFO"># This file specifies property settings for the clustered data store to control its behavior. A
# property may be applied to every data store type ("config" and "operational") or can be customized
# differently for each data store type by prefixing the data store type + '.'. For example, specifying
# the "shard-election-timeout-factor" property would be applied to both data stores whereas specifying
# "operational.shard-election-timeout-factor" would only apply to the "operational" data store. Similarly,
# specifying "config.shard-election-timeout-factor" would only apply to the "config" data store.
# Overall flexibility goes even further, as these overrides can also be combined with per-shard specification,
# so that you can also use:
#   &lt;shard-name&gt;.&lt;setting&gt;
#   &lt;datastore-name&gt;.&lt;shard-name&gt;.&lt;setting&gt;
# for example:
#   topology.shard-election-timeout-factor=2             # override both config/operational for topology shard
#   config.topology.shard-election-timeout-factor=5      # override config for topology shard
#   operational.topology.shard-election-timeout-factor=7 # override operational for topology shard
#

# The multiplication factor to be used to determine shard election timeout. The shard election timeout
# is determined by multiplying shardHeartbeatIntervalInMillis with the shardElectionTimeoutFactor.
shard-election-timeout-factor=20

# The interval at which a shard will send a heart beat message to its remote shard.
#shard-heartbeat-interval-in-millis=500

# The amount by which to divide election timeout in case of a candidate. This serves as a counter-balance
# to shard-election-timeout-factor. The default value is 1, i.e. election timeout is the same in all
# situations.
#shard-candidate-election-timeout-divisor=1

# The maximum amount of time to wait for a shard to elect a leader before failing an operation (eg transaction create).
#shard-leader-election-timeout-in-seconds=30

# Enable or disable data persistence.
#persistent=true

# Disable persistence for the operational data store by default.
operational.persistent=false

# The maximum amount of time a shard transaction can be idle without receiving any messages before it self-destructs.
#shard-transaction-idle-timeout-in-minutes=10

# The maximum amount of time a shard transaction three-phase commit can be idle without receiving the
# next messages before it aborts the transaction.
#shard-transaction-commit-timeout-in-seconds=30

# The maximum allowed capacity for each shard's transaction commit queue.
#shard-transaction-commit-queue-capacity=20000

# The maximum amount of time to wait for a shard to initialize from persistence on startup before
# failing an operation (eg transaction create and change listener registration).
#shard-initialization-timeout-in-seconds=300

# The minimum number of entries to be present in the in-memory journal log before a snapshot is to be taken.
#shard-snapshot-batch-count=20000

# The percentage of Runtime.totalMemory() used by the in-memory journal log before a snapshot is to be taken.
# Disabled, if direct threshold is enabled.
#shard-snapshot-data-threshold-percentage=12

# The max size of in-memory journal(in MB), after reaching the limit, snapshot will be taken. Should be not less then 1.
# If set to 0, direct threshold is disabled and percentage is used instead.
#shard-snapshot-data-threshold=0

# The interval at which the leader of the shard will check if its majority followers are active and
# term itself as isolated.
#shard-isolated-leader-check-interval-in-millis=5000

# The number of transaction modification operations (put, merge, delete) to batch before sending to the
# shard transaction actor. Batching improves performance as less modifications messages are sent to the
# actor and thus lessens the chance that the transaction actor's mailbox queue could get full.
#shard-batched-modification-count=1000

# The maximum amount of time for akka operations (remote or local) to complete before failing.
#operation-timeout-in-seconds=5

# Obsolete: this knob will be removed in a future release.
#
# The initial number of transactions per second that are allowed before the data store should begin
# applying back pressure. This number is only used as an initial guidance, subsequently the datastore
# measures the latency for a commit and auto-adjusts the rate limit.
#transaction-creation-initial-rate-limit=100

# A fully qualified java class name. The class should implement
# org.opendaylight.controller.cluster.raft.policy.RaftPolicy. This java class should be
# accessible to the distributed data store OSGi module so that it can be dynamically loaded via
# reflection. For now let's assume that these classes to customize raft behaviors should be
# present in the distributed data store module itself. If this property is set to a class which
# cannot be found then the default raft policy will be applied
#custom-raft-policy-implementation=

# When fragmenting messages thru the akka remoting framework, this is the maximum size in bytes
# for a message slice. This needs to be below Akka's maximum-frame-size and defaults to 480KiB.
maximum-message-slice-size=491520

# Tune the maximum number of entries a follower is allowed to lag behind the leader before it is
# considered out-of-sync. This flag may require tuning in face of a large number of small transactions.
#sync-index-threshold=10

# Record new transaction allocation stack trace, useful for debugging.  This makes the log include
# the stack trace of the creator of the Tx when there is an exception when the transaction is submitted 
# (e.g. for a failed validation).  Defaults to false due to performance impact.
#transaction-debug-context-enabled=true

# Multiplicator of shard-leader-election-timeout-in-seconds for the purposes of initial datastore
# convergence. Each frontend datastore instance will wait specified amount of time before becoming
# exposed as a service. A value of 0 indicates waiting forever. Defaults to 3.
#initial-settle-timeout-multiplier=3

#Interval after which a snapshot should be taken during the recovery process.
#recovery-snapshot-interval-seconds=0

# Option to take a snapshot when the entire DataTree root or top-level container is overwritten
snapshot-on-root-overwrite=false

# Enable lz4 compression for snapshots sent from leader to followers
#use-lz4-compression=true

# Export snapshot and journal content after recovery, possible modes: off, json
#
# Journal Json structure:
#       Entries : [
#            Entry : [
#                Node: [
#                   Path : {},
#                   ModificationType : {},
#                   Data : {}
#                ]
#            ]
#        ]
#
# Snapshot Json structure:
#       RootNode : {}
#
export-on-recovery=off

# Directory name for export files
#recovery-export-base-dir=persistence-export</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:39.963772" elapsed="0.001007"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:39.965715" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:39.965134" elapsed="0.000674"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:39.966761" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:39.966194" elapsed="0.000611"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:26:39.962731" elapsed="0.004174"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:39.960346" elapsed="0.006605"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:39.960225" elapsed="0.006787"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:26:39.967390" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:39.967175" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:39.967122" elapsed="0.000399"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:26:39.967918" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-08-22T23:26:39.967707" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:39.967655" elapsed="0.000425"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:39.969102" elapsed="0.000058"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:26:39.935422" elapsed="0.033965"/>
</kw>
<msg time="2026-08-22T23:26:39.969658" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:39.969703" level="INFO">${result} = # This file specifies property settings for the clustered data store to control its behavior. A
# property may be applied to every data store type ("config" and "operational") or can be customized
# d...</msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:39.934726" elapsed="0.035001"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:39.969889" elapsed="0.000228"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:26:39.970295" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:26:39.970183" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:39.970165" elapsed="0.000213"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:39.970523" elapsed="0.000022"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:26:39.600601" elapsed="0.370095"/>
</kw>
<msg time="2026-08-22T23:26:39.970798" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:39.600052" elapsed="0.370795"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:26:39.598488" elapsed="0.372577"/>
</kw>
<msg time="2026-08-22T23:26:39.971146" 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-08-22T23:26:39.598008" elapsed="0.373183"/>
</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-08-22T23:26:39.975180" elapsed="0.000147"/>
</kw>
<msg time="2026-08-22T23:26:39.975370" 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-08-22T23:26:39.974555" 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="NOT RUN" start="2026-08-22T23:26:39.975605" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:39.975794" 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-08-22T23:26:39.971481" elapsed="0.004398"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:26:39.596857" elapsed="0.379211"/>
</kw>
<msg time="2026-08-22T23:26:39.976161" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:39.596392" elapsed="0.379816"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:26:39.595690" elapsed="0.380915"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:26:39.595519" elapsed="0.381136"/>
</iter>
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:39.978827" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:39.978715" elapsed="0.000238"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:39.980699" level="INFO">${ip_address} = 10.30.170.79</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:26:39.980416" elapsed="0.000310"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:26:39.980779" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:26:39.980930" level="INFO">${member_ip} = 10.30.170.79</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:26:39.980097" elapsed="0.000858"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:39.983531" level="INFO">${odl_connection} = 55</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:26:39.982790" elapsed="0.000782"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:39.986925" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:39.987004" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:39.986646" elapsed="0.000382"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:39.987188" elapsed="0.000320"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:39.988474" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:40.312523" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:27 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:39 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:39.988163" elapsed="0.324584"/>
</kw>
<msg time="2026-08-22T23:26:40.312848" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:39.987800" elapsed="0.325157"/>
</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-08-22T23:26:39.985930" elapsed="0.327174"/>
</kw>
<msg time="2026-08-22T23:26:40.313231" 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-08-22T23:26:39.985184" elapsed="0.328128"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:26:39.983869" elapsed="0.329585"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:26:40.313573" elapsed="0.000093"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.79 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:26:39.982361" elapsed="0.331468"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:40.317733" level="INFO">Executing command 'cat //tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/org.opendaylight.controller.cluster.datastore.cfg'.</msg>
<msg time="2026-08-22T23:26:40.330123" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:26:40.330536" level="INFO">${stdout} = # This file specifies property settings for the clustered data store to control its behavior. A
# property may be applied to every data store type ("config" and "operational") or can be customized
# d...</msg>
<msg time="2026-08-22T23:26:40.330794" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:26:40.331013" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:40.317328" elapsed="0.013823"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:26:40.334111" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:26:40.333652" elapsed="0.000528"/>
</kw>
<msg time="2026-08-22T23:26:40.334507" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:26:40.334765" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:40.332813" elapsed="0.002102"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:40.337935" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:40.336665" elapsed="0.001426"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:40.341063" level="INFO"># This file specifies property settings for the clustered data store to control its behavior. A
# property may be applied to every data store type ("config" and "operational") or can be customized
# differently for each data store type by prefixing the data store type + '.'. For example, specifying
# the "shard-election-timeout-factor" property would be applied to both data stores whereas specifying
# "operational.shard-election-timeout-factor" would only apply to the "operational" data store. Similarly,
# specifying "config.shard-election-timeout-factor" would only apply to the "config" data store.
# Overall flexibility goes even further, as these overrides can also be combined with per-shard specification,
# so that you can also use:
#   &lt;shard-name&gt;.&lt;setting&gt;
#   &lt;datastore-name&gt;.&lt;shard-name&gt;.&lt;setting&gt;
# for example:
#   topology.shard-election-timeout-factor=2             # override both config/operational for topology shard
#   config.topology.shard-election-timeout-factor=5      # override config for topology shard
#   operational.topology.shard-election-timeout-factor=7 # override operational for topology shard
#

# The multiplication factor to be used to determine shard election timeout. The shard election timeout
# is determined by multiplying shardHeartbeatIntervalInMillis with the shardElectionTimeoutFactor.
shard-election-timeout-factor=20

# The interval at which a shard will send a heart beat message to its remote shard.
#shard-heartbeat-interval-in-millis=500

# The amount by which to divide election timeout in case of a candidate. This serves as a counter-balance
# to shard-election-timeout-factor. The default value is 1, i.e. election timeout is the same in all
# situations.
#shard-candidate-election-timeout-divisor=1

# The maximum amount of time to wait for a shard to elect a leader before failing an operation (eg transaction create).
#shard-leader-election-timeout-in-seconds=30

# Enable or disable data persistence.
#persistent=true

# Disable persistence for the operational data store by default.
operational.persistent=false

# The maximum amount of time a shard transaction can be idle without receiving any messages before it self-destructs.
#shard-transaction-idle-timeout-in-minutes=10

# The maximum amount of time a shard transaction three-phase commit can be idle without receiving the
# next messages before it aborts the transaction.
#shard-transaction-commit-timeout-in-seconds=30

# The maximum allowed capacity for each shard's transaction commit queue.
#shard-transaction-commit-queue-capacity=20000

# The maximum amount of time to wait for a shard to initialize from persistence on startup before
# failing an operation (eg transaction create and change listener registration).
#shard-initialization-timeout-in-seconds=300

# The minimum number of entries to be present in the in-memory journal log before a snapshot is to be taken.
#shard-snapshot-batch-count=20000

# The percentage of Runtime.totalMemory() used by the in-memory journal log before a snapshot is to be taken.
# Disabled, if direct threshold is enabled.
#shard-snapshot-data-threshold-percentage=12

# The max size of in-memory journal(in MB), after reaching the limit, snapshot will be taken. Should be not less then 1.
# If set to 0, direct threshold is disabled and percentage is used instead.
#shard-snapshot-data-threshold=0

# The interval at which the leader of the shard will check if its majority followers are active and
# term itself as isolated.
#shard-isolated-leader-check-interval-in-millis=5000

# The number of transaction modification operations (put, merge, delete) to batch before sending to the
# shard transaction actor. Batching improves performance as less modifications messages are sent to the
# actor and thus lessens the chance that the transaction actor's mailbox queue could get full.
#shard-batched-modification-count=1000

# The maximum amount of time for akka operations (remote or local) to complete before failing.
#operation-timeout-in-seconds=5

# Obsolete: this knob will be removed in a future release.
#
# The initial number of transactions per second that are allowed before the data store should begin
# applying back pressure. This number is only used as an initial guidance, subsequently the datastore
# measures the latency for a commit and auto-adjusts the rate limit.
#transaction-creation-initial-rate-limit=100

# A fully qualified java class name. The class should implement
# org.opendaylight.controller.cluster.raft.policy.RaftPolicy. This java class should be
# accessible to the distributed data store OSGi module so that it can be dynamically loaded via
# reflection. For now let's assume that these classes to customize raft behaviors should be
# present in the distributed data store module itself. If this property is set to a class which
# cannot be found then the default raft policy will be applied
#custom-raft-policy-implementation=

# When fragmenting messages thru the akka remoting framework, this is the maximum size in bytes
# for a message slice. This needs to be below Akka's maximum-frame-size and defaults to 480KiB.
maximum-message-slice-size=491520

# Tune the maximum number of entries a follower is allowed to lag behind the leader before it is
# considered out-of-sync. This flag may require tuning in face of a large number of small transactions.
#sync-index-threshold=10

# Record new transaction allocation stack trace, useful for debugging.  This makes the log include
# the stack trace of the creator of the Tx when there is an exception when the transaction is submitted 
# (e.g. for a failed validation).  Defaults to false due to performance impact.
#transaction-debug-context-enabled=true

# Multiplicator of shard-leader-election-timeout-in-seconds for the purposes of initial datastore
# convergence. Each frontend datastore instance will wait specified amount of time before becoming
# exposed as a service. A value of 0 indicates waiting forever. Defaults to 3.
#initial-settle-timeout-multiplier=3

#Interval after which a snapshot should be taken during the recovery process.
#recovery-snapshot-interval-seconds=0

# Option to take a snapshot when the entire DataTree root or top-level container is overwritten
snapshot-on-root-overwrite=false

# Enable lz4 compression for snapshots sent from leader to followers
#use-lz4-compression=true

# Export snapshot and journal content after recovery, possible modes: off, json
#
# Journal Json structure:
#       Entries : [
#            Entry : [
#                Node: [
#                   Path : {},
#                   ModificationType : {},
#                   Data : {}
#                ]
#            ]
#        ]
#
# Snapshot Json structure:
#       RootNode : {}
#
export-on-recovery=off

# Directory name for export files
#recovery-export-base-dir=persistence-export</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:40.340670" elapsed="0.000692"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:40.342148" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:40.341729" elapsed="0.000482"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:40.342826" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:40.342443" elapsed="0.000428"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:26:40.339936" elapsed="0.003037"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:40.338354" elapsed="0.004667"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:40.338265" elapsed="0.004823"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:26:40.343484" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:40.343257" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:40.343203" elapsed="0.000462"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:26:40.344043" elapsed="0.000055"/>
</return>
<status status="PASS" start="2026-08-22T23:26:40.343827" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:40.343775" elapsed="0.000437"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:40.345278" elapsed="0.000062"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:26:40.315196" elapsed="0.030408"/>
</kw>
<msg time="2026-08-22T23:26:40.345889" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:40.345937" level="INFO">${result} = # This file specifies property settings for the clustered data store to control its behavior. A
# property may be applied to every data store type ("config" and "operational") or can be customized
# d...</msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:40.314158" elapsed="0.031803"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:40.346129" elapsed="0.000265"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:26:40.346614" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-08-22T23:26:40.346463" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:40.346443" elapsed="0.000262"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:40.346851" elapsed="0.000022"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:26:39.981659" elapsed="0.365317"/>
</kw>
<msg time="2026-08-22T23:26:40.347078" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:39.981111" elapsed="0.366021"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:26:39.979565" elapsed="0.367802"/>
</kw>
<msg time="2026-08-22T23:26:40.347452" 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-08-22T23:26:39.979107" elapsed="0.368392"/>
</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-08-22T23:26:40.351877" elapsed="0.000155"/>
</kw>
<msg time="2026-08-22T23:26:40.352076" 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-08-22T23:26:40.351132" elapsed="0.001004"/>
</kw>
<kw name="Open 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-08-22T23:26:40.352296" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:40.352461" 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-08-22T23:26:40.347842" elapsed="0.004700"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:26:39.978086" elapsed="0.374684"/>
</kw>
<msg time="2026-08-22T23:26:40.352871" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:39.977615" elapsed="0.375306"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:26:39.976905" elapsed="0.376278"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:26:39.976748" elapsed="0.376485"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:26:39.220232" elapsed="1.133046"/>
</for>
<arg>cat ${DATASTORE_CFG}</arg>
<doc>Cycle through indices (or all), run bash command on each, using temporary SSH session and restoring the previously active one.</doc>
<status status="PASS" start="2026-08-22T23:26:39.215925" elapsed="1.137424"/>
</kw>
<kw name="Clean_Directories_On_List_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:40.364352" level="INFO">${path_list} = ['tmp/', 'data/', 'cache/', 'snapshots/', 'journal/', 'segmented-journal/', 'etc/opendaylight/current/', 'etc/host.key']</msg>
<var>${path_list}</var>
<arg>"${directory_list}" == "${EMPTY}"</arg>
<arg>${ODL_DEFAULT_DATA_PATHS}</arg>
<arg>${directory_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:40.361975" elapsed="0.002413"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${tmp_dir}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Check_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:40.366245" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:40.365825" elapsed="0.000448"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:26:40.366770" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:26:40.366437" elapsed="0.000359"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:26:40.366841" elapsed="0.000038"/>
</return>
<msg time="2026-08-22T23:26:40.367018" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:26:40.365426" elapsed="0.001617"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:40.369389" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:40.369245" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:40.371603" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:26:40.371084" elapsed="0.000549"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:26:40.371683" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:26:40.371839" level="INFO">${member_ip} = 10.30.170.200</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:26:40.370746" elapsed="0.001119"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:40.378830" level="INFO">${odl_connection} = 56</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:26:40.378122" elapsed="0.000757"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:40.381344" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:40.381423" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:40.381027" elapsed="0.000421"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:40.381635" elapsed="0.000356"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:40.382891" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:40.707297" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.08               Processes:             121
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:39 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:40.382543" elapsed="0.324867"/>
</kw>
<msg time="2026-08-22T23:26:40.707574" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:40.382174" elapsed="0.325494"/>
</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-08-22T23:26:40.380377" elapsed="0.327395"/>
</kw>
<msg time="2026-08-22T23:26:40.707823" 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-08-22T23:26:40.379952" elapsed="0.327921"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:26:40.379389" elapsed="0.328629"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:26:40.708169" elapsed="0.000085"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.200 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:26:40.376960" elapsed="0.331484"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:40.710836" level="INFO">Executing command 'mkdir -p '/tmp' &amp;&amp; rm -vrf '/tmp/log' &amp;&amp; mv -vf '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log' '/tmp/''.</msg>
<msg time="2026-08-22T23:26:40.723905" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:26:40.724167" level="INFO">${stdout} = renamed '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log' -&gt; '/tmp/log'</msg>
<msg time="2026-08-22T23:26:40.724271" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:26:40.724366" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:40.710637" elapsed="0.013783"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:26:40.726311" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:26:40.725691" elapsed="0.000725"/>
</kw>
<msg time="2026-08-22T23:26:40.726663" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:26:40.726772" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:40.724875" elapsed="0.001949"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:40.728254" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:40.727278" elapsed="0.001037"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:40.730840" level="INFO">renamed '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log' -&gt; '/tmp/log'</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:40.730247" elapsed="0.000700"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:40.731865" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:40.731293" elapsed="0.000665"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:40.732868" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:40.732300" elapsed="0.000666"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:26:40.729286" elapsed="0.003803"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:40.728492" elapsed="0.004678"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:40.728447" elapsed="0.004782"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:26:40.733615" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:40.733359" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:40.733320" elapsed="0.000502"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:26:40.734147" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-08-22T23:26:40.733943" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:40.733907" elapsed="0.000425"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:40.734699" elapsed="0.000041"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:26:40.710033" elapsed="0.024850"/>
</kw>
<msg time="2026-08-22T23:26:40.735027" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:40.735142" level="INFO">${result} = renamed '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log' -&gt; '/tmp/log'</msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:40.708823" elapsed="0.026379"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:40.735460" elapsed="0.000510"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:26:40.736340" elapsed="0.000072"/>
</return>
<status status="PASS" start="2026-08-22T23:26:40.736107" elapsed="0.000386"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:40.736088" elapsed="0.000446"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:40.736741" elapsed="0.000053"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:26:40.375250" elapsed="0.361750"/>
</kw>
<msg time="2026-08-22T23:26:40.737099" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:40.372035" elapsed="0.365117"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:26:40.370201" elapsed="0.367040"/>
</kw>
<msg time="2026-08-22T23:26:40.737283" 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-08-22T23:26:40.369694" elapsed="0.367636"/>
</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-08-22T23:26:40.741246" elapsed="0.000154"/>
</kw>
<msg time="2026-08-22T23:26:40.741443" 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-08-22T23:26:40.740504" elapsed="0.001001"/>
</kw>
<kw name="Open 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-08-22T23:26:40.741682" elapsed="0.000035"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:40.741864" 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-08-22T23:26:40.737651" elapsed="0.004295"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:26:40.368602" elapsed="0.373402"/>
</kw>
<msg time="2026-08-22T23:26:40.742060" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:40.368133" elapsed="0.373974"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:26:40.367410" elapsed="0.374781"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:26:40.367249" elapsed="0.374988"/>
</iter>
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:40.744523" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:40.744405" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:40.746654" level="INFO">${ip_address} = 10.30.170.12</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:26:40.746171" elapsed="0.000510"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:26:40.746731" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:26:40.746882" level="INFO">${member_ip} = 10.30.170.12</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:26:40.745846" elapsed="0.001061"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:40.751135" level="INFO">${odl_connection} = 57</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:26:40.750501" elapsed="0.000682"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:40.753401" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:40.753479" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:40.753137" elapsed="0.000366"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:40.753687" elapsed="0.000341"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:40.755061" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:41.082986" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.02               Processes:             118
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:39 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:40.754735" elapsed="0.328334"/>
</kw>
<msg time="2026-08-22T23:26:41.083129" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:40.754239" elapsed="0.328948"/>
</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-08-22T23:26:40.752622" elapsed="0.330652"/>
</kw>
<msg time="2026-08-22T23:26:41.083323" 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-08-22T23:26:40.752180" elapsed="0.331193"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:26:40.751676" elapsed="0.331840"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:26:41.083681" elapsed="0.000081"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.12 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:26:40.749444" elapsed="0.334500"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:41.086208" level="INFO">Executing command 'mkdir -p '/tmp' &amp;&amp; rm -vrf '/tmp/log' &amp;&amp; mv -vf '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log' '/tmp/''.</msg>
<msg time="2026-08-22T23:26:41.098873" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:26:41.099119" level="INFO">${stdout} = renamed '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log' -&gt; '/tmp/log'</msg>
<msg time="2026-08-22T23:26:41.099219" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:26:41.099311" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:41.086011" elapsed="0.013352"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:26:41.101181" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:26:41.100570" elapsed="0.000714"/>
</kw>
<msg time="2026-08-22T23:26:41.101497" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:26:41.101645" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:41.099804" elapsed="0.001896"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:41.103059" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:41.102089" elapsed="0.001028"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:41.105542" level="INFO">renamed '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log' -&gt; '/tmp/log'</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:41.104994" elapsed="0.000694"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:41.106560" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:41.106031" elapsed="0.000652"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:41.107571" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:41.107018" elapsed="0.000684"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:26:41.104074" elapsed="0.003749"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:41.103290" elapsed="0.004614"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:41.103247" elapsed="0.004714"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:26:41.108309" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:41.108087" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:41.108049" elapsed="0.000406"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:26:41.108800" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-08-22T23:26:41.108571" elapsed="0.000359"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:41.108536" elapsed="0.000447"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:41.109304" elapsed="0.000049"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:26:41.085394" elapsed="0.024352"/>
</kw>
<msg time="2026-08-22T23:26:41.110288" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:41.110553" level="INFO">${result} = renamed '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log' -&gt; '/tmp/log'</msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:41.084261" elapsed="0.026469"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:41.110996" elapsed="0.000501"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:26:41.111908" elapsed="0.000076"/>
</return>
<status status="PASS" start="2026-08-22T23:26:41.111665" elapsed="0.000404"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:41.111645" elapsed="0.000465"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:41.112303" elapsed="0.000050"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:26:40.747882" elapsed="0.364687"/>
</kw>
<msg time="2026-08-22T23:26:41.112649" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:40.747065" elapsed="0.365636"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:26:40.745283" elapsed="0.367506"/>
</kw>
<msg time="2026-08-22T23:26:41.112831" 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-08-22T23:26:40.744825" elapsed="0.368051"/>
</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-08-22T23:26:41.116632" elapsed="0.000147"/>
</kw>
<msg time="2026-08-22T23:26:41.116822" 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-08-22T23:26:41.116023" 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="NOT RUN" start="2026-08-22T23:26:41.117043" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:41.117224" 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-08-22T23:26:41.113172" elapsed="0.004264"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:26:40.743779" elapsed="0.373724"/>
</kw>
<msg time="2026-08-22T23:26:41.117559" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:40.743310" elapsed="0.374326"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:26:40.742494" elapsed="0.375228"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:26:40.742335" elapsed="0.375434"/>
</iter>
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:41.119934" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:41.119821" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:41.122040" level="INFO">${ip_address} = 10.30.170.79</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:26:41.121533" elapsed="0.000534"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:26:41.122116" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:26:41.122267" level="INFO">${member_ip} = 10.30.170.79</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:26:41.121213" elapsed="0.001078"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:41.126531" level="INFO">${odl_connection} = 58</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:26:41.125913" elapsed="0.000684"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:41.128911" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:41.128990" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:41.128529" elapsed="0.000486"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:26:41.129174" elapsed="0.000316"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:41.130368" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:41.455165" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:27 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:40 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:41.130050" elapsed="0.325305"/>
</kw>
<msg time="2026-08-22T23:26:41.455498" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:41.129692" elapsed="0.325992"/>
</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-08-22T23:26:41.128046" elapsed="0.327844"/>
</kw>
<msg time="2026-08-22T23:26:41.456006" 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-08-22T23:26:41.127653" elapsed="0.328469"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:26:41.127073" elapsed="0.329368"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:26:41.456821" elapsed="0.000183"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.79 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:26:41.124836" elapsed="0.332581"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:41.462267" level="INFO">Executing command 'mkdir -p '/tmp' &amp;&amp; rm -vrf '/tmp/log' &amp;&amp; mv -vf '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log' '/tmp/''.</msg>
<msg time="2026-08-22T23:26:41.474291" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:26:41.474562" level="INFO">${stdout} = renamed '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log' -&gt; '/tmp/log'</msg>
<msg time="2026-08-22T23:26:41.474714" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:26:41.474820" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:41.462070" elapsed="0.012806"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:26:41.476862" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:26:41.476182" elapsed="0.000793"/>
</kw>
<msg time="2026-08-22T23:26:41.477206" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:26:41.477313" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:41.475307" elapsed="0.002062"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:41.478924" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:41.477864" elapsed="0.001125"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:41.481722" level="INFO">renamed '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log' -&gt; '/tmp/log'</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:41.481042" elapsed="0.000751"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:41.482349" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:41.482011" elapsed="0.000396"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:41.482978" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:41.482640" elapsed="0.000399"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:26:41.480036" elapsed="0.003080"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:41.479182" elapsed="0.003985"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:41.479134" elapsed="0.004069"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:26:41.483485" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:41.483341" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:41.483315" elapsed="0.000281"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:26:41.483800" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:26:41.483674" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:41.483652" elapsed="0.000264"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:41.484122" elapsed="0.000031"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:26:41.460955" elapsed="0.023398"/>
</kw>
<msg time="2026-08-22T23:26:41.484553" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:41.484749" level="INFO">${result} = renamed '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log' -&gt; '/tmp/log'</msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:41.458222" elapsed="0.026612"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:41.485191" elapsed="0.000761"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:26:41.486476" elapsed="0.000126"/>
</return>
<status status="PASS" start="2026-08-22T23:26:41.486147" elapsed="0.000576"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:41.486120" elapsed="0.000659"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:41.487045" elapsed="0.000068"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:26:41.123043" elapsed="0.364359"/>
</kw>
<msg time="2026-08-22T23:26:41.487486" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:41.122486" elapsed="0.365071"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:26:41.120694" elapsed="0.367019"/>
</kw>
<msg time="2026-08-22T23:26:41.487771" 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-08-22T23:26:41.120218" elapsed="0.367617"/>
</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-08-22T23:26:41.492747" elapsed="0.000147"/>
</kw>
<msg time="2026-08-22T23:26:41.492937" 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-08-22T23:26:41.492147" elapsed="0.000851"/>
</kw>
<kw name="Open 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-08-22T23:26:41.493157" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:41.493320" elapsed="0.000019"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:26:41.488251" elapsed="0.005148"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:26:41.119187" elapsed="0.374288"/>
</kw>
<msg time="2026-08-22T23:26:41.493532" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:41.118735" elapsed="0.374855"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:26:41.118020" elapsed="0.375657"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:26:41.117861" elapsed="0.375863"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:26:40.367104" elapsed="1.126658"/>
</for>
<arg>mkdir -p '${tmp_dir}' &amp;&amp; rm -vrf '${tmp_dir}/log' &amp;&amp; mv -vf '${karaf_home}/data/log' '${tmp_dir}/'</arg>
<arg>${member_index_list}</arg>
<doc>Cycle through indices (or all), run bash command on each, using temporary SSH session and restoring the previously active one.</doc>
<status status="PASS" start="2026-08-22T23:26:40.364791" elapsed="1.129032"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:40.364474" elapsed="1.129420"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:40.364448" elapsed="1.129474"/>
</if>
<kw name="Safe_With_Ssh_To_List_Or_All_Run_Keyword" owner="ClusterManagement">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:41.495212" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:41.495096" elapsed="0.000391"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="With_Ssh_To_List_Or_All_Run_Keyword" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>This keyword is experimental and there is high risk of being replaced by another approach.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:26:41.496610" elapsed="0.000211"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:41.497825" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:41.497409" elapsed="0.000443"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:26:41.498317" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:26:41.498013" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:26:41.498388" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:26:41.498542" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:26:41.497036" elapsed="0.001530"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:41.499540" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:26:41.499269" elapsed="0.000296"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:26:41.499630" elapsed="0.000248"/>
</return>
<msg time="2026-08-22T23:26:41.500007" level="INFO">${member_ip} = 10.30.170.200</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:26:41.498948" elapsed="0.001084"/>
</kw>
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:41.501647" level="INFO">${odl_connection} = 59</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:26:41.501225" elapsed="0.000448"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:41.504161" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:41.504437" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:41.503607" elapsed="0.000934"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:26:41.504868" elapsed="0.000632"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:41.506868" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:41.830782" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.08               Processes:             121
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:40 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:41.506487" elapsed="0.324379"/>
</kw>
<msg time="2026-08-22T23:26:41.830961" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:41.505833" elapsed="0.325207"/>
</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-08-22T23:26:41.502636" elapsed="0.328538"/>
</kw>
<msg time="2026-08-22T23:26:41.831261" 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-08-22T23:26:41.502233" elapsed="0.329079"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:26:41.501854" elapsed="0.329531"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:26:41.831426" elapsed="0.000034"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.200 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:26:41.500867" elapsed="0.330760"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="ClusterManagement__Clean_Directories" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:41.833547" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/tmp/'.</msg>
<msg time="2026-08-22T23:26:41.846078" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:41.832938" elapsed="0.013301"/>
</kw>
<var name="${relative_path}">tmp/</var>
<status status="PASS" start="2026-08-22T23:26:41.832796" elapsed="0.013496"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:41.847519" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/data/'.</msg>
<msg time="2026-08-22T23:26:41.934852" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:41.846644" elapsed="0.088467"/>
</kw>
<var name="${relative_path}">data/</var>
<status status="PASS" start="2026-08-22T23:26:41.846415" elapsed="0.088780"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:41.936692" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/cache/'.</msg>
<msg time="2026-08-22T23:26:41.989983" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:41.935754" elapsed="0.054479"/>
</kw>
<var name="${relative_path}">cache/</var>
<status status="PASS" start="2026-08-22T23:26:41.935389" elapsed="0.054929"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:41.991801" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/snapshots/'.</msg>
<msg time="2026-08-22T23:26:42.041542" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:41.990868" elapsed="0.050979"/>
</kw>
<var name="${relative_path}">snapshots/</var>
<status status="PASS" start="2026-08-22T23:26:41.990509" elapsed="0.051433"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:42.043397" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/journal/'.</msg>
<msg time="2026-08-22T23:26:42.089909" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:42.042462" elapsed="0.047708"/>
</kw>
<var name="${relative_path}">journal/</var>
<status status="PASS" start="2026-08-22T23:26:42.042149" elapsed="0.048105"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:42.091827" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/segmented-journal/'.</msg>
<msg time="2026-08-22T23:26:42.138049" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:42.090802" elapsed="0.047517"/>
</kw>
<var name="${relative_path}">segmented-journal/</var>
<status status="PASS" start="2026-08-22T23:26:42.090444" elapsed="0.047963"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:42.140004" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/opendaylight/current/'.</msg>
<msg time="2026-08-22T23:26:42.185947" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:42.139049" elapsed="0.047150"/>
</kw>
<var name="${relative_path}">etc/opendaylight/current/</var>
<status status="PASS" start="2026-08-22T23:26:42.138669" elapsed="0.047617"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:42.187775" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/host.key'.</msg>
<msg time="2026-08-22T23:26:42.233692" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:42.186847" elapsed="0.047091"/>
</kw>
<var name="${relative_path}">etc/host.key</var>
<status status="PASS" start="2026-08-22T23:26:42.186481" elapsed="0.047543"/>
</iter>
<var>${relative_path}</var>
<value>@{relative_path_list}</value>
<status status="PASS" start="2026-08-22T23:26:41.832656" elapsed="0.401436"/>
</for>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>For each relative path, remove files with respect to /tmp/netconf-karaf-9.0.4-SNAPSHOT. Return None.</doc>
<status status="PASS" start="2026-08-22T23:26:41.832352" elapsed="0.401874"/>
</kw>
<msg time="2026-08-22T23:26:42.234449" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:42.234548" level="INFO">${result} = None</msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:41.831805" elapsed="0.402846"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:42.235025" elapsed="0.000464"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:26:42.235980" elapsed="0.000067"/>
</return>
<status status="PASS" start="2026-08-22T23:26:42.235694" elapsed="0.000431"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:42.235643" elapsed="0.000539"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:42.236512" elapsed="0.000049"/>
</kw>
<arg>${member_ip}</arg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:26:41.500294" elapsed="0.736537"/>
</kw>
<var name="${member_index}">1</var>
<status status="PASS" start="2026-08-22T23:26:41.498782" elapsed="0.738145"/>
</iter>
<iter>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:42.239015" level="INFO">${ip_address} = 10.30.170.12</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:26:42.238357" elapsed="0.000716"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:26:42.239180" elapsed="0.000063"/>
</return>
<msg time="2026-08-22T23:26:42.239646" level="INFO">${member_ip} = 10.30.170.12</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:26:42.237567" elapsed="0.002137"/>
</kw>
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:42.243303" level="INFO">${odl_connection} = 60</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:26:42.242419" elapsed="0.000944"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:42.247424" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:42.247725" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:42.246860" elapsed="0.000976"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:26:42.248142" elapsed="0.000659"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:42.250148" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:42.611115" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.02               Processes:             118
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:41 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:42.249826" elapsed="0.361375"/>
</kw>
<msg time="2026-08-22T23:26:42.611299" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:42.249114" elapsed="0.362273"/>
</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-08-22T23:26:42.245836" elapsed="0.365690"/>
</kw>
<msg time="2026-08-22T23:26:42.611636" 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-08-22T23:26:42.244677" elapsed="0.367012"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:26:42.243793" elapsed="0.367975"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:26:42.611812" elapsed="0.000033"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.12 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:26:42.241610" elapsed="0.370344"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="ClusterManagement__Clean_Directories" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:42.613721" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/tmp/'.</msg>
<msg time="2026-08-22T23:26:42.627036" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:42.613297" elapsed="0.013896"/>
</kw>
<var name="${relative_path}">tmp/</var>
<status status="PASS" start="2026-08-22T23:26:42.613153" elapsed="0.014092"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:42.628362" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/data/'.</msg>
<msg time="2026-08-22T23:26:42.714409" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:42.627568" elapsed="0.087155"/>
</kw>
<var name="${relative_path}">data/</var>
<status status="PASS" start="2026-08-22T23:26:42.627368" elapsed="0.087446"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:42.716276" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/cache/'.</msg>
<msg time="2026-08-22T23:26:42.766072" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:42.715343" elapsed="0.050996"/>
</kw>
<var name="${relative_path}">cache/</var>
<status status="PASS" start="2026-08-22T23:26:42.715017" elapsed="0.051412"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:42.767958" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/snapshots/'.</msg>
<msg time="2026-08-22T23:26:42.813684" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:42.767009" elapsed="0.046928"/>
</kw>
<var name="${relative_path}">snapshots/</var>
<status status="PASS" start="2026-08-22T23:26:42.766680" elapsed="0.047342"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:42.815489" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/journal/'.</msg>
<msg time="2026-08-22T23:26:42.862127" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:42.814556" elapsed="0.047829"/>
</kw>
<var name="${relative_path}">journal/</var>
<status status="PASS" start="2026-08-22T23:26:42.814228" elapsed="0.048243"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:42.864006" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/segmented-journal/'.</msg>
<msg time="2026-08-22T23:26:42.909691" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:42.863068" elapsed="0.046865"/>
</kw>
<var name="${relative_path}">segmented-journal/</var>
<status status="PASS" start="2026-08-22T23:26:42.862726" elapsed="0.047290"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:42.911439" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/opendaylight/current/'.</msg>
<msg time="2026-08-22T23:26:42.957003" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:42.910526" elapsed="0.046592"/>
</kw>
<var name="${relative_path}">etc/opendaylight/current/</var>
<status status="PASS" start="2026-08-22T23:26:42.910210" elapsed="0.046947"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:42.957827" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/host.key'.</msg>
<msg time="2026-08-22T23:26:43.005554" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:42.957397" elapsed="0.048431"/>
</kw>
<var name="${relative_path}">etc/host.key</var>
<status status="PASS" start="2026-08-22T23:26:42.957250" elapsed="0.048662"/>
</iter>
<var>${relative_path}</var>
<value>@{relative_path_list}</value>
<status status="PASS" start="2026-08-22T23:26:42.612995" elapsed="0.392985"/>
</for>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>For each relative path, remove files with respect to /tmp/netconf-karaf-9.0.4-SNAPSHOT. Return None.</doc>
<status status="PASS" start="2026-08-22T23:26:42.612698" elapsed="0.393417"/>
</kw>
<msg time="2026-08-22T23:26:43.006344" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:43.006441" level="INFO">${result} = None</msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:42.612127" elapsed="0.394365"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:43.006902" elapsed="0.000454"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:26:43.007837" elapsed="0.000068"/>
</return>
<status status="PASS" start="2026-08-22T23:26:43.007520" elapsed="0.000463"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:43.007473" elapsed="0.000564"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:43.008368" elapsed="0.000048"/>
</kw>
<arg>${member_ip}</arg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:26:42.240298" elapsed="0.768386"/>
</kw>
<var name="${member_index}">2</var>
<status status="PASS" start="2026-08-22T23:26:42.237132" elapsed="0.771650"/>
</iter>
<iter>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:43.010839" level="INFO">${ip_address} = 10.30.170.79</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:26:43.010186" elapsed="0.000712"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:26:43.011004" elapsed="0.000063"/>
</return>
<msg time="2026-08-22T23:26:43.011337" level="INFO">${member_ip} = 10.30.170.79</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:26:43.009411" elapsed="0.001981"/>
</kw>
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:43.014995" level="INFO">${odl_connection} = 61</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:26:43.014115" elapsed="0.000938"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:43.019297" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:43.019596" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:43.018739" 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-08-22T23:26:43.020015" elapsed="0.000657"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:43.022050" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:43.336566" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:27 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:41 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:43.021727" elapsed="0.314941"/>
</kw>
<msg time="2026-08-22T23:26:43.336791" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:43.020998" elapsed="0.315883"/>
</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-08-22T23:26:43.017773" elapsed="0.319292"/>
</kw>
<msg time="2026-08-22T23:26:43.337157" 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-08-22T23:26:43.016331" elapsed="0.320878"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:26:43.015446" elapsed="0.321838"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:26:43.337325" elapsed="0.000031"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.79 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:26:43.013286" elapsed="0.324175"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="ClusterManagement__Clean_Directories" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:43.339211" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/tmp/'.</msg>
<msg time="2026-08-22T23:26:43.351463" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:43.338803" elapsed="0.012796"/>
</kw>
<var name="${relative_path}">tmp/</var>
<status status="PASS" start="2026-08-22T23:26:43.338660" elapsed="0.012980"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:43.352286" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/data/'.</msg>
<msg time="2026-08-22T23:26:43.440029" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:43.351873" elapsed="0.088273"/>
</kw>
<var name="${relative_path}">data/</var>
<status status="PASS" start="2026-08-22T23:26:43.351730" elapsed="0.088453"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:43.440873" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/cache/'.</msg>
<msg time="2026-08-22T23:26:43.492076" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:43.440416" elapsed="0.051773"/>
</kw>
<var name="${relative_path}">cache/</var>
<status status="PASS" start="2026-08-22T23:26:43.440272" elapsed="0.051955"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:43.492904" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/snapshots/'.</msg>
<msg time="2026-08-22T23:26:43.539572" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:43.492455" elapsed="0.047246"/>
</kw>
<var name="${relative_path}">snapshots/</var>
<status status="PASS" start="2026-08-22T23:26:43.492314" elapsed="0.047424"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:43.540369" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/journal/'.</msg>
<msg time="2026-08-22T23:26:43.587787" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:43.539972" elapsed="0.047929"/>
</kw>
<var name="${relative_path}">journal/</var>
<status status="PASS" start="2026-08-22T23:26:43.539828" elapsed="0.048111"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:43.588567" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/segmented-journal/'.</msg>
<msg time="2026-08-22T23:26:43.636135" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:43.588170" elapsed="0.048229"/>
</kw>
<var name="${relative_path}">segmented-journal/</var>
<status status="PASS" start="2026-08-22T23:26:43.588027" elapsed="0.048459"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:43.638010" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/opendaylight/current/'.</msg>
<msg time="2026-08-22T23:26:43.684443" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:43.637077" elapsed="0.047698"/>
</kw>
<var name="${relative_path}">etc/opendaylight/current/</var>
<status status="PASS" start="2026-08-22T23:26:43.636753" elapsed="0.048110"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:43.686351" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/host.key'.</msg>
<msg time="2026-08-22T23:26:43.732058" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:43.685404" elapsed="0.046920"/>
</kw>
<var name="${relative_path}">etc/host.key</var>
<status status="PASS" start="2026-08-22T23:26:43.685075" elapsed="0.047335"/>
</iter>
<var>${relative_path}</var>
<value>@{relative_path_list}</value>
<status status="PASS" start="2026-08-22T23:26:43.338496" elapsed="0.393984"/>
</for>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>For each relative path, remove files with respect to /tmp/netconf-karaf-9.0.4-SNAPSHOT. Return None.</doc>
<status status="PASS" start="2026-08-22T23:26:43.338210" elapsed="0.394466"/>
</kw>
<msg time="2026-08-22T23:26:43.732911" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:43.733011" level="INFO">${result} = None</msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:43.337650" elapsed="0.395412"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:43.733436" elapsed="0.000485"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:26:43.734340" elapsed="0.000061"/>
</return>
<status status="PASS" start="2026-08-22T23:26:43.734074" elapsed="0.000402"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:43.734031" elapsed="0.000499"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:43.734905" elapsed="0.000050"/>
</kw>
<arg>${member_ip}</arg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:26:43.012016" elapsed="0.723159"/>
</kw>
<var name="${member_index}">3</var>
<status status="PASS" start="2026-08-22T23:26:43.009013" elapsed="0.726342"/>
</iter>
<var>${member_index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:26:41.498637" elapsed="2.236787"/>
</for>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>For each index in given list (or all): activate SSH connection, run given Keyword, close active connection. Return None.
Beware that in order to avoid "got positional argument after named arguments", first two arguments in the call should not be named.</doc>
<status status="PASS" start="2026-08-22T23:26:41.496167" elapsed="2.239384"/>
</kw>
<msg time="2026-08-22T23:26:43.735688" 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-08-22T23:26:41.495661" elapsed="2.240139"/>
</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-08-22T23:26:43.742543" elapsed="0.000163"/>
</kw>
<msg time="2026-08-22T23:26:43.742750" 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-08-22T23:26:43.741676" elapsed="0.001134"/>
</kw>
<kw name="Open 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-08-22T23:26:43.742974" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:43.743136" 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-08-22T23:26:43.736475" elapsed="0.006742"/>
</kw>
<arg>With_Ssh_To_List_Or_All_Run_Keyword</arg>
<arg>${member_index_list}</arg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-08-22T23:26:41.494619" elapsed="2.248658"/>
</kw>
<arg>${member_index_list}</arg>
<arg>ClusterManagement__Clean_Directories</arg>
<arg>${path_list}</arg>
<arg>${karaf_home}</arg>
<doc>Remember active ssh connection index, call With_Ssh_To_List_Or_All_Run_Keyword, return None. Restore the conection index on teardown.</doc>
<status status="PASS" start="2026-08-22T23:26:41.494095" elapsed="2.249251"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${tmp_dir}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Check_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:43.745339" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:43.744953" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:26:43.745851" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:26:43.745528" elapsed="0.000350"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:26:43.745923" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:26:43.746079" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:26:43.744544" elapsed="0.001560"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:43.748339" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:43.748221" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:43.750416" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:26:43.749961" elapsed="0.000481"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:26:43.750490" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:26:43.750665" level="INFO">${member_ip} = 10.30.170.200</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:26:43.749641" elapsed="0.001050"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:43.755256" level="INFO">${odl_connection} = 62</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:26:43.754627" elapsed="0.000676"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:43.757649" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:43.757729" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:43.757359" elapsed="0.000394"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:43.757909" elapsed="0.000316"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:43.759161" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:44.057197" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.08               Processes:             121
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:41 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:43.758840" elapsed="0.298442"/>
</kw>
<msg time="2026-08-22T23:26:44.057343" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:43.758441" elapsed="0.298970"/>
</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-08-22T23:26:43.756870" elapsed="0.300629"/>
</kw>
<msg time="2026-08-22T23:26:44.057547" 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-08-22T23:26:43.756350" elapsed="0.301262"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:26:43.755838" elapsed="0.301915"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:26:44.057919" elapsed="0.000089"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.200 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:26:43.753509" elapsed="0.304671"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:44.060363" level="INFO">Executing command 'mkdir -p '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data' &amp;&amp; rm -vrf '/tmp/netconf-karaf-9.0.4-SNAPSHOT/log' &amp;&amp; mv -vf '/tmp/log' '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/''.</msg>
<msg time="2026-08-22T23:26:44.075031" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:26:44.075220" level="INFO">${stdout} = renamed '/tmp/log' -&gt; '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log'</msg>
<msg time="2026-08-22T23:26:44.075287" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:26:44.075344" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:44.060167" elapsed="0.015209"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:26:44.076979" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:26:44.076344" elapsed="0.000748"/>
</kw>
<msg time="2026-08-22T23:26:44.077316" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:26:44.077414" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:44.075657" elapsed="0.001807"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:44.078841" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:44.077874" elapsed="0.001032"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:44.081343" level="INFO">renamed '/tmp/log' -&gt; '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log'</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:44.080796" elapsed="0.000650"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:44.082341" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:44.081813" elapsed="0.000620"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:44.083326" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:44.082798" elapsed="0.000625"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:26:44.079865" elapsed="0.003677"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:44.079092" elapsed="0.004559"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:44.079044" elapsed="0.004663"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:26:44.084051" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:44.083832" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:44.083792" elapsed="0.000404"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:26:44.084552" elapsed="0.000087"/>
</return>
<status status="PASS" start="2026-08-22T23:26:44.084310" elapsed="0.000404"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:44.084276" elapsed="0.000490"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:44.085014" elapsed="0.000021"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:26:44.059619" elapsed="0.025559"/>
</kw>
<msg time="2026-08-22T23:26:44.085365" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:44.085481" level="INFO">${result} = renamed '/tmp/log' -&gt; '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log'</msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:44.058490" elapsed="0.027053"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:44.085823" elapsed="0.000485"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:26:44.086697" elapsed="0.000071"/>
</return>
<status status="PASS" start="2026-08-22T23:26:44.086447" elapsed="0.000406"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:44.086428" elapsed="0.000465"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:44.087079" elapsed="0.000048"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:26:43.751602" elapsed="0.335728"/>
</kw>
<msg time="2026-08-22T23:26:44.087391" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:43.750847" elapsed="0.336594"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:26:43.749112" elapsed="0.338415"/>
</kw>
<msg time="2026-08-22T23:26:44.087569" 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-08-22T23:26:43.748647" elapsed="0.338990"/>
</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-08-22T23:26:44.091338" elapsed="0.000147"/>
</kw>
<msg time="2026-08-22T23:26:44.091528" 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-08-22T23:26:44.090750" elapsed="0.000855"/>
</kw>
<kw name="Open 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-08-22T23:26:44.091767" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:44.091929" 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-08-22T23:26:44.087930" elapsed="0.004080"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:26:43.747606" elapsed="0.344462"/>
</kw>
<msg time="2026-08-22T23:26:44.092122" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:43.747148" elapsed="0.345020"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:26:43.746437" elapsed="0.345967"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:26:43.746284" elapsed="0.346190"/>
</iter>
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:44.094642" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:44.094515" elapsed="0.000256"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:44.096735" level="INFO">${ip_address} = 10.30.170.12</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:26:44.096234" elapsed="0.000528"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:26:44.096811" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:26:44.096963" level="INFO">${member_ip} = 10.30.170.12</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:26:44.095915" elapsed="0.001073"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:44.101297" level="INFO">${odl_connection} = 63</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:26:44.100619" elapsed="0.000725"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:44.103713" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:44.103791" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:44.103433" elapsed="0.000382"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:44.103976" elapsed="0.000317"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:44.105211" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:44.433657" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.02               Processes:             118
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:42 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:44.104877" elapsed="0.328866"/>
</kw>
<msg time="2026-08-22T23:26:44.433805" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:44.104478" elapsed="0.329392"/>
</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-08-22T23:26:44.102935" elapsed="0.331019"/>
</kw>
<msg time="2026-08-22T23:26:44.434001" 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-08-22T23:26:44.102390" elapsed="0.331661"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:26:44.101869" elapsed="0.332320"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:26:44.434335" elapsed="0.000082"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.12 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:26:44.099446" elapsed="0.335170"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:44.436870" level="INFO">Executing command 'mkdir -p '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data' &amp;&amp; rm -vrf '/tmp/netconf-karaf-9.0.4-SNAPSHOT/log' &amp;&amp; mv -vf '/tmp/log' '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/''.</msg>
<msg time="2026-08-22T23:26:44.449574" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:26:44.449757" level="INFO">${stdout} = renamed '/tmp/log' -&gt; '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log'</msg>
<msg time="2026-08-22T23:26:44.449820" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:26:44.449878" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:44.436669" elapsed="0.013240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:26:44.451032" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:26:44.450663" elapsed="0.000432"/>
</kw>
<msg time="2026-08-22T23:26:44.451229" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:26:44.451289" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:44.450163" elapsed="0.001158"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:44.452164" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:44.451560" elapsed="0.000641"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:44.454352" level="INFO">renamed '/tmp/log' -&gt; '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log'</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:44.453808" elapsed="0.000643"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:44.455347" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:44.454819" elapsed="0.000617"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:44.456342" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:44.455801" elapsed="0.000638"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:26:44.452891" elapsed="0.003666"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:44.452312" elapsed="0.004457"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:44.452283" elapsed="0.004551"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:26:44.457188" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:44.456964" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:44.456925" elapsed="0.000409"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:26:44.457673" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-08-22T23:26:44.457447" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:44.457414" elapsed="0.000460"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:44.458214" elapsed="0.000049"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:26:44.436066" elapsed="0.022548"/>
</kw>
<msg time="2026-08-22T23:26:44.458947" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:44.459203" level="INFO">${result} = renamed '/tmp/log' -&gt; '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log'</msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:44.434938" elapsed="0.024403"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:44.459948" elapsed="0.001318"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:26:44.461699" elapsed="0.000074"/>
</return>
<status status="PASS" start="2026-08-22T23:26:44.461432" elapsed="0.000428"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:44.461411" elapsed="0.000489"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:44.462091" elapsed="0.000049"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:26:44.097727" elapsed="0.364621"/>
</kw>
<msg time="2026-08-22T23:26:44.462408" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:44.097182" elapsed="0.365278"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:26:44.095378" elapsed="0.367169"/>
</kw>
<msg time="2026-08-22T23:26:44.462612" 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-08-22T23:26:44.094924" elapsed="0.367741"/>
</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-08-22T23:26:44.466478" elapsed="0.000168"/>
</kw>
<msg time="2026-08-22T23:26:44.466689" 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-08-22T23:26:44.465870" elapsed="0.000882"/>
</kw>
<kw name="Open 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-08-22T23:26:44.466913" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:44.467076" 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-08-22T23:26:44.462964" elapsed="0.004193"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:26:44.093905" elapsed="0.373310"/>
</kw>
<msg time="2026-08-22T23:26:44.467270" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:44.093444" elapsed="0.373873"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:26:44.092744" elapsed="0.374660"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:26:44.092571" elapsed="0.374878"/>
</iter>
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:44.469655" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:44.469520" elapsed="0.000323"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:44.471815" level="INFO">${ip_address} = 10.30.170.79</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:26:44.471327" elapsed="0.000518"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:26:44.471896" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:26:44.472049" level="INFO">${member_ip} = 10.30.170.79</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:26:44.471003" elapsed="0.001071"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:44.476265" level="INFO">${odl_connection} = 64</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:26:44.475644" elapsed="0.000681"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:44.478496" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:44.478573" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:44.478233" elapsed="0.000406"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:44.478799" elapsed="0.000318"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:44.479989" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:44.804385" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:27 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:43 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:44.479667" elapsed="0.324889"/>
</kw>
<msg time="2026-08-22T23:26:44.804657" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:44.479288" elapsed="0.325453"/>
</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-08-22T23:26:44.477739" elapsed="0.327104"/>
</kw>
<msg time="2026-08-22T23:26:44.804893" 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-08-22T23:26:44.477328" elapsed="0.327620"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:26:44.476814" elapsed="0.328280"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:26:44.805243" elapsed="0.000088"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.79 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:26:44.474597" elapsed="0.330925"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:44.807904" level="INFO">Executing command 'mkdir -p '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data' &amp;&amp; rm -vrf '/tmp/netconf-karaf-9.0.4-SNAPSHOT/log' &amp;&amp; mv -vf '/tmp/log' '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/''.</msg>
<msg time="2026-08-22T23:26:44.820330" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:26:44.820495" level="INFO">${stdout} = renamed '/tmp/log' -&gt; '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log'</msg>
<msg time="2026-08-22T23:26:44.820559" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:26:44.820645" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:26:44.807700" elapsed="0.012978"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:26:44.822429" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:26:44.821826" elapsed="0.000706"/>
</kw>
<msg time="2026-08-22T23:26:44.822780" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:26:44.822879" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:44.821029" elapsed="0.001900"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:44.824307" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:44.823308" elapsed="0.001058"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:44.826960" level="INFO">renamed '/tmp/log' -&gt; '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log'</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:44.826371" elapsed="0.000692"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:44.827981" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:44.827408" elapsed="0.000664"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:44.829003" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:44.828435" elapsed="0.000665"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:26:44.825443" elapsed="0.003777"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:44.824675" elapsed="0.004626"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:44.824623" elapsed="0.004736"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:26:44.829746" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:44.829486" elapsed="0.000360"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:44.829447" elapsed="0.000448"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:26:44.830211" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-08-22T23:26:44.830011" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:44.829977" elapsed="0.000416"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:44.830752" elapsed="0.000056"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:26:44.807093" elapsed="0.024046"/>
</kw>
<msg time="2026-08-22T23:26:44.831463" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:26:44.831758" level="INFO">${result} = renamed '/tmp/log' -&gt; '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log'</msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:26:44.805904" elapsed="0.025991"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:44.832514" elapsed="0.000836"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:26:44.833742" elapsed="0.000072"/>
</return>
<status status="PASS" start="2026-08-22T23:26:44.833489" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:44.833469" elapsed="0.000469"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:44.834128" elapsed="0.000048"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:26:44.472814" elapsed="0.361567"/>
</kw>
<msg time="2026-08-22T23:26:44.834443" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:44.472230" elapsed="0.362263"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:26:44.470464" elapsed="0.364145"/>
</kw>
<msg time="2026-08-22T23:26:44.834656" 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-08-22T23:26:44.470000" elapsed="0.364703"/>
</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-08-22T23:26:44.838423" elapsed="0.000144"/>
</kw>
<msg time="2026-08-22T23:26:44.838628" 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-08-22T23:26:44.837886" elapsed="0.000804"/>
</kw>
<kw name="Open 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-08-22T23:26:44.838850" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:44.839027" 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-08-22T23:26:44.835004" elapsed="0.004103"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:26:44.468905" elapsed="0.370260"/>
</kw>
<msg time="2026-08-22T23:26:44.839219" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:44.468442" elapsed="0.370826"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:26:44.467724" elapsed="0.371669"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:26:44.467546" elapsed="0.371894"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:26:43.746154" elapsed="1.093324"/>
</for>
<arg>mkdir -p '${karaf_home}/data' &amp;&amp; rm -vrf '${karaf_home}/log' &amp;&amp; mv -vf '${tmp_dir}/log' '${karaf_home}/data/'</arg>
<arg>${member_index_list}</arg>
<doc>Cycle through indices (or all), run bash command on each, using temporary SSH session and restoring the previously active one.</doc>
<status status="PASS" start="2026-08-22T23:26:43.743940" elapsed="1.095599"/>
</kw>
<status status="PASS" start="2026-08-22T23:26:43.743647" elapsed="1.095942"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:43.743622" elapsed="1.096021"/>
</if>
<arg>tmp_dir=/tmp</arg>
<doc>Clear @{directory_list} or ['tmp/', 'data/', 'cache/', 'snapshots/', 'journal/', 'segmented-journal/', 'etc/opendaylight/current/', 'etc/host.key'] for members in given list or all. Return None.
If ${tmp_dir} is nonempty, use that location to preserve data/log/.
This is intended to return Karaf (offline) to the state it was upon the first boot.</doc>
<status status="PASS" start="2026-08-22T23:26:40.356892" elapsed="4.482806"/>
</kw>
<doc>Comment out the flag usage in config file. Also clean most data except data/log/.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-08-22T23:26:35.827983" elapsed="9.011846"/>
</test>
<test id="s1-s3-t3" name="Start_All_And_Sync" line="40">
<kw name="Start_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:44.853271" level="INFO">${base_command} = /tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/start</msg>
<var>${base_command}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/bin/start</arg>
<arg>${NODE_START_COMMAND}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:44.852892" elapsed="0.000406"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:44.853851" level="INFO">${command} = /tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/start</msg>
<var>${command}</var>
<arg>"""${export_java_home}""" != ""</arg>
<arg>export JAVA_HOME="${export_java_home}"; ${base_command}</arg>
<arg>${base_command}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:44.853469" elapsed="0.000408"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-08-22T23:26:44.854321" level="INFO">${epoch} = 1787441204.854246</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-08-22T23:26:44.854045" elapsed="0.000302"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:44.854936" level="INFO">${gc_filepath} = /tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log/gc_1787441204.854246.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-08-22T23:26:44.854514" elapsed="0.000448"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:26:44.855502" level="INFO">${gc_options} = -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log/gc_1787441204.854246.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-08-22T23:26:44.855130" elapsed="0.000399"/>
</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-08-22T23:26:44.857087" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:44.856707" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:26:44.857591" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:26:44.857274" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:26:44.857664" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:26:44.857820" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:26:44.856316" elapsed="0.001528"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:44.858918" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:26:44.858644" elapsed="0.000299"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:44.859949" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:44.859828" 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-08-22T23:26:44.862763" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:44.862456" elapsed="0.000406"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:44.862437" elapsed="0.000451"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:44.863151" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:26:44.863253" level="INFO">${current_ssh_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:44.863041" elapsed="0.000239"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:44.863936" level="INFO">Attempting to execute command "/tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/start -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log/gc_1787441204.854246.log" on remote system "10.30.170.200" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:44.863432" elapsed="0.000553"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:44.864614" level="INFO">${conn_id} = 65</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:26:44.864146" elapsed="0.000497"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:44.865843" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:44.865975" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:44.865292" elapsed="0.000708"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:26:44.866190" elapsed="0.000697"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:44.869403" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:45.189661" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.08               Processes:             121
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:44 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:44.868807" elapsed="0.321044"/>
</kw>
<msg time="2026-08-22T23:26:45.189967" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:44.867122" elapsed="0.323002"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:26:44.864860" elapsed="0.325424"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:45.190685" level="INFO">Executing command '/tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/start -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log/gc_1787441204.854246.log'.</msg>
<msg time="2026-08-22T23:26:45.213305" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:26:45.213553" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:26:45.213692" 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-08-22T23:26:45.190464" elapsed="0.023283"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:45.214118" elapsed="0.000450"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:45.215671" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:45.214998" elapsed="0.000770"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:26:45.216246" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:45.215924" elapsed="0.000427"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:45.215879" elapsed="0.000520"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:26:45.216789" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-08-22T23:26:45.216516" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:45.216482" elapsed="0.000489"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:26:45.217045" 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-08-22T23:26:45.236076" elapsed="0.000411"/>
</kw>
<msg time="2026-08-22T23:26:45.236802" 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-08-22T23:26:45.235333" elapsed="0.001635"/>
</kw>
<kw name="Open 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-08-22T23:26:45.237135" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:45.237362" elapsed="0.000023"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:26:45.217768" elapsed="0.019679"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:26:44.861929" elapsed="0.375609"/>
</kw>
<msg time="2026-08-22T23:26:45.237608" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:44.861311" elapsed="0.376347"/>
</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-08-22T23:26:44.860783" elapsed="0.376954"/>
</kw>
<msg time="2026-08-22T23:26:45.237778" 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-08-22T23:26:44.860254" elapsed="0.377570"/>
</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-08-22T23:26:45.241392" elapsed="0.000142"/>
</kw>
<msg time="2026-08-22T23:26:45.241601" 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-08-22T23:26:45.240903" elapsed="0.000763"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:45.241824" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:45.241985" 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-08-22T23:26:45.238121" elapsed="0.003944"/>
</kw>
<msg time="2026-08-22T23:26:45.242154" 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-08-22T23:26:44.859157" elapsed="0.383022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:45.242625" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:45.242362" elapsed="0.000305"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:26:45.242709" 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-08-22T23:26:44.858223" elapsed="0.384609"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:26:44.858042" elapsed="0.384825"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:45.243836" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:26:45.243537" elapsed="0.000325"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:45.244667" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:45.244519" elapsed="0.000276"/>
</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-08-22T23:26:45.247567" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:45.247289" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:45.247096" elapsed="0.000570"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:45.247930" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:26:45.248033" level="INFO">${current_ssh_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:45.247818" elapsed="0.000242"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:45.248728" level="INFO">Attempting to execute command "/tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/start -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log/gc_1787441204.854246.log" on remote system "10.30.170.12" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:45.248227" elapsed="0.000551"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:45.249396" 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-08-22T23:26:45.248972" elapsed="0.000450"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:45.250673" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:45.250802" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:45.250095" elapsed="0.000731"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:26:45.251023" elapsed="0.000692"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:45.253896" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:45.580754" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.02               Processes:             118
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:44 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:45.253299" elapsed="0.327614"/>
</kw>
<msg time="2026-08-22T23:26:45.581017" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:45.251949" elapsed="0.329211"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:26:45.249656" elapsed="0.331648"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:45.581706" level="INFO">Executing command '/tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/start -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log/gc_1787441204.854246.log'.</msg>
<msg time="2026-08-22T23:26:45.604483" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:26:45.604769" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:26:45.604868" 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-08-22T23:26:45.581479" elapsed="0.023440"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:45.605287" elapsed="0.000598"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:45.606930" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:45.606271" elapsed="0.000754"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:26:45.607441" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:45.607180" elapsed="0.000362"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:45.607134" elapsed="0.000502"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:26:45.607996" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-08-22T23:26:45.607760" elapsed="0.000368"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:45.607725" elapsed="0.000455"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:26:45.608255" 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-08-22T23:26:45.627598" elapsed="0.000407"/>
</kw>
<msg time="2026-08-22T23:26:45.628105" 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-08-22T23:26:45.626826" elapsed="0.001447"/>
</kw>
<kw name="Open 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-08-22T23:26:45.628465" elapsed="0.000026"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:45.628805" elapsed="0.000026"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:26:45.608990" elapsed="0.019911"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:26:45.246561" elapsed="0.382447"/>
</kw>
<msg time="2026-08-22T23:26:45.629068" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:45.245996" elapsed="0.383126"/>
</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-08-22T23:26:45.245448" elapsed="0.383761"/>
</kw>
<msg time="2026-08-22T23:26:45.629314" 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-08-22T23:26:45.244954" elapsed="0.384415"/>
</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-08-22T23:26:45.633085" elapsed="0.000142"/>
</kw>
<msg time="2026-08-22T23:26:45.633269" 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-08-22T23:26:45.632525" elapsed="0.000804"/>
</kw>
<kw name="Open 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-08-22T23:26:45.633485" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:45.633668" 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-08-22T23:26:45.629728" elapsed="0.004022"/>
</kw>
<msg time="2026-08-22T23:26:45.633839" 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-08-22T23:26:45.244082" elapsed="0.389781"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:45.634284" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:45.634038" elapsed="0.000287"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:26:45.634368" 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-08-22T23:26:45.243131" elapsed="0.391358"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:26:45.242954" elapsed="0.391571"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:26:45.635491" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:26:45.635225" elapsed="0.000292"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:45.636264" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:45.636154" elapsed="0.000236"/>
</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-08-22T23:26:45.639033" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:45.638759" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:45.638740" elapsed="0.000374"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:45.639373" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:26:45.639472" level="INFO">${current_ssh_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:26:45.639265" elapsed="0.000234"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:45.640138" level="INFO">Attempting to execute command "/tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/start -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log/gc_1787441204.854246.log" on remote system "10.30.170.79" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:45.639670" elapsed="0.000516"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:26:45.640786" level="INFO">${conn_id} = 67</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:26:45.640342" elapsed="0.000470"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:26:45.642207" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:26:45.642335" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:26:45.641679" elapsed="0.000681"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:26:45.642551" elapsed="0.000705"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:26:45.645454" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:26:45.964818" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:27 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:44 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:26:45.644833" elapsed="0.320192"/>
</kw>
<msg time="2026-08-22T23:26:45.965134" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:45.643490" elapsed="0.321788"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:26:45.641023" elapsed="0.324401"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:26:45.965825" level="INFO">Executing command '/tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/start -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log/gc_1787441204.854246.log'.</msg>
<msg time="2026-08-22T23:26:45.988670" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:26:45.988908" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:26:45.989004" 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-08-22T23:26:45.965603" elapsed="0.023452"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:26:45.989465" elapsed="0.000507"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:45.991050" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:45.990377" elapsed="0.000767"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:26:45.991568" elapsed="0.000043"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:45.991304" elapsed="0.000417"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:45.991259" 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-08-22T23:26:45.992129" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-08-22T23:26:45.991892" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-08-22T23:26:45.991857" elapsed="0.000454"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:26:45.992387" 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-08-22T23:26:46.010963" elapsed="0.000386"/>
</kw>
<msg time="2026-08-22T23:26:46.011439" 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-08-22T23:26:46.009829" elapsed="0.001767"/>
</kw>
<kw name="Open 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-08-22T23:26:46.011778" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:46.011942" 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-08-22T23:26:45.993098" elapsed="0.018926"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:26:45.638207" elapsed="0.374017"/>
</kw>
<msg time="2026-08-22T23:26:46.012284" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:26:45.637618" elapsed="0.374717"/>
</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-08-22T23:26:45.637083" elapsed="0.375332"/>
</kw>
<msg time="2026-08-22T23:26:46.012456" 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-08-22T23:26:45.636545" elapsed="0.375956"/>
</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-08-22T23:26:46.016363" elapsed="0.000146"/>
</kw>
<msg time="2026-08-22T23:26:46.016551" 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-08-22T23:26:46.015819" 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="NOT RUN" start="2026-08-22T23:26:46.016791" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:46.016958" 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-08-22T23:26:46.012875" elapsed="0.004164"/>
</kw>
<msg time="2026-08-22T23:26:46.017261" 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-08-22T23:26:45.635750" elapsed="0.381543"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:46.017746" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:46.017476" elapsed="0.000312"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:26:46.017867" 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-08-22T23:26:45.634815" elapsed="0.383179"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:26:45.634618" elapsed="0.383413"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:26:44.857903" elapsed="1.160163"/>
</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-08-22T23:26:44.855768" elapsed="1.162359"/>
</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-08-22T23:26:46.030101" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:46.029712" elapsed="0.000416"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:26:46.030833" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:26:46.030289" elapsed="0.000571"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:26:46.030906" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:26:46.031061" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:26:46.029318" elapsed="0.001767"/>
</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-08-22T23:26:46.032663" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:46.032340" elapsed="0.000350"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:26:46.032736" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:26:46.032882" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-08-22T23:26:46.031993" elapsed="0.000914"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:46.040674" 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-08-22T23:26:46.040397" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:46.041125" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:46.040881" 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-08-22T23:26:46.046809" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', 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-08-22T23:26:46.043387" elapsed="0.007749">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-08-22T23:26:46.041237" elapsed="0.009991">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', 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-08-22T23:26:46.051425" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:46.051264" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-08-22T23:26:46.041218" elapsed="0.010297">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', 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-08-22T23:26:46.052083" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:46.052221" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:46.052184" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:46.052166" 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-08-22T23:26:46.052464" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:26:46.052535" 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-08-22T23:26:46.035886" elapsed="0.016818">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', 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-08-22T23:26:46.052780" 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-08-22T23:26:46.033154" elapsed="0.019726">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', 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-08-22T23:26:46.053101" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-08-22T23:26:46.053230" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:46.053192" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:46.053175" elapsed="0.000118"/>
</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-08-22T23:26:46.053489" 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-08-22T23:26:46.053739" elapsed="0.000024"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="NOT RUN" start="2026-08-22T23:26:46.053807" 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-08-22T23:26:46.031596" elapsed="0.022311">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', 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-08-22T23:26:46.054028" elapsed="0.000023"/>
</continue>
<status status="NOT RUN" start="2026-08-22T23:26:46.053985" elapsed="0.000093"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:46.053968" 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-08-22T23:26:46.054244" elapsed="0.000021"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-08-22T23:26:46.031328" elapsed="0.022986">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', 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-08-22T23:26:46.031141" elapsed="0.023235">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', 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-08-22T23:26:46.028919" elapsed="0.025554">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-08-22T23:26:46.028579" elapsed="0.025951">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<status status="FAIL" start="2026-08-22T23:26:46.028557" elapsed="0.026005">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', 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-08-22T23:26:46.054851" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:46.054649" elapsed="0.000255"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:46.054615" elapsed="0.000312"/>
</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-08-22T23:26:46.055189" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:46.054980" elapsed="0.000264"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:46.054965" elapsed="0.000302"/>
</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-08-22T23:26:46.028161" elapsed="0.027185">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', 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-08-22T23:26:56.075021" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:26:56.074558" elapsed="0.000495"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:26:56.075541" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:26:56.075228" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:26:56.075634" elapsed="0.000038"/>
</return>
<msg time="2026-08-22T23:26:56.075806" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:26:56.074155" elapsed="0.001676"/>
</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-08-22T23:26:56.077356" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:26:56.077048" elapsed="0.000335"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:26:56.077432" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:26:56.077586" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-08-22T23:26:56.076701" elapsed="0.000924"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:56.085345" 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-08-22T23:26:56.085087" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:26:56.085817" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:26:56.085551" 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-08-22T23:26:56.172723" level="INFO">GET Request : url=http://10.30.170.200: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:26:56.172895" level="INFO">GET Response : url=http://10.30.170.200: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-08-22T23:26:56.173360" level="FAIL">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.200: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-08-22T23:26:56.088108" elapsed="0.086096">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.200:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<status status="FAIL" start="2026-08-22T23:26:56.085930" elapsed="0.088459">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.200: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-08-22T23:26:56.174919" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:56.174514" elapsed="0.000553"/>
</branch>
<status status="FAIL" start="2026-08-22T23:26:56.085911" elapsed="0.089213">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.200: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-08-22T23:26:56.176389" elapsed="0.000066"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:26:56.176747" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:56.176661" elapsed="0.000179"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:56.176585" elapsed="0.000393"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:26:56.177318" elapsed="0.000052"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:26:56.177479" elapsed="0.000033"/>
</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-08-22T23:26:56.080396" elapsed="0.097365">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.200: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-08-22T23:26:56.177922" elapsed="0.000035"/>
</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-08-22T23:26:56.077839" elapsed="0.100299">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.200: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-08-22T23:26:56.178673" elapsed="0.000057"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-08-22T23:26:56.178964" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:26:56.178882" elapsed="0.000171"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:56.178845" 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-08-22T23:26:56.179652" elapsed="0.000059"/>
</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-08-22T23:26:56.180150" elapsed="0.000033"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="NOT RUN" start="2026-08-22T23:26:56.180244" elapsed="0.000021"/>
</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-08-22T23:26:56.076306" elapsed="0.104079">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.200: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-08-22T23:26:56.180548" elapsed="0.000024"/>
</continue>
<status status="NOT RUN" start="2026-08-22T23:26:56.180493" elapsed="0.000148"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:56.180470" elapsed="0.000203"/>
</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-08-22T23:26:56.180877" elapsed="0.000030"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-08-22T23:26:56.076072" elapsed="0.104905">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.200: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-08-22T23:26:56.075886" elapsed="0.105172">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.200: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-08-22T23:26:56.073711" elapsed="0.107480">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.200:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<status status="FAIL" start="2026-08-22T23:26:56.073347" elapsed="0.107924">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.200:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</branch>
<status status="FAIL" start="2026-08-22T23:26:56.073323" elapsed="0.107992">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.200: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-08-22T23:26:56.181750" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:56.181407" elapsed="0.000423"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:56.181384" elapsed="0.000479"/>
</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-08-22T23:26:56.182231" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:26:56.181939" elapsed="0.000371"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:26:56.181917" elapsed="0.000425"/>
</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-08-22T23:26:56.072843" elapsed="0.109611">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.200: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-08-22T23:27:06.199732" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:06.199226" elapsed="0.000541"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:27:06.200375" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:27:06.200050" elapsed="0.000352"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:27:06.200454" elapsed="0.000040"/>
</return>
<msg time="2026-08-22T23:27:06.200651" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:27:06.198807" elapsed="0.001869"/>
</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-08-22T23:27:06.202540" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:06.202190" elapsed="0.000378"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:27:06.202632" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:27:06.202784" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-08-22T23:27:06.201541" elapsed="0.001269"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:06.210361" 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-08-22T23:27:06.210102" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:06.210857" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:06.210606" 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-08-22T23:27:06.578413" level="INFO">GET Request : url=http://10.30.170.200: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:06.578649" level="INFO">GET Response : url=http://10.30.170.200: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': 'Sat, 22 Aug 2026 23:27:06 GMT', 'Expires': 'Sat, 22 Aug 2026 22:27:06 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787441226,"status":200} 
 </msg>
<msg time="2026-08-22T23:27:06.578948" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:27:06.213135" elapsed="0.365877"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:06.210971" elapsed="0.368152"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:06.579687" elapsed="0.000070"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:06.579189" elapsed="0.000706"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:06.210952" elapsed="0.368998"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:06.588950" 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787441226,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:06.582890" elapsed="0.006160"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:06.582285" elapsed="0.006880"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:06.582241" elapsed="0.006953"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:06.592410" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:06.589497" elapsed="0.003020"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:06.589252" elapsed="0.003406"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:06.589235" elapsed="0.003452"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:06.593514" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:06.592876" elapsed="0.000666"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:06.593902" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:06.593634" elapsed="0.000458"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:06.594906" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:06.594291" elapsed="0.000703"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:06.594120" elapsed="0.001038"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:06.593614" elapsed="0.001630"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:06.596026" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:06.595415" 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-08-22T23:27:06.596392" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:06.596126" elapsed="0.000452"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:06.597409" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:06.596816" elapsed="0.000678"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:06.596646" elapsed="0.001027"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:06.596107" elapsed="0.001592"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:06.597859" elapsed="0.000702"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:27:06.599641" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:06.598748" elapsed="0.000922"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:27:06.599829" elapsed="0.003177"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:27:06.581250" elapsed="0.021823"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:06.603257" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:06.603144" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:06.603125" elapsed="0.000202"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:27:06.606397" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787441226,...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:27:06.603474" elapsed="0.002954"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:27:06.606479" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:27:06.606664" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787441226,...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:27:06.205563" elapsed="0.401129"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:27:06.606750" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:27:06.606902" level="INFO">${conf_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787441226,...</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-08-22T23:27:06.203025" elapsed="0.403904"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:06.607798" level="INFO">{
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787441226,
 "value": {
  "LocalShards": [
   "member-1-shard-default-config",
   "member-1-shard-inventory-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-08-22T23:27:06.607507" elapsed="0.000340"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:06.608888" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787441226, '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-08-22T23:27:06.608419" elapsed="0.000498"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-08-22T23:27:06.608966" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:27:06.609128" level="INFO">${manager_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787441226, '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-08-22T23:27:06.608073" elapsed="0.001082"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:06.609537" level="INFO">${value_object} = {'LocalShards': ['member-1-shard-default-config', 'member-1-shard-inventory-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-08-22T23:27:06.609310" elapsed="0.000254"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:06.609955" 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-08-22T23:27:06.609740" elapsed="0.000276"/>
</kw>
<return>
<value>${sync_status}</value>
<status status="PASS" start="2026-08-22T23:27:06.610066" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:27:06.610222" 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-08-22T23:27:06.607148" elapsed="0.003100"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-08-22T23:27:06.610426" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:06.610316" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:06.610298" 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-08-22T23:27:06.618253" 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-08-22T23:27:06.618001" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:06.618724" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:06.618461" 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-08-22T23:27:06.627531" level="INFO">GET Request : url=http://10.30.170.200: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:06.627629" level="INFO">GET Response : url=http://10.30.170.200: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': 'Sat, 22 Aug 2026 23:27:06 GMT', 'Expires': 'Sat, 22 Aug 2026 22:27:06 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787441226,"status":200} 
 </msg>
<msg time="2026-08-22T23:27:06.627744" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:27:06.621006" elapsed="0.006765"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:06.618837" elapsed="0.008978"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:06.627996" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:06.627840" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:06.618819" elapsed="0.009315"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:06.633650" 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787441226,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:06.629788" elapsed="0.004005"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:06.629413" elapsed="0.004540"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:06.629387" elapsed="0.004604"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:06.637908" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:06.634421" elapsed="0.003582"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:06.634076" elapsed="0.004040"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:06.634050" elapsed="0.004094"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:06.638884" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:06.638312" 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-08-22T23:27:06.639247" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:06.638984" elapsed="0.000446"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:06.640252" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:06.639644" elapsed="0.000693"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:06.639458" elapsed="0.001040"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:06.638966" elapsed="0.001556"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:06.641241" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:06.640712" 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-08-22T23:27:06.641640" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:06.641340" elapsed="0.000485"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:06.642627" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:06.642019" elapsed="0.000728"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:06.641852" elapsed="0.001058"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:06.641321" elapsed="0.001613"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:06.643090" elapsed="0.000756"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:27:06.644929" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:06.644016" elapsed="0.000947"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:27:06.645121" 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-08-22T23:27:06.628818" elapsed="0.019669"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:06.648696" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:06.648558" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:06.648539" elapsed="0.000225"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:27:06.651673" 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-08-22T23:27:06.648913" elapsed="0.002790"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:27:06.651757" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:27:06.651919" 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-08-22T23:27:06.613448" elapsed="0.038497"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:27:06.652002" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:27:06.652178" 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-08-22T23:27:06.610713" elapsed="0.041493"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:06.653056" level="INFO">{
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787441226,
 "value": {
  "LocalShards": [
   "member-1-shard-default-operational",
   "member-1-shard-inventory-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-08-22T23:27:06.652804" elapsed="0.000299"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:06.654077" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787441226, ...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:06.653678" elapsed="0.000427"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-08-22T23:27:06.654154" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:27:06.654317" level="INFO">${manager_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787441226, ...</msg>
<var>${manager_object}</var>
<arg>${shard_manager_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-08-22T23:27:06.653312" elapsed="0.001033"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:06.654745" level="INFO">${value_object} = {'LocalShards': ['member-1-shard-default-operational', 'member-1-shard-inventory-operational', 'member-1-shard-topology-operational'], '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-08-22T23:27:06.654500" elapsed="0.000272"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:06.655139" 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-08-22T23:27:06.654927" elapsed="0.000237"/>
</kw>
<return>
<value>${sync_status}</value>
<status status="PASS" start="2026-08-22T23:27:06.655211" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:27:06.655361" 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-08-22T23:27:06.652420" elapsed="0.002966"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="PASS" start="2026-08-22T23:27:06.655429" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:27:06.655576" 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-08-22T23:27:06.201160" elapsed="0.454459"/>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="PASS" start="2026-08-22T23:27:06.655842" elapsed="0.000035"/>
</continue>
<status status="PASS" start="2026-08-22T23:27:06.655728" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:06.655709" elapsed="0.000226"/>
</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-08-22T23:27:06.656086" elapsed="0.000022"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:27:06.200927" elapsed="0.455228"/>
</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-08-22T23:27:06.657610" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:06.657294" elapsed="0.000344"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:27:06.657683" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:27:06.657832" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-08-22T23:27:06.656946" elapsed="0.000911"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:06.665629" 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-08-22T23:27:06.665361" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:06.666080" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:06.665837" 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-08-22T23:27:07.040677" level="INFO">GET Request : url=http://10.30.170.12: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:07.040885" level="INFO">GET Response : url=http://10.30.170.12: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': 'Sat, 22 Aug 2026 23:27:07 GMT', 'Expires': 'Sat, 22 Aug 2026 22:27:07 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787441227,"status":200} 
 </msg>
<msg time="2026-08-22T23:27:07.041182" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:27:06.668390" elapsed="0.372853"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:06.666190" elapsed="0.375168"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:07.041895" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:07.041424" elapsed="0.000627"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:06.666172" elapsed="0.375937"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.049556" 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787441227,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:07.045029" elapsed="0.004744"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:07.044413" elapsed="0.005521"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:07.044367" elapsed="0.005607"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.054294" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:07.050407" elapsed="0.004045"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:07.050056" elapsed="0.004580"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:07.050031" elapsed="0.004633"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.055405" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:07.054845" 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-08-22T23:27:07.055802" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:07.055504" elapsed="0.000481"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.056816" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:07.056183" elapsed="0.000718"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:07.056012" elapsed="0.001054"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:07.055486" elapsed="0.001605"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.057834" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:07.057255" 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-08-22T23:27:07.058256" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:07.057988" elapsed="0.000450"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.059255" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:07.058659" elapsed="0.000688"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:07.058466" elapsed="0.001038"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:07.057969" elapsed="0.001560"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:07.059752" elapsed="0.000704"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:27:07.061519" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:07.060684" elapsed="0.000865"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:27:07.061782" elapsed="0.003250"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:27:07.043354" elapsed="0.021746"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:07.065286" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:07.065171" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:07.065152" elapsed="0.000206"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:27:07.068316" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787441227,...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:27:07.065510" elapsed="0.002837"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:27:07.068399" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:27:07.068565" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787441227,...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:27:06.660806" elapsed="0.407811"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:27:07.068677" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:27:07.068830" level="INFO">${conf_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787441227,...</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-08-22T23:27:06.658067" elapsed="0.410790"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.069747" level="INFO">{
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787441227,
 "value": {
  "LocalShards": [
   "member-1-shard-default-config",
   "member-1-shard-inventory-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-08-22T23:27:07.069438" elapsed="0.000358"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.070780" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787441227, '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-08-22T23:27:07.070344" elapsed="0.000465"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-08-22T23:27:07.070858" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:27:07.071018" level="INFO">${manager_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787441227, '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-08-22T23:27:07.070005" elapsed="0.001039"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:07.071422" level="INFO">${value_object} = {'LocalShards': ['member-1-shard-default-config', 'member-1-shard-inventory-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-08-22T23:27:07.071199" elapsed="0.000250"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:07.071855" 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-08-22T23:27:07.071641" elapsed="0.000240"/>
</kw>
<return>
<value>${sync_status}</value>
<status status="PASS" start="2026-08-22T23:27:07.071929" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:27:07.072080" 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-08-22T23:27:07.069077" elapsed="0.003149"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-08-22T23:27:07.072420" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:07.072303" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:07.072285" elapsed="0.000203"/>
</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-08-22T23:27:07.080015" 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-08-22T23:27:07.079764" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.080457" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:07.080215" 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-08-22T23:27:07.089954" level="INFO">GET Request : url=http://10.30.170.12: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:07.090035" level="INFO">GET Response : url=http://10.30.170.12: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': 'Sat, 22 Aug 2026 23:27:07 GMT', 'Expires': 'Sat, 22 Aug 2026 22:27:07 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787441227,"status":200} 
 </msg>
<msg time="2026-08-22T23:27:07.090152" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:27:07.083282" elapsed="0.006897"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:07.080568" elapsed="0.009656"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:07.090424" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:07.090250" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:07.080550" elapsed="0.010024"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.096137" 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787441227,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:07.092313" elapsed="0.003962"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:07.091966" elapsed="0.004468"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:07.091939" elapsed="0.004533"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.100197" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:07.096952" elapsed="0.003340"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:07.096553" elapsed="0.003854"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:07.096529" elapsed="0.003909"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.101170" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:07.100632" 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-08-22T23:27:07.101530" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:07.101269" elapsed="0.000476"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.102545" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:07.101960" elapsed="0.000691"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:07.101789" elapsed="0.001021"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:07.101250" elapsed="0.001585"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.103525" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:07.102999" 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-08-22T23:27:07.103917" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:07.103652" elapsed="0.000445"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.104907" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:07.104290" elapsed="0.000699"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:07.104125" elapsed="0.001017"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:07.103632" elapsed="0.001534"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:07.105318" elapsed="0.000846"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:27:07.107229" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:07.106332" elapsed="0.000925"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:27:07.107413" elapsed="0.003134"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:27:07.091338" elapsed="0.019339"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:07.110857" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:07.110749" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:07.110730" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:27:07.113875" 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-08-22T23:27:07.111070" elapsed="0.002837"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:27:07.113959" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:27:07.114117" 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-08-22T23:27:07.075258" elapsed="0.038886"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:27:07.114201" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:27:07.114349" 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-08-22T23:27:07.072712" elapsed="0.041663"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.115209" level="INFO">{
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787441227,
 "value": {
  "LocalShards": [
   "member-1-shard-default-operational",
   "member-1-shard-inventory-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-08-22T23:27:07.114959" elapsed="0.000298"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.116216" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787441227, ...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:07.115825" elapsed="0.000420"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-08-22T23:27:07.116297" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:27:07.116457" level="INFO">${manager_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787441227, ...</msg>
<var>${manager_object}</var>
<arg>${shard_manager_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-08-22T23:27:07.115465" elapsed="0.001019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:07.116883" level="INFO">${value_object} = {'LocalShards': ['member-1-shard-default-operational', 'member-1-shard-inventory-operational', 'member-1-shard-topology-operational'], '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-08-22T23:27:07.116658" elapsed="0.000252"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:07.117280" 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-08-22T23:27:07.117066" elapsed="0.000239"/>
</kw>
<return>
<value>${sync_status}</value>
<status status="PASS" start="2026-08-22T23:27:07.117352" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:27:07.117504" 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-08-22T23:27:07.114605" elapsed="0.002925"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="PASS" start="2026-08-22T23:27:07.117573" elapsed="0.000042"/>
</return>
<msg time="2026-08-22T23:27:07.117742" 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-08-22T23:27:06.656546" elapsed="0.461221"/>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="PASS" start="2026-08-22T23:27:07.117976" elapsed="0.000031"/>
</continue>
<status status="PASS" start="2026-08-22T23:27:07.117861" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:07.117842" elapsed="0.000222"/>
</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-08-22T23:27:07.118248" elapsed="0.000022"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:27:06.656312" elapsed="0.461993"/>
</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-08-22T23:27:07.119927" 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-08-22T23:27:07.119625" elapsed="0.000329"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:27:07.119999" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:27:07.120147" 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-08-22T23:27:07.119263" elapsed="0.000909"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.127697" 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-08-22T23:27:07.127433" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.128139" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:07.127897" 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-08-22T23:27:07.535811" level="INFO">GET Request : url=http://10.30.170.79: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:07.536040" level="INFO">GET Response : url=http://10.30.170.79: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': 'Sat, 22 Aug 2026 23:27:07 GMT', 'Expires': 'Sat, 22 Aug 2026 22:27:07 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787441227,"status":200} 
 </msg>
<msg time="2026-08-22T23:27:07.536370" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:27:07.130413" elapsed="0.406022"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:07.128249" elapsed="0.408311"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:07.537140" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:07.536676" elapsed="0.000722"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:07.128231" elapsed="0.409221"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.545674" 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787441227,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:07.540515" elapsed="0.005262"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:07.539924" elapsed="0.005972"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:07.539877" elapsed="0.006047"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.549003" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:07.546230" elapsed="0.002871"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:07.545983" elapsed="0.003235"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:07.545965" elapsed="0.003281"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.550048" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:07.549445" 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-08-22T23:27:07.550413" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:07.550148" elapsed="0.000492"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.551475" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:07.550840" elapsed="0.000722"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:07.550669" elapsed="0.001080"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:07.550129" elapsed="0.001645"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.552476" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:07.551940" 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-08-22T23:27:07.552866" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:07.552573" elapsed="0.000475"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.553933" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:07.553296" elapsed="0.000724"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:07.553122" elapsed="0.001060"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:07.552555" elapsed="0.001651"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:07.554367" elapsed="0.000758"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:27:07.556236" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:07.555314" elapsed="0.000950"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:27:07.556422" elapsed="0.003223"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:27:07.538794" elapsed="0.020920"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:07.559903" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:07.559786" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:07.559767" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:27:07.562908" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787441227,...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:27:07.560127" elapsed="0.002811"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:27:07.562990" elapsed="0.000038"/>
</return>
<msg time="2026-08-22T23:27:07.563158" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787441227,...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:27:07.122946" elapsed="0.440238"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:27:07.563242" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:27:07.563411" level="INFO">${conf_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787441227,...</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-08-22T23:27:07.120382" elapsed="0.443056"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.564283" level="INFO">{
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787441227,
 "value": {
  "LocalShards": [
   "member-1-shard-default-config",
   "member-1-shard-inventory-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-08-22T23:27:07.564030" elapsed="0.000302"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.565319" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787441227, '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-08-22T23:27:07.564918" elapsed="0.000429"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-08-22T23:27:07.565396" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:27:07.565556" level="INFO">${manager_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787441227, '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-08-22T23:27:07.564546" elapsed="0.001056"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:07.565990" level="INFO">${value_object} = {'LocalShards': ['member-1-shard-default-config', 'member-1-shard-inventory-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-08-22T23:27:07.565763" elapsed="0.000254"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:07.566387" 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-08-22T23:27:07.566174" elapsed="0.000239"/>
</kw>
<return>
<value>${sync_status}</value>
<status status="PASS" start="2026-08-22T23:27:07.566460" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:27:07.566629" 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-08-22T23:27:07.563674" elapsed="0.002982"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-08-22T23:27:07.566832" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:07.566724" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:07.566707" elapsed="0.000226"/>
</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-08-22T23:27:07.574579" 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-08-22T23:27:07.574327" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.575039" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:07.574795" 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-08-22T23:27:07.584239" level="INFO">GET Request : url=http://10.30.170.79: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:07.584315" level="INFO">GET Response : url=http://10.30.170.79: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': 'Sat, 22 Aug 2026 23:27:07 GMT', 'Expires': 'Sat, 22 Aug 2026 22:27:07 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787441227,"status":200} 
 </msg>
<msg time="2026-08-22T23:27:07.584465" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:27:07.577309" elapsed="0.007201"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:07.575149" 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-08-22T23:27:07.584910" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:07.584684" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:07.575131" 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-08-22T23:27:07.590489" 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787441227,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:07.586729" elapsed="0.003949"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:07.586357" elapsed="0.004481"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:07.586331" elapsed="0.004546"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.594433" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:07.591296" elapsed="0.003233"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:07.590956" elapsed="0.003705"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:07.590932" elapsed="0.003757"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.595407" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:07.594852" 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-08-22T23:27:07.595791" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:07.595507" elapsed="0.000473"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.596816" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:07.596175" elapsed="0.000724"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:07.596008" elapsed="0.001048"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:07.595488" elapsed="0.001593"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.597788" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:07.597244" 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-08-22T23:27:07.598145" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:07.597885" elapsed="0.000448"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.599138" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:07.598527" elapsed="0.000696"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:07.598361" elapsed="0.001019"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:07.597867" 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-08-22T23:27:07.599623" elapsed="0.000698"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:27:07.601387" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:07.600491" elapsed="0.000924"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:27:07.601569" elapsed="0.004672"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:27:07.585772" elapsed="0.020533"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:07.606485" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:07.606376" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:07.606356" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:27:07.609526" 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-08-22T23:27:07.606722" elapsed="0.002835"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:27:07.609659" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:27:07.609828" 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-08-22T23:27:07.569863" elapsed="0.039992"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:27:07.609913" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:27:07.610062" 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-08-22T23:27:07.567140" elapsed="0.042949"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.610985" level="INFO">{
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787441227,
 "value": {
  "LocalShards": [
   "member-1-shard-default-operational",
   "member-1-shard-inventory-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-08-22T23:27:07.610713" elapsed="0.000320"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.612051" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787441227, ...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:07.611640" elapsed="0.000439"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-08-22T23:27:07.612130" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:27:07.612293" level="INFO">${manager_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787441227, ...</msg>
<var>${manager_object}</var>
<arg>${shard_manager_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-08-22T23:27:07.611243" elapsed="0.001076"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:07.612722" level="INFO">${value_object} = {'LocalShards': ['member-1-shard-default-operational', 'member-1-shard-inventory-operational', 'member-1-shard-topology-operational'], '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-08-22T23:27:07.612475" elapsed="0.000274"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:07.613116" 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-08-22T23:27:07.612904" elapsed="0.000238"/>
</kw>
<return>
<value>${sync_status}</value>
<status status="PASS" start="2026-08-22T23:27:07.613189" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:27:07.613338" 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-08-22T23:27:07.610321" elapsed="0.003042"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="PASS" start="2026-08-22T23:27:07.613406" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:27:07.613550" 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-08-22T23:27:07.118882" elapsed="0.494693"/>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="PASS" start="2026-08-22T23:27:07.613784" elapsed="0.000034"/>
</continue>
<status status="PASS" start="2026-08-22T23:27:07.613666" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:07.613647" elapsed="0.000228"/>
</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-08-22T23:27:07.614024" elapsed="0.000022"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:27:07.118646" elapsed="0.495433"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:27:06.200736" elapsed="1.413378"/>
</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-08-22T23:27:06.198335" elapsed="1.415880"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:06.197980" elapsed="1.416268"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:06.197953" elapsed="1.416318"/>
</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-08-22T23:27:07.615809" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:07.615372" elapsed="0.000464"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.616303" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:27:07.615997" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:27:07.616373" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:27:07.616526" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:27:07.614994" elapsed="0.001557"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.617603" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:07.617284" elapsed="0.000347"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:27:07.617677" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:27:07.617826" 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-08-22T23:27:07.616938" 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-08-22T23:27:07.716576" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:07.715758" elapsed="0.000953"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:27:07.718010" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:27:07.717689" elapsed="0.000404">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:27:07.718294" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:27:07.716990" elapsed="0.001405"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.719561" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:07.718690" elapsed="0.001096"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:27:07.720414" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:27:07.720742" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:27:07.720058" elapsed="0.000788"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.721706" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:07.721085" elapsed="0.000772"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.723570" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:07.723301" elapsed="0.000363"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.724119" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:27:07.723842" 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-08-22T23:27:07.724477" 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-08-22T23:27:07.724728" 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-08-22T23:27:07.724905" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-08-22T23:27:07.724341" elapsed="0.000620"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-08-22T23:27:07.724197" elapsed="0.000794"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:27:07.725037" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:27:07.725412" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:27:07.722790" elapsed="0.002656"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:07.721976" elapsed="0.003517"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:07.725972" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:07.725667" elapsed="0.000392"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:07.721938" elapsed="0.004211"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.727285" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:07.726364" elapsed="0.001025"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:27:07.727467" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:27:07.714485" elapsed="0.013293"/>
</kw>
<msg time="2026-08-22T23:27:07.727856" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:07.656386" elapsed="0.071526"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:07.741073" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:07.753904" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:07.766751" 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-08-22T23:27:07.766950" 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-08-22T23:27:07.767127" 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-08-22T23:27:07.767545" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:07.767395" elapsed="0.000370"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:07.767380" elapsed="0.000415"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:07.767944" elapsed="0.000043"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:07.768139" 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-08-22T23:27:07.768307" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:27:07.767347" elapsed="0.001012"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:27:07.767206" elapsed="0.001179"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:07.768533" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:07.768631" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:27:07.768765" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:27:07.651976" elapsed="0.116815"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:27:07.770260" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:27:07.769880" elapsed="0.000450">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:27:07.770424" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:27:07.769499" elapsed="0.000950"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:07.770802" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:07.770519" elapsed="0.000341"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.771486" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:07.771069" elapsed="0.000444"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:07.770885" elapsed="0.000664"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:07.770501" elapsed="0.001070"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.774096" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:07.771749" elapsed="0.002374"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:27:07.774174" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:27:07.774330" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:27:07.769165" 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-08-22T23:27:07.775746" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:27:07.775368" elapsed="0.000442">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-08-22T23:27:07.775903" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:27:07.775031" elapsed="0.000897"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-08-22T23:27:07.776162" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:27:07.776022" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:07.775980" elapsed="0.000267"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:07.776395" 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-08-22T23:27:07.776572" elapsed="0.000042"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-08-22T23:27:07.776661" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:27:07.778830" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:27:07.774704" elapsed="0.004153"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.780271" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:07.780014" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:07.780734" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:07.780471" 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-08-22T23:27:08.287085" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:08.287680" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node092vt7sdvuy3ynpqqa34eavwc0.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Fri, 21-Aug-2026 23:27:08 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":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","cms-enveloped-data-format","csr-generation","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cms-encrypted-data-format","cleartext-private-keys","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-netconf-monitoring_2010-10-04","revision":"2010-10-04","schema":"/rests/modules/ietf-netconf-monitoring?revision=2010-10-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring","conformance-type":"import"},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["https-listen","http-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"odl-netconf-device_2025-12-05","revision":"2025-12-05","schema":"/rests/modules/odl-netconf-device?revision=2025-12-05","namespace":"urn:opendaylight:netconf:device","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-http-server_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-server?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["tcp-supported","tls-supported"]},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"netconf-keystore_2024-07-08","revision":"2024-07-08","schema":"/rests/modules/netconf-keystore?revision=2024-07-08","namespace":"urn:opendaylight:netconf:keystore","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["url","xpath","rollback-on-error","validate","startup","confirmed-commit","candidate","writable-running"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-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_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["tcp-client-keepalives","local-binding-supported"]},{"name":"ietf-netconf-client_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-netconf-client?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-client","conformance-type":"import","feature":["ssh-listen","tls-listen","tls-initiate","central-netconf-client-supported","ssh-initiate"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":[... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-08-22T23:27:08.288311" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:27:07.783009" elapsed="0.505368"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:07.780845" elapsed="0.507646"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:08.289040" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:08.288561" elapsed="0.000630"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:07.780827" elapsed="0.508414"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:08.296473" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","cms-enveloped-data-format","csr-generation","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cms-encrypted-data-format","cleartext-private-keys","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-netconf-monitoring_2010-10-04","revision":"2010-10-04","schema":"/rests/modules/ietf-netconf-monitoring?revision=2010-10-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring","conformance-type":"import"},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["https-listen","http-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"odl-netconf-device_2025-12-05","revision":"2025-12-05","schema":"/rests/modules/odl-netconf-device?revision=2025-12-05","namespace":"urn:opendaylight:netconf:device","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-http-server_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-server?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["tcp-supported","tls-supported"]},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"netconf-keystore_2024-07-08","revision":"2024-07-08","schema":"/rests/modules/netconf-keystore?revision=2024-07-08","namespace":"urn:opendaylight:netconf:keystore","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["url","xpath","rollback-on-error","validate","startup","confirmed-commit","candidate","writable-running"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-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_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["tcp-client-keepalives","local-binding-supported"]},{"name":"ietf-netconf-client_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-netconf-client?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-client","conformance-type":"import","feature":["ssh-listen","tls-listen","tls-initiate","central-netconf-client-supported","ssh-initiate"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"netconf-node-optional_2022-12-25","revision":"2022-12-25","schema":"/rests/modules/netconf-node-optional?revision=2022-12-25","namespace":"urn:opendaylight:netconf-node-optional","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","arbitrary-names","if-mib"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert: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":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"netconf-node-topology_2025-12-05","revision":"2025-12-05","schema":"/rests/modules/netconf-node-topology?revision=2025-12-05","namespace":"urn:opendaylight:netconf-node-topology","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-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-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","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":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:08.292250" elapsed="0.004549"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:08.291666" elapsed="0.005255"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:08.291617" elapsed="0.005333"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:08.300155" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:08.297267" elapsed="0.002985"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:08.297011" elapsed="0.003358"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:08.296993" elapsed="0.003403"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:08.301203" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:08.300608" 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-08-22T23:27:08.301621" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:08.301306" elapsed="0.000539"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:08.302700" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:08.302049" elapsed="0.000740"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:08.301873" elapsed="0.001080"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:08.301287" elapsed="0.001692"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:08.303737" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:08.303150" 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-08-22T23:27:08.304108" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:08.303838" elapsed="0.000462"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:08.305151" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:08.304499" elapsed="0.000739"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:08.304329" elapsed="0.001068"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:08.303819" elapsed="0.001603"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:08.305670" elapsed="0.000734"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:27:08.307529" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:08.306653" elapsed="0.000903"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:27:08.307791" elapsed="0.003440"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:27:08.290536" elapsed="0.020766"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:08.311491" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:08.311375" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:08.311356" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:27:08.323211" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:27:08.311770" elapsed="0.011476"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:27:08.323309" elapsed="0.000041"/>
</return>
<msg time="2026-08-22T23:27:08.323496" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:27:07.779173" elapsed="0.544351"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:27:08.323699" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:27:08.323870" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-08-22T23:27:07.628505" elapsed="0.695393"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:08.324280" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:08.323992" elapsed="0.000428"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:08.323971" elapsed="0.000477"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:27:08.324484" 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-08-22T23:27:07.622131" elapsed="0.702513"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:27:07.616770" elapsed="0.707921"/>
</iter>
<iter>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:08.325794" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:08.325369" elapsed="0.000454"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:27:08.325871" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:27:08.326023" 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-08-22T23:27:08.324979" elapsed="0.001070"/>
</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-08-22T23:27:08.429661" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:08.428743" elapsed="0.001036"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:27:08.431092" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:27:08.430815" elapsed="0.000358">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:27:08.431377" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:27:08.430098" elapsed="0.001385"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:27:08.432972" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:08.431793" elapsed="0.001286"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:27:08.433727" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:27:08.434085" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:27:08.433327" elapsed="0.000864"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:08.435085" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:08.434435" elapsed="0.000803"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:08.437153" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:08.436883" elapsed="0.000316"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:27:08.437669" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:27:08.437361" elapsed="0.000336"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:08.438066" 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-08-22T23:27:08.438281" 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-08-22T23:27:08.438459" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-08-22T23:27:08.437901" elapsed="0.000616"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-08-22T23:27:08.437753" elapsed="0.000795"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:27:08.438691" elapsed="0.000039"/>
</return>
<msg time="2026-08-22T23:27:08.439052" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:27:08.436259" elapsed="0.002827"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:08.435370" elapsed="0.003765"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:08.439534" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:08.439229" elapsed="0.000421"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:08.435328" elapsed="0.004414"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:08.441034" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:08.439962" elapsed="0.001180"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:27:08.441236" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:27:08.427240" elapsed="0.014293"/>
</kw>
<msg time="2026-08-22T23:27:08.441644" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:08.367132" elapsed="0.074581"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:08.454965" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:08.468314" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:08.481298" 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-08-22T23:27:08.481546" 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-08-22T23:27:08.481775" 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-08-22T23:27:08.482270" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:08.482100" elapsed="0.000382"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:08.482082" elapsed="0.000432"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:08.482698" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:08.482878" 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-08-22T23:27:08.483046" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:27:08.482038" elapsed="0.001061"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:27:08.481864" elapsed="0.001264"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:08.483278" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:08.483358" elapsed="0.000019"/>
</return>
<msg time="2026-08-22T23:27:08.483520" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:27:08.362597" elapsed="0.120951"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:27:08.485238" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:27:08.484813" elapsed="0.000501">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:27:08.485412" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:27:08.484291" elapsed="0.001146"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:08.485826" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:08.485509" elapsed="0.000377"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:08.486572" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:08.486098" elapsed="0.000526"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:08.485911" elapsed="0.000753"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:08.485491" elapsed="0.001195"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:27:08.489194" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:08.486844" elapsed="0.002378"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:27:08.489275" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:27:08.489436" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:27:08.483928" elapsed="0.005533"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:27:08.490903" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:27:08.490505" elapsed="0.000466">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-08-22T23:27:08.491066" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:27:08.490139" elapsed="0.000952"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-08-22T23:27:08.491302" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:27:08.491162" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:08.491143" 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-08-22T23:27:08.491535" 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-08-22T23:27:08.491747" elapsed="0.000023"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-08-22T23:27:08.491817" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:27:08.494006" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:27:08.489807" elapsed="0.004227"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:08.495510" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:08.495251" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:08.495995" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:08.495746" 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-08-22T23:27:08.943740" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:08.944280" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node01f6tx31nfabcf18fm84em17r800.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Fri, 21-Aug-2026 23:27:08 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":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","cms-enveloped-data-format","csr-generation","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cms-encrypted-data-format","cleartext-private-keys","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["hello-params","tls12","tls13"]},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-netconf-monitoring_2010-10-04","revision":"2010-10-04","schema":"/rests/modules/ietf-netconf-monitoring?revision=2010-10-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring","conformance-type":"import"},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["https-listen","http-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"odl-netconf-device_2025-12-05","revision":"2025-12-05","schema":"/rests/modules/odl-netconf-device?revision=2025-12-05","namespace":"urn:opendaylight:netconf:device","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","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":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-http-server_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-server?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["tcp-supported","tls-supported"]},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"netconf-keystore_2024-07-08","revision":"2024-07-08","schema":"/rests/modules/netconf-keystore?revision=2024-07-08","namespace":"urn:opendaylight:netconf:keystore","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":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["url","xpath","rollback-on-error","validate","candidate","startup","confirmed-commit","writable-running"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-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_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["tcp-client-keepalives","local-binding-supported"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"ietf-netconf-client_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-netconf-client?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-client","conformance-type":"import","feature":["ssh-listen","tls-listen","tls-initiate","central-netconf-client-supported","ssh-initiate"]},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":[... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-08-22T23:27:08.944776" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:27:08.498260" elapsed="0.446561"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:08.496108" elapsed="0.448798"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:08.945270" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:08.944957" elapsed="0.000417"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:08.496089" elapsed="0.449319"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:08.951982" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","cms-enveloped-data-format","csr-generation","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cms-encrypted-data-format","cleartext-private-keys","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["hello-params","tls12","tls13"]},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-netconf-monitoring_2010-10-04","revision":"2010-10-04","schema":"/rests/modules/ietf-netconf-monitoring?revision=2010-10-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring","conformance-type":"import"},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["https-listen","http-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"odl-netconf-device_2025-12-05","revision":"2025-12-05","schema":"/rests/modules/odl-netconf-device?revision=2025-12-05","namespace":"urn:opendaylight:netconf:device","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","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":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-http-server_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-server?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["tcp-supported","tls-supported"]},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"netconf-keystore_2024-07-08","revision":"2024-07-08","schema":"/rests/modules/netconf-keystore?revision=2024-07-08","namespace":"urn:opendaylight:netconf:keystore","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":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["url","xpath","rollback-on-error","validate","candidate","startup","confirmed-commit","writable-running"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-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_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["tcp-client-keepalives","local-binding-supported"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"ietf-netconf-client_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-netconf-client?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-client","conformance-type":"import","feature":["ssh-listen","tls-listen","tls-initiate","central-netconf-client-supported","ssh-initiate"]},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"netconf-node-optional_2022-12-25","revision":"2022-12-25","schema":"/rests/modules/netconf-node-optional?revision=2022-12-25","namespace":"urn:opendaylight:netconf-node-optional","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","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","arbitrary-names","if-mib"]},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert: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":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"netconf-node-topology_2025-12-05","revision":"2025-12-05","schema":"/rests/modules/netconf-node-topology?revision=2025-12-05","namespace":"urn:opendaylight:netconf-node-topology","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-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-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","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":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:08.947425" elapsed="0.004931"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:08.947035" elapsed="0.005455"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:08.947003" elapsed="0.005515"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:08.955688" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:08.952871" elapsed="0.002913"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:08.952609" elapsed="0.003291"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:08.952560" elapsed="0.003369"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:08.956736" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:08.956124" 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-08-22T23:27:08.957109" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:08.956837" elapsed="0.000462"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:08.958127" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:08.957499" elapsed="0.000713"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:08.957327" elapsed="0.001048"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:08.956818" elapsed="0.001582"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:08.959306" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:08.958568" elapsed="0.000765"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:08.959736" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:08.959404" elapsed="0.000520"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:08.960743" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:08.960120" elapsed="0.000710"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:08.959952" elapsed="0.001035"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:08.959386" elapsed="0.001626"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:08.961175" elapsed="0.000763"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:27:08.963034" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:08.962109" elapsed="0.000953"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:27:08.963222" elapsed="0.003442"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:27:08.946278" elapsed="0.020459"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:08.966929" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:08.966812" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:08.966792" elapsed="0.000211"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:27:08.978158" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:27:08.967152" elapsed="0.011038"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:27:08.978248" elapsed="0.000041"/>
</return>
<msg time="2026-08-22T23:27:08.978428" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:27:08.494399" elapsed="0.484057"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:27:08.978522" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:27:08.978813" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-08-22T23:27:08.338172" elapsed="0.640669"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:08.979216" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:08.978930" elapsed="0.000430"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:08.978911" elapsed="0.000476"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:27:08.979423" 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-08-22T23:27:08.330307" elapsed="0.649245"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:27:08.324801" elapsed="0.654811"/>
</iter>
<iter>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:08.980642" 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-08-22T23:27:08.980295" elapsed="0.000375"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:27:08.980720" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:27:08.980870" 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-08-22T23:27:08.979916" elapsed="0.000979"/>
</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-08-22T23:27:09.079877" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:09.078997" elapsed="0.001019"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:27:09.081269" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:27:09.081002" elapsed="0.000344">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:27:09.081553" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:27:09.080302" elapsed="0.001394"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:27:09.082929" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:09.081971" elapsed="0.001062"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:27:09.083709" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:27:09.084021" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:27:09.083277" elapsed="0.000849"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:09.084990" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:09.084364" elapsed="0.000776"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:09.086997" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:09.086726" elapsed="0.000318"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:27:09.087480" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:27:09.087207" 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-08-22T23:27:09.087901" 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-08-22T23:27:09.088139" 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-08-22T23:27:09.088315" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-08-22T23:27:09.087764" elapsed="0.000609"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-08-22T23:27:09.087559" elapsed="0.000843"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:27:09.088455" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:27:09.088843" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:27:09.086157" elapsed="0.002720"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:09.085266" elapsed="0.003659"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:09.089320" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:09.089017" elapsed="0.000389"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:09.085226" elapsed="0.004275"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:09.090739" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:09.089736" elapsed="0.001109"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:27:09.090922" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:27:09.077704" elapsed="0.013490"/>
</kw>
<msg time="2026-08-22T23:27:09.091251" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:09.019214" elapsed="0.072091"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:09.104208" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:09.117386" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:09.130200" 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-08-22T23:27:09.130400" 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-08-22T23:27:09.130580" 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-08-22T23:27:09.131005" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:09.130857" elapsed="0.000352"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:09.130841" elapsed="0.000396"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:09.131383" 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-08-22T23:27:09.131554" 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-08-22T23:27:09.131746" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:27:09.130809" elapsed="0.000992"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:27:09.130669" elapsed="0.001157"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:09.131972" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:09.132050" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:27:09.132187" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:27:09.014700" elapsed="0.117513"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:27:09.133695" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:27:09.133288" elapsed="0.000483">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:27:09.133866" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:27:09.132892" elapsed="0.000999"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:09.134213" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:09.133962" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:09.134942" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:09.134492" elapsed="0.000477"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:09.134294" elapsed="0.000712"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:09.133944" elapsed="0.001083"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:27:09.137549" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:09.135180" elapsed="0.002416"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:27:09.137651" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:27:09.137805" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:27:09.132542" elapsed="0.005287"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:27:09.139179" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:27:09.138827" elapsed="0.000415">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-08-22T23:27:09.139335" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:27:09.138462" elapsed="0.000898"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-08-22T23:27:09.139565" elapsed="0.000049"/>
</return>
<status status="PASS" start="2026-08-22T23:27:09.139430" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:09.139412" elapsed="0.000262"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:09.139824" 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-08-22T23:27:09.139997" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-08-22T23:27:09.140064" elapsed="0.000024"/>
</return>
<msg time="2026-08-22T23:27:09.142217" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:27:09.138136" elapsed="0.004108"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:09.143662" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:09.143391" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:09.144134" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:09.143866" 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-08-22T23:27:09.591259" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:09.591825" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node0p5mw34rlawrn11sjmhn1mcatt0.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Fri, 21-Aug-2026 23:27:09 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":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","cms-enveloped-data-format","csr-generation","hidden-symmetric-keys","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cms-encrypted-data-format","cleartext-private-keys","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["hello-params","tls12","tls13"]},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-netconf-monitoring_2010-10-04","revision":"2010-10-04","schema":"/rests/modules/ietf-netconf-monitoring?revision=2010-10-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring","conformance-type":"import"},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["https-listen","http-listen"]},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"odl-netconf-device_2025-12-05","revision":"2025-12-05","schema":"/rests/modules/odl-netconf-device?revision=2025-12-05","namespace":"urn:opendaylight:netconf:device","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-http-server_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-server?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["tcp-supported","tls-supported"]},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"netconf-keystore_2024-07-08","revision":"2024-07-08","schema":"/rests/modules/netconf-keystore?revision=2024-07-08","namespace":"urn:opendaylight:netconf:keystore","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["url","xpath","rollback-on-error","validate","startup","confirmed-commit","candidate","writable-running"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["tcp-client-keepalives","local-binding-supported"]},{"name":"ietf-netconf-client_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-netconf-client?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-client","conformance-type":"import","feature":["ssh-listen","tls-listen","tls-initiate","central-netconf-client-supported","ssh-initiate"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":[... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-08-22T23:27:09.592403" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:27:09.146392" elapsed="0.446077"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:09.144247" elapsed="0.448375"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:09.593106" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:09.592692" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:09.144229" elapsed="0.449095"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:09.600333" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","cms-enveloped-data-format","csr-generation","hidden-symmetric-keys","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cms-encrypted-data-format","cleartext-private-keys","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["hello-params","tls12","tls13"]},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-netconf-monitoring_2010-10-04","revision":"2010-10-04","schema":"/rests/modules/ietf-netconf-monitoring?revision=2010-10-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring","conformance-type":"import"},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["https-listen","http-listen"]},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"odl-netconf-device_2025-12-05","revision":"2025-12-05","schema":"/rests/modules/odl-netconf-device?revision=2025-12-05","namespace":"urn:opendaylight:netconf:device","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-http-server_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-server?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["tcp-supported","tls-supported"]},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"netconf-keystore_2024-07-08","revision":"2024-07-08","schema":"/rests/modules/netconf-keystore?revision=2024-07-08","namespace":"urn:opendaylight:netconf:keystore","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["url","xpath","rollback-on-error","validate","startup","confirmed-commit","candidate","writable-running"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["tcp-client-keepalives","local-binding-supported"]},{"name":"ietf-netconf-client_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-netconf-client?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-client","conformance-type":"import","feature":["ssh-listen","tls-listen","tls-initiate","central-netconf-client-supported","ssh-initiate"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"netconf-node-optional_2022-12-25","revision":"2022-12-25","schema":"/rests/modules/netconf-node-optional?revision=2022-12-25","namespace":"urn:opendaylight:netconf-node-optional","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","arbitrary-names","if-mib"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert: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":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"netconf-node-topology_2025-12-05","revision":"2025-12-05","schema":"/rests/modules/netconf-node-topology?revision=2025-12-05","namespace":"urn:opendaylight:netconf-node-topology","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:09.596223" elapsed="0.004405"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:09.595654" elapsed="0.005091"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:09.595573" elapsed="0.005200"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:09.603905" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:09.601081" elapsed="0.002923"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:09.600832" elapsed="0.003287"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:09.600815" elapsed="0.003332"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:09.604927" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:09.604334" 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-08-22T23:27:09.605298" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:09.605028" elapsed="0.000488"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:09.606356" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:09.605752" elapsed="0.000688"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:09.605544" elapsed="0.001078"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:09.605010" elapsed="0.001638"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:09.607356" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:09.606816" 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-08-22T23:27:09.607752" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:09.607455" elapsed="0.000482"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:09.608761" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:09.608135" elapsed="0.000712"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:09.607965" elapsed="0.001041"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:09.607437" 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-08-22T23:27:09.609188" elapsed="0.000782"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:27:09.611057" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:09.610139" elapsed="0.000945"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:27:09.611243" elapsed="0.004512"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:27:09.594555" elapsed="0.021268"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:09.616006" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:09.615893" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:09.615875" elapsed="0.000203"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:27:09.627531" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:27:09.616226" elapsed="0.011337"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:27:09.627635" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:27:09.627807" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:27:09.142554" elapsed="0.485280"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:27:09.627899" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:27:09.628051" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-08-22T23:27:08.991268" elapsed="0.636809"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:09.628409" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:09.628160" elapsed="0.000360"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:09.628143" elapsed="0.000402"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:27:09.628604" 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-08-22T23:27:08.984966" elapsed="0.643766"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:27:08.979738" elapsed="0.649035"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:27:07.616628" elapsed="2.012178"/>
</for>
<arg>${member_index_list}</arg>
<status status="PASS" start="2026-08-22T23:27:07.614610" elapsed="2.014253"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:07.614326" elapsed="2.014565"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:07.614310" elapsed="2.014604"/>
</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-08-22T23:27:09.629306" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:09.628970" elapsed="0.000395"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:09.628954" elapsed="0.000460"/>
</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-08-22T23:27:06.197414" elapsed="3.432048"/>
</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-08-22T23:26:46.018294" elapsed="23.611229"/>
</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-08-22T23:27:09.633065" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:09.632676" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:27:09.633593" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:27:09.633255" elapsed="0.000366"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:27:09.633668" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:27:09.633824" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:27:09.632243" elapsed="0.001605"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:09.634936" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:27:09.634666" elapsed="0.000296"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:09.635769" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:27:09.635871" level="INFO">${current_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:27:09.635635" 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-08-22T23:27:09.638559" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:09.638285" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:09.638267" elapsed="0.000391"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:09.638915" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:27:09.639015" level="INFO">${current_ssh_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:27:09.638806" elapsed="0.000236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:09.639695" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.200" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:09.639191" elapsed="0.000552"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:09.640559" level="INFO">${conn_id} = 68</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:27:09.639935" elapsed="0.000670"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:27:09.641934" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:27:09.642039" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:27:09.641296" elapsed="0.000769"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:27:09.642229" elapsed="0.000587"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:27:09.644253" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:27:09.967898" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.08               Processes:             121
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:45 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:27:09.643573" elapsed="0.324522"/>
</kw>
<msg time="2026-08-22T23:27:09.968211" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:09.642992" elapsed="0.325355"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:27:09.640828" elapsed="0.327634"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:27:09.968975" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-08-22T23:27:09.981207" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-08-22T23:27:09.981453" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:27:09.981550" 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-08-22T23:27:09.968721" elapsed="0.012919"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:27:09.982013" elapsed="0.000464"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:09.983630" 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-08-22T23:27:09.982933" elapsed="0.000803"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:27:09.984195" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:09.983908" elapsed="0.000393"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:09.983859" elapsed="0.000493"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:27:09.984767" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-08-22T23:27:09.984469" elapsed="0.000433"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:09.984435" elapsed="0.000522"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:27:09.985033" 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-08-22T23:27:09.991730" elapsed="0.000499"/>
</kw>
<msg time="2026-08-22T23:27:09.992342" 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-08-22T23:27:09.990504" elapsed="0.001983"/>
</kw>
<kw name="Open 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-08-22T23:27:09.992737" elapsed="0.000032"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:09.992971" elapsed="0.000029"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:27:09.985757" 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-08-22T23:27:09.637734" elapsed="0.355482"/>
</kw>
<msg time="2026-08-22T23:27:09.993291" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:09.637135" elapsed="0.356242"/>
</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-08-22T23:27:09.636558" elapsed="0.356928"/>
</kw>
<msg time="2026-08-22T23:27:09.993542" 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-08-22T23:27:09.636054" elapsed="0.357677"/>
</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-08-22T23:27:09.997879" elapsed="0.000147"/>
</kw>
<msg time="2026-08-22T23:27:09.998069" 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-08-22T23:27:09.997282" 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="NOT RUN" start="2026-08-22T23:27:09.998291" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:09.998476" 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-08-22T23:27:09.994147" elapsed="0.004412"/>
</kw>
<msg time="2026-08-22T23:27:09.998668" 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-08-22T23:27:09.635180" elapsed="0.363514"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:09.999121" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:09.998873" elapsed="0.000291"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:27:09.999207" 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-08-22T23:27:09.634213" elapsed="0.365118"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:27:09.634036" elapsed="0.365331"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:10.000386" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:27:10.000111" elapsed="0.000301"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:10.001217" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:27:10.001318" level="INFO">${current_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:27:10.004477" level="INFO">${current_ssh_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:27:10.004268" elapsed="0.000236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:10.005136" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.12" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:10.004670" elapsed="0.000513"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:10.005795" 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-08-22T23:27:10.005339" elapsed="0.000483"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:27:10.007115" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:27:10.007213" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:27:10.006715" 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-08-22T23:27:10.007401" elapsed="0.000700"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:27:10.009488" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:27:10.330620" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.02               Processes:             118
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:45 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:27:10.008856" elapsed="0.322084"/>
</kw>
<msg time="2026-08-22T23:27:10.331067" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:10.008276" elapsed="0.322948"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:27:10.006036" elapsed="0.325304"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:27:10.331856" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-08-22T23:27:10.344674" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-08-22T23:27:10.344838" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:27:10.344904" 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-08-22T23:27:10.331574" elapsed="0.013365"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:27:10.345189" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:10.346681" 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-08-22T23:27:10.345986" 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-08-22T23:27:10.347264" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:10.346948" elapsed="0.000426"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:10.346899" 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-08-22T23:27:10.347810" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-08-22T23:27:10.347542" elapsed="0.000400"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:10.347508" elapsed="0.000487"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:27:10.348071" 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-08-22T23:27:10.356247" elapsed="0.000382"/>
</kw>
<msg time="2026-08-22T23:27:10.356712" 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-08-22T23:27:10.354932" elapsed="0.001889"/>
</kw>
<kw name="Open 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-08-22T23:27:10.356985" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:10.357147" 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-08-22T23:27:10.348806" elapsed="0.008422"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:27:10.003190" elapsed="0.354131"/>
</kw>
<msg time="2026-08-22T23:27:10.357375" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:10.002634" elapsed="0.354802"/>
</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-08-22T23:27:10.002027" elapsed="0.355492"/>
</kw>
<msg time="2026-08-22T23:27:10.357559" 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-08-22T23:27:10.001502" elapsed="0.356137"/>
</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-08-22T23:27:10.361457" elapsed="0.000161"/>
</kw>
<msg time="2026-08-22T23:27:10.361662" 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-08-22T23:27:10.360965" elapsed="0.000758"/>
</kw>
<kw name="Open 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-08-22T23:27:10.361880" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:10.362043" elapsed="0.000033"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:27:10.357933" elapsed="0.004204"/>
</kw>
<msg time="2026-08-22T23:27:10.362231" 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-08-22T23:27:10.000653" elapsed="0.361603"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:10.362718" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:10.362449" elapsed="0.000311"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:27:10.362803" 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-08-22T23:27:09.999668" elapsed="0.363415"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:27:09.999466" elapsed="0.363656"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:10.364187" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:27:10.363912" elapsed="0.000302"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:10.365017" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:27:10.365118" level="INFO">${current_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:27:10.368345" level="INFO">${current_ssh_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:27:10.368136" elapsed="0.000236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:10.369031" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.79" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:10.368530" elapsed="0.000548"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:10.369709" level="INFO">${conn_id} = 70</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:27:10.369236" elapsed="0.000500"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:27:10.370881" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:27:10.370979" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:27:10.370450" elapsed="0.000555"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:27:10.371165" elapsed="0.000613"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:27:10.373259" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:27:10.701388" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:27 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:26:45 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:27:10.372570" elapsed="0.329069"/>
</kw>
<msg time="2026-08-22T23:27:10.701769" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:10.371954" elapsed="0.329957"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:27:10.369954" elapsed="0.332076"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:27:10.702620" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-08-22T23:27:10.714663" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-08-22T23:27:10.714827" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:27:10.714890" 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-08-22T23:27:10.702282" elapsed="0.012641"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:27:10.715161" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:10.716310" 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-08-22T23:27:10.715837" 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-08-22T23:27:10.716828" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:10.716618" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:10.716552" elapsed="0.000381"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:27:10.717161" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:27:10.717010" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:10.716988" elapsed="0.000289"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:27:10.717325" 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">
<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-08-22T23:27:10.722981" elapsed="0.000497"/>
</kw>
<msg time="2026-08-22T23:27:10.723615" 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-08-22T23:27:10.721743" elapsed="0.002022"/>
</kw>
<kw name="Open 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-08-22T23:27:10.723993" elapsed="0.000031"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:10.724238" elapsed="0.000030"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:27:10.717805" elapsed="0.006550"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:27:10.367022" elapsed="0.357462"/>
</kw>
<msg time="2026-08-22T23:27:10.724558" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:10.366432" elapsed="0.358244"/>
</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-08-22T23:27:10.365872" elapsed="0.358917"/>
</kw>
<msg time="2026-08-22T23:27:10.724846" 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-08-22T23:27:10.365300" elapsed="0.359627"/>
</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-08-22T23:27:10.729640" elapsed="0.000146"/>
</kw>
<msg time="2026-08-22T23:27:10.729829" 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-08-22T23:27:10.729115" 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="NOT RUN" start="2026-08-22T23:27:10.730049" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:10.730211" 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-08-22T23:27:10.725333" elapsed="0.004960"/>
</kw>
<msg time="2026-08-22T23:27:10.730387" 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-08-22T23:27:10.364433" elapsed="0.365980"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:10.730874" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:10.730622" elapsed="0.000295"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:27:10.730960" 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-08-22T23:27:10.363443" elapsed="0.367645"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:27:10.363225" elapsed="0.367901"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:27:09.633903" elapsed="1.097264"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-08-22T23:27:09.629909" elapsed="1.101323"/>
</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-08-22T23:26:44.844884" elapsed="25.886402"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:27:10.735484" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:10.735084" elapsed="0.000434"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:27:10.736074" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:27:10.735717" elapsed="0.000383"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:27:10.736180" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:27:10.736340" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:27:10.734684" elapsed="0.001681"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:10.737446" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:27:10.737170" elapsed="0.000303"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:10.738244" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:27:10.738344" level="INFO">${current_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:27:10.738124" elapsed="0.000247"/>
</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-08-22T23:27:10.741122" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:10.740840" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:10.740819" elapsed="0.000385"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:10.741466" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:27:10.741607" level="INFO">${current_ssh_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:27:10.741355" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:10.742603" level="INFO">Attempting to execute command "netstat -punta" on remote system "10.30.170.200" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:10.741791" elapsed="0.000862"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:10.743346" 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-08-22T23:27:10.742813" elapsed="0.000560"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:27:10.745009" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:27:10.745155" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:27:10.744183" elapsed="0.001032"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:27:10.745526" elapsed="0.000749"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:27:10.749229" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:27:11.059518" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.08               Processes:             121
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:27:09 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:27:10.748736" elapsed="0.311053"/>
</kw>
<msg time="2026-08-22T23:27:11.059895" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:10.746782" elapsed="0.313223"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:27:10.743611" elapsed="0.316810"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:27:11.061078" level="INFO">Executing command 'netstat -punta'.</msg>
<msg time="2026-08-22T23:27:11.073311" level="INFO">Command exited with return code 127.</msg>
<msg time="2026-08-22T23:27:11.073555" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:27:11.073689" 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-08-22T23:27:11.060703" elapsed="0.013152"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:27:11.074239" elapsed="0.000509"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:11.076004" 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-08-22T23:27:11.075177" elapsed="0.000931"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:27:11.076635" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:11.076280" elapsed="0.000472"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:11.076226" elapsed="0.000580"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:27:11.077215" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-08-22T23:27:11.076928" elapsed="0.000420"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:11.076891" elapsed="0.000511"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:27:11.077478" 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">
<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-08-22T23:27:11.099816" elapsed="0.000407"/>
</kw>
<msg time="2026-08-22T23:27:11.100283" 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-08-22T23:27:11.097884" elapsed="0.002486"/>
</kw>
<kw name="Open 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-08-22T23:27:11.100572" elapsed="0.000114"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:11.100853" 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-08-22T23:27:11.077994" elapsed="0.022942"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:27:10.740287" elapsed="0.360775"/>
</kw>
<msg time="2026-08-22T23:27:11.101118" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:10.739626" elapsed="0.361542"/>
</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-08-22T23:27:10.739048" elapsed="0.362200"/>
</kw>
<msg time="2026-08-22T23:27:11.101289" 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-08-22T23:27:10.738525" elapsed="0.362816"/>
</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-08-22T23:27:11.104888" elapsed="0.000167"/>
</kw>
<msg time="2026-08-22T23:27:11.105098" 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-08-22T23:27:11.104413" 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="NOT RUN" start="2026-08-22T23:27:11.105317" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:11.105477" 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-08-22T23:27:11.101654" elapsed="0.003903"/>
</kw>
<msg time="2026-08-22T23:27:11.105675" 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-08-22T23:27:10.737717" elapsed="0.367984"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:11.106132" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:11.105883" elapsed="0.000291"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:27:11.106216" elapsed="0.000027"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-08-22T23:27:10.736763" elapsed="0.369579"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:27:10.736562" elapsed="0.369819"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:11.107627" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:27:11.107112" elapsed="0.000543"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:11.108413" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:27:11.108514" level="INFO">${current_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:27:11.108285" elapsed="0.000310"/>
</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-08-22T23:27:11.111610" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:11.111319" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:11.111300" elapsed="0.000392"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:11.111949" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:27:11.112050" level="INFO">${current_ssh_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:27:11.111840" elapsed="0.000237"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:11.113065" level="INFO">Attempting to execute command "netstat -punta" on remote system "10.30.170.12" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:11.112228" elapsed="0.000885"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:11.113829" level="INFO">${conn_id} = 72</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:27:11.113271" elapsed="0.000585"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:27:11.115719" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:27:11.115868" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:27:11.114638" elapsed="0.001292"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:27:11.116244" elapsed="0.000724"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:27:11.119978" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:27:11.482639" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.02               Processes:             118
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:27:10 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:27:11.119465" elapsed="0.363437"/>
</kw>
<msg time="2026-08-22T23:27:11.483006" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:11.117437" elapsed="0.365675"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:27:11.114073" elapsed="0.369434"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:27:11.484144" level="INFO">Executing command 'netstat -punta'.</msg>
<msg time="2026-08-22T23:27:11.496412" level="INFO">Command exited with return code 127.</msg>
<msg time="2026-08-22T23:27:11.496611" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:27:11.496679" 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-08-22T23:27:11.483790" elapsed="0.012924"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:27:11.496967" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:11.498151" 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-08-22T23:27:11.497569" elapsed="0.000651"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:27:11.498554" elapsed="0.000057"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:11.498340" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:11.498304" elapsed="0.000392"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:27:11.498934" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-08-22T23:27:11.498776" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:11.498753" elapsed="0.000306"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:27:11.499110" 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-08-22T23:27:11.522248" elapsed="0.000428"/>
</kw>
<msg time="2026-08-22T23:27:11.522817" 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-08-22T23:27:11.520343" elapsed="0.002614"/>
</kw>
<kw name="Open 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-08-22T23:27:11.523168" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:11.523355" 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-08-22T23:27:11.499619" elapsed="0.023822"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:27:11.110793" elapsed="0.412748"/>
</kw>
<msg time="2026-08-22T23:27:11.523677" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:11.110109" elapsed="0.413622"/>
</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-08-22T23:27:11.109553" elapsed="0.414263"/>
</kw>
<msg time="2026-08-22T23:27:11.523857" 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-08-22T23:27:11.108759" elapsed="0.415146"/>
</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-08-22T23:27:11.527503" elapsed="0.000161"/>
</kw>
<msg time="2026-08-22T23:27:11.527706" 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-08-22T23:27:11.527038" elapsed="0.000729"/>
</kw>
<kw name="Open 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-08-22T23:27:11.527925" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:11.528087" 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-08-22T23:27:11.524229" elapsed="0.003939"/>
</kw>
<msg time="2026-08-22T23:27:11.528262" 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-08-22T23:27:11.107872" elapsed="0.420415"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:11.528782" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:11.528507" elapsed="0.000317"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:27:11.528872" 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-08-22T23:27:11.106699" elapsed="0.422306"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:27:11.106489" elapsed="0.422554"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:11.530222" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:27:11.529947" elapsed="0.000302"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:11.531030" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:27:11.531131" level="INFO">${current_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:27:11.530899" 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-08-22T23:27:11.534081" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:11.533711" elapsed="0.000430"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:11.533687" elapsed="0.000481"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:11.534488" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:27:11.534728" level="INFO">${current_ssh_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:27:11.534355" elapsed="0.000406"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:11.535980" level="INFO">Attempting to execute command "netstat -punta" on remote system "10.30.170.79" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:11.535023" elapsed="0.001011"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:11.536891" level="INFO">${conn_id} = 73</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:27:11.536225" elapsed="0.000696"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:27:11.539294" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:27:11.539456" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:27:11.538329" elapsed="0.001199"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:27:11.539937" elapsed="0.000846"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:27:11.544262" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:27:11.862952" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:27 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:27:10 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:27:11.543753" elapsed="0.319454"/>
</kw>
<msg time="2026-08-22T23:27:11.863311" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:11.541280" elapsed="0.322143"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:27:11.537181" elapsed="0.326680"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:27:11.864462" level="INFO">Executing command 'netstat -punta'.</msg>
<msg time="2026-08-22T23:27:11.876740" level="INFO">Command exited with return code 127.</msg>
<msg time="2026-08-22T23:27:11.876906" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:27:11.876967" 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-08-22T23:27:11.864117" elapsed="0.012882"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:27:11.877233" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:11.878968" 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-08-22T23:27:11.878061" elapsed="0.001012"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:27:11.879558" elapsed="0.000073"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:11.879253" elapsed="0.000451"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:11.879198" elapsed="0.000557"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:27:11.880116" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-08-22T23:27:11.879876" elapsed="0.000371"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:11.879841" elapsed="0.000459"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:27:11.880376" 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-08-22T23:27:11.903695" elapsed="0.000401"/>
</kw>
<msg time="2026-08-22T23:27:11.904156" 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-08-22T23:27:11.901838" elapsed="0.002401"/>
</kw>
<kw name="Open 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-08-22T23:27:11.904440" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:11.904642" 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-08-22T23:27:11.881164" elapsed="0.023563"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:27:11.533125" elapsed="0.371694"/>
</kw>
<msg time="2026-08-22T23:27:11.904874" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:11.532381" elapsed="0.372604"/>
</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-08-22T23:27:11.531829" elapsed="0.373238"/>
</kw>
<msg time="2026-08-22T23:27:11.905109" 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-08-22T23:27:11.531311" elapsed="0.373844"/>
</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-08-22T23:27:11.908961" elapsed="0.000140"/>
</kw>
<msg time="2026-08-22T23:27:11.909142" 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-08-22T23:27:11.908480" elapsed="0.000723"/>
</kw>
<kw name="Open 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-08-22T23:27:11.909360" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:11.909523" 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-08-22T23:27:11.905448" elapsed="0.004172"/>
</kw>
<msg time="2026-08-22T23:27:11.909715" 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-08-22T23:27:11.530464" elapsed="0.379276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:11.910172" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:11.909921" elapsed="0.000292"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:27:11.910256" 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-08-22T23:27:11.529339" elapsed="0.381042"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:27:11.529151" elapsed="0.381268"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:27:10.736422" elapsed="1.174039"/>
</for>
<arg>netstat -punta</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-08-22T23:27:10.732041" elapsed="1.178484"/>
</kw>
<arg>60s</arg>
<arg>10s</arg>
<arg>ClusterManagement.Run_Bash_Command_On_List_Or_All</arg>
<arg>netstat -punta</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:27:10.731454" elapsed="1.179119"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:27:11.913421" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:11.913032" elapsed="0.000416"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:27:11.913939" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:27:11.913629" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:27:11.914010" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:27:11.914166" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:27:11.910847" elapsed="0.003343"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:11.916337" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:27:11.916438" level="INFO">${current_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:27:11.916214" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:11.918447" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:27:11.917976" elapsed="0.000505"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:27:11.918532" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:27:11.918707" level="INFO">${member_ip} = 10.30.170.200</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:27:11.917646" elapsed="0.001087"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:11.922874" level="INFO">${odl_connection} = 74</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:27:11.920547" elapsed="0.002356"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:27:11.925883" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:27:11.925963" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:27:11.925575" elapsed="0.000413"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:11.926208" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:27:11.927503" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:27:12.277434" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.08               Processes:             121
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:27:11 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:27:11.927176" elapsed="0.350470"/>
</kw>
<msg time="2026-08-22T23:27:12.277733" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:11.926810" elapsed="0.351021"/>
</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-08-22T23:27:11.924699" elapsed="0.353437"/>
</kw>
<msg time="2026-08-22T23:27:12.278231" 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-08-22T23:27:11.923478" elapsed="0.354855"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:27:11.923091" elapsed="0.355421"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:27:12.278569" elapsed="0.000073"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.200 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:27:11.920174" elapsed="0.358607"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:27:12.281190" level="INFO">Executing command 'sudo netstat -punta | grep 2550 | grep LISTEN'.</msg>
<msg time="2026-08-22T23:27:12.304869" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-08-22T23:27:12.305266" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:27:12.305433" level="INFO">${stderr} = sudo: netstat: command not found</msg>
<msg time="2026-08-22T23:27:12.305637" level="INFO">${rc} = 1</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:27:12.280699" elapsed="0.025033"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:27:12.311347" level="INFO">Length is 32.</msg>
<msg time="2026-08-22T23:27:12.311901" level="FAIL">'sudo: netstat: command not found' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-08-22T23:27:12.310206" elapsed="0.002049">'sudo: netstat: command not found' should be empty.</status>
</kw>
<msg time="2026-08-22T23:27:12.312567" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-08-22T23:27:12.312804" level="INFO">${result} = 'sudo: netstat: command not found' should be empty.</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:12.306849" elapsed="0.006041"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:27:12.316128" level="INFO">${success} = False</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:12.313798" elapsed="0.002427"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:12.319157" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:12.318874" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:12.319823" level="INFO">sudo: netstat: command not found</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:12.319494" elapsed="0.000416"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:12.320427" level="INFO">1</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:12.320160" elapsed="0.000352"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:27:12.317933" elapsed="0.002686"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:12.316850" elapsed="0.003907"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:12.316821" elapsed="0.003967"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:27:12.321026" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:12.320849" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:12.320832" elapsed="0.000333"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-08-22T23:27:12.321390" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:12.321221" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:12.321206" elapsed="0.000353"/>
</if>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-08-22T23:27:12.322657" level="FAIL">Got rc: 1 or stderr was not empty: sudo: netstat: command not found</msg>
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-08-22T23:27:12.321930" elapsed="0.000883">Got rc: 1 or stderr was not empty: sudo: netstat: command not found</status>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="FAIL" start="2026-08-22T23:27:12.279998" elapsed="0.043077">Got rc: 1 or stderr was not empty: sudo: netstat: command not found</status>
</kw>
<msg time="2026-08-22T23:27:12.323183" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:27:12.323228" level="INFO">${result} = Got rc: 1 or stderr was not empty: sudo: netstat: command not found</msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:12.279025" elapsed="0.044226"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:27:12.323415" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="NOT RUN" start="2026-08-22T23:27:12.323918" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:12.323803" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:12.323785" elapsed="0.000209"/>
</if>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-08-22T23:27:12.324445" level="FAIL">Got rc: 1 or stderr was not empty: sudo: netstat: command not found</msg>
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-08-22T23:27:12.324140" elapsed="0.000364">Got rc: 1 or stderr was not empty: sudo: netstat: command not found</status>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="FAIL" start="2026-08-22T23:27:11.919447" elapsed="0.405186">Got rc: 1 or stderr was not empty: sudo: netstat: command not found</status>
</kw>
<msg time="2026-08-22T23:27:12.324698" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-08-22T23:27:11.918936" elapsed="0.405809"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="FAIL" start="2026-08-22T23:27:11.917097" elapsed="0.407754">Got rc: 1 or stderr was not empty: sudo: netstat: command not found</status>
</kw>
<msg time="2026-08-22T23:27:12.324898" 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="FAIL" start="2026-08-22T23:27:11.916636" elapsed="0.408306"/>
</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-08-22T23:27:12.328696" elapsed="0.000146"/>
</kw>
<msg time="2026-08-22T23:27:12.328886" 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-08-22T23:27:12.328201" elapsed="0.000744"/>
</kw>
<kw name="Open 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-08-22T23:27:12.329109" elapsed="0.000028"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:12.329297" 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-08-22T23:27:12.325270" elapsed="0.004109"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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="FAIL" start="2026-08-22T23:27:11.915564" elapsed="0.413888">Got rc: 1 or stderr was not empty: sudo: netstat: command not found</status>
</kw>
<msg time="2026-08-22T23:27:12.329511" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-08-22T23:27:11.915118" elapsed="0.414440"/>
</kw>
<var>${output}</var>
<arg>command=sudo netstat -punta | grep 2550 | grep LISTEN</arg>
<arg>member_index=${index}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="FAIL" start="2026-08-22T23:27:11.914649" elapsed="0.415034">Got rc: 1 or stderr was not empty: sudo: netstat: command not found</status>
</kw>
<kw name="Get Match">
<var>${listening}</var>
<arg>${output}</arg>
<arg>LISTEN</arg>
<doc>Wrapper around String.Get Regexp Matches to return None if not found or the first match if found.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:12.329913" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${listening}' == 'None'">
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<arg>command=pid=$(grep org.apache.karaf.main.Main | grep -v grep | tr -s ' ' | cut -f2 -d' '); sudo /usr/lib/jvm/java-1.8.0/bin/jstack -l ${pid}</arg>
<arg>member_index=${index}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:12.330197" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:12.330005" elapsed="0.000286"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:12.329988" elapsed="0.000329"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-08-22T23:27:11.914446" elapsed="0.415915">Got rc: 1 or stderr was not empty: sudo: netstat: command not found</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-08-22T23:27:11.914246" elapsed="0.416177">Got rc: 1 or stderr was not empty: sudo: netstat: command not found</status>
</for>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>60s</arg>
<arg>10s</arg>
<arg>ShardStability.Shards_Stability_Get_Details</arg>
<arg>${DEFAULT_SHARD_LIST}</arg>
<arg>verify_restconf=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:12.330625" elapsed="0.000023"/>
</kw>
<doc>Start each member and wait for sync.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-08-22T23:26:44.840035" elapsed="27.490775">Got rc: 1 or stderr was not empty: sudo: netstat: command not found</status>
</test>
<kw name="Close All Connections" owner="SSHLibrary" type="TEARDOWN">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-08-22T23:27:12.331383" elapsed="0.000491"/>
</kw>
<doc>Unset tell-based protocol usage

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

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

Suite stops all odl nodes, outcomment usage of tell-based protocol in
config file (means make it false by default) and starts all nodes again.</doc>
<status status="FAIL" start="2026-08-22T23:26:25.887934" elapsed="46.443979"/>
</suite>
<suite id="s1-s4" name="Entity" source="/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/entity.robot">
<kw name="Setup_Everything" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:12.433622" 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-08-22T23:27:12.429423" elapsed="0.004258"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-08-22T23:27:12.429181" elapsed="0.004578"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-08-22T23:27:12.438532" 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-08-22T23:27:12.434858" elapsed="0.003703"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-08-22T23:27:12.438818" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:12.438675" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:12.438643" elapsed="0.000251"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:12.439406" 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-08-22T23:27:12.439051" elapsed="0.000398"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-08-22T23:27:12.439954" 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-08-22T23:27:12.439625" elapsed="0.000356"/>
</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-08-22T23:27:12.440494" elapsed="0.000318"/>
</kw>
<msg time="2026-08-22T23:27:12.440912" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:12.440959" 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-08-22T23:27:12.440147" elapsed="0.000835"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:27:12.441521" 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-08-22T23:27:12.441151" elapsed="0.000401"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:27:12.442536" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:27:12.442274" elapsed="0.000288"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:27:12.442980" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:27:12.442724" elapsed="0.000282"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:27:12.443473" 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-08-22T23:27:12.443178" elapsed="0.000323"/>
</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-08-22T23:27:12.446594" elapsed="0.000231"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:12.447313" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:27:12.446986" elapsed="0.000353"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:27:12.447491" elapsed="0.000249"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:12.448558" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:12.448259" elapsed="0.000340"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:27:12.448651" elapsed="0.000055"/>
</return>
<msg time="2026-08-22T23:27:12.448856" 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-08-22T23:27:12.447943" elapsed="0.000940"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:27:12.449762" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.200:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396b845ec90&gt;, timeout=2, 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-08-22T23:27:12.449133" elapsed="0.000793"/>
</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-08-22T23:27:12.450091" elapsed="0.000200"/>
</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-08-22T23:27:12.446014" elapsed="0.004340"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:27:12.445825" elapsed="0.004576"/>
</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-08-22T23:27:12.451248" elapsed="0.000195"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:12.452012" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:27:12.451628" elapsed="0.000414"/>
</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-08-22T23:27:12.452194" elapsed="0.000229"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:12.453215" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:12.452922" elapsed="0.000321"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:27:12.453289" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:27:12.453448" 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-08-22T23:27:12.452632" elapsed="0.000841"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:27:12.454047" level="INFO">Creating Session using : alias=ClusterManagement__session_2, url=http://10.30.170.12:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396b87648d0&gt;, timeout=2, 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-08-22T23:27:12.453639" elapsed="0.000519"/>
</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-08-22T23:27:12.454318" elapsed="0.000191"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-08-22T23:27:12.450685" elapsed="0.003884"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:27:12.450488" elapsed="0.004140"/>
</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-08-22T23:27:12.455446" elapsed="0.000204"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:12.456149" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:27:12.455809" 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-08-22T23:27:12.456325" elapsed="0.000222"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:12.457349" 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-08-22T23:27:12.457044" elapsed="0.000332"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:27:12.457421" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:27:12.457573" 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-08-22T23:27:12.456753" elapsed="0.000862"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:27:12.458174" level="INFO">Creating Session using : alias=ClusterManagement__session_3, url=http://10.30.170.79:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396b85dd510&gt;, timeout=2, 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-08-22T23:27:12.457769" elapsed="0.000511"/>
</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-08-22T23:27:12.458445" elapsed="0.000207"/>
</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-08-22T23:27:12.454894" elapsed="0.003818"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:27:12.454712" elapsed="0.004045"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-08-22T23:27:12.443562" elapsed="0.015265"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:12.459398" 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-08-22T23:27:12.458995" elapsed="0.000447"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:12.460059" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.200', 2: '10.30.170.12', 3: '10.30.170.79'}</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-08-22T23:27:12.459619" elapsed="0.000485"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:12.460668" 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-08-22T23:27:12.460264" elapsed="0.000448"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-08-22T23:27:12.441825" elapsed="0.018946"/>
</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-08-22T23:27:12.434496" elapsed="0.026331"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:27:12.461009" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:12.460893" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:12.460874" elapsed="0.000201"/>
</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-08-22T23:27:12.464332" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:12.463948" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:27:12.464840" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:27:12.464517" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:27:12.464911" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:27:12.465064" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:27:12.463576" elapsed="0.001513"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:12.466074" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:27:12.465811" elapsed="0.000289"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:12.466820" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:27:12.466921" level="INFO">${current_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:27:12.466681" 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-08-22T23:27:12.470369" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:12.469773" elapsed="0.000683"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:12.469754" elapsed="0.000742"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:12.471001" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:27:12.471243" level="INFO">${current_ssh_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:27:12.470718" elapsed="0.000580"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:12.472325" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.200" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:12.471593" elapsed="0.000843"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:12.473715" level="INFO">${conn_id} = 22</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:27:12.472744" elapsed="0.001023"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:27:12.475513" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:27:12.475754" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:27:12.475150" elapsed="0.000649"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:27:12.476180" elapsed="0.000502"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:27:12.477956" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:27:12.803236" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.08               Processes:             121
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:27:12 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:27:12.477494" elapsed="0.325926"/>
</kw>
<msg time="2026-08-22T23:27:12.803514" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:12.477043" elapsed="0.326673"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:27:12.474213" elapsed="0.329676"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:27:12.804889" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-08-22T23:27:12.818088" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-08-22T23:27:12.818475" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:27:12.818769" 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-08-22T23:27:12.804289" elapsed="0.014597"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:27:12.819575" elapsed="0.001316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:12.823704" 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-08-22T23:27:12.822262" elapsed="0.001708"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:27:12.825054" elapsed="0.000117"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:12.824355" elapsed="0.000987"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:12.824298" elapsed="0.001130"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:27:12.825936" elapsed="0.000087"/>
</return>
<status status="PASS" start="2026-08-22T23:27:12.825606" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:12.825563" elapsed="0.000632"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:27:12.826280" 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">
<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-08-22T23:27:12.831909" elapsed="0.000211"/>
</kw>
<msg time="2026-08-22T23:27:12.832180" 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-08-22T23:27:12.830946" elapsed="0.001946"/>
</kw>
<kw name="Open 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-08-22T23:27:12.833278" elapsed="0.000053"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:12.833736" elapsed="0.000038"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:27:12.826990" elapsed="0.006864"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:27:12.468802" elapsed="0.365232"/>
</kw>
<msg time="2026-08-22T23:27:12.834091" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:12.468129" elapsed="0.366014"/>
</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-08-22T23:27:12.467609" elapsed="0.366618"/>
</kw>
<msg time="2026-08-22T23:27:12.834269" 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-08-22T23:27:12.467099" elapsed="0.367216"/>
</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-08-22T23:27:12.837557" elapsed="0.000184"/>
</kw>
<msg time="2026-08-22T23:27:12.837783" 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-08-22T23:27:12.837063" 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="NOT RUN" start="2026-08-22T23:27:12.837997" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:12.838153" 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-08-22T23:27:12.834714" elapsed="0.003520"/>
</kw>
<msg time="2026-08-22T23:27:12.838328" 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-08-22T23:27:12.466314" elapsed="0.372040"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:12.838843" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:12.838527" elapsed="0.000358"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:27:12.838928" elapsed="0.000027"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-08-22T23:27:12.465442" elapsed="0.373610"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:27:12.465265" elapsed="0.373826"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:12.840049" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:27:12.839774" elapsed="0.000305"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:12.840819" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:27:12.840922" level="INFO">${current_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:27:12.840692" elapsed="0.000256"/>
</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-08-22T23:27:12.844705" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:12.844082" elapsed="0.000712"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:12.844062" elapsed="0.000772"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:12.845308" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:27:12.845554" level="INFO">${current_ssh_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:27:12.845035" elapsed="0.000591"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:12.846569" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.12" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:12.845894" elapsed="0.000803"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:12.847939" level="INFO">${conn_id} = 23</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:27:12.846973" elapsed="0.001020"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:27:12.849805" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:27:12.849990" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:27:12.849411" elapsed="0.000625"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:27:12.850382" elapsed="0.000481"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:27:12.852034" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:27:13.179363" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.02               Processes:             118
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:27:11 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:27:12.851707" elapsed="0.327949"/>
</kw>
<msg time="2026-08-22T23:27:13.179747" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:12.851219" elapsed="0.328702"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:27:12.848439" elapsed="0.331649"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:27:13.181039" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-08-22T23:27:13.194231" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-08-22T23:27:13.194641" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:27:13.194882" 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-08-22T23:27:13.180485" elapsed="0.014510"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:27:13.195711" elapsed="0.001186"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:13.199570" 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-08-22T23:27:13.198263" elapsed="0.001684"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:27:13.201030" elapsed="0.000119"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:13.200326" elapsed="0.001052"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:13.200270" elapsed="0.001197"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:27:13.201932" elapsed="0.000065"/>
</return>
<status status="PASS" start="2026-08-22T23:27:13.201689" elapsed="0.000389"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:13.201666" elapsed="0.000452"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:27:13.202178" elapsed="0.000016"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<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-08-22T23:27:13.206520" elapsed="0.000222"/>
</kw>
<msg time="2026-08-22T23:27:13.206785" 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-08-22T23:27:13.205828" 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-08-22T23:27:13.207498" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:13.207819" 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-08-22T23:27:13.202697" elapsed="0.005236"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:27:12.843111" elapsed="0.365002"/>
</kw>
<msg time="2026-08-22T23:27:13.208166" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:12.842385" elapsed="0.365831"/>
</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-08-22T23:27:12.841897" elapsed="0.366396"/>
</kw>
<msg time="2026-08-22T23:27:13.208333" 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-08-22T23:27:12.841098" elapsed="0.367281"/>
</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-08-22T23:27:13.211561" elapsed="0.000215"/>
</kw>
<msg time="2026-08-22T23:27:13.211818" 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-08-22T23:27:13.211064" 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="NOT RUN" start="2026-08-22T23:27:13.212032" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:13.212188" 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-08-22T23:27:13.208688" elapsed="0.003580"/>
</kw>
<msg time="2026-08-22T23:27:13.212362" 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-08-22T23:27:12.840291" elapsed="0.372096"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:13.212869" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:13.212617" elapsed="0.000294"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:27:13.212954" 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-08-22T23:27:12.839399" elapsed="0.373678"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:27:12.839214" elapsed="0.373900"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:13.214081" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:27:13.213803" elapsed="0.000305"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:13.214828" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:27:13.214929" level="INFO">${current_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:27:13.214703" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:13.218300" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:13.217727" elapsed="0.000660"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:13.217707" elapsed="0.000719"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:13.218939" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:27:13.219181" level="INFO">${current_ssh_connection} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:27:13.218654" elapsed="0.000582"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:13.220197" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.79" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:13.219504" elapsed="0.000802"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:13.221710" level="INFO">${conn_id} = 24</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:27:13.220604" elapsed="0.001163"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:27:13.223751" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:27:13.223936" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:27:13.223310" elapsed="0.000670"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:27:13.224326" elapsed="0.000483"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:27:13.226068" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:27:13.541448" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:27 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:27:11 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:27:13.225729" elapsed="0.315883"/>
</kw>
<msg time="2026-08-22T23:27:13.541694" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:13.225166" elapsed="0.316668"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:27:13.222205" elapsed="0.319820"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:27:13.542959" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-08-22T23:27:13.555162" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-08-22T23:27:13.555539" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:27:13.555825" 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-08-22T23:27:13.542406" elapsed="0.013655"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:27:13.556819" elapsed="0.001354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:13.560001" 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-08-22T23:27:13.559161" elapsed="0.000994"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:27:13.560824" elapsed="0.000073"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:13.560404" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:13.560364" elapsed="0.000704"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:27:13.561511" elapsed="0.000160"/>
</return>
<status status="PASS" start="2026-08-22T23:27:13.561185" elapsed="0.000606"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:13.561160" elapsed="0.000687"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:27:13.561956" 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">
<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-08-22T23:27:13.567288" elapsed="0.000153"/>
</kw>
<msg time="2026-08-22T23:27:13.567484" 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-08-22T23:27:13.566689" elapsed="0.001303"/>
</kw>
<kw name="Open 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-08-22T23:27:13.568276" elapsed="0.000038"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:13.568566" elapsed="0.000073"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:27:13.562771" elapsed="0.005949"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:27:13.216737" elapsed="0.352160"/>
</kw>
<msg time="2026-08-22T23:27:13.568953" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:13.216104" elapsed="0.352900"/>
</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-08-22T23:27:13.215622" elapsed="0.353462"/>
</kw>
<msg time="2026-08-22T23:27:13.569124" 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-08-22T23:27:13.215107" elapsed="0.354064"/>
</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-08-22T23:27:13.572615" elapsed="0.000145"/>
</kw>
<msg time="2026-08-22T23:27:13.572803" 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-08-22T23:27:13.572115" elapsed="0.000750"/>
</kw>
<kw name="Open 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-08-22T23:27:13.573026" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:13.573188" 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-08-22T23:27:13.569457" elapsed="0.003812"/>
</kw>
<msg time="2026-08-22T23:27:13.573360" 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-08-22T23:27:13.214323" elapsed="0.359062"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:13.573839" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:13.573555" elapsed="0.000326"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:27:13.573953" 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-08-22T23:27:13.213423" elapsed="0.360661"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:27:13.213213" elapsed="0.360908"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:27:12.465139" elapsed="1.109023"/>
</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-08-22T23:27:12.461295" elapsed="1.112931"/>
</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-08-22T23:27:13.574381" elapsed="0.000283"/>
</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-08-22T23:27:13.587863" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:13.587754" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:13.587734" elapsed="0.000197"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:13.588202" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:27:13.588307" level="INFO">${current_ssh_connection_object} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:27:13.588081" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:13.588770" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:13.588487" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:13.589204" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:13.588962" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:13.590054" 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-08-22T23:27:13.589795" elapsed="0.000373">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-08-22T23:27:13.590275" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:27:13.590321" 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-08-22T23:27:13.589398" elapsed="0.000945"/>
</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-08-22T23:27:13.590693" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:13.590418" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:13.590399" elapsed="0.000395"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:13.591545" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:27:13.591267" elapsed="0.000306"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:27:13.591638" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:27:13.591789" level="INFO">${odl_ip} = 10.30.170.200</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:27:13.590994" elapsed="0.000820"/>
</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-08-22T23:27:13.591964" elapsed="0.000423"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:13.592676" level="INFO">index=25
host=10.30.170.200
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-08-22T23:27:13.592776" level="INFO">${karaf_connection_object} = index=25
host=10.30.170.200
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-08-22T23:27:13.592554" elapsed="0.000247"/>
</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-08-22T23:27:13.592948" elapsed="0.003832"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:27:13.597208" level="INFO">Logging into '10.30.170.200:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:27:14.439099" 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-08-22T23:27:13.596944" elapsed="0.842326"/>
</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-08-22T23:27:14.443803" elapsed="0.000251"/>
</kw>
<msg time="2026-08-22T23:27:14.444115" 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-08-22T23:27:14.443133" elapsed="0.001066"/>
</kw>
<kw name="Open 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-08-22T23:27:14.444442" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:14.444627" 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-08-22T23:27:14.440654" elapsed="0.004062"/>
</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-08-22T23:27:14.439825" elapsed="0.004939"/>
</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-08-22T23:27:13.587459" elapsed="0.857359"/>
</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-08-22T23:27:13.575438" elapsed="0.869431"/>
</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-08-22T23:27:13.575023" elapsed="0.869902"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:27:13.574884" elapsed="0.870083"/>
</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-08-22T23:27:14.458361" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:14.458233" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:14.458203" elapsed="0.000240"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:14.458751" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:27:14.458865" level="INFO">${current_ssh_connection_object} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:27:14.458622" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:14.459318" level="INFO">{1: 25}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:14.459046" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:14.459816" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:14.459545" elapsed="0.000314"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:14.460629" 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-08-22T23:27:14.460381" elapsed="0.000370">Dictionary does not contain key '2'.</status>
</kw>
<msg time="2026-08-22T23:27:14.460864" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:27:14.460910" 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-08-22T23:27:14.460015" elapsed="0.000918"/>
</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-08-22T23:27:14.461231" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:14.461008" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:14.460989" elapsed="0.000340"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:14.462087" level="INFO">${ip_address} = 10.30.170.12</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:27:14.461820" elapsed="0.000293"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:27:14.462162" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:27:14.462311" level="INFO">${odl_ip} = 10.30.170.12</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:27:14.461530" elapsed="0.000806"/>
</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-08-22T23:27:14.462485" elapsed="0.000458"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:14.463217" level="INFO">index=26
host=10.30.170.12
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-08-22T23:27:14.463321" level="INFO">${karaf_connection_object} = index=26
host=10.30.170.12
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:27:14.463112" 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-08-22T23:27:14.463508" elapsed="0.002199"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:27:14.466135" level="INFO">Logging into '10.30.170.12:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:27:15.059006" 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-08-22T23:27:14.465872" elapsed="0.593410"/>
</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-08-22T23:27:15.063760" elapsed="0.000240"/>
</kw>
<msg time="2026-08-22T23:27:15.064065" 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-08-22T23:27:15.063216" 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="NOT RUN" start="2026-08-22T23:27:15.064300" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:15.064476" 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-08-22T23:27:15.060570" elapsed="0.003992"/>
</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-08-22T23:27:15.059780" elapsed="0.004857"/>
</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-08-22T23:27:14.457921" elapsed="0.606770"/>
</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-08-22T23:27:14.445637" elapsed="0.619101"/>
</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-08-22T23:27:14.445227" elapsed="0.619563"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:27:14.445085" elapsed="0.619746"/>
</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-08-22T23:27:15.077939" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:15.077820" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:15.077795" elapsed="0.000220"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:15.078286" level="INFO">index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:27:15.078393" level="INFO">${current_ssh_connection_object} = index=20
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:27:15.078165" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:15.078856" level="INFO">{1: 25, 2: 26}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:15.078574" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:15.079294" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:15.079050" elapsed="0.000289"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:15.080089" 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-08-22T23:27:15.079868" elapsed="0.000329">Dictionary does not contain key '3'.</status>
</kw>
<msg time="2026-08-22T23:27:15.080306" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:27:15.080352" 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-08-22T23:27:15.079492" elapsed="0.000883"/>
</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-08-22T23:27:15.080704" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:15.080466" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:15.080448" elapsed="0.000356"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:15.081541" level="INFO">${ip_address} = 10.30.170.79</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:27:15.081275" elapsed="0.000292"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:27:15.081668" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:27:15.081823" level="INFO">${odl_ip} = 10.30.170.79</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:27:15.081005" elapsed="0.000843"/>
</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-08-22T23:27:15.082000" elapsed="0.000421"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:15.082714" level="INFO">index=27
host=10.30.170.79
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-08-22T23:27:15.082816" level="INFO">${karaf_connection_object} = index=27
host=10.30.170.79
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:27:15.082605" elapsed="0.000238"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:27:15.082986" elapsed="0.002361"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:27:15.085792" level="INFO">Logging into '10.30.170.79:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:27:15.748352" 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-08-22T23:27:15.085511" elapsed="0.663060"/>
</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-08-22T23:27:15.753193" elapsed="0.000252"/>
</kw>
<msg time="2026-08-22T23:27:15.753509" 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-08-22T23:27:15.752661" elapsed="0.000950"/>
</kw>
<kw name="Open 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-08-22T23:27:15.753780" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:15.753945" 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-08-22T23:27:15.750204" elapsed="0.003826"/>
</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-08-22T23:27:15.749162" elapsed="0.004915"/>
</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-08-22T23:27:15.077514" elapsed="0.676617"/>
</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-08-22T23:27:15.065447" elapsed="0.688732"/>
</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-08-22T23:27:15.065079" elapsed="0.689154"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:27:15.064940" elapsed="0.689335"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-08-22T23:27:13.574727" elapsed="2.179588"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-08-22T23:27:12.434064" elapsed="3.320316"/>
</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-08-22T23:27:15.757020" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:15.756898" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:15.756874" elapsed="0.000219"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:27:15.762024" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:15.761916" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:15.761897" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:27:15.763067" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:15.762669" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:27:15.763657" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:27:15.763325" elapsed="0.000359"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:27:15.763731" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:27:15.763889" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:27:15.762318" 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-08-22T23:27:15.769197" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:15.769088" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:15.769069" 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-08-22T23:27:15.770475" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:15.770348" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:15.770330" elapsed="0.000214"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:15.771038" level="INFO">${karaf_connection_index} = 25</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:27:15.770709" elapsed="0.000356"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:15.771446" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:27:15.771221" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:27:15.855821" 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 "/ "n "e "t "[78Cc "[A[78Co</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:27:15.772228" elapsed="0.084002"/>
</kw>
<msg time="2026-08-22T23:27:15.856658" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:27:15.856772" 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-08-22T23:27:15.771645" elapsed="0.085211"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:27:15.951549" level="INFO">"n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "e "n "t "[78Ci "[A[78Ct
 "y ". "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-08-22T23:27:15.858810" elapsed="0.092967"/>
</kw>
<msg time="2026-08-22T23:27:15.951947" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:27:15.951996" level="INFO">${message_wait} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:27:15.857377" elapsed="0.094657"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:15.952672" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:15.952359" elapsed="0.000466"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:15.952333" elapsed="0.000521"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:15.953425" level="INFO"> "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "e "n "t "[78Ci "[A[78Ct
 "y ". "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-08-22T23:27:15.953007" 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-08-22T23:27:15.953946" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:15.953659" elapsed="0.000434"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:15.953557" elapsed="0.000563"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:27:15.954155" 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-08-22T23:27:15.956689" elapsed="0.000150"/>
</kw>
<msg time="2026-08-22T23:27:15.956882" 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-08-22T23:27:15.956121" elapsed="0.000883"/>
</kw>
<kw name="Open 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-08-22T23:27:15.957332" elapsed="0.000221"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:15.957962" elapsed="0.000064"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:27:15.955326" elapsed="0.002800"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:27:15.954431" elapsed="0.003828"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:27:15.770060" elapsed="0.188299"/>
</kw>
<msg time="2026-08-22T23:27:15.958452" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:15.958497" level="INFO">${message} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:27:15.769432" elapsed="0.189103"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:27:15.958794" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:27:15.958686" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:15.958666" 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-08-22T23:27:15.959279" 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-08-22T23:27:15.959695" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:27:15.959770" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:27:15.768795" elapsed="0.191084"/>
</kw>
<msg time="2026-08-22T23:27:15.959974" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:15.960018" level="INFO">${output} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:27:15.764287" elapsed="0.195768"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:15.960380" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:15.960131" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:15.960114" elapsed="0.000344"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:27:15.764147" elapsed="0.196335"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:27:15.965665" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:15.965542" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:15.965523" 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-08-22T23:27:15.966942" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:15.966814" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:15.966796" elapsed="0.000213"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:15.967468" level="INFO">${karaf_connection_index} = 26</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:27:15.967151" elapsed="0.000343"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:15.967894" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:27:15.967671" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:27:16.068181" 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 "/ "n "e "t "[78Cc "[A[78Co</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:27:15.968562" elapsed="0.099757"/>
</kw>
<msg time="2026-08-22T23:27:16.068458" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:27:16.068504" 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-08-22T23:27:15.968077" elapsed="0.100463"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:27:16.154153" level="INFO">"n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "e "n "t "[78Ci "[A[78Ct
 "y ". "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-08-22T23:27:16.069232" elapsed="0.085076"/>
</kw>
<msg time="2026-08-22T23:27:16.154437" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:27:16.154483" level="INFO">${message_wait} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:27:16.068731" elapsed="0.085835"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:16.154911" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:16.154664" elapsed="0.000395"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:16.154643" elapsed="0.000443"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:16.155671" level="INFO"> "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "e "n "t "[78Ci "[A[78Ct
 "y ". "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-08-22T23:27:16.155229" 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-08-22T23:27:16.156061" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:16.155824" elapsed="0.000383"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:16.155806" elapsed="0.000428"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:27:16.156268" 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-08-22T23:27:16.158799" elapsed="0.000146"/>
</kw>
<msg time="2026-08-22T23:27:16.158987" 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-08-22T23:27:16.158238" 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-08-22T23:27:16.159438" elapsed="0.000063"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:16.159886" elapsed="0.000064"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:27:16.157407" elapsed="0.002641"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:27:16.156528" elapsed="0.003652"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:27:15.966497" elapsed="0.193783"/>
</kw>
<msg time="2026-08-22T23:27:16.160372" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:16.160415" level="INFO">${message} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:27:15.965900" elapsed="0.194552"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:27:16.160819" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:27:16.160528" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:16.160509" elapsed="0.000396"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:16.161292" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:16.161704" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:27:16.161778" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:27:15.965251" elapsed="0.196636"/>
</kw>
<msg time="2026-08-22T23:27:16.162005" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:16.162054" level="INFO">${output} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:27:15.960788" elapsed="0.201306"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:16.162420" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:16.162172" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:16.162154" elapsed="0.000351"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:27:15.960649" elapsed="0.201880"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:27:16.167821" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:16.167715" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:16.167696" 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-08-22T23:27:16.169106" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:16.168979" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:16.168961" elapsed="0.000212"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:16.169651" level="INFO">${karaf_connection_index} = 27</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:27:16.169315" elapsed="0.000363"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:16.170083" level="INFO">${current_connection_index} = 20</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:27:16.169833" elapsed="0.000278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:27:16.246770" 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 "/ "n "e "t "[78Cc "[A[78Co</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:27:16.170777" elapsed="0.076127"/>
</kw>
<msg time="2026-08-22T23:27:16.247032" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:27:16.247078" 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-08-22T23:27:16.170266" elapsed="0.076849"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:27:16.360281" level="INFO">"n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "e "n "t "[78Ci "[A[78Ct
 "y ". "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-08-22T23:27:16.247801" elapsed="0.112632"/>
</kw>
<msg time="2026-08-22T23:27:16.360562" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:27:16.360737" level="INFO">${message_wait} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:27:16.247280" elapsed="0.113496"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:16.361095" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:16.360854" elapsed="0.000387"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:16.360833" elapsed="0.000435"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:16.361785" level="INFO"> "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "e "n "t "[78Ci "[A[78Ct
 "y ". "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-08-22T23:27:16.361414" 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-08-22T23:27:16.362169" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:16.361933" elapsed="0.000407"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:16.361915" elapsed="0.000453"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:27:16.362403" 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-08-22T23:27:16.365000" elapsed="0.000144"/>
</kw>
<msg time="2026-08-22T23:27:16.365186" 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-08-22T23:27:16.364419" elapsed="0.000886"/>
</kw>
<kw name="Open 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-08-22T23:27:16.365660" elapsed="0.000067"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:16.366045" elapsed="0.000065"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:27:16.363663" elapsed="0.002545"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:27:16.362776" 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-08-22T23:27:16.168693" elapsed="0.197778"/>
</kw>
<msg time="2026-08-22T23:27:16.366564" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:16.366796" level="INFO">${message} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:27:16.168036" elapsed="0.198802"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:27:16.367022" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:27:16.366916" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:16.366897" 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-08-22T23:27:16.367749" 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-08-22T23:27:16.368083" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:27:16.368155" 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-08-22T23:27:16.167405" elapsed="0.200860"/>
</kw>
<msg time="2026-08-22T23:27:16.368358" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:16.368403" level="INFO">${output} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:27:16.162814" elapsed="0.205625"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:16.368824" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:16.368515" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:16.368498" elapsed="0.000403"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:27:16.162677" elapsed="0.206247"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:27:15.763969" elapsed="0.604984"/>
</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-08-22T23:27:15.761617" elapsed="0.607393"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-08-22T23:27:15.755000" elapsed="0.614066"/>
</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-08-22T23:27:15.754536" elapsed="0.614574"/>
</kw>
<arg>http_timeout=2</arg>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-08-22T23:27:12.428840" elapsed="3.940324"/>
</kw>
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-08-22T23:27:16.370090" level="INFO">${already_done} = True</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-08-22T23:27:16.369753" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="PASS" start="2026-08-22T23:27:16.370317" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-08-22T23:27:16.370190" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:16.370172" elapsed="0.000229"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:16.370556" elapsed="0.000037"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:16.370750" elapsed="0.000022"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:16.370928" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:16.371106" elapsed="0.000021"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:16.371361" elapsed="0.000029"/>
</kw>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-08-22T23:27:16.369432" elapsed="0.002032"/>
</kw>
<kw name="Setup_NetconfKeywords" owner="NetconfKeywords">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:27:16.372290" level="INFO">${tmp} = {}</msg>
<var>${tmp}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:27:16.372015" elapsed="0.000306"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:16.376192" level="INFO">${NetconfKeywords__mounted_device_types} = {}</msg>
<arg>${NetconfKeywords__mounted_device_types}</arg>
<arg>${tmp}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:27:16.372474" elapsed="0.003764"/>
</kw>
<if>
<branch type="IF" condition="${create_session_for_templated_requests}">
<kw name="Create_Default_Session" owner="TemplatedRequests">
<arg>timeout=2</arg>
<doc>Create "default" session to ${url} with authentication and connection parameters.
This Keyword is in this Resource only so that user do not need to call RequestsLibrary directly.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:16.379617" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:16.376309" elapsed="0.003370"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:16.376291" elapsed="0.003413"/>
</if>
<kw name="Initialize_Artifact_Deployment_And_Usage" owner="NexusKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:16.384667" level="INFO">${odl_connection} = 28</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:27:16.384247" elapsed="0.000479"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:27:16.386398" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:27:16.386481" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:27:16.386075" 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-08-22T23:27:16.386681" elapsed="0.000319"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:27:16.387860" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:27:16.720965" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.08               Processes:             121
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:27:12 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:27:16.387526" elapsed="0.333568"/>
</kw>
<msg time="2026-08-22T23:27:16.721186" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:16.387165" elapsed="0.334106"/>
</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-08-22T23:27:16.385641" elapsed="0.335755"/>
</kw>
<msg time="2026-08-22T23:27:16.721468" 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-08-22T23:27:16.385241" elapsed="0.336293"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:27:16.384909" elapsed="0.336756"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:27:16.721728" elapsed="0.000046"/>
</return>
<msg time="2026-08-22T23:27:16.721970" level="INFO">${odl} = 28</msg>
<var>${odl}</var>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:27:16.383956" elapsed="0.338051"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-08-22T23:27:16.731385" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-08-22T23:27:16.739228" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../../tools/deployment/search.sh' -&gt; '/home/jenkins//search.sh'</msg>
<arg>/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../../tools/deployment/search.sh</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-08-22T23:27:16.722245" elapsed="0.017115"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:27:16.739690" elapsed="0.000356"/>
</kw>
<if>
<branch type="IF" condition="not (${tools_system_connect})">
<return>
<status status="NOT RUN" start="2026-08-22T23:27:16.740341" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:16.740155" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:16.740126" elapsed="0.000306"/>
</if>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:16.747595" level="INFO">${tools_connection} = 29</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-08-22T23:27:16.747020" elapsed="0.000603"/>
</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-08-22T23:27:16.749356" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:27:16.749433" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:27:16.749083" elapsed="0.000374"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:27:16.749633" elapsed="0.000322"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:27:16.750821" level="INFO">Logging into '10.30.171.196:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:27:17.361277" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:27:16 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:21:32 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:27:16.750470" elapsed="0.610970"/>
</kw>
<msg time="2026-08-22T23:27:17.361623" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:16.750120" elapsed="0.611593"/>
</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-08-22T23:27:16.748542" elapsed="0.613295"/>
</kw>
<msg time="2026-08-22T23:27:17.361890" 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-08-22T23:27:16.748139" elapsed="0.613799"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-08-22T23:27:16.747807" elapsed="0.614206"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-08-22T23:27:17.362069" elapsed="0.000352"/>
</return>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:27:16.746438" elapsed="0.616123"/>
</kw>
<doc>Places search utility to ODL system, which will be needed for version detection.
By default also initialize a SSH connection to Tools system,
as following Keywords assume a working connection towards target system.</doc>
<status status="PASS" start="2026-08-22T23:27:16.379947" elapsed="0.982686"/>
</kw>
<arg>create_session_for_templated_requests=False</arg>
<doc>Setup the environment for the other keywords of this Resource to work properly.</doc>
<status status="PASS" start="2026-08-22T23:27:16.371726" elapsed="0.990959"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:17.363782" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:17.363348" elapsed="0.000461"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:27:17.363855" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:27:17.364010" level="INFO">${node1_session} = ClusterManagement__session_1</msg>
<var>${node1_session}</var>
<arg>member_index=1</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-08-22T23:27:17.363014" elapsed="0.001021"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:17.364814" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:17.364493" elapsed="0.000347"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:27:17.364899" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:27:17.365051" level="INFO">${node2_session} = ClusterManagement__session_2</msg>
<var>${node2_session}</var>
<arg>member_index=2</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-08-22T23:27:17.364243" elapsed="0.000832"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:17.365852" 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-08-22T23:27:17.365537" elapsed="0.000341"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:27:17.365924" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:27:17.366073" level="INFO">${node3_session} = ClusterManagement__session_3</msg>
<var>${node3_session}</var>
<arg>member_index=3</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-08-22T23:27:17.365280" elapsed="0.000817"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:17.366596" level="INFO">${node1_session} = ClusterManagement__session_1</msg>
<arg>${node1_session}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:27:17.366261" elapsed="0.000379"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:17.367091" level="INFO">${node2_session} = ClusterManagement__session_2</msg>
<arg>${node2_session}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:27:17.366794" elapsed="0.000337"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:17.367600" level="INFO">${node3_session} = ClusterManagement__session_3</msg>
<arg>${node3_session}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:27:17.367282" elapsed="0.000361"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:17.371766" level="INFO">${directory_with_template_folders} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD</msg>
<arg>${directory_with_template_folders}</arg>
<arg>/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:27:17.367797" elapsed="0.004016"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:17.376033" level="INFO">${empty_data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${empty_data}</arg>
<arg>&lt;data xmlns="${ODL_NETCONF_NAMESPACE}"&gt;&lt;/data&gt;</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:27:17.371978" elapsed="0.004101"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:17.376555" level="INFO">${cont} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;</msg>
<var>${cont}</var>
<arg>&lt;data xmlns="${ODL_NETCONF_NAMESPACE}"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:17.376233" elapsed="0.000377"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:17.377013" level="INFO">${contend} = &lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<var>${contend}</var>
<arg>&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:17.376764" elapsed="0.000276"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:17.381506" level="INFO">${original_data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${original_data}</arg>
<arg>${cont}Content${contend}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:27:17.377194" elapsed="0.004411"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:17.386071" level="INFO">${modified_data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${modified_data}</arg>
<arg>${cont}Modified Content${contend}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:27:17.381772" elapsed="0.004347"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:17.390627" level="INFO">${modified_data_2} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${modified_data_2}</arg>
<arg>${cont}Another Modified Content${contend}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:27:17.386282" elapsed="0.004394"/>
</kw>
<doc>Setup everything needed for the test cases.</doc>
<status status="PASS" start="2026-08-22T23:27:12.428434" elapsed="4.962306"/>
</kw>
<test id="s1-s4-t1" name="Start_Testtool" line="63">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:27:17.393813" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:27:17.393535" 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-08-22T23:27:17.395121" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:17.394986" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:17.394964" 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-08-22T23:27:17.400273" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:17.400159" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:17.400141" elapsed="0.000200"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:27:17.401360" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:17.400979" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:27:17.401867" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:27:17.401545" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:27:17.401937" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:27:17.402091" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:27:17.400569" elapsed="0.001547"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:27:17.407491" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:17.407383" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:17.407365" 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-08-22T23:27:17.408748" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:17.408641" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:17.408623" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:17.409265" level="INFO">${karaf_connection_index} = 25</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:27:17.408961" elapsed="0.000330"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:17.409687" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:27:17.409447" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:27:17.464989" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:27:17.410200" elapsed="0.054887"/>
</kw>
<msg time="2026-08-22T23:27:17.465249" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:27:17.465295" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:17.409867" elapsed="0.055463"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:27:17.489466" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:27:17.465855" elapsed="0.023713"/>
</kw>
<msg time="2026-08-22T23:27:17.489761" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:27:17.489852" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                 ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:17.465494" elapsed="0.024395"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:17.490200" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:17.489970" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:17.489949" elapsed="0.000331"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:17.490741" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:17.490421" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:17.491080" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:17.490867" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:17.490849" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:27:17.491191" 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-08-22T23:27:17.494046" elapsed="0.000156"/>
</kw>
<msg time="2026-08-22T23:27:17.494266" 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-08-22T23:27:17.492793" 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-08-22T23:27:17.494704" elapsed="0.000216"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:17.495189" 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-08-22T23:27:17.492088" elapsed="0.003295"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:27:17.491466" elapsed="0.003985"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:27:17.408321" elapsed="0.087231"/>
</kw>
<msg time="2026-08-22T23:27:17.495674" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:17.495718" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                 ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:17.407737" elapsed="0.088049"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:27:17.495997" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:27:17.495885" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:17.495864" 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-08-22T23:27:17.496487" 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-08-22T23:27:17.496905" elapsed="0.000031"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:27:17.496985" 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-08-22T23:27:17.407050" elapsed="0.090047"/>
</kw>
<msg time="2026-08-22T23:27:17.497192" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:17.497236" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                 ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:17.402502" elapsed="0.094770"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:17.497668" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:17.497348" elapsed="0.000378"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:17.497330" elapsed="0.000420"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:27:17.402355" elapsed="0.095419"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:27:17.503400" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:17.503289" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:17.503270" 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-08-22T23:27:17.504771" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:17.504626" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:17.504602" elapsed="0.000241"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:17.505292" level="INFO">${karaf_connection_index} = 26</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:27:17.504988" elapsed="0.000331"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:17.505719" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:27:17.505475" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:27:17.552124" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:27:17.506238" elapsed="0.045990"/>
</kw>
<msg time="2026-08-22T23:27:17.552413" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:27:17.552463" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:17.505904" elapsed="0.046594"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:27:17.574750" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:27:17.553042" elapsed="0.021911"/>
</kw>
<msg time="2026-08-22T23:27:17.575300" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:27:17.575402" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                 ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:17.552691" elapsed="0.022789"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:17.576204" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:17.575692" elapsed="0.000632"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:17.575646" elapsed="0.000730"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:17.577370" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:17.576720" elapsed="0.000776"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:17.578160" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:17.577689" elapsed="0.000589"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:17.577648" elapsed="0.000681"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:27:17.578401" elapsed="0.000059"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<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-08-22T23:27:17.584082" elapsed="0.000319"/>
</kw>
<msg time="2026-08-22T23:27:17.584533" 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-08-22T23:27:17.581666" elapsed="0.003069"/>
</kw>
<kw name="Open 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-08-22T23:27:17.585004" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:17.585330" 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-08-22T23:27:17.580242" elapsed="0.005273"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:27:17.579004" elapsed="0.006599"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:27:17.504251" elapsed="0.081459"/>
</kw>
<msg time="2026-08-22T23:27:17.585803" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:17.585847" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                 ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:17.503634" elapsed="0.082247"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:27:17.587888" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-08-22T23:27:17.585957" elapsed="0.001995"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:17.585938" elapsed="0.002038"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:17.588372" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:17.588756" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:27:17.588830" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:27:17.502937" elapsed="0.086002"/>
</kw>
<msg time="2026-08-22T23:27:17.589031" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:17.589074" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                 ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:17.498044" elapsed="0.091066"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:17.589436" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:17.589184" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:17.589167" elapsed="0.000347"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:27:17.497905" elapsed="0.091632"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:27:17.595002" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:17.594893" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:17.594874" 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-08-22T23:27:17.596236" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:17.596128" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:17.596109" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:17.596780" level="INFO">${karaf_connection_index} = 27</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:27:17.596444" elapsed="0.000363"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:17.597176" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:27:17.596962" elapsed="0.000240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:27:17.651342" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:27:17.597707" elapsed="0.053745"/>
</kw>
<msg time="2026-08-22T23:27:17.651643" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:27:17.651692" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:17.597357" elapsed="0.054372"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:27:17.672917" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:27:17.652277" elapsed="0.020739"/>
</kw>
<msg time="2026-08-22T23:27:17.673177" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:27:17.673222" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                 ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:17.651902" elapsed="0.021356"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:17.673561" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:17.673336" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:17.673316" elapsed="0.000369"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:17.674126" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:17.673827" elapsed="0.000359"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:17.674468" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:17.674253" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:17.674235" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:27:17.674599" 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-08-22T23:27:17.677134" elapsed="0.000146"/>
</kw>
<msg time="2026-08-22T23:27:17.677372" 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-08-22T23:27:17.676053" 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-08-22T23:27:17.677796" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:17.678124" 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-08-22T23:27:17.675381" 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-08-22T23:27:17.674856" elapsed="0.003514"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:27:17.595799" elapsed="0.082669"/>
</kw>
<msg time="2026-08-22T23:27:17.678559" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:17.678634" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                 ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:17.595219" elapsed="0.083453"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:27:17.678855" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:27:17.678749" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:17.678730" 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-08-22T23:27:17.679512" 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-08-22T23:27:17.679881" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:27:17.679956" 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-08-22T23:27:17.594535" elapsed="0.085546"/>
</kw>
<msg time="2026-08-22T23:27:17.680174" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:17.680218" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                 ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:17.589821" elapsed="0.090434"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:17.680660" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:17.680330" elapsed="0.000389"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:17.680312" elapsed="0.000431"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:27:17.589683" elapsed="0.091084"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:27:17.402174" elapsed="0.278622"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:27:17.399798" elapsed="0.281056"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:27:17.394685" elapsed="0.286223"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:17.394218" elapsed="0.286734"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:27:17.391424" elapsed="0.289578"/>
</kw>
<kw name="Install_And_Start_Testtool" owner="NetconfKeywords">
<kw name="Deploy_Test_Tool" owner="NexusKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:17.701630" level="INFO">${name_prefix} = netconf-testtool-</msg>
<var>${name_prefix}</var>
<arg>${artifact}-</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:17.701304" elapsed="0.000355"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:27:17.702155" level="INFO">${extension} = jar</msg>
<var>${extension}</var>
<arg>'${component}'=='odl-micro'</arg>
<arg>tar</arg>
<arg>jar</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:17.701820" elapsed="0.000361"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:27:17.702752" level="INFO">${name_suffix} = -executable.jar</msg>
<var>${name_suffix}</var>
<arg>"${suffix}" != ""</arg>
<arg>-${suffix}.${extension}</arg>
<arg>.${extension}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:17.702345" elapsed="0.000434"/>
</kw>
<kw name="Deploy_Artifact" owner="NexusKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_url}""" != ""</arg>
<arg>Deploy_From_Url</arg>
<arg>${explicit_url}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:17.704027" elapsed="0.000305"/>
</kw>
<kw name="Fetch From Left" owner="String">
<msg time="2026-08-22T23:27:17.704728" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot</msg>
<var>${urlbase}</var>
<arg>${BUNDLE_URL}</arg>
<arg>/org/opendaylight</arg>
<doc>Returns contents of the ``string`` before the first occurrence of ``marker``.</doc>
<status status="PASS" start="2026-08-22T23:27:17.704492" elapsed="0.000262"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:27:17.705343" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot</msg>
<var>${urlbase}</var>
<arg>'${urlbase}' != '${BUNDLE_URL}'</arg>
<arg>${urlbase}</arg>
<arg>${fallback_url}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:17.704956" elapsed="0.000414"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Magnesium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_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-08-22T23:27:17.723865" elapsed="0.000428"/>
</kw>
<arg>magnesium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to titanium and in case titanium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'carpeople'] {} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:27:17.723396" elapsed="0.000967"/>
</kw>
<msg time="2026-08-22T23:27:17.724410" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>magnesium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:17.714847" elapsed="0.009612"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>carpeople</arg>
<doc>Compare magnesium to titanium and in case titanium is at most magnesium,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:27:17.714438" elapsed="0.010097"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Aluminium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_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-08-22T23:27:17.743139" elapsed="0.000398"/>
</kw>
<arg>aluminium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to titanium and in case titanium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'netconf'] {} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:27:17.742685" elapsed="0.000940"/>
</kw>
<msg time="2026-08-22T23:27:17.743672" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>aluminium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:17.733924" elapsed="0.009796"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>netconf</arg>
<doc>Compare aluminium to titanium and in case titanium is at most aluminium,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:27:17.733525" elapsed="0.010270"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Silicon" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_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-08-22T23:27:17.762264" elapsed="0.000417"/>
</kw>
<arg>silicon</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to titanium and in case titanium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'bgpcep'] {} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:27:17.761813" elapsed="0.000939"/>
</kw>
<msg time="2026-08-22T23:27:17.762797" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>silicon</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:17.753270" elapsed="0.009575"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>bgpcep</arg>
<doc>Compare silicon to titanium and in case titanium is at most silicon,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:27:17.752884" elapsed="0.010036"/>
</kw>
<if>
<branch type="IF" condition="'${build_version}'=='${EMPTY}'">
<kw name="NexusKeywords__Detect_Version_To_Pull" owner="NexusKeywords">
<kw name="NexusKeywords__Get_Items_To_Look_At" owner="NexusKeywords">
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<arg>Component not supported by NexusKeywords version detection: ${component}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:27:17.765949" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:27:17.766802" elapsed="0.000185"/>
</kw>
<msg time="2026-08-22T23:27:17.767034" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Collections.Get_From_Dictionary</arg>
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:17.766359" elapsed="0.000723"/>
</kw>
<msg time="2026-08-22T23:27:17.767183" level="INFO">${itemlist} = netconf-api</msg>
<var>${itemlist}</var>
<arg>${component}</arg>
<doc>Get a list of items that might contain the version number that we are looking for.</doc>
<status status="PASS" start="2026-08-22T23:27:17.765635" elapsed="0.001572"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:17.767486" level="INFO">index=29
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:27:17.767604" level="INFO">${current_ssh_connection} = index=29
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:27:17.767365" elapsed="0.000267"/>
</kw>
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:17.772514" level="INFO">${odl_connection} = 30</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:27:17.772113" elapsed="0.000427"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:27:17.774330" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:27:17.774409" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:27:17.774046" 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-08-22T23:27:17.774605" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:27:17.776396" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:27:18.107525" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:26:26 UTC 2026

  System load:  0.08               Processes:             121
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:27:16 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:27:17.775473" elapsed="0.332294"/>
</kw>
<msg time="2026-08-22T23:27:18.107856" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:17.775120" elapsed="0.332832"/>
</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-08-22T23:27:17.773548" elapsed="0.334532"/>
</kw>
<msg time="2026-08-22T23:27:18.108137" 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-08-22T23:27:17.773163" elapsed="0.335027"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:27:17.772786" elapsed="0.335486"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:27:18.108331" elapsed="0.000051"/>
</return>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:27:17.771752" elapsed="0.336775"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:27:18.109143" level="INFO">Executing command 'sh search.sh /tmp/netconf-karaf-9.0.4-SNAPSHOT/system netconf-api'.</msg>
<msg time="2026-08-22T23:27:18.141459" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:27:18.141641" level="INFO">${version} = 9.0.4-SNAPSHOT
org/opendaylight/netconf</msg>
<msg time="2026-08-22T23:27:18.141707" level="INFO">${result} = 0</msg>
<var>${version}</var>
<var>${result}</var>
<arg>sh search.sh ${WORKSPACE}/${BUNDLEFOLDER}/system ${itemlist}</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:27:18.108808" elapsed="0.032933"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:27:18.141968" elapsed="0.000306"/>
</kw>
<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-08-22T23:27:18.147128" elapsed="0.000205"/>
</kw>
<msg time="2026-08-22T23:27:18.147391" 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-08-22T23:27:18.146195" elapsed="0.001265"/>
</kw>
<kw name="Open 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-08-22T23:27:18.147726" elapsed="0.000032"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:18.147950" elapsed="0.000028"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:27:18.142669" elapsed="0.005392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.148643" level="INFO">9.0.4-SNAPSHOT
org/opendaylight/netconf</msg>
<arg>${version}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:18.148265" elapsed="0.000442"/>
</kw>
<if>
<branch type="IF" condition="${result}!=0">
<kw name="Fail" owner="BuiltIn">
<arg>Component "${component}": searching for "${itemlist}" found no version, cannot locate test tool.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:18.149134" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:18.148820" elapsed="0.000389"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:18.148786" elapsed="0.000460"/>
</if>
<kw name="Split String" owner="String">
<msg time="2026-08-22T23:27:18.149806" level="INFO">${version} = 9.0.4-SNAPSHOT</msg>
<msg time="2026-08-22T23:27:18.149868" level="INFO">${location} = org/opendaylight/netconf</msg>
<var>${version}</var>
<var>${location}</var>
<arg>${version}</arg>
<arg>max_split=1</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-08-22T23:27:18.149447" elapsed="0.000452"/>
</kw>
<return>
<value>${version}</value>
<value>${location}</value>
<status status="PASS" start="2026-08-22T23:27:18.149967" elapsed="0.000040"/>
</return>
<msg time="2026-08-22T23:27:18.150233" level="INFO">${version} = 9.0.4-SNAPSHOT</msg>
<msg time="2026-08-22T23:27:18.150293" level="INFO">${location} = org/opendaylight/netconf</msg>
<var>${version}</var>
<var>${location}</var>
<arg>${component}</arg>
<doc>Determine the exact Nexus directory to be used as a source for a particular test tool
Figure out what version of the tool needs to be pulled out of the
Nexus by looking at the version directory of the subsystem from
which the tool is being pulled. This code is REALLY UGLY but there
is no way around it until the bug
https://bugs.opendaylight.org/show_bug.cgi?id=5206 gets fixed.
I also don't want to depend on maven-metadata-local.xml and other
bits and pieces of ODL distribution which are not required for ODL
to function properly.</doc>
<status status="PASS" start="2026-08-22T23:27:17.765203" elapsed="0.385122"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:17.762992" elapsed="0.387469"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${version}</var>
<var>${location}</var>
<arg>${build_version}</arg>
<arg>${build_location}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:18.150736" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:18.150500" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:17.762973" elapsed="0.387889"/>
</if>
<if>
<branch type="IF" condition="'SNAPSHOT' in '${version}'">
<kw name="Remove Values From List" owner="Collections">
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>netconf</arg>
<arg>bgpcep</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:27:18.151250" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:18.150944" elapsed="0.000717"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:18.150921" elapsed="0.000783"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.152289" level="INFO">${is_staged} = "FALSE"</msg>
<var>${is_staged}</var>
<arg>"opendaylight.release" not in '${urlbase}' and "opendaylight.snapshot" not in '${urlbase}'</arg>
<arg>"TRUE"</arg>
<arg>"FALSE"</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:18.151902" elapsed="0.000414"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.152883" level="INFO">${is_mri_component} = "FALSE"</msg>
<var>${is_mri_component}</var>
<arg>'${component}' in ${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>"TRUE"</arg>
<arg>"FALSE"</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:18.152481" elapsed="0.000428"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.153463" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot</msg>
<var>${urlbase}</var>
<arg>${is_mri_component} == "TRUE" and ${is_staged} == "FALSE"</arg>
<arg>${NEXUS_RELEASE_BASE_URL}</arg>
<arg>${urlbase}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:18.153073" elapsed="0.000417"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.154032" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.4-SNAPSHOT</msg>
<var>${url}</var>
<arg>${urlbase}/${location}/${artifact}/${version}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:18.153664" elapsed="0.000395"/>
</kw>
<kw name="Execute_Command_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:27:18.156039" level="INFO">Executing command 'curl -L https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.4-SNAPSHOT/maven-metadata.xml'.</msg>
<msg time="2026-08-22T23:27:18.239448" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:27:18.239629" level="INFO">${stdout} = &lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;metadata modelVersion="1.1.0"&gt;
  &lt;groupId&gt;org.opendaylight.netconf&lt;/groupId&gt;
  &lt;artifactId&gt;netconf-testtool&lt;/artifactId&gt;
  &lt;versioning&gt;
    &lt;lastUpdated&gt;2026082...</msg>
<msg time="2026-08-22T23:27:18.239700" level="INFO">${stderr} =   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0   ...</msg>
<msg time="2026-08-22T23:27:18.239759" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:27:18.155858" elapsed="0.083932"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.240950" level="INFO">Length is 316.</msg>
<msg time="2026-08-22T23:27:18.241074" level="FAIL">'  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  2763  100  2763    0     0  45748      0 --:--:-- --:--:-- --:--:-- 46050' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-08-22T23:27:18.240536" elapsed="0.000645">'  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  2763  100  2763    0     0  45748      0 --:--:-- --:--:-- --:--:-- 46050' should be empty.</status>
</kw>
<msg time="2026-08-22T23:27:18.241328" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-08-22T23:27:18.241390" level="INFO">${result} = '  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0  ...</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:18.240040" elapsed="0.001383"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.242257" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:18.241677" elapsed="0.000616"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.243812" level="INFO">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;metadata modelVersion="1.1.0"&gt;
  &lt;groupId&gt;org.opendaylight.netconf&lt;/groupId&gt;
  &lt;artifactId&gt;netconf-testtool&lt;/artifactId&gt;
  &lt;versioning&gt;
    &lt;lastUpdated&gt;20260822052751&lt;/lastUpdated&gt;
    &lt;snapshot&gt;
      &lt;timestamp&gt;20260822.052751&lt;/timestamp&gt;
      &lt;buildNumber&gt;14&lt;/buildNumber&gt;
    &lt;/snapshot&gt;
    &lt;snapshotVersions&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;pom&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;javadoc&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;executable&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;stress-client&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;rest-perf-client&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;scale-util&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;stress-client&lt;/classifier&gt;
        &lt;extension&gt;tar.gz&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;cyclonedx&lt;/classifier&gt;
        &lt;extension&gt;xml&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;cyclonedx&lt;/classifier&gt;
        &lt;extension&gt;json&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;sources&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
    &lt;/snapshotVersions&gt;
  &lt;/versioning&gt;
  &lt;version&gt;9.0.4-SNAPSHOT&lt;/version&gt;
&lt;/metadata&gt;</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:18.243441" elapsed="0.000538"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.244544" level="INFO">  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  2763  100  2763    0     0  45748      0 --:--:-- --:--:-- --:--:-- 46050</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:18.244206" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.245184" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:18.244851" elapsed="0.000392"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:27:18.242890" elapsed="0.002428"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:18.242398" elapsed="0.002969"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:18.242371" elapsed="0.003032"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:27:18.245647" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:18.245483" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:18.245460" elapsed="0.000281"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:27:18.245941" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:27:18.245814" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:18.245793" elapsed="0.000263"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:18.246252" elapsed="0.000030"/>
</kw>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:27:18.155223" elapsed="0.091193"/>
</kw>
<msg time="2026-08-22T23:27:18.246510" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:18.154667" elapsed="0.091908"/>
</kw>
<msg time="2026-08-22T23:27:18.246814" level="INFO">${metadata} = &lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;metadata modelVersion="1.1.0"&gt;
  &lt;groupId&gt;org.opendaylight.netconf&lt;/groupId&gt;
  &lt;artifactId&gt;netconf-testtool&lt;/artifactId&gt;
  &lt;versioning&gt;
    &lt;lastUpdated&gt;2026082...</msg>
<var>${metadata}</var>
<arg>curl -L ${url}/maven-metadata.xml</arg>
<doc>A wrapper for Execute_Command_Passes with return_success_only=False
Also, log_on_success defaults to True (but is customizable, unlike return_success_only)..</doc>
<status status="PASS" start="2026-08-22T23:27:18.154261" elapsed="0.092593"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:27:18.249742" level="INFO">Executing command 'echo "&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;metadata modelVersion="1.1.0"&gt;
  &lt;groupId&gt;org.opendaylight.netconf&lt;/groupId&gt;
  &lt;artifactId&gt;netconf-testtool&lt;/artifactId&gt;
  &lt;versioning&gt;
    &lt;lastUpdated&gt;20260822052751&lt;/lastUpdated&gt;
    &lt;snapshot&gt;
      &lt;timestamp&gt;20260822.052751&lt;/timestamp&gt;
      &lt;buildNumber&gt;14&lt;/buildNumber&gt;
    &lt;/snapshot&gt;
    &lt;snapshotVersions&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;pom&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;javadoc&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;executable&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;stress-client&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;rest-perf-client&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;scale-util&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;stress-client&lt;/classifier&gt;
        &lt;extension&gt;tar.gz&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;cyclonedx&lt;/classifier&gt;
        &lt;extension&gt;xml&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;cyclonedx&lt;/classifier&gt;
        &lt;extension&gt;json&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;sources&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
    &lt;/snapshotVersions&gt;
  &lt;/versioning&gt;
  &lt;version&gt;9.0.4-SNAPSHOT&lt;/version&gt;
&lt;/metadata&gt;" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1'.</msg>
<msg time="2026-08-22T23:27:18.286179" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:27:18.286333" level="INFO">${stdout} = 9.0.4-20260822.052751-14</msg>
<msg time="2026-08-22T23:27:18.286436" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:27:18.286494" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:27:18.249547" elapsed="0.036979"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.287658" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:27:18.287273" elapsed="0.000448"/>
</kw>
<msg time="2026-08-22T23:27:18.287853" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:27:18.287913" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:18.286810" elapsed="0.001134"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.288766" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:18.288171" elapsed="0.000631"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.290278" level="INFO">9.0.4-20260822.052751-14</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:18.289937" elapsed="0.000402"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.290919" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:18.290569" elapsed="0.000406"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.291508" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:18.291182" elapsed="0.000384"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:27:18.289367" elapsed="0.002298"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:18.288911" elapsed="0.002803"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:18.288882" elapsed="0.002866"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:27:18.291964" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:18.291826" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:18.291803" elapsed="0.000252"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:27:18.292248" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:27:18.292127" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:18.292105" elapsed="0.000254"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:18.292555" elapsed="0.000052"/>
</kw>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:27:18.248963" elapsed="0.043780"/>
</kw>
<msg time="2026-08-22T23:27:18.292816" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:18.248293" elapsed="0.044588"/>
</kw>
<arg>echo "${metadata}" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1</arg>
<arg>stderr_must_be_empty=${True}</arg>
<doc>A wrapper for Execute_Command_Passes with return_success_only=False
Also, log_on_success defaults to True (but is customizable, unlike return_success_only)..</doc>
<status status="PASS" start="2026-08-22T23:27:18.247632" elapsed="0.045357"/>
</kw>
<msg time="2026-08-22T23:27:18.293120" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:18.293180" level="INFO">${namepart} = 9.0.4-20260822.052751-14</msg>
<var>${status}</var>
<var>${namepart}</var>
<arg>SSHKeywords.Execute_Command_Should_Pass</arg>
<arg>echo "${metadata}" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1</arg>
<arg>stderr_must_be_empty=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:18.247072" elapsed="0.046139"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.293825" level="INFO">Length is 24.</msg>
<msg time="2026-08-22T23:27:18.293929" level="INFO">${length} = 24</msg>
<var>${length}</var>
<arg>${namepart}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:27:18.293432" elapsed="0.000530"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.294804" level="INFO">${namepart} = 9.0.4-20260822.052751-14</msg>
<var>${namepart}</var>
<arg>"${status}" != "PASS" or ${length} == 0</arg>
<arg>${version}</arg>
<arg>${namepart}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:18.294186" elapsed="0.000654"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.295840" level="INFO">${filename} = netconf-testtool-9.0.4-20260822.052751-14-executable.jar</msg>
<var>${filename}</var>
<arg>${name_prefix}${namepart}${name_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:18.295059" elapsed="0.000818"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.296427" level="INFO">netconf-testtool-9.0.4-20260822.052751-14-executable.jar</msg>
<arg>${filename}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:18.296089" elapsed="0.000399"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.297154" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.4-SNAPSHOT/netconf-testtool-9.0.4-20260822.052751-14-executable.jar</msg>
<var>${url}</var>
<arg>${url}/${filename}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:18.296716" elapsed="0.000475"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:27:18.297658" level="INFO">Executing command 'wget -q -N 'https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.4-SNAPSHOT/netconf-testtool-9.0.4-20260822.052751-14-executable.jar' 2&gt;&amp;1'.</msg>
<msg time="2026-08-22T23:27:18.358145" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:27:18.358298" level="INFO">${response} = </msg>
<msg time="2026-08-22T23:27:18.358360" level="INFO">${result} = 0</msg>
<var>${response}</var>
<var>${result}</var>
<arg>wget -q -N '${url}' 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:27:18.297406" elapsed="0.060987"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.358995" level="INFO"/>
<arg>${response}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:18.358647" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="${result} == 0">
<return>
<value>${filename}</value>
<status status="PASS" start="2026-08-22T23:27:18.359297" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:27:18.359146" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:18.359121" elapsed="0.000292"/>
</if>
<kw name="Replace String Using Regexp" owner="String">
<var>${release_url}</var>
<arg>${url}</arg>
<arg>autorelease-[0-9]{4}</arg>
<arg>opendaylight.release</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:18.359639" elapsed="0.000032"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${response}</var>
<var>${result}</var>
<arg>wget -q -N '${release_url}' 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:18.359893" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="${result} != 0">
<kw name="Fail" owner="BuiltIn">
<arg>Artifact "${artifact}" in component "${component}" could not be downloaded from ${release_url} nor ${url}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:18.360233" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:18.360040" elapsed="0.000264"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:18.360015" elapsed="0.000322"/>
</if>
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-08-22T23:27:18.360382" elapsed="0.000019"/>
</return>
<msg time="2026-08-22T23:27:18.360611" level="INFO">${filename} = netconf-testtool-9.0.4-20260822.052751-14-executable.jar</msg>
<var>${filename}</var>
<arg>${component}</arg>
<arg>${artifact}</arg>
<arg>${name_prefix}</arg>
<arg>${name_suffix}</arg>
<arg>${fallback_url}</arg>
<arg>${explicit_url}</arg>
<arg>${build_version}</arg>
<arg>${build_location}</arg>
<doc>Deploy the specified artifact from Nexus to the cwd of the machine to which the active SSHLibrary connection points.
netconf is a name part of an artifact present in system/ of ODl installation with the same version as netconf-testtool should have.
Must have https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-karaf/9.0.4-SNAPSHOT/netconf-karaf-9.0.4-20260822.052751-14.zip variable set to the URL from which the
tested ODL distribution was downloaded and this place must be
inside a repository created by a standard distribution
construction job. If this is detected to ne be the case, fallback URL is used.
If  is non-empty, Deploy_From_Utrl is called instead.
TODO: Allow deploying to a specific directory, we have SSHKeywords.Execute_Command_At_Cwd_Should_Pass now.</doc>
<status status="PASS" start="2026-08-22T23:27:17.703354" elapsed="0.657295"/>
</kw>
<return>
<value>${filename}</value>
<status status="PASS" start="2026-08-22T23:27:18.360744" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:27:18.360954" level="INFO">${filename} = netconf-testtool-9.0.4-20260822.052751-14-executable.jar</msg>
<var>${filename}</var>
<arg>netconf</arg>
<arg>netconf-testtool</arg>
<doc>Deploy a test tool.
The test tools have naming convention of the form
"&lt;repository_url&gt;/some/dir/somewhere/&lt;tool-name&gt;/&lt;tool-name&gt;-&lt;version-tag&gt;-${suffix}.jar"
where "&lt;tool-name&gt;" is the name of the tool and "&lt;version-tag&gt;" is
the version tag that is digged out of the maven metadata. This
keyword calculates ${name_prefix} and ${name_suffix} for
"Deploy_Artifact" and then calls "Deploy_Artifact" to do the real
work of deploying the artifact.</doc>
<status status="PASS" start="2026-08-22T23:27:17.695379" elapsed="0.665610"/>
</kw>
<kw name="Start_Testtool" owner="NetconfKeywords">
<kw name="NetconfKeywords__Deploy_Additional_Schemas" owner="NetconfKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:27:18.363328" level="INFO">Executing command 'rm -rf schemas 2&gt;&amp;1'.</msg>
<msg time="2026-08-22T23:27:18.409700" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:27:18.409833" level="INFO">${response} = </msg>
<var>${response}</var>
<arg>rm -rf schemas 2&gt;&amp;1</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:27:18.363195" elapsed="0.046672"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.410465" level="INFO"/>
<arg>${response}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:18.410095" elapsed="0.000428"/>
</kw>
<if>
<branch type="IF" condition="'${schemas}' == 'none'">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-08-22T23:27:18.410813" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:18.410656" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:18.410628" elapsed="0.000278"/>
</if>
<kw name="Put Directory" owner="SSHLibrary">
<msg time="2026-08-22T23:27:18.454233" level="INFO">[chan 5] Opened sftp connection (server version 3)</msg>
<msg time="2026-08-22T23:27:18.541390" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/yang-ext@2013-07-09.yang' -&gt; '/home/jenkins/./schemas/yang-ext@2013-07-09.yang'</msg>
<msg time="2026-08-22T23:27:18.541450" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/example-action@2016-07-07.yang' -&gt; '/home/jenkins/./schemas/example-action@2016-07-07.yang'</msg>
<msg time="2026-08-22T23:27:18.541488" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/car@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/car@2014-08-18.yang'</msg>
<msg time="2026-08-22T23:27:18.541539" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/car-purchase@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/car-purchase@2014-08-18.yang'</msg>
<msg time="2026-08-22T23:27:18.541611" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/ncmount-l2fib@2016-03-07.yang' -&gt; '/home/jenkins/./schemas/ncmount-l2fib@2016-03-07.yang'</msg>
<msg time="2026-08-22T23:27:18.541648" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/augment-main-a@2014-01-21.yang' -&gt; '/home/jenkins/./schemas/augment-main-a@2014-01-21.yang'</msg>
<msg time="2026-08-22T23:27:18.541682" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/ietf-netconf-monitoring@2010-10-04.yang' -&gt; '/home/jenkins/./schemas/ietf-netconf-monitoring@2010-10-04.yang'</msg>
<msg time="2026-08-22T23:27:18.541716" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/ietf-netconf-monitoring-extension@2013-12-10.yang' -&gt; '/home/jenkins/./schemas/ietf-netconf-monitoring-extension@2013-12-10.yang'</msg>
<msg time="2026-08-22T23:27:18.541803" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/people@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/people@2014-08-18.yang'</msg>
<msg time="2026-08-22T23:27:18.541842" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/test@2014-10-18.yang' -&gt; '/home/jenkins/./schemas/test@2014-10-18.yang'</msg>
<msg time="2026-08-22T23:27:18.541877" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/car-people@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/car-people@2014-08-18.yang'</msg>
<msg time="2026-08-22T23:27:18.541910" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/ietf-inet-types@2010-09-24.yang' -&gt; '/home/jenkins/./schemas/ietf-inet-types@2010-09-24.yang'</msg>
<msg time="2026-08-22T23:27:18.541943" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/main@2014-01-21.yang' -&gt; '/home/jenkins/./schemas/main@2014-01-21.yang'</msg>
<arg>${schemas}</arg>
<arg>destination=./schemas</arg>
<doc>Uploads a directory, including its content, from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-08-22T23:27:18.411107" elapsed="0.130898"/>
</kw>
<kw name="List Directory" owner="SSHLibrary">
<msg time="2026-08-22T23:27:18.545381" level="INFO">13 items:
augment-main-a@2014-01-21.yang
car-people@2014-08-18.yang
car-purchase@2014-08-18.yang
car@2014-08-18.yang
example-action@2016-07-07.yang
ietf-inet-types@2010-09-24.yang
ietf-netconf-monitoring-extension@2013-12-10.yang
ietf-netconf-monitoring@2010-10-04.yang
main@2014-01-21.yang
ncmount-l2fib@2016-03-07.yang
people@2014-08-18.yang
test@2014-10-18.yang
yang-ext@2013-07-09.yang</msg>
<arg>./schemas</arg>
<doc>Returns and logs items in the remote ``path``, optionally filtered with ``pattern``.</doc>
<status status="PASS" start="2026-08-22T23:27:18.542230" elapsed="0.003231"/>
</kw>
<return>
<value>--schemas-dir ./schemas</value>
<status status="PASS" start="2026-08-22T23:27:18.545525" elapsed="0.000079"/>
</return>
<msg time="2026-08-22T23:27:18.545750" level="INFO">${schemas_option} = --schemas-dir ./schemas</msg>
<var>${schemas_option}</var>
<arg>${schemas}</arg>
<doc>Internal keyword for Install_And_Start_TestTool
This deploys the additional schemas if any and returns a
command line argument to be added to the testtool commandline
to tell it to load them. While this code could be integrated
into its only user, I considered the resulting code to be too
unreadable as the actions are quite different in the two
possibilities (additional schemas present versus no additional
schemas present), therefore a separate keyword is used.</doc>
<status status="PASS" start="2026-08-22T23:27:18.362605" elapsed="0.183179"/>
</kw>
<kw name="NetconfKeywords__Deploy_Custom_RPC" owner="NetconfKeywords">
<if>
<branch type="IF" condition="'${rpc_config}' == 'none'">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-08-22T23:27:18.546629" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:27:18.546455" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:18.546429" elapsed="0.000320"/>
</if>
<kw name="Copy_File_To_Tools_System" owner="SSHKeywords">
<arg>${TOOLS_SYSTEM_1_IP}</arg>
<arg>${rpc_config}</arg>
<arg>/tmp</arg>
<doc>Wrapper keyword to make it easier to copy a file to an Tools specific system</doc>
<status status="NOT RUN" start="2026-08-22T23:27:18.547012" elapsed="0.000034"/>
</kw>
<return>
<value>--rpc-config /tmp/customaction.xml</value>
<status status="NOT RUN" start="2026-08-22T23:27:18.547112" elapsed="0.000021"/>
</return>
<msg time="2026-08-22T23:27:18.549881" level="INFO">${rpc_config_option} = </msg>
<var>${rpc_config_option}</var>
<arg>${rpc_config}</arg>
<doc>Internal keyword for Install_And_Start_TestTool
This deploys the optional custom rpc file.
Drop out of the keyword, returning no command line argument when there
is no rpc file to deploy.</doc>
<status status="PASS" start="2026-08-22T23:27:18.546120" elapsed="0.003797"/>
</kw>
<kw name="Compose_Full_Java_Command" owner="NexusKeywords">
<kw name="Compose_Base_Java_Command" owner="NexusKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${openjdk}""" == "openjdk8"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_8_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_8_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:18.551831" elapsed="0.000448"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${openjdk}""" == "openjdk11"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_11_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_11_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:18.552509" elapsed="0.000456"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${openjdk}""" == "openjdk17"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_17_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_17_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:18.553204" elapsed="0.000476"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Compose_Dilemma_Filepath" owner="NexusKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:27:18.555661" level="INFO">Executing command 'ls -lA /usr/lib/jvm/java-21-openjdk-amd64/bin/java 2&gt;&amp;1'.</msg>
<msg time="2026-08-22T23:27:18.567484" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:27:18.567605" level="INFO">${out} = -rwxr-xr-x 1 root root 14456 Apr 26 09:33 /usr/lib/jvm/java-21-openjdk-amd64/bin/java</msg>
<msg time="2026-08-22T23:27:18.567659" level="INFO">${rc} = 0</msg>
<var>${out}</var>
<var>${rc}</var>
<arg>ls -lA ${specific_path} 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:27:18.555401" elapsed="0.012294"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${specific_path}</value>
<status status="PASS" start="2026-08-22T23:27:18.567953" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:27:18.567807" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:18.567779" elapsed="0.000290"/>
</if>
<return>
<value>${default_path}</value>
<status status="NOT RUN" start="2026-08-22T23:27:18.568116" elapsed="0.000019"/>
</return>
<arg>${JAVA_21_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_21_HOME_UBUNTU}/bin/java</arg>
<doc>Query active SSH connection, return specific path if it exists else default path.</doc>
<status status="PASS" start="2026-08-22T23:27:18.554854" elapsed="0.013414"/>
</kw>
<msg time="2026-08-22T23:27:18.568328" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>"""${openjdk}""" == "openjdk21"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_21_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_21_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:18.553912" elapsed="0.014482"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${out}</var>
<var>${rc}</var>
<arg>java -version 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:18.568669" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>java</value>
<status status="NOT RUN" start="2026-08-22T23:27:18.568852" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:18.568802" elapsed="0.000154"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:18.568779" elapsed="0.000210"/>
</if>
<kw name="Execute Command" owner="SSHLibrary">
<var>${java}</var>
<arg>echo $JAVA_HOME/bin/java 2&gt;&amp;1</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:18.569192" elapsed="0.000029"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${out}</var>
<var>${rc}</var>
<arg>${java} -version 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:18.569429" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${java}</value>
<status status="NOT RUN" start="2026-08-22T23:27:18.569624" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:18.569553" elapsed="0.000127"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:18.569531" elapsed="0.000179"/>
</if>
<kw name="Get Environment Variable" owner="OperatingSystem">
<var>${JAVA_HOME}</var>
<arg>JAVA_HOME</arg>
<arg>${EMPTY}</arg>
<doc>Returns the value of an environment variable with the given name.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:18.569905" elapsed="0.000028"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${java}</var>
<arg>"""${JAVA_HOME}"""!=""</arg>
<arg>${JAVA_HOME}/bin/java</arg>
<arg>false</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:18.570148" elapsed="0.000028"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${out}</var>
<var>${rc}</var>
<arg>${java} -version 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:18.570390" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${java}</value>
<status status="NOT RUN" start="2026-08-22T23:27:18.570565" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:18.570515" elapsed="0.000126"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:18.570492" elapsed="0.000179"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unable to find Java; specify \${JDKVERSION}, put it to your PATH or set JAVA_HOME environment variable.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:18.570862" elapsed="0.000028"/>
</kw>
<msg time="2026-08-22T23:27:18.571031" level="INFO">${base_command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java</msg>
<var>${base_command}</var>
<arg>openjdk=${openjdk}</arg>
<doc>Return string suitable for launching Java programs over SSHLibrary, depending on JRE version needed.
This requires that the SSH connection on which the command is going to be used is active as it is needed for querying files.
Commands composed for one SSH connection shall not be reused on other SSH connections as the two connections may have different Java setups.
Not directly related to Nexus, but versioned Java tools may need this.</doc>
<status status="PASS" start="2026-08-22T23:27:18.551295" elapsed="0.019771"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.571754" level="INFO">${full_command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.4-20260822.052751-14-executable.jar  --device-count 1 --debug true --schemas-dir ./...</msg>
<var>${full_command}</var>
<arg>${base_command} ${options}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:18.571274" elapsed="0.000518"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.572338" level="INFO">/usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.4-20260822.052751-14-executable.jar  --device-count 1 --debug true --schemas-dir ./schemas  --md-sal true</msg>
<arg>${full_command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:18.572002" elapsed="0.000410"/>
</kw>
<return>
<value>${full_command}</value>
<status status="PASS" start="2026-08-22T23:27:18.572473" elapsed="0.000039"/>
</return>
<msg time="2026-08-22T23:27:18.572714" level="INFO">${command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.4-20260822.052751-14-executable.jar  --device-count 1 --debug true --schemas-dir ./...</msg>
<var>${command}</var>
<arg>${java_options} -jar ${filename} ${tool_options} --device-count ${device-count} --debug ${debug} ${schemas_option} ${rpc_config_option} --md-sal ${mdsal}</arg>
<doc>Return full Bash command to run Java with given options.
This requires that the SSH connection on which the command is going to be used is active as it is needed for querying files.
The options may include JVM options, application command line arguments, Bash redirects and other constructs.</doc>
<status status="PASS" start="2026-08-22T23:27:18.550231" elapsed="0.022520"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.573310" level="INFO">Running testtool: /usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.4-20260822.052751-14-executable.jar  --device-count 1 --debug true --schemas-dir ./schemas  --md-sal true</msg>
<arg>Running testtool: ${command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:18.572965" elapsed="0.000407"/>
</kw>
<kw name="Get Log File Name" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.577123" level="INFO">${name} = netconf-clustering-txt-Entity</msg>
<var>${name}</var>
<arg>"""${SUITE_NAME}""".replace(" ","-").replace("/","-").replace(".","-")</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:18.576715" elapsed="0.000435"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.579443" level="INFO">${suffix} = </msg>
<var>${suffix}</var>
<arg>'${testcase}' != ''</arg>
<arg>--${testcase}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:18.577310" elapsed="0.002159"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-08-22T23:27:18.579830" level="INFO">${date} = 2026-08-22 23:27:18.580</msg>
<var>${date}</var>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-08-22T23:27:18.579647" elapsed="0.000209"/>
</kw>
<kw name="Convert Date" owner="DateTime">
<msg time="2026-08-22T23:27:18.580319" level="INFO">${timestamp} = 1787441238.58</msg>
<var>${timestamp}</var>
<arg>${date}</arg>
<arg>epoch</arg>
<doc>Converts between supported `date formats`.</doc>
<status status="PASS" start="2026-08-22T23:27:18.580004" elapsed="0.000341"/>
</kw>
<return>
<value>${testtool}--${name}${suffix}.${timestamp}.log</value>
<status status="PASS" start="2026-08-22T23:27:18.580392" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:27:18.580652" level="INFO">${logfile} = testtool--netconf-clustering-txt-Entity.1787441238.58.log</msg>
<var>${logfile}</var>
<arg>testtool</arg>
<doc>Get the name of the suite sanitized to be usable as a part of filename.
These names are used to constructs names of the log files produced
by the testing tools so two suites using a tool wont overwrite the
log files if they happen to run in one job.</doc>
<status status="PASS" start="2026-08-22T23:27:18.573709" elapsed="0.006969"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.585299" level="INFO">${testtool_log} = testtool--netconf-clustering-txt-Entity.1787441238.58.log</msg>
<arg>${testtool_log}</arg>
<arg>${logfile}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:27:18.580840" elapsed="0.004542"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:27:18.609603" level="INFO">/usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.4-20260822.052751-14-executable.jar  --device-count 1 --debug true --schemas-dir ./schemas  --md-sal true &gt;testtool--netconf-clustering-txt-Entity.1787441238.58.log 2&gt;&amp;1</msg>
<arg>${command} &gt;${logfile} 2&gt;&amp;1</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:27:18.585538" elapsed="0.024124"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.613688" level="INFO">${NetconfKeywords__testtool_device_count} = 1</msg>
<arg>${NetconfKeywords__testtool_device_count}</arg>
<arg>${device-count}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:27:18.609830" elapsed="0.003904"/>
</kw>
<kw name="Perform_Operation_On_Each_Device" owner="NetconfKeywords">
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-08-22T23:27:18.614529" level="INFO">${current_Date} = 2026-08-22 23:27:18.614</msg>
<var>${current_Date}</var>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-08-22T23:27:18.614377" elapsed="0.000179"/>
</kw>
<kw name="Add Time To Date" owner="DateTime">
<msg time="2026-08-22T23:27:18.615058" level="INFO">${deadline_Date} = 2026-08-23 00:12:18.614</msg>
<var>${deadline_Date}</var>
<arg>${current_Date}</arg>
<arg>${timeout}</arg>
<doc>Adds time to date and returns the resulting date.</doc>
<status status="PASS" start="2026-08-22T23:27:18.614725" elapsed="0.000358"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.619838" level="INFO">${current_port} = 17830</msg>
<arg>${current_port}</arg>
<arg>${BASE_NETCONF_DEVICE_PORT}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:27:18.615243" elapsed="0.004642"/>
</kw>
<kw name="Repeat Keyword" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.620366" level="INFO">Repeating keyword, round 1/1.</msg>
<kw name="NetconfKeywords__Perform_Operation_With_Checking_On_Next_Device" owner="NetconfKeywords">
<kw name="NetconfKeywords__Check_Netconf_Test_Timeout_Not_Expired" owner="NetconfKeywords">
<if>
<branch type="IF" condition="not ${ENABLE_NETCONF_TEST_TIMEOUT}">
<return>
<status status="NOT RUN" start="2026-08-22T23:27:18.621475" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:18.621367" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:18.621348" elapsed="0.000192"/>
</if>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-08-22T23:27:18.621853" level="INFO">${current_Date} = 2026-08-22 23:27:18.622</msg>
<var>${current_Date}</var>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-08-22T23:27:18.621699" elapsed="0.000180"/>
</kw>
<kw name="Subtract Date From Date" owner="DateTime">
<msg time="2026-08-22T23:27:18.622338" level="INFO">${ellapsed_seconds} = 2699.992</msg>
<var>${ellapsed_seconds}</var>
<arg>${deadline_Date}</arg>
<arg>${current_Date}</arg>
<doc>Subtracts date from another date and returns time between.</doc>
<status status="PASS" start="2026-08-22T23:27:18.622028" elapsed="0.000336"/>
</kw>
<if>
<branch type="IF" condition="${ellapsed_seconds}&lt;0">
<kw name="Fail" owner="BuiltIn">
<arg>The global time out period expired</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:18.622700" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:18.622436" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:18.622417" elapsed="0.000362"/>
</if>
<arg>${deadline_Date}</arg>
<status status="PASS" start="2026-08-22T23:27:18.621128" elapsed="0.001698"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.623334" level="INFO">${number} = 1</msg>
<var>${number}</var>
<arg>${current_port}-${BASE_NETCONF_DEVICE_PORT}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:18.622970" elapsed="0.000390"/>
</kw>
<kw name="Run Keyword" owner="BuiltIn">
<kw name="NetconfKeywords__Wait_Device_Is_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.624790" level="INFO">${number} = 1</msg>
<var>${number}</var>
<arg>'${device_name}'.split('-').pop()</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:18.624425" elapsed="0.000392"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.626347" level="INFO">${device-port} = 17830</msg>
<var>${device-port}</var>
<arg>${FIRST_TESTTOOL_PORT}+${device-number}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:18.625809" elapsed="0.000565"/>
</kw>
<kw name="NetconfKeywords__Check_Device_Is_Up" owner="NetconfKeywords">
<kw name="Count_Port_Occurences" owner="SSHKeywords">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_And_Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:27:18.629470" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-08-22T23:27:18.641542" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:27:18.641705" level="INFO">${netstat_installed} = net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET...</msg>
<var>${netstat_installed}</var>
<arg>netstat --version</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:27:18.629375" elapsed="0.012367"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<doc>Install netstat if it is not already installed.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:18.642310" elapsed="0.000194"/>
</kw>
<msg time="2026-08-22T23:27:18.642555" level="FAIL">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</msg>
<status status="FAIL" start="2026-08-22T23:27:18.641842" elapsed="0.000868">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</branch>
<status status="FAIL" start="2026-08-22T23:27:18.641815" elapsed="0.000958">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="FAIL" start="2026-08-22T23:27:18.629095" elapsed="0.013862">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</kw>
<arg>Check_And_Install_Netstat</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:18.628530" elapsed="0.014597"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:27:18.644953" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-08-22T23:27:18.703365" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:27:18.703825" level="INFO">${output} = 0</msg>
<var>${output}</var>
<arg>${NETSTAT_COMMAND} 2&gt; /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:27:18.644456" elapsed="0.059471"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:27:18.704067" elapsed="0.000120"/>
</return>
<msg time="2026-08-22T23:27:18.704807" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${last-port}</arg>
<arg>LISTEN</arg>
<arg>java</arg>
<doc>Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.</doc>
<status status="PASS" start="2026-08-22T23:27:18.627038" elapsed="0.077950"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-08-22T23:27:18.707248" level="FAIL">0 != 1</msg>
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-08-22T23:27:18.705838" elapsed="0.001659">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-08-22T23:27:18.626589" elapsed="0.081532">0 != 1</status>
</kw>
<arg>${number}</arg>
<doc>Query netstat on remote machine whether testtool device with the specified number has its port open and fail if not.</doc>
<status status="FAIL" start="2026-08-22T23:27:18.625476" elapsed="0.082863">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:19.712205" level="INFO">${device-port} = 17830</msg>
<var>${device-port}</var>
<arg>${FIRST_TESTTOOL_PORT}+${device-number}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:19.710522" elapsed="0.001761"/>
</kw>
<kw name="NetconfKeywords__Check_Device_Is_Up" owner="NetconfKeywords">
<kw name="Count_Port_Occurences" owner="SSHKeywords">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_And_Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:27:19.719881" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-08-22T23:27:19.732529" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:27:19.732873" level="INFO">${netstat_installed} = net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET...</msg>
<var>${netstat_installed}</var>
<arg>netstat --version</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:27:19.719715" elapsed="0.013274"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<doc>Install netstat if it is not already installed.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:19.733996" elapsed="0.000077"/>
</kw>
<msg time="2026-08-22T23:27:19.734165" level="FAIL">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</msg>
<status status="FAIL" start="2026-08-22T23:27:19.733188" elapsed="0.001249">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</branch>
<status status="FAIL" start="2026-08-22T23:27:19.733132" elapsed="0.001482">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="FAIL" start="2026-08-22T23:27:19.719169" elapsed="0.015803">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</kw>
<arg>Check_And_Install_Netstat</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:19.717948" elapsed="0.017353"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:27:19.738680" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-08-22T23:27:19.782051" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:27:19.782367" level="INFO">${output} = 0</msg>
<var>${output}</var>
<arg>${NETSTAT_COMMAND} 2&gt; /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:27:19.737634" elapsed="0.044809"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:27:19.782559" elapsed="0.000142"/>
</return>
<msg time="2026-08-22T23:27:19.783118" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${last-port}</arg>
<arg>LISTEN</arg>
<arg>java</arg>
<doc>Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.</doc>
<status status="PASS" start="2026-08-22T23:27:19.714193" elapsed="0.069050"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-08-22T23:27:19.784863" level="FAIL">0 != 1</msg>
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-08-22T23:27:19.783861" elapsed="0.001189">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-08-22T23:27:19.712832" elapsed="0.072590">0 != 1</status>
</kw>
<arg>${number}</arg>
<doc>Query netstat on remote machine whether testtool device with the specified number has its port open and fail if not.</doc>
<status status="FAIL" start="2026-08-22T23:27:19.709308" elapsed="0.076252">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:20.788993" level="INFO">${device-port} = 17830</msg>
<var>${device-port}</var>
<arg>${FIRST_TESTTOOL_PORT}+${device-number}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:20.787443" elapsed="0.001625"/>
</kw>
<kw name="NetconfKeywords__Check_Device_Is_Up" owner="NetconfKeywords">
<kw name="Count_Port_Occurences" owner="SSHKeywords">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_And_Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:27:20.797012" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-08-22T23:27:20.809720" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:27:20.809943" level="INFO">${netstat_installed} = net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET...</msg>
<var>${netstat_installed}</var>
<arg>netstat --version</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:27:20.796879" elapsed="0.013135"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<doc>Install netstat if it is not already installed.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:20.810989" elapsed="0.000070"/>
</kw>
<msg time="2026-08-22T23:27:20.811142" level="FAIL">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</msg>
<status status="FAIL" start="2026-08-22T23:27:20.810209" elapsed="0.001143">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</branch>
<status status="FAIL" start="2026-08-22T23:27:20.810157" elapsed="0.001299">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="FAIL" start="2026-08-22T23:27:20.796129" elapsed="0.015647">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</kw>
<arg>Check_And_Install_Netstat</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:20.794735" elapsed="0.017354"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:27:20.815126" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-08-22T23:27:20.862025" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:27:20.862440" level="INFO">${output} = 0</msg>
<var>${output}</var>
<arg>${NETSTAT_COMMAND} 2&gt; /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:27:20.814295" elapsed="0.048260"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:27:20.862779" elapsed="0.000132"/>
</return>
<msg time="2026-08-22T23:27:20.863490" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${last-port}</arg>
<arg>LISTEN</arg>
<arg>java</arg>
<doc>Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.</doc>
<status status="PASS" start="2026-08-22T23:27:20.790646" elapsed="0.073079"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-08-22T23:27:20.866092" level="FAIL">0 != 1</msg>
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-08-22T23:27:20.864548" elapsed="0.001810">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-08-22T23:27:20.789500" elapsed="0.077563">0 != 1</status>
</kw>
<arg>${number}</arg>
<doc>Query netstat on remote machine whether testtool device with the specified number has its port open and fail if not.</doc>
<status status="FAIL" start="2026-08-22T23:27:20.786390" elapsed="0.080895">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:21.870680" level="INFO">${device-port} = 17830</msg>
<var>${device-port}</var>
<arg>${FIRST_TESTTOOL_PORT}+${device-number}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:21.869166" elapsed="0.001587"/>
</kw>
<kw name="NetconfKeywords__Check_Device_Is_Up" owner="NetconfKeywords">
<kw name="Count_Port_Occurences" owner="SSHKeywords">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_And_Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:27:21.878186" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-08-22T23:27:21.908757" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:27:21.909002" level="INFO">${netstat_installed} = net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET...</msg>
<var>${netstat_installed}</var>
<arg>netstat --version</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:27:21.877831" elapsed="0.031229"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<doc>Install netstat if it is not already installed.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:21.910074" elapsed="0.000057"/>
</kw>
<msg time="2026-08-22T23:27:21.910209" level="FAIL">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</msg>
<status status="FAIL" start="2026-08-22T23:27:21.909258" elapsed="0.001162">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</branch>
<status status="FAIL" start="2026-08-22T23:27:21.909191" elapsed="0.001333">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="FAIL" start="2026-08-22T23:27:21.877112" elapsed="0.033738">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</kw>
<arg>Check_And_Install_Netstat</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:21.875679" elapsed="0.035450"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:27:21.914186" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-08-22T23:27:21.979053" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:27:21.979785" level="INFO">${output} = 0</msg>
<var>${output}</var>
<arg>${NETSTAT_COMMAND} 2&gt; /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:27:21.913330" elapsed="0.066564"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:27:21.980089" elapsed="0.000166"/>
</return>
<msg time="2026-08-22T23:27:21.980900" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${last-port}</arg>
<arg>LISTEN</arg>
<arg>java</arg>
<doc>Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.</doc>
<status status="PASS" start="2026-08-22T23:27:21.872242" elapsed="0.108840"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-08-22T23:27:21.984371" level="FAIL">0 != 1</msg>
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-08-22T23:27:21.982143" elapsed="0.002591">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-08-22T23:27:21.871172" elapsed="0.114173">0 != 1</status>
</kw>
<arg>${number}</arg>
<doc>Query netstat on remote machine whether testtool device with the specified number has its port open and fail if not.</doc>
<status status="FAIL" start="2026-08-22T23:27:21.868152" elapsed="0.117417">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:22.989813" level="INFO">${device-port} = 17830</msg>
<var>${device-port}</var>
<arg>${FIRST_TESTTOOL_PORT}+${device-number}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:22.988302" elapsed="0.001582"/>
</kw>
<kw name="NetconfKeywords__Check_Device_Is_Up" owner="NetconfKeywords">
<kw name="Count_Port_Occurences" owner="SSHKeywords">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_And_Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:27:22.996496" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-08-22T23:27:23.009676" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:27:23.009899" level="INFO">${netstat_installed} = net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET...</msg>
<var>${netstat_installed}</var>
<arg>netstat --version</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:27:22.996382" elapsed="0.013575"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<doc>Install netstat if it is not already installed.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.010931" elapsed="0.000056"/>
</kw>
<msg time="2026-08-22T23:27:23.011065" level="FAIL">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</msg>
<status status="FAIL" start="2026-08-22T23:27:23.010137" elapsed="0.001141">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</branch>
<status status="FAIL" start="2026-08-22T23:27:23.010084" elapsed="0.001297">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="FAIL" start="2026-08-22T23:27:22.996092" elapsed="0.015603">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</kw>
<arg>Check_And_Install_Netstat</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:22.994919" elapsed="0.017088"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:27:23.015022" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-08-22T23:27:23.058350" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:27:23.058826" level="INFO">${output} = 1</msg>
<var>${output}</var>
<arg>${NETSTAT_COMMAND} 2&gt; /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:27:23.014203" elapsed="0.044734"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:27:23.059088" elapsed="0.000131"/>
</return>
<msg time="2026-08-22T23:27:23.059835" level="INFO">${count} = 1</msg>
<var>${count}</var>
<arg>${last-port}</arg>
<arg>LISTEN</arg>
<arg>java</arg>
<doc>Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.</doc>
<status status="PASS" start="2026-08-22T23:27:22.991362" elapsed="0.068674"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-08-22T23:27:23.060905" elapsed="0.001428"/>
</kw>
<arg>${device-port}</arg>
<status status="PASS" start="2026-08-22T23:27:22.990299" elapsed="0.072486"/>
</kw>
<arg>${number}</arg>
<doc>Query netstat on remote machine whether testtool device with the specified number has its port open and fail if not.</doc>
<status status="PASS" start="2026-08-22T23:27:22.987295" elapsed="0.075617"/>
</kw>
<arg>${TESTTOOL_BOOT_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Device_Up_And_Running</arg>
<arg>${number}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:27:18.624978" elapsed="4.438047"/>
</kw>
<arg>${DEVICE_NAME_BASE}-${number}</arg>
<arg>log_response=${log_response}</arg>
<status status="PASS" start="2026-08-22T23:27:18.623984" elapsed="4.439175"/>
</kw>
<arg>${operation}</arg>
<arg>${DEVICE_NAME_BASE}-${number}</arg>
<arg>log_response=${log_response}</arg>
<doc>Executes the given keyword with the given arguments.</doc>
<status status="PASS" start="2026-08-22T23:27:18.623514" elapsed="4.439741"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.064545" level="INFO">${next} = 17831</msg>
<var>${next}</var>
<arg>${current_port}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:23.063748" elapsed="0.000939"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.065986" level="INFO">${current_port} = 17831</msg>
<arg>${current_port}</arg>
<arg>${next}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:27:23.065050" elapsed="0.001031"/>
</kw>
<arg>${operation}</arg>
<arg>${deadline_Date}</arg>
<arg>log_response=${log_response}</arg>
<status status="PASS" start="2026-08-22T23:27:18.620560" elapsed="4.445654"/>
</kw>
<arg>${count} times</arg>
<arg>NetconfKeywords__Perform_Operation_With_Checking_On_Next_Device</arg>
<arg>${operation}</arg>
<arg>${deadline_Date}</arg>
<arg>log_response=${log_response}</arg>
<doc>Executes the specified keyword multiple times.</doc>
<status status="PASS" start="2026-08-22T23:27:18.620048" elapsed="4.446279"/>
</kw>
<arg>NetconfKeywords__Wait_Device_Is_Up_And_Running</arg>
<arg>log_response=${log_response}</arg>
<status status="PASS" start="2026-08-22T23:27:18.613928" elapsed="4.452534"/>
</kw>
<arg>${filename}</arg>
<arg>${device-count}</arg>
<arg>${debug}</arg>
<arg>${schemas}</arg>
<arg>${rpc_config}</arg>
<arg>${tool_options}</arg>
<arg>${java_options}</arg>
<arg>${mdsal}</arg>
<arg>log_response=${log_response}</arg>
<doc>Arrange to collect tool's output into a log file.
Will use specific /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas unless argument resolves to 'none',
which signifies that there are no additional schemas to be deployed.
If so the directory for the additional schemas is deleted on the
remote machine and the additional schemas argument is left out.</doc>
<status status="PASS" start="2026-08-22T23:27:18.361361" elapsed="4.705264"/>
</kw>
<arg>device-count=1</arg>
<arg>schemas=/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas</arg>
<doc>Install and run testtool.</doc>
<status status="PASS" start="2026-08-22T23:27:17.681217" elapsed="5.385673"/>
</kw>
<doc>Deploy and start test tool, then wait for all its devices to become online.</doc>
<status status="PASS" start="2026-08-22T23:27:17.390809" elapsed="5.676338"/>
</test>
<test id="s1-s4-t2" name="Check_Device_Is_Not_Mounted_At_Beginning" 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-08-22T23:27:23.072646" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:27:23.072369" elapsed="0.000544"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:27:23.073965" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:23.073826" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.073802" 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-08-22T23:27:23.079151" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:23.079045" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.079027" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.080219" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:23.079837" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.080726" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:27:23.080404" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:27:23.080797" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:27:23.080949" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:27:23.079445" 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-08-22T23:27:23.086470" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:23.086357" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.086339" 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-08-22T23:27:23.087696" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:23.087567" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.087549" elapsed="0.000214"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:23.088215" level="INFO">${karaf_connection_index} = 25</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:27:23.087912" elapsed="0.000329"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:23.088633" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:27:23.088397" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:27:23.156620" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:27:23.089157" elapsed="0.067574"/>
</kw>
<msg time="2026-08-22T23:27:23.156899" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:27:23.156945" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:23.088813" elapsed="0.068168"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:27:23.188635" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:27:23.157501" elapsed="0.031237"/>
</kw>
<msg time="2026-08-22T23:27:23.188926" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:27:23.188980" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:23.157160" elapsed="0.031856"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.189361" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.189139" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.189114" elapsed="0.000326"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.189905" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:23.189599" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.190251" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.190039" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.190021" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:27:23.190360" 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-08-22T23:27:23.192953" elapsed="0.000150"/>
</kw>
<msg time="2026-08-22T23:27:23.193164" 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-08-22T23:27:23.191845" 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-08-22T23:27:23.193570" elapsed="0.002176"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.196051" 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-08-22T23:27:23.191205" elapsed="0.005037"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:27:23.190661" elapsed="0.005647"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:27:23.087270" elapsed="0.109138"/>
</kw>
<msg time="2026-08-22T23:27:23.196499" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:23.196543" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:23.086702" elapsed="0.109960"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:27:23.196869" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-08-22T23:27:23.196742" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.196723" 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 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.197363" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.197707" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:27:23.197778" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:27:23.086024" elapsed="0.111861"/>
</kw>
<msg time="2026-08-22T23:27:23.197979" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:23.198022" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:23.081380" elapsed="0.116679"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.198379" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.198132" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.198115" elapsed="0.000341"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:27:23.081240" elapsed="0.117239"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:27:23.203959" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:23.203833" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.203810" 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-08-22T23:27:23.205200" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:23.205093" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.205075" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:23.205762" level="INFO">${karaf_connection_index} = 26</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:27:23.205440" elapsed="0.000349"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:23.206157" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:27:23.205944" elapsed="0.000238"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:27:23.262101" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:27:23.206684" elapsed="0.055544"/>
</kw>
<msg time="2026-08-22T23:27:23.262411" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:27:23.262458" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:23.206335" elapsed="0.056160"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:27:23.292703" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:27:23.263043" elapsed="0.029898"/>
</kw>
<msg time="2026-08-22T23:27:23.293324" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:27:23.293429" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:23.262694" elapsed="0.030818"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.294228" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.293730" elapsed="0.000619"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.293685" elapsed="0.000718"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.295419" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:23.294745" elapsed="0.000827"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.296235" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.295764" elapsed="0.000589"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.295724" elapsed="0.000681"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:27:23.296477" 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">
<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-08-22T23:27:23.299811" elapsed="0.000149"/>
</kw>
<msg time="2026-08-22T23:27:23.300020" 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-08-22T23:27:23.298693" elapsed="0.001456"/>
</kw>
<kw name="Open 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-08-22T23:27:23.300419" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.300770" 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-08-22T23:27:23.298052" elapsed="0.002902"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:27:23.297153" 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-08-22T23:27:23.204752" elapsed="0.096538"/>
</kw>
<msg time="2026-08-22T23:27:23.301383" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:23.301427" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:23.204172" elapsed="0.097292"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:27:23.301674" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:27:23.301541" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.301522" 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-08-22T23:27:23.345729" elapsed="0.000071"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.346189" elapsed="0.000151"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:27:23.346400" 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-08-22T23:27:23.203458" elapsed="0.143087"/>
</kw>
<msg time="2026-08-22T23:27:23.346704" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:23.346749" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:23.198773" elapsed="0.148012"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.347176" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.346877" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.346856" elapsed="0.000402"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:27:23.198636" elapsed="0.148647"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:27:23.352937" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:23.352826" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.352805" 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-08-22T23:27:23.354239" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:23.354131" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.354112" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:23.354792" level="INFO">${karaf_connection_index} = 27</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:27:23.354452" elapsed="0.000367"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:23.355197" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:27:23.354975" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:27:23.410722" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:27:23.355736" elapsed="0.055090"/>
</kw>
<msg time="2026-08-22T23:27:23.411008" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:27:23.411062" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:23.355379" elapsed="0.055719"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:27:23.445776" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:27:23.411632" elapsed="0.034249"/>
</kw>
<msg time="2026-08-22T23:27:23.446038" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:27:23.446084" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:23.411271" elapsed="0.034848"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.446431" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.446198" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.446177" elapsed="0.000333"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.446981" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:23.446682" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.447325" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.447114" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.447096" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:27:23.447436" 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-08-22T23:27:23.450104" elapsed="0.000167"/>
</kw>
<msg time="2026-08-22T23:27:23.450335" 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-08-22T23:27:23.449065" 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-08-22T23:27:23.451008" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.451348" 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-08-22T23:27:23.448268" elapsed="0.003265"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:27:23.447735" 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-08-22T23:27:23.353820" elapsed="0.097906"/>
</kw>
<msg time="2026-08-22T23:27:23.451844" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:23.451890" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:23.353154" elapsed="0.098944"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:27:23.452293" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:27:23.452182" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.452163" 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-08-22T23:27:23.452790" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.453119" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:27:23.453191" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:27:23.352436" elapsed="0.100862"/>
</kw>
<msg time="2026-08-22T23:27:23.453393" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:23.453436" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:23.347562" elapsed="0.105909"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.453926" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.453547" elapsed="0.000436"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.453529" elapsed="0.000479"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:27:23.347416" elapsed="0.106615"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:27:23.081033" elapsed="0.373028"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:27:23.078682" elapsed="0.375438"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:27:23.073488" elapsed="0.380712"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:23.073058" elapsed="0.381188"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:27:23.070013" elapsed="0.384285"/>
</kw>
<kw name="Check_Device_Has_No_Netconf_Connector" owner="NetconfKeywords">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.465567" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:23.463495" elapsed="0.002112"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.465946" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-22T23:27:23.465785" elapsed="0.000219"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-22T23:27:23.465663" elapsed="0.000368"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.466331" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.466093" elapsed="0.000296"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.467136" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:23.466661" elapsed="0.000502"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:23.466413" elapsed="0.000822"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.467426" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.467262" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.466077" elapsed="0.001428"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:23.467540" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:27:23.467707" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:27:23.463042" elapsed="0.004690"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:23.467779" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:27:23.467922" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:27:23.462535" elapsed="0.005412"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.475408" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:23.475153" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.475874" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:23.475623" 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-08-22T23:27:23.499963" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:23.500300" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Fri, 21-Aug-2026 23:27:23 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1011'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}} 
 </msg>
<msg time="2026-08-22T23:27:23.500561" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:27:23.478048" elapsed="0.022606"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:23.475986" elapsed="0.024766"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.501152" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.500810" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.475968" elapsed="0.025427"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.509317" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:23.503720" elapsed="0.005719"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:23.503200" elapsed="0.006316"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.503158" elapsed="0.006450"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.514589" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:23.510231" elapsed="0.004406"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:23.509740" elapsed="0.004932"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.509702" elapsed="0.004995"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.515259" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:23.514856" 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-08-22T23:27:23.515609" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.515357" elapsed="0.000346"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.516237" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:23.515921" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:23.515728" elapsed="0.000572"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.515339" elapsed="0.000983"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.516896" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:23.516481" 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-08-22T23:27:23.517248" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.517016" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.517811" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:23.517486" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:23.517330" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.516997" 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-08-22T23:27:23.518044" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:27:23.518873" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:23.518552" 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-08-22T23:27:23.519052" 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-08-22T23:27:23.502220" elapsed="0.019323"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:23.521737" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:23.521631" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.521612" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:27:23.524885" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:27:23.521947" elapsed="0.002976"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:27:23.524988" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:27:23.525145" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:27:23.470797" elapsed="0.054375"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:27:23.525230" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:27:23.525377" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:27:23.468161" elapsed="0.057242"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.525841" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:23.525562" elapsed="0.000334"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.526434" level="INFO">${actual_count} = 0</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:23.526048" elapsed="0.000445"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-22T23:27:23.526542" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:27:23.526713" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-22T23:27:23.454999" elapsed="0.071739"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.527150" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:27:23.526891" elapsed="0.000312"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${node1_session}</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="PASS" start="2026-08-22T23:27:23.454512" elapsed="0.072749"/>
</kw>
<kw name="Check_Device_Has_No_Netconf_Connector" owner="NetconfKeywords">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.538282" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:23.536195" elapsed="0.002114"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.538639" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-22T23:27:23.538475" elapsed="0.000223"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-22T23:27:23.538362" elapsed="0.000361"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.539082" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.538841" elapsed="0.000298"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.539874" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:23.539389" elapsed="0.000511"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:23.539163" elapsed="0.000774"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.540121" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.539961" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.538823" elapsed="0.001374"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:23.540232" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:27:23.540378" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:27:23.535741" elapsed="0.004662"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:23.540449" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:27:23.540633" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:27:23.535257" elapsed="0.005402"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.548039" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:23.547791" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.548506" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:23.548236" 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-08-22T23:27:23.572775" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:23.573071" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Fri, 21-Aug-2026 23:27:23 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1011'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}} 
 </msg>
<msg time="2026-08-22T23:27:23.573299" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:27:23.550775" elapsed="0.022582"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:23.548648" elapsed="0.024878"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.574008" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.573625" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.548627" elapsed="0.025578"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.582341" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:23.576538" elapsed="0.005925"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:23.576046" elapsed="0.006495"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.576004" elapsed="0.006624"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.586438" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:23.583249" elapsed="0.003235"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:23.582760" elapsed="0.003759"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.582722" elapsed="0.003822"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.587097" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:23.586715" 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-08-22T23:27:23.587426" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.587196" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.587991" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:23.587690" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:23.587508" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.587178" elapsed="0.000898"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.588616" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:23.588231" 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-08-22T23:27:23.588948" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.588716" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.589480" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:23.589186" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:23.589029" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.588698" elapsed="0.000865"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:23.589727" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:27:23.590520" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:23.590230" 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-08-22T23:27:23.590715" 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-08-22T23:27:23.575046" elapsed="0.018172"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:23.593512" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:23.593288" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.593270" elapsed="0.000326"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:27:23.596617" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:27:23.593743" elapsed="0.002905"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:27:23.596701" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:27:23.596903" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:27:23.543429" elapsed="0.053501"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:27:23.596989" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:27:23.597138" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:27:23.540873" elapsed="0.056291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.597572" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:23.597321" elapsed="0.000324"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.598184" level="INFO">${actual_count} = 0</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:23.597797" elapsed="0.000414"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-22T23:27:23.598258" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:27:23.598408" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-22T23:27:23.527939" elapsed="0.070494"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.598855" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:27:23.598601" elapsed="0.000307"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${node2_session}</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="PASS" start="2026-08-22T23:27:23.527461" elapsed="0.071506"/>
</kw>
<kw name="Check_Device_Has_No_Netconf_Connector" owner="NetconfKeywords">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.610057" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:23.607980" elapsed="0.002104"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.610396" elapsed="0.000021"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-22T23:27:23.610248" elapsed="0.000205"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-22T23:27:23.610135" elapsed="0.000342"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.610792" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.610538" elapsed="0.000311"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.611602" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:23.611101" elapsed="0.000529"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:23.610873" elapsed="0.000794"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.611859" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.611692" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.610522" elapsed="0.001412"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:23.611967" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:27:23.612113" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:27:23.607506" elapsed="0.004632"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:23.612183" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:27:23.612323" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:27:23.607026" elapsed="0.005321"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.619795" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:23.619520" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.620235" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:23.619990" 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-08-22T23:27:23.645136" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:23.645266" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node01pvys0nqdqsq164kkcp7sslh01.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Fri, 21-Aug-2026 23:27:23 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1011'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}} 
 </msg>
<msg time="2026-08-22T23:27:23.645368" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:27:23.622408" elapsed="0.022986"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:23.620345" elapsed="0.025091"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.645639" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.645461" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.620326" elapsed="0.025401"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.649178" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:23.646752" elapsed="0.002480"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:23.646506" elapsed="0.002760"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.646488" elapsed="0.002803"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.651898" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:23.649565" elapsed="0.002379"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:23.649347" elapsed="0.002631"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.649331" elapsed="0.002671"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.652526" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:23.652159" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.652877" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.652640" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.653410" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:23.653112" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:23.652958" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.652622" elapsed="0.000872"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.654032" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:23.653669" 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-08-22T23:27:23.654356" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.654129" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.654986" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:23.654687" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:23.654493" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.654111" 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-08-22T23:27:23.655217" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:27:23.656023" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:23.655749" 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-08-22T23:27:23.656199" 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-08-22T23:27:23.646087" elapsed="0.012668"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:23.658930" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:23.658824" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.658806" elapsed="0.000190"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:27:23.662181" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:27:23.659138" elapsed="0.003073"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:27:23.662262" elapsed="0.000040"/>
</return>
<msg time="2026-08-22T23:27:23.662432" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:27:23.615157" elapsed="0.047302"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:27:23.662515" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:27:23.662690" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:27:23.612621" elapsed="0.050096"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.663121" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:23.662873" elapsed="0.000303"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.663727" level="INFO">${actual_count} = 0</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:23.663327" elapsed="0.000432"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-22T23:27:23.663804" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:27:23.663953" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-22T23:27:23.599666" elapsed="0.064312"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.664381" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:27:23.664129" elapsed="0.000304"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${node3_session}</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="PASS" start="2026-08-22T23:27:23.599167" elapsed="0.065323"/>
</kw>
<doc>Sanity check making sure our device is not there. Fail if found.</doc>
<status status="PASS" start="2026-08-22T23:27:23.068089" elapsed="0.596527"/>
</test>
<test id="s1-s4-t3" name="Configure_Device_On_Netconf" line="75">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:27:23.668468" elapsed="0.000227"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:27:23.667995" elapsed="0.000756"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:27:23.669736" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:23.669624" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.669604" 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-08-22T23:27:23.674692" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:23.674563" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.674545" elapsed="0.000214"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.675743" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:23.675351" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.676225" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:27:23.675925" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:27:23.676295" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:27:23.676448" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:27:23.674979" elapsed="0.001493"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:27:23.682070" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:23.681962" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.681942" 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-08-22T23:27:23.683280" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:23.683175" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.683156" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:23.683809" level="INFO">${karaf_connection_index} = 25</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:27:23.683487" elapsed="0.000348"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:23.684211" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:27:23.683989" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:27:23.736942" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:27:23.684735" elapsed="0.052321"/>
</kw>
<msg time="2026-08-22T23:27:23.737223" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:27:23.737273" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:23.684389" elapsed="0.052919"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:27:23.765358" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:27:23.737840" elapsed="0.027614"/>
</kw>
<msg time="2026-08-22T23:27:23.765630" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:27:23.765678" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:23.737473" elapsed="0.028241"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.766016" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.765791" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.765771" elapsed="0.000322"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.766522" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:23.766230" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.766879" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.766669" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.766651" elapsed="0.000353"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:27:23.767038" 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-08-22T23:27:23.769623" elapsed="0.000146"/>
</kw>
<msg time="2026-08-22T23:27:23.769831" 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-08-22T23:27:23.768482" 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-08-22T23:27:23.770242" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.770659" 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-08-22T23:27:23.767839" elapsed="0.003034"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:27:23.767292" 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-08-22T23:27:23.682874" elapsed="0.088161"/>
</kw>
<msg time="2026-08-22T23:27:23.771126" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:23.771169" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:23.682288" elapsed="0.088916"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:27:23.771385" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:27:23.771280" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.771261" elapsed="0.000204"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.771933" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.772288" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:27:23.772359" 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-08-22T23:27:23.681613" elapsed="0.090856"/>
</kw>
<msg time="2026-08-22T23:27:23.772562" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:23.772656" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:23.676845" elapsed="0.095847"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.773011" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.772768" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.772750" elapsed="0.000338"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:27:23.676707" elapsed="0.096404"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:27:23.778780" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:23.778673" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.778654" 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-08-22T23:27:23.779989" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:23.779884" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.779866" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:23.780510" level="INFO">${karaf_connection_index} = 26</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:27:23.780215" elapsed="0.000322"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:23.780928" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:27:23.780717" elapsed="0.000237"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:27:23.822155" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:27:23.781435" elapsed="0.040829"/>
</kw>
<msg time="2026-08-22T23:27:23.822424" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:27:23.822470" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:23.781107" elapsed="0.041465"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:27:23.846297" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:27:23.823099" elapsed="0.023298"/>
</kw>
<msg time="2026-08-22T23:27:23.846555" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:27:23.846624" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:23.822761" elapsed="0.023901"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.846967" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.846739" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.846720" elapsed="0.000325"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.847479" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:23.847184" 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-08-22T23:27:23.847840" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.847627" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.847608" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:27:23.847951" 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-08-22T23:27:23.850450" elapsed="0.000168"/>
</kw>
<msg time="2026-08-22T23:27:23.850681" 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-08-22T23:27:23.849352" elapsed="0.001479"/>
</kw>
<kw name="Open 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-08-22T23:27:23.851103" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.851431" 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-08-22T23:27:23.848744" 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-08-22T23:27:23.848202" elapsed="0.003501"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:27:23.779562" elapsed="0.072238"/>
</kw>
<msg time="2026-08-22T23:27:23.851892" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:23.851935" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:23.779002" elapsed="0.072970"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:27:23.852153" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:27:23.852048" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.852030" elapsed="0.000203"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.852646" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.852975" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:27:23.853046" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:27:23.778320" elapsed="0.074833"/>
</kw>
<msg time="2026-08-22T23:27:23.853245" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:23.853289" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:23.773493" elapsed="0.079832"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.853749" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.853400" elapsed="0.000437"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.853383" elapsed="0.000481"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:27:23.773231" elapsed="0.080659"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:27:23.859568" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:23.859462" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.859442" 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-08-22T23:27:23.860824" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:23.860715" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.860697" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:23.861328" level="INFO">${karaf_connection_index} = 27</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:27:23.861033" elapsed="0.000321"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:23.861751" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:27:23.861506" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:27:23.905763" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:27:23.862260" elapsed="0.043602"/>
</kw>
<msg time="2026-08-22T23:27:23.906034" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:27:23.906080" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:23.861933" elapsed="0.044182"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:27:23.929483" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:27:23.906630" elapsed="0.022987"/>
</kw>
<msg time="2026-08-22T23:27:23.929781" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:27:23.929827" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:23.906280" elapsed="0.023583"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.930153" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.929938" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.929918" elapsed="0.000313"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.930691" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:23.930369" 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-08-22T23:27:23.931029" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.930818" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.930800" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:27:23.931138" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<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-08-22T23:27:23.933679" elapsed="0.000147"/>
</kw>
<msg time="2026-08-22T23:27:23.933886" 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-08-22T23:27:23.932536" 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-08-22T23:27:23.934278" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.934630" 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-08-22T23:27:23.931926" elapsed="0.002885"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:27:23.931386" 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="PASS" start="2026-08-22T23:27:23.860394" elapsed="0.074575"/>
</kw>
<msg time="2026-08-22T23:27:23.935058" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:23.935101" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:23.859800" elapsed="0.075369"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:27:23.935354" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:27:23.935247" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.935228" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.935846" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.936175" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:27:23.936246" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:27:23.859122" elapsed="0.077231"/>
</kw>
<msg time="2026-08-22T23:27:23.936446" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:23.936489" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:23.854150" elapsed="0.082374"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.936926" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.936678" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.936659" elapsed="0.000344"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:27:23.854014" elapsed="0.083012"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:27:23.676523" elapsed="0.260532"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:27:23.674207" elapsed="0.262901"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:27:23.669320" elapsed="0.267842"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:23.668899" elapsed="0.268308"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:27:23.665574" elapsed="0.271684"/>
</kw>
<kw name="Configure_Device_In_Netconf" owner="NetconfKeywords">
<kw name="Set_Variable_If_At_Least_Scandium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Set_Variable_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Set Variable If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:23.958639" elapsed="0.000424"/>
</kw>
<msg time="2026-08-22T23:27:23.959114" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>BuiltIn.Set_Variable_If</arg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:23.958269" elapsed="0.000893"/>
</kw>
<arg>scandium</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Compare ${lower_bound} to titanium and return scandium if titanium is at least ${lower_bound},
return calcium otherwise.</doc>
<status status="PASS" start="2026-08-22T23:27:23.957886" elapsed="0.001350"/>
</kw>
<msg time="2026-08-22T23:27:23.959278" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Set_Variable_If_At_Least</arg>
<arg>scandium</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:23.949223" elapsed="0.010097"/>
</kw>
<msg time="2026-08-22T23:27:23.959421" level="INFO">${version} = scandium</msg>
<var>${version}</var>
<arg>scandium</arg>
<arg>calcium</arg>
<doc>Compare scandium to titanium and return ${value_if_true} if titanium is at least scandium, return ${value_if_false} otherwise.</doc>
<status status="PASS" start="2026-08-22T23:27:23.948894" elapsed="0.010551"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.960341" level="INFO">${mapping} = {'DEVICE_IP': '10.30.171.196', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/t...</msg>
<var>${mapping}</var>
<arg>DEVICE_IP=${device_address}</arg>
<arg>DEVICE_NAME=${device_name}</arg>
<arg>DEVICE_PORT=${device_port}</arg>
<arg>DEVICE_USER=${device_user}</arg>
<arg>DEVICE_PASSWORD=${device_password}</arg>
<arg>DEVICE_KEY=${device_key}</arg>
<arg>SCHEMA_DIRECTORY=${schema_directory}</arg>
<arg>RESTCONF_ROOT=${RESTCONF_ROOT}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:27:23.959621" elapsed="0.000747"/>
</kw>
<if>
<branch type="IF" condition="'${http_method}'=='post'">
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<arg>folder=${DIRECTORY_WITH_DEVICE_TEMPLATES}${/}${version}${/}${device_type}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:23.960786" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:23.960456" elapsed="0.000397"/>
</branch>
<branch type="ELSE">
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.993670" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:23.993256" elapsed="0.000443"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:27:23.994450" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:27:23.994188" elapsed="0.000343">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:27:23.994642" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:27:23.993859" elapsed="0.000808"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.995204" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:23.994826" elapsed="0.000405"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:27:23.995525" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:27:23.995690" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:27:23.995388" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.996108" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:23.995867" 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-08-22T23:27:23.997129" level="INFO">mapping: {'DEVICE_IP': '10.30.171.196', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tmp/schema', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:23.996871" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.997608" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:27:23.997328" elapsed="0.000307"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:27:23.998397" level="INFO">${value} = 10.30.171.196</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:27:23.997987" elapsed="0.000436"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:27:23.999422" level="INFO">${encoded} = 10.30.171.196</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:27:23.999023" elapsed="0.000498"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:27:23.999810" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:27:23.999969" level="INFO">${encoded_value} = 10.30.171.196</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:27:23.998630" elapsed="0.001364"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:27:24.000143" elapsed="0.000415"/>
</kw>
<var name="${key}">DEVICE_IP</var>
<var name="${value}">10.30.171.196</var>
<status status="PASS" start="2026-08-22T23:27:23.997857" elapsed="0.002775"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.001284" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:27:24.000875" elapsed="0.000435"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:27:24.002286" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:27:24.001900" elapsed="0.000486"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:27:24.002677" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:27:24.002836" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:27:24.001491" elapsed="0.001370"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:27:24.003008" elapsed="0.000391"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:27:24.000746" elapsed="0.002695"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.004196" level="INFO">${value} = 17830</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:27:24.003788" elapsed="0.000434"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:27:24.005233" level="INFO">${encoded} = 17830</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:27:24.004832" elapsed="0.000500"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:27:24.005671" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:27:24.005832" level="INFO">${encoded_value} = 17830</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:27:24.004426" elapsed="0.001431"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:27:24.006004" elapsed="0.000385"/>
</kw>
<var name="${key}">DEVICE_PORT</var>
<var name="${value}">17830</var>
<status status="PASS" start="2026-08-22T23:27:24.003553" elapsed="0.002877"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.007271" level="INFO">${value} = admin</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:27:24.006688" elapsed="0.000610"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:27:24.008284" level="INFO">${encoded} = admin</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:27:24.007883" elapsed="0.000498"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:27:24.008722" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:27:24.008887" level="INFO">${encoded_value} = admin</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:27:24.007480" elapsed="0.001432"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:27:24.009059" elapsed="0.000390"/>
</kw>
<var name="${key}">DEVICE_USER</var>
<var name="${value}">admin</var>
<status status="PASS" start="2026-08-22T23:27:24.006543" elapsed="0.002948"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.010175" level="INFO">${value} = topsecret</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:27:24.009770" elapsed="0.000431"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:27:24.011164" level="INFO">${encoded} = topsecret</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:27:24.010780" elapsed="0.000479"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:27:24.011522" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:27:24.011740" level="INFO">${encoded_value} = topsecret</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:27:24.010383" elapsed="0.001382"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:27:24.011912" elapsed="0.000399"/>
</kw>
<var name="${key}">DEVICE_PASSWORD</var>
<var name="${value}">topsecret</var>
<status status="PASS" start="2026-08-22T23:27:24.009641" elapsed="0.002713"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.013051" level="INFO">${value} = device-key</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:27:24.012645" elapsed="0.000432"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:27:24.014044" level="INFO">${encoded} = device-key</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:27:24.013656" elapsed="0.000484"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:27:24.014401" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:27:24.014556" level="INFO">${encoded_value} = device-key</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:27:24.013258" elapsed="0.001382"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:27:24.014791" elapsed="0.000387"/>
</kw>
<var name="${key}">DEVICE_KEY</var>
<var name="${value}">device-key</var>
<status status="PASS" start="2026-08-22T23:27:24.012467" elapsed="0.002752"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.015904" level="INFO">${value} = /tmp/schema</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:27:24.015459" elapsed="0.000471"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:27:24.016923" level="INFO">${encoded} = /tmp/schema</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:27:24.016507" elapsed="0.000513"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:27:24.017279" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:27:24.017435" level="INFO">${encoded_value} = /tmp/schema</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:27:24.016132" elapsed="0.001327"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:27:24.017667" elapsed="0.000389"/>
</kw>
<var name="${key}">SCHEMA_DIRECTORY</var>
<var name="${value}">/tmp/schema</var>
<status status="PASS" start="2026-08-22T23:27:24.015332" elapsed="0.002766"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.018784" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:27:24.018339" elapsed="0.000471"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:27:24.019774" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:27:24.019364" elapsed="0.000506"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:27:24.020190" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:27:24.020349" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:27:24.018990" elapsed="0.001384"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:27:24.020522" elapsed="0.000461"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:27:24.018211" elapsed="0.002814"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:27:23.997682" elapsed="0.023378"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:27:24.021104" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:27:24.021266" level="INFO">${mapping_to_use} = {'DEVICE_IP': '10.30.171.196', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/t...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:27:23.996528" elapsed="0.024765"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:23.996218" elapsed="0.025107"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.021494" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:24.021349" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.996199" elapsed="0.025372"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.022447" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:24.021770" elapsed="0.000705"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:27:24.022525" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:27:23.992646" elapsed="0.030060"/>
</kw>
<msg time="2026-08-22T23:27:24.022761" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:23.978961" elapsed="0.043859"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.035567" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.047993" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.060445" 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-08-22T23:27:24.060651" 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-08-22T23:27:24.060825" 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-08-22T23:27:24.061186" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:24.061045" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:24.061031" elapsed="0.000234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.061435" 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-08-22T23:27:24.061614" 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-08-22T23:27:24.061778" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:27:24.061003" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:27:24.060900" 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-08-22T23:27:24.061997" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:24.062073" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:27:24.062192" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:27:23.974689" elapsed="0.087529"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.088781" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:24.088388" elapsed="0.000421"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:27:24.089496" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology.titanium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:27:24.089291" elapsed="0.000277">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology.titanium/data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:27:24.089677" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:27:24.088966" elapsed="0.000736"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.090241" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:24.089861" elapsed="0.000407"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:27:24.090557" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:27:24.090699" level="INFO">${template} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;$DEVICE_NAME&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;$DEVICE_IP&lt;/host&gt;
    &lt;port&gt;$DEVI...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:27:24.090423" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.091138" level="INFO">&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;$DEVICE_NAME&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;$DEVICE_IP&lt;/host&gt;
    &lt;port&gt;$DEVICE_PORT&lt;/port&gt;
    &lt;login-password-unencrypted&gt;
      &lt;username&gt;$DEVICE_USER&lt;/username&gt;
      &lt;password&gt;$DEVICE_PASSWORD&lt;/password&gt;
    &lt;/login-password-unencrypted&gt;
    &lt;tcp-only&gt;false&lt;/tcp-only&gt;
    &lt;keepalive-delay&gt;0&lt;/keepalive-delay&gt;
  &lt;/netconf-node&gt;
&lt;/node&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:24.090893" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:27:24.091543" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:24.091257" elapsed="0.000364"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.092085" level="INFO">${mapping_to_use} = {'DEVICE_IP': '10.30.171.196', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/t...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:24.091789" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:24.091646" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.091239" elapsed="0.000930"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.093017" level="INFO">${final_text} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;10.30.171.196&lt;/host&gt;
    &lt;...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:24.092312" elapsed="0.000735"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:27:24.093129" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:27:24.087741" elapsed="0.005516"/>
</kw>
<msg time="2026-08-22T23:27:24.093313" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:24.075020" elapsed="0.018340"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.105879" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.118189" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.130503" 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-08-22T23:27:24.130715" 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-08-22T23:27:24.130888" 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-08-22T23:27:24.131244" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:24.131104" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:24.131090" elapsed="0.000232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.131457" 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-08-22T23:27:24.131635" 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-08-22T23:27:24.131797" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:27:24.131062" elapsed="0.000792"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:27:24.130961" elapsed="0.000918"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.132020" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:24.132094" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:27:24.132217" level="INFO">${data} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;10.30.171.196&lt;/host&gt;
    &lt;...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:27:24.072231" elapsed="0.060014"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:27:24.133516" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:27:24.133283" elapsed="0.000311">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:27:24.133689" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:27:24.132950" elapsed="0.000764"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.134025" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:24.133784" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.134606" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:24.134286" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:24.134106" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.133766" elapsed="0.000927"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.137027" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:24.134842" elapsed="0.002211"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:27:24.137106" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:27:24.137258" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:27:24.132628" elapsed="0.004655"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.138686" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:24.138411" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.139229" level="INFO">&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;10.30.171.196&lt;/host&gt;
    &lt;port&gt;17830&lt;/port&gt;
    &lt;login-password-unencrypted&gt;
      &lt;username&gt;admin&lt;/username&gt;
      &lt;password&gt;topsecret&lt;/password&gt;
    &lt;/login-password-unencrypted&gt;
    &lt;tcp-only&gt;false&lt;/tcp-only&gt;
    &lt;keepalive-delay&gt;0&lt;/keepalive-delay&gt;
  &lt;/netconf-node&gt;
&lt;/node&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:24.138986" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.139693" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:24.139430" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.140127" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:24.139885" elapsed="0.000286"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:24.140987" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:27:24.140792" elapsed="0.000221"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:27:24.141338" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:27:24.141163" 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-08-22T23:27:24.141506" elapsed="0.000212"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.142124" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:24.141869" elapsed="0.000299"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:27:24.142210" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:27:24.142363" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:27:24.140368" elapsed="0.002020"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:27:24.188489" level="INFO">PUT Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Content-Length': '452', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;10.30.171.196&lt;/host&gt;
    &lt;port&gt;17830&lt;/port&gt;
    &lt;login-password-unencrypted&gt;
      &lt;username&gt;admin&lt;/username&gt;
      &lt;password&gt;topsecret&lt;/password&gt;
    &lt;/login-password-unencrypted&gt;
    &lt;tcp-only&gt;false&lt;/tcp-only&gt;
    &lt;keepalive-delay&gt;0&lt;/keepalive-delay&gt;
  &lt;/netconf-node&gt;
&lt;/node&gt; 
 </msg>
<msg time="2026-08-22T23:27:24.188545" level="INFO">PUT Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:24.188704" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:27:24.144703" elapsed="0.044028"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:24.142457" elapsed="0.046320"/>
</branch>
<branch type="ELSE">
<kw name="PUT 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 PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.189167" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:24.188810" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.142440" elapsed="0.046950"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.196848" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:24.191526" elapsed="0.005420"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:24.191043" elapsed="0.005982"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.191002" elapsed="0.006081"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.200290" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:24.197777" elapsed="0.002559"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:24.197254" elapsed="0.003117"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.197214" elapsed="0.003181"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.200946" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:24.200554" 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-08-22T23:27:24.201290" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:24.201044" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.201866" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:24.201534" elapsed="0.000359"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:24.201372" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.201026" elapsed="0.000925"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.202470" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:24.202107" 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-08-22T23:27:24.202846" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:24.202567" elapsed="0.000337"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.203385" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:24.203085" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:24.202929" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.202549" 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-08-22T23:27:24.203636" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:27:24.204428" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:24.204151" 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-08-22T23:27:24.204621" elapsed="0.002335"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:27:24.190217" elapsed="0.016801"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:27:24.207190" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:27:24.207084" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.207066" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.207419" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:24.207486" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:27:24.209791" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT 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-08-22T23:27:24.137625" elapsed="0.072193"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:27:24.209884" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:27:24.210041" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-08-22T23:27:23.963762" elapsed="0.246341"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.210436" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:24.210203" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.210186" elapsed="0.000343"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:27:24.210563" elapsed="0.000042"/>
</return>
<arg>folder=${DIRECTORY_WITH_DEVICE_TEMPLATES}${/}${version}${/}${device_type}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-08-22T23:27:23.961120" elapsed="0.249584"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:23.960878" elapsed="0.249868"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:23.960438" elapsed="0.250329"/>
</if>
<kw name="Set To Dictionary" owner="Collections">
<arg>${NetconfKeywords__mounted_device_types}</arg>
<arg>${device_name}</arg>
<arg>${device_type}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:27:24.210907" elapsed="0.000236"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>device_type=configure-via-topology</arg>
<arg>session=${node1_session}</arg>
<doc>Tell Netconf about the specified device so it can add it into its configuration.</doc>
<status status="PASS" start="2026-08-22T23:27:23.937543" elapsed="0.273662"/>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.212361" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:24.211948" elapsed="0.000441"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-08-22T23:27:24.212621" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:27:24.212463" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.212445" elapsed="0.000256"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.212862" elapsed="0.000022"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.213051" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.213227" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.213394" elapsed="0.000019"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.213556" elapsed="0.000043"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.213746" elapsed="0.000019"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.213904" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.214150" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:24.213986" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:24.213969" elapsed="0.000256"/>
</if>
<arg>5089</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:27:24.211599" elapsed="0.002674"/>
</kw>
<doc>Use node 1 to configure a testtool device on Netconf connector.</doc>
<status status="PASS" start="2026-08-22T23:27:23.664992" elapsed="0.549325"/>
</test>
<test id="s1-s4-t4" name="Wait_For_Device_To_Become_Visible_For_All_Nodes" line="83">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:27:24.217900" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:27:24.217638" elapsed="0.000524"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:27:24.219452" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:24.219341" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.219322" 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-08-22T23:27:24.224609" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:24.224487" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.224469" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.225680" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:24.225284" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.226214" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:27:24.225906" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:27:24.226285" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:27:24.226440" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:27:24.224909" 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-08-22T23:27:24.231888" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:24.231779" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.231760" 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-08-22T23:27:24.233127" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:24.233021" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.233002" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:24.233649" level="INFO">${karaf_connection_index} = 25</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:27:24.233337" elapsed="0.000340"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:24.234048" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:27:24.233832" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:27:24.267373" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:27:24.234561" elapsed="0.032911"/>
</kw>
<msg time="2026-08-22T23:27:24.267663" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:27:24.267711" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:24.234230" elapsed="0.033516"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:27:24.312790" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "A "l "l "_ "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-08-22T23:27:24.268283" elapsed="0.044749"/>
</kw>
<msg time="2026-08-22T23:27:24.313399" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:27:24.313505" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:24.267912" elapsed="0.045712"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.314305" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:24.313805" elapsed="0.000623"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.313760" elapsed="0.000723"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.315545" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "A "l "l "_ "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-08-22T23:27:24.314834" elapsed="0.000913"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.316071" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:24.315853" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.315832" elapsed="0.000318"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:27:24.316184" 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-08-22T23:27:24.318731" elapsed="0.000148"/>
</kw>
<msg time="2026-08-22T23:27:24.318940" 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-08-22T23:27:24.317631" elapsed="0.001439"/>
</kw>
<kw name="Open 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-08-22T23:27:24.319362" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.319727" 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-08-22T23:27:24.316994" 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-08-22T23:27:24.316442" elapsed="0.003709"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:27:24.232712" elapsed="0.087538"/>
</kw>
<msg time="2026-08-22T23:27:24.320341" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:24.320386" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:24.232107" elapsed="0.088317"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:27:24.320642" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:27:24.320500" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.320482" elapsed="0.000243"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.321114" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.321442" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:27:24.321513" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:27:24.231425" elapsed="0.090221"/>
</kw>
<msg time="2026-08-22T23:27:24.321741" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:24.321784" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:24.226838" elapsed="0.094981"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.322139" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:24.321893" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.321876" elapsed="0.000340"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:27:24.226699" elapsed="0.095541"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:27:24.327726" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:24.327616" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.327596" 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-08-22T23:27:24.328929" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:24.328821" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.328803" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:24.329430" level="INFO">${karaf_connection_index} = 26</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:27:24.329137" elapsed="0.000320"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:24.329855" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:27:24.329638" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:27:24.373815" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:27:24.330370" elapsed="0.043550"/>
</kw>
<msg time="2026-08-22T23:27:24.374079" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:27:24.374125" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:24.330038" elapsed="0.044123"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:27:24.404802" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "A "l "l "_ "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-08-22T23:27:24.374720" elapsed="0.030190"/>
</kw>
<msg time="2026-08-22T23:27:24.405070" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:27:24.405116" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:24.374353" elapsed="0.030799"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.405491" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:24.405267" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.405246" elapsed="0.000325"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.406064" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "A "l "l "_ "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-08-22T23:27:24.405737" 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-08-22T23:27:24.406414" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:24.406201" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.406183" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:27:24.406526" 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-08-22T23:27:24.409033" elapsed="0.000149"/>
</kw>
<msg time="2026-08-22T23:27:24.409241" 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-08-22T23:27:24.407961" 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="NOT RUN" start="2026-08-22T23:27:24.409661" elapsed="0.000100"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.410020" 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-08-22T23:27:24.407331" elapsed="0.003067"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:27:24.406802" elapsed="0.003662"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:27:24.328497" elapsed="0.082066"/>
</kw>
<msg time="2026-08-22T23:27:24.410683" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:24.410727" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:24.327943" elapsed="0.082820"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:27:24.410946" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:27:24.410840" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.410821" 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-08-22T23:27:24.411409" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.411802" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:27:24.411874" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:27:24.327254" elapsed="0.084727"/>
</kw>
<msg time="2026-08-22T23:27:24.412074" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:24.412117" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:24.322498" elapsed="0.089659"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.412482" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:24.412237" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.412220" elapsed="0.000339"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:27:24.322359" elapsed="0.090324"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:27:24.418128" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:24.418020" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.418002" 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-08-22T23:27:24.419340" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:24.419224" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.419206" elapsed="0.000240"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:24.419916" level="INFO">${karaf_connection_index} = 27</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:27:24.419614" elapsed="0.000328"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:24.420311" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:27:24.420098" elapsed="0.000239"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:27:24.468130" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:27:24.420846" elapsed="0.047398"/>
</kw>
<msg time="2026-08-22T23:27:24.468419" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:27:24.468466" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:24.420493" elapsed="0.048008"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:27:24.500177" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "A "l "l "_ "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-08-22T23:27:24.469080" elapsed="0.031415"/>
</kw>
<msg time="2026-08-22T23:27:24.500684" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:27:24.500731" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:24.468699" elapsed="0.032068"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.501078" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:24.500853" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.500831" elapsed="0.000328"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.501612" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "A "l "l "_ "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-08-22T23:27:24.501300" 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-08-22T23:27:24.501966" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:24.501751" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.501733" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:27:24.502078" 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-08-22T23:27:24.504657" elapsed="0.000149"/>
</kw>
<msg time="2026-08-22T23:27:24.504866" 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-08-22T23:27:24.503503" elapsed="0.001491"/>
</kw>
<kw name="Open 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-08-22T23:27:24.505265" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.505617" 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-08-22T23:27:24.502889" 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-08-22T23:27:24.502340" elapsed="0.003532"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:27:24.418924" elapsed="0.087045"/>
</kw>
<msg time="2026-08-22T23:27:24.506063" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:24.506106" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:24.418346" elapsed="0.087794"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:27:24.506321" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:27:24.506215" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.506197" 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-08-22T23:27:24.506889" 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-08-22T23:27:24.507266" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:27:24.507338" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:27:24.417682" elapsed="0.089765"/>
</kw>
<msg time="2026-08-22T23:27:24.507561" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:24.507709" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:24.412948" elapsed="0.094798"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.508235" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:24.507823" elapsed="0.000469"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.507806" elapsed="0.000510"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:27:24.412809" elapsed="0.095532"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:27:24.226515" elapsed="0.281854"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:27:24.224126" elapsed="0.284301"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:27:24.218911" elapsed="0.289572"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:24.218326" elapsed="0.290202"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:27:24.215285" elapsed="0.293320"/>
</kw>
<kw name="Wait_Device_Connected" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.520705" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:24.518339" elapsed="0.002396"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.521435" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:24.521106" elapsed="0.000356"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:27:24.520955" elapsed="0.000545"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.522067" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:24.521745" elapsed="0.000349"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:27:24.521595" elapsed="0.000536"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:27:24.520793" elapsed="0.001367"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.522462" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:24.522224" elapsed="0.000297"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.523313" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:24.522803" elapsed="0.000537"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:24.522546" elapsed="0.000831"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.523567" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:24.523402" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.522206" elapsed="0.001454"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:24.523695" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:27:24.523886" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:27:24.517891" elapsed="0.006029"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:24.523979" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:27:24.524124" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:27:24.517327" elapsed="0.006822"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.531465" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:24.531214" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.531934" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:24.531680" 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-08-22T23:27:24.546082" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:24.546233" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"connection-status":"connecting","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196"}}]} 
 </msg>
<msg time="2026-08-22T23:27:24.546332" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:27:24.534111" elapsed="0.012248"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:24.532048" elapsed="0.014356"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:24.546602" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:24.546430" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.532029" elapsed="0.014664"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.550398" level="INFO">{"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"connection-status":"connecting","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196"}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:24.547730" elapsed="0.002718"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:24.547479" elapsed="0.003004"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.547448" elapsed="0.003061"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.553171" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:24.550802" elapsed="0.002415"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:24.550565" elapsed="0.002689"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.550549" elapsed="0.002730"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.553841" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:24.553439" 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-08-22T23:27:24.554176" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:24.553941" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.554733" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:24.554417" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:24.554259" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.553922" elapsed="0.000897"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.555360" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:24.554975" 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-08-22T23:27:24.555719" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:24.555460" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.556256" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:24.555960" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:24.555803" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.555443" 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-08-22T23:27:24.556484" elapsed="0.000362"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:27:24.557296" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:24.557008" 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-08-22T23:27:24.557472" 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-08-22T23:27:24.547043" elapsed="0.012880"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:24.560136" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:24.560028" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:24.560009" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:27:24.563120" level="INFO">${text_normalized} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:27:24.560348" elapsed="0.002803"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:27:24.563212" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:27:24.563372" level="INFO">${response_text} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:27:24.526842" elapsed="0.036557"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:27:24.563458" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:27:24.563634" level="INFO">${device_status} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:27:24.524369" elapsed="0.039292"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:27:24.564175" level="FAIL">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</msg>
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:27:24.563822" elapsed="0.000428">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</status>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:27:24.509869" elapsed="0.054507">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:25.581630" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:25.578508" elapsed="0.003156"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:25.582366" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:25.582036" elapsed="0.000358"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:27:25.581883" elapsed="0.000549"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:25.583001" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:25.582678" elapsed="0.000350"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:27:25.582514" elapsed="0.000550"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:27:25.581731" elapsed="0.001362"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:25.583420" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:25.583166" elapsed="0.000312"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:25.584230" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:25.583751" elapsed="0.000507"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:25.583504" elapsed="0.000789"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:25.584483" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:25.584319" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:25.583146" elapsed="0.001413"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:25.584623" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:27:25.584786" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:27:25.577865" elapsed="0.007012"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:25.584928" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:27:25.585073" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:27:25.577068" elapsed="0.008030"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:25.592482" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:25.592206" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:25.592949" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:25.592700" 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-08-22T23:27:25.601816" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:25.602035" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"connection-status":"connecting","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196"}}]} 
 </msg>
<msg time="2026-08-22T23:27:25.602178" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:27:25.595176" elapsed="0.007039"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:25.593065" elapsed="0.009210"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:25.602527" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:25.602313" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:25.593047" elapsed="0.009626"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:25.609492" level="INFO">{"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"connection-status":"connecting","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196"}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:25.604089" elapsed="0.005474"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:25.603769" elapsed="0.005866"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:25.603744" elapsed="0.005928"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:25.615077" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:25.610061" elapsed="0.005125"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:25.609751" elapsed="0.005518"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:25.609728" elapsed="0.005599"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:25.616648" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:25.615745" elapsed="0.000967"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:25.617400" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:25.616875" elapsed="0.000652"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:25.618668" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:25.617967" elapsed="0.000762"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:25.617611" elapsed="0.001202"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:25.616834" elapsed="0.002028"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:25.620186" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:25.619211" elapsed="0.001005"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:25.620536" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:25.620293" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:25.621113" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:25.620802" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:25.620638" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:25.620272" 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-08-22T23:27:25.621358" elapsed="0.000419"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:27:25.622244" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:25.621943" 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-08-22T23:27:25.622422" elapsed="0.002362"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:27:25.603161" elapsed="0.021687"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:25.625025" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:25.624917" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:25.624899" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:27:25.628051" level="INFO">${text_normalized} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:27:25.625234" elapsed="0.002847"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:27:25.628133" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:27:25.628291" level="INFO">${response_text} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:27:25.587771" elapsed="0.040547"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:27:25.628374" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:27:25.628522" level="INFO">${device_status} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:27:25.585318" elapsed="0.043230"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:27:25.629074" level="FAIL">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</msg>
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:27:25.628724" elapsed="0.000427">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</status>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:27:25.565138" elapsed="0.064137">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:26.647660" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:26.644686" elapsed="0.003007"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:26.648391" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:26.648062" elapsed="0.000356"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:27:26.647908" elapsed="0.000547"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:26.649018" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:26.648698" elapsed="0.000346"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:27:26.648536" elapsed="0.000545"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:27:26.647762" elapsed="0.001347"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:26.649440" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:26.649184" elapsed="0.000314"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:26.650238" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:26.649770" elapsed="0.000571"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:26.649524" elapsed="0.000859"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:26.650597" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:26.650408" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:26.649163" elapsed="0.001512"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:26.650714" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:27:26.650872" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:27:26.644016" elapsed="0.006882"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:26.650944" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:27:26.651085" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:27:26.643196" elapsed="0.007914"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:26.658451" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:26.658187" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:26.658920" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:26.658673" 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-08-22T23:27:26.672058" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:26.672332" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '3689'} 
 body={"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"unavailable-capabilities":{"unavailable-capability":[{"failure-reason":"missing-source","capability":"(urn:ietf:params:xml:ns:netconf:notification:1.0?revision=2008-07-14)notifications"}]},"clustered-connection-status":{"netconf-master-node":"pekko://opendaylight-cluster-data@127.0.0.1:2550"},"negotiated-ssh-transport-parameters":{"encryption-alg":"chacha20-poly1305","host-key-alg":"rsa-sha2-512","mac-alg":"none","key-exchange-alg":"sntrup761x25519-sha512"},"session-id":1,"connection-status":"connected","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196","available-capabilities":{"available-capability":[{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:notification:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:exi:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:candidate:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.1"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.0"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people?revision=2014-08-18)people"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?revision=2010-10-04)ietf-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)ietf-yang-types"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car?revision=2014-08-18)car"},{"capability-origin":"device-advertised","capability":"(ns:main?revision=2014-01-21)main"},{"capability-origin":"device-advertised","capability":"(ns:augment:main:a?revision=2014-01-21)augment-main-a"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:netconf:monitoring?revision=2022-07-18)odl-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:netconf:base:1.0?revision=2011-06-01)ietf-netconf"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring-extension?revision=2013-12-10)ietf-netconf-monitoring-extension"},{"capability-origin":"device-advertised","capability":"(org:opendaylight:coretutorials:ncmount:example:l2fib?revision=2016-03-07)ncmount-l2fib"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people?revision=2014-08-18)car-people"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-purchase?revision=2014-08-18)car-purchase"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:test:netconf:crud?revision=2014-10-18)test"},{"capability-origin":"device-advertised","capability":"(https://example.com/ns/example-action?revision=2016-07-07)example-action"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2013-07-15)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2010-09-24)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:yang:extension:yang-ext?revision=2013-07-09)yang-ext"}]}}}]} 
 </msg>
<msg time="2026-08-22T23:27:26.672503" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:27:26.661096" elapsed="0.011444"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:26.659032" elapsed="0.013599"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:26.672889" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:26.672670" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:26.659014" elapsed="0.014041"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:26.678244" level="INFO">{"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"unavailable-capabilities":{"unavailable-capability":[{"failure-reason":"missing-source","capability":"(urn:ietf:params:xml:ns:netconf:notification:1.0?revision=2008-07-14)notifications"}]},"clustered-connection-status":{"netconf-master-node":"pekko://opendaylight-cluster-data@127.0.0.1:2550"},"negotiated-ssh-transport-parameters":{"encryption-alg":"chacha20-poly1305","host-key-alg":"rsa-sha2-512","mac-alg":"none","key-exchange-alg":"sntrup761x25519-sha512"},"session-id":1,"connection-status":"connected","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196","available-capabilities":{"available-capability":[{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:notification:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:exi:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:candidate:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.1"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.0"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people?revision=2014-08-18)people"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?revision=2010-10-04)ietf-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)ietf-yang-types"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car?revision=2014-08-18)car"},{"capability-origin":"device-advertised","capability":"(ns:main?revision=2014-01-21)main"},{"capability-origin":"device-advertised","capability":"(ns:augment:main:a?revision=2014-01-21)augment-main-a"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:netconf:monitoring?revision=2022-07-18)odl-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:netconf:base:1.0?revision=2011-06-01)ietf-netconf"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring-extension?revision=2013-12-10)ietf-netconf-monitoring-extension"},{"capability-origin":"device-advertised","capability":"(org:opendaylight:coretutorials:ncmount:example:l2fib?revision=2016-03-07)ncmount-l2fib"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people?revision=2014-08-18)car-people"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-purchase?revision=2014-08-18)car-purchase"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:test:netconf:crud?revision=2014-10-18)test"},{"capability-origin":"device-advertised","capability":"(https://example.com/ns/example-action?revision=2016-07-07)example-action"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2013-07-15)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2010-09-24)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:yang:extension:yang-ext?revision=2013-07-09)yang-ext"}]}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:26.674514" elapsed="0.003833"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:26.674204" elapsed="0.004192"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:26.674178" elapsed="0.004254"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:26.682178" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:26.678842" elapsed="0.003403"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:26.678510" elapsed="0.003784"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:26.678487" elapsed="0.003845"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:26.683052" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:26.682557" elapsed="0.000523"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:26.683385" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:26.683151" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:26.683945" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:26.683642" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:26.683468" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:26.683133" elapsed="0.000898"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:26.684552" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:26.684188" 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-08-22T23:27:26.684900" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:26.684668" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:26.685434" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:26.685138" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:26.684982" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:26.684649" elapsed="0.000870"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:27:26.685686" elapsed="0.000370"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:27:26.686564" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:26.686265" 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-08-22T23:27:26.686764" elapsed="0.002408"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:27:26.673553" elapsed="0.015682"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:26.689412" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:26.689306" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:26.689288" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:27:26.693185" level="INFO">${text_normalized} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "available-capabilities": {
     "available-capability": [
      {
       "capability": "(https://example.com/ns/exampl...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:27:26.689637" elapsed="0.003578"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:27:26.693269" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:27:26.693428" level="INFO">${response_text} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "available-capabilities": {
     "available-capability": [
      {
       "capability": "(https://example.com/ns/exampl...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:27:26.653808" elapsed="0.039647"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:27:26.693513" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:27:26.693678" level="INFO">${device_status} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "available-capabilities": {
     "available-capability": [
      {
       "capability": "(https://example.com/ns/exampl...</msg>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:27:26.651330" elapsed="0.042385"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-08-22T23:27:26.693879" elapsed="0.000307"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="PASS" start="2026-08-22T23:27:26.630055" elapsed="0.064198"/>
</kw>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Connected</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:27:24.509290" elapsed="2.185015"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${node1_session}</arg>
<doc>Wait for the device to become connected.
It is more readable to use this keyword in a test case than to put the whole WUKS below into it.</doc>
<status status="PASS" start="2026-08-22T23:27:24.508810" elapsed="2.185560"/>
</kw>
<kw name="Wait_Device_Connected" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:26.706485" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:26.704220" elapsed="0.002292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:26.707188" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:26.706863" elapsed="0.000351"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:27:26.706712" elapsed="0.000540"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:26.707875" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:26.707479" elapsed="0.000423"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:27:26.707330" elapsed="0.000608"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:27:26.706565" elapsed="0.001403"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:26.708270" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:26.708032" elapsed="0.000296"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:26.709064" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:26.708598" elapsed="0.000493"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:26.708352" elapsed="0.000776"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:26.709315" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:26.709153" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:26.708015" elapsed="0.001413"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:26.709463" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:27:26.709653" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:27:26.703772" elapsed="0.005907"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:26.709725" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:27:26.709869" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:27:26.703202" elapsed="0.006692"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:26.717199" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:26.716949" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:26.717676" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:26.717396" 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-08-22T23:27:26.739078" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:26.739197" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:27:26.739309" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:26.719919" elapsed="0.019859">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:26.717791" elapsed="0.022073">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:26.740051" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:26.739897" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:26.717773" elapsed="0.022366">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:26.740504" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:26.740655" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:26.740617" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:26.740598" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:26.740857" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:26.740926" 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-08-22T23:27:26.712610" elapsed="0.028422">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:26.741100" elapsed="0.000029"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:26.710109" elapsed="0.031100">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:26.741374" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:27:26.695627" elapsed="0.045891">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:27.758376" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:27.756189" elapsed="0.002222"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:27.759128" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:27.758801" elapsed="0.000354"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:27:27.758647" elapsed="0.000546"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:27.759762" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:27.759426" elapsed="0.000364"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:27:27.759280" elapsed="0.000546"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:27:27.758482" elapsed="0.001373"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:27.760234" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:27.759930" elapsed="0.000370"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:27.761120" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:27.760565" elapsed="0.000595"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:27.760326" elapsed="0.000886"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:27.761470" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:27.761247" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:27.759910" elapsed="0.001688"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:27.761653" elapsed="0.000048"/>
</return>
<msg time="2026-08-22T23:27:27.761894" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:27:27.755705" elapsed="0.006226"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:27.761996" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:27:27.762196" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:27:27.755107" elapsed="0.007125"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:27.771831" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:27.771554" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:27.772277" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:27.772032" 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-08-22T23:27:27.784392" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:27.784863" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:27:27.785145" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:27.774467" elapsed="0.011689">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:27.772388" elapsed="0.014044">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:27.786977" elapsed="0.000161"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:27.786530" elapsed="0.000724"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:27.772370" elapsed="0.014943">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:27.788303" elapsed="0.000066"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:27.788668" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:27.788541" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:27.788498" 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-08-22T23:27:27.789166" elapsed="0.000052"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:27.789332" elapsed="0.000035"/>
</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-08-22T23:27:27.766024" elapsed="0.023628">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:27.789825" elapsed="0.000037"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:27.762542" elapsed="0.027513">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:27.790453" elapsed="0.000052"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:27:27.742380" elapsed="0.048365">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:28.807783" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:28.805534" elapsed="0.002284"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:28.808546" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:28.808211" elapsed="0.000363"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:27:28.808036" elapsed="0.000592"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:28.809188" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:28.808862" elapsed="0.000353"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:27:28.808714" elapsed="0.000538"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:27:28.807888" elapsed="0.001393"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:28.809633" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:28.809355" elapsed="0.000338"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:28.810427" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:28.809953" elapsed="0.000503"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:28.809720" elapsed="0.000773"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:28.810699" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:28.810519" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:28.809335" elapsed="0.001444"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:28.810818" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:27:28.810979" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:27:28.805048" elapsed="0.005957"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:28.811052" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:27:28.811197" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:27:28.804442" elapsed="0.006782"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:28.818689" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:28.818413" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:28.819135" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:28.818890" 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-08-22T23:27:28.830250" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:28.830425" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:27:28.830545" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:28.821367" elapsed="0.009602">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:28.819283" elapsed="0.011775">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:28.831278" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:28.831096" elapsed="0.000265"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:28.819264" elapsed="0.012122">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:28.831814" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:28.831955" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:28.831916" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:28.831898" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:28.832163" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:28.832235" 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-08-22T23:27:28.814016" elapsed="0.018327">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:28.832414" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:28.811531" elapsed="0.020978">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:28.832701" elapsed="0.000023"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:27:28.791735" elapsed="0.041078">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:29.850216" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:29.848069" elapsed="0.002180"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:29.850966" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:29.850636" elapsed="0.000417"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:27:29.850462" elapsed="0.000631"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:29.851661" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:29.851323" elapsed="0.000365"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:27:29.851175" elapsed="0.000549"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:27:29.850317" elapsed="0.001435"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:29.852086" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:29.851825" elapsed="0.000319"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:29.852875" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:29.852397" elapsed="0.000506"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:29.852169" elapsed="0.000771"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:29.853125" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:29.852964" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:29.851805" elapsed="0.001397"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:29.853239" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:27:29.853398" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:27:29.847575" elapsed="0.005849"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:29.853471" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:27:29.853629" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:27:29.846966" elapsed="0.006690"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:29.861697" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:29.861426" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:29.862139" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:29.861897" 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-08-22T23:27:29.872762" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:29.872927" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:27:29.873041" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:29.864327" elapsed="0.009117">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:29.862249" elapsed="0.011281">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:29.873741" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:29.873565" elapsed="0.000242"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:29.862231" elapsed="0.011600">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:29.874221" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:29.874415" elapsed="0.000043"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:29.874375" elapsed="0.000113"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:29.874356" elapsed="0.000155"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:29.874684" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:29.874756" 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-08-22T23:27:29.857095" elapsed="0.017768">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:29.874934" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:29.853878" elapsed="0.021151">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:29.875293" elapsed="0.000056"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:27:29.833668" elapsed="0.041880">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:30.894071" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:30.891918" elapsed="0.002186"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:30.894827" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:30.894471" elapsed="0.000384"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:27:30.894321" elapsed="0.000571"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:30.895446" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:30.895124" elapsed="0.000350"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:27:30.894975" elapsed="0.000535"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:27:30.894174" elapsed="0.001365"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:30.895891" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:30.895627" elapsed="0.000322"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:30.896687" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:30.896203" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:30.895974" elapsed="0.000778"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:30.896937" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:30.896777" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:30.895607" elapsed="0.001407"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:30.897052" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:27:30.897214" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:27:30.891412" elapsed="0.005828"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:30.897286" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:27:30.897429" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:27:30.890792" elapsed="0.006662"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:30.904803" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:30.904521" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:30.905309" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:30.905007" elapsed="0.000346"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:27:30.916543" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:30.916734" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:27:30.916850" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:30.907640" elapsed="0.009617">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:30.905560" elapsed="0.011781">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:30.917529" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:30.917375" elapsed="0.000237"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:30.905539" elapsed="0.012098">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:30.918014" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:30.918149" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:30.918112" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:30.918095" 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-08-22T23:27:30.918352" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:30.918422" 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-08-22T23:27:30.900180" elapsed="0.018347">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:30.918613" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:30.897697" elapsed="0.021039">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:30.918905" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:27:30.876382" elapsed="0.042632">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:31.936718" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:31.934442" elapsed="0.002311"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:31.937468" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:31.937133" elapsed="0.000362"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:27:31.936976" elapsed="0.000556"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:31.938110" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:31.937786" elapsed="0.000351"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:27:31.937635" elapsed="0.000538"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:27:31.936826" elapsed="0.001376"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:31.938544" elapsed="0.000105"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:31.938277" elapsed="0.000413"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:31.939431" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:31.938957" elapsed="0.000503"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:31.938717" elapsed="0.000780"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:31.939699" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:31.939522" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:31.938257" elapsed="0.001520"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:31.939818" elapsed="0.000038"/>
</return>
<msg time="2026-08-22T23:27:31.940016" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:27:31.933954" elapsed="0.006092"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:31.940096" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:27:31.940240" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:27:31.933350" elapsed="0.006916"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:31.947669" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:31.947390" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:31.948137" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:31.947873" 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-08-22T23:27:31.960277" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:31.960437" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:27:31.960558" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:31.950494" elapsed="0.010480">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:31.948250" elapsed="0.012808">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:31.961267" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:31.961097" elapsed="0.000238"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:31.948231" elapsed="0.013129">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:31.961754" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:31.961890" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:31.961853" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:31.961835" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:31.962097" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:31.962168" 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-08-22T23:27:31.942994" elapsed="0.019280">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:31.962390" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:31.940493" elapsed="0.021994">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:31.962672" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:27:31.919877" elapsed="0.042907">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:32.983229" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:32.980965" elapsed="0.002301"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:32.983999" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:32.983660" elapsed="0.000367"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:27:32.983490" elapsed="0.000578"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:32.984668" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:32.984311" elapsed="0.000385"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:27:32.984154" elapsed="0.000582"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:27:32.983341" elapsed="0.001426"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:32.985124" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:32.984842" elapsed="0.000344"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:32.986020" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:32.985480" elapsed="0.000571"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:32.985214" elapsed="0.000874"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:32.986279" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:32.986115" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:32.984821" elapsed="0.001540"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:32.986405" elapsed="0.000039"/>
</return>
<msg time="2026-08-22T23:27:32.986609" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:27:32.980470" elapsed="0.006171"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:32.986691" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:27:32.986852" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:27:32.979886" elapsed="0.006995"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:32.994499" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:32.994239" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:32.994959" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:32.994717" 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-08-22T23:27:33.005728" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:33.005896" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:27:33.006068" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:32.997141" elapsed="0.009312">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:32.995071" elapsed="0.011463">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:33.006741" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:33.006568" elapsed="0.000240"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:32.995053" elapsed="0.011779">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:33.007208" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:33.007344" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:33.007306" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:33.007288" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:33.007548" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:33.007634" 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-08-22T23:27:32.989876" elapsed="0.017867">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:33.007813" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:32.987121" elapsed="0.020786">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:33.008076" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:27:32.963543" elapsed="0.044641">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:34.024887" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:34.022493" elapsed="0.002429"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:34.025710" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:34.025302" elapsed="0.000438"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:27:34.025144" elapsed="0.000637"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:34.026344" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:34.026016" elapsed="0.000355"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:27:34.025865" elapsed="0.000544"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:27:34.024994" elapsed="0.001444"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:34.026802" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:34.026517" elapsed="0.000344"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:34.027603" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:34.027118" elapsed="0.000516"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:34.026888" elapsed="0.000782"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:34.027858" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:34.027695" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:34.026495" elapsed="0.001511"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:34.028050" elapsed="0.000041"/>
</return>
<msg time="2026-08-22T23:27:34.028222" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:27:34.022006" elapsed="0.006243"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:34.028297" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:27:34.028440" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:27:34.021403" elapsed="0.007062"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:34.035985" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:34.035722" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:34.036427" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:34.036184" 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-08-22T23:27:34.048157" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:34.048453" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:27:34.048735" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:34.038619" elapsed="0.010918">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:34.036539" elapsed="0.013212">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:34.050174" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:34.049827" elapsed="0.000496"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:34.036521" elapsed="0.013856">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:34.051214" elapsed="0.000058"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:34.051510" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:34.051428" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:34.051391" elapsed="0.000294"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:34.051996" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:34.052152" elapsed="0.000033"/>
</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-08-22T23:27:34.031342" elapsed="0.021039">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:34.052607" elapsed="0.000038"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:34.028810" elapsed="0.024015">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:34.053152" elapsed="0.000032"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:27:34.009069" elapsed="0.044242">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:35.075078" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:35.072928" elapsed="0.002184"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:35.075826" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:35.075479" elapsed="0.000375"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:27:35.075325" elapsed="0.000566"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:35.076456" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:35.076134" elapsed="0.000349"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:27:35.075986" elapsed="0.000533"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:27:35.075180" elapsed="0.001368"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:35.076905" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:35.076640" elapsed="0.000325"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:35.077708" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:35.077227" elapsed="0.000509"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:35.076990" elapsed="0.000783"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:35.077959" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:35.077798" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:35.076619" elapsed="0.001416"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:35.078075" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:27:35.078237" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:27:35.072431" elapsed="0.005833"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:35.078310" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:27:35.078451" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:27:35.071790" elapsed="0.006687"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:35.085773" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:35.085501" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:35.086215" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:35.085972" 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-08-22T23:27:35.096761" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:35.096912" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:27:35.097027" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:35.088396" elapsed="0.009014">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:35.086326" elapsed="0.011167">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:35.097697" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:35.097526" elapsed="0.000297"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:35.086308" elapsed="0.011541">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:35.098233" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:35.098367" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:35.098330" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:35.098312" 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-08-22T23:27:35.098570" elapsed="0.000042"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:35.098662" 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-08-22T23:27:35.081191" elapsed="0.017576">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:35.098839" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:35.078716" elapsed="0.020217">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:35.099101" elapsed="0.000024"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:27:35.054231" elapsed="0.044982">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:36.115895" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:36.113724" elapsed="0.002205"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:36.116647" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:36.116302" elapsed="0.000372"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:27:36.116149" elapsed="0.000562"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:36.117266" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:36.116943" elapsed="0.000349"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:27:36.116792" elapsed="0.000536"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:27:36.116000" elapsed="0.001357"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:36.117715" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:36.117433" elapsed="0.000340"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:36.118498" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:36.118029" elapsed="0.000498"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:36.117799" elapsed="0.000765"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:36.118767" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:36.118605" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:36.117411" elapsed="0.001433"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:36.118883" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:27:36.119047" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:27:36.113234" elapsed="0.005839"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:36.119119" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:27:36.119260" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:27:36.112657" elapsed="0.006628"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:36.126762" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:36.126486" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:36.127203" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:36.126960" 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-08-22T23:27:36.138258" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:36.138411" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:27:36.138518" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:36.129405" elapsed="0.009526">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:36.127313" elapsed="0.011703">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:36.139203" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:36.139049" elapsed="0.000219"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:36.127295" elapsed="0.011997">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:36.139683" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:36.139845" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:36.139808" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:36.139789" 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-08-22T23:27:36.140051" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:36.140139" elapsed="0.000036"/>
</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-08-22T23:27:36.122097" elapsed="0.018295">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:36.140547" elapsed="0.000066"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:36.119569" elapsed="0.021227">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:36.141186" elapsed="0.000055"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:27:36.100275" elapsed="0.041167">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:37.161843" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:37.159691" elapsed="0.002183"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:37.162569" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:37.162238" elapsed="0.000374"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:27:37.162079" elapsed="0.000571"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:37.163275" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:37.162947" elapsed="0.000355"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:27:37.162794" elapsed="0.000545"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:27:37.161938" elapsed="0.001431"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:37.163710" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:37.163440" elapsed="0.000330"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:37.164537" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:37.164030" elapsed="0.000536"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:37.163795" elapsed="0.000826"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:37.164813" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:37.164648" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:37.163420" elapsed="0.001473"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:37.164930" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:27:37.165089" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:27:37.159201" elapsed="0.005915"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:37.165163" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:27:37.165307" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:27:37.158622" elapsed="0.006711"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:37.172793" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:37.172519" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:37.173233" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:37.172990" 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-08-22T23:27:37.183294" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:37.183448" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:27:37.183552" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:37.175408" elapsed="0.008551">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:37.173345" elapsed="0.010695">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:37.184253" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:37.184074" elapsed="0.000246"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:37.173326" elapsed="0.011018">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:37.184737" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:37.184872" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:37.184835" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:37.184817" 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-08-22T23:27:37.185112" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:37.185183" 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-08-22T23:27:37.168044" elapsed="0.017246">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:37.185360" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:37.165556" elapsed="0.019900">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:37.185638" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:27:37.142249" elapsed="0.043500">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:38.204335" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:38.202123" elapsed="0.002249"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:38.205210" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:38.204781" elapsed="0.000457"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:27:38.204623" elapsed="0.000660"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:38.205884" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:38.205522" elapsed="0.000389"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:27:38.205370" elapsed="0.000577"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:27:38.204450" elapsed="0.001527"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:38.206335" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:38.206059" elapsed="0.000336"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:38.207136" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:38.206668" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:38.206422" elapsed="0.000781"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:38.207391" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:38.207228" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:38.206036" elapsed="0.001432"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:38.207510" elapsed="0.000042"/>
</return>
<msg time="2026-08-22T23:27:38.207699" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:27:38.201630" elapsed="0.006097"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:38.207776" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:27:38.207921" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:27:38.201024" elapsed="0.006922"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:38.215304" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:38.215039" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:38.215765" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:38.215502" 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-08-22T23:27:38.226131" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:38.226383" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:27:38.226496" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:38.217949" elapsed="0.008975">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:38.215877" elapsed="0.011134">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:38.227200" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:38.227044" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:38.215859" elapsed="0.011431">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:38.227684" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:38.227820" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:38.227782" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:38.227765" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:38.228029" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:38.228100" 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-08-22T23:27:38.210703" elapsed="0.017503">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:38.228276" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:38.208173" elapsed="0.020198">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:38.228536" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:27:38.186611" elapsed="0.042055">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:39.247409" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:39.244461" elapsed="0.002982"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:39.248162" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:39.247832" elapsed="0.000358"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:27:39.247678" elapsed="0.000549"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:39.248796" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:39.248458" elapsed="0.000364"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:27:39.248310" elapsed="0.000550"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:27:39.247515" elapsed="0.001374"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:39.249235" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:39.248964" elapsed="0.000332"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:39.250047" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:39.249554" elapsed="0.000522"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:39.249321" elapsed="0.000865"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:39.250377" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:39.250213" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:39.248943" elapsed="0.001512"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:39.250495" elapsed="0.000038"/>
</return>
<msg time="2026-08-22T23:27:39.250676" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:27:39.243806" elapsed="0.006897"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:39.250750" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:27:39.250895" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:27:39.242988" elapsed="0.007933"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:39.258240" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:39.257954" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:39.258704" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:39.258441" 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-08-22T23:27:39.269438" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:39.269607" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:27:39.269715" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:39.261001" elapsed="0.009119">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:39.258817" elapsed="0.011412">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:39.270491" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:39.270276" elapsed="0.000327"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:39.258799" elapsed="0.011841">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:39.271161" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:39.271351" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:39.271299" elapsed="0.000111"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:39.271274" elapsed="0.000167"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:39.271657" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:39.271757" 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-08-22T23:27:39.253620" elapsed="0.018284">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:39.272003" elapsed="0.000021"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:39.251143" elapsed="0.020993">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:39.272422" elapsed="0.000031"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:27:39.229494" elapsed="0.043102">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:40.292946" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:40.290778" elapsed="0.002201"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:40.293703" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:40.293356" elapsed="0.000374"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:27:40.293198" elapsed="0.000570"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:40.294322" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:40.294000" elapsed="0.000349"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:27:40.293850" elapsed="0.000536"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:27:40.293050" elapsed="0.001365"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:40.294769" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:40.294488" elapsed="0.000341"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:40.295570" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:40.295084" elapsed="0.000531"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:40.294854" elapsed="0.000799"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:40.295841" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:40.295679" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:40.294469" elapsed="0.001450"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:40.295956" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:27:40.296114" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:27:40.290285" elapsed="0.005855"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:40.296186" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:27:40.296331" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:27:40.289700" elapsed="0.006657"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:40.303691" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:40.303416" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:40.304138" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:40.303891" 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-08-22T23:27:40.314243" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:40.314395" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:27:40.314500" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:40.306305" elapsed="0.008597">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:40.304250" elapsed="0.010791">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:40.315231" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:40.315076" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:40.304231" elapsed="0.011090">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:40.315730" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:40.315866" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:40.315828" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:40.315811" 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-08-22T23:27:40.316068" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:40.316140" 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-08-22T23:27:40.299059" elapsed="0.017186">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:40.316316" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:40.296594" elapsed="0.019819">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:40.316594" elapsed="0.000023"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:27:40.273419" elapsed="0.043285">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:41.334716" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:41.331806" elapsed="0.002942"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:41.335442" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:41.335116" elapsed="0.000352"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:27:41.334963" elapsed="0.000542"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:41.336072" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:41.335753" elapsed="0.000347"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:27:41.335604" elapsed="0.000531"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:27:41.334818" elapsed="0.001345"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:41.336500" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:41.336236" elapsed="0.000322"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:41.337313" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:41.336833" elapsed="0.000508"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:41.336600" elapsed="0.000776"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:41.337564" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:41.337403" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:41.336215" elapsed="0.001449"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:41.337702" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:27:41.337860" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:27:41.331135" elapsed="0.006750"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:41.337934" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:27:41.338141" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:27:41.330320" elapsed="0.007847"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:41.345485" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:41.345226" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:41.345943" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:41.345698" 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-08-22T23:27:41.356084" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:41.356242" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:27:41.356415" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:41.348170" elapsed="0.008791">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:41.346055" elapsed="0.011036">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:41.357357" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:41.357139" elapsed="0.000310"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:41.346036" elapsed="0.011448">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:41.358025" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:41.358215" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:41.358162" elapsed="0.000112"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:41.358138" elapsed="0.000167"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:41.358504" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:41.358623" 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-08-22T23:27:41.340864" elapsed="0.017908">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:41.358871" elapsed="0.000022"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:41.338388" elapsed="0.020615">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:41.359235" elapsed="0.000030"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:27:41.317484" elapsed="0.041901">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:42.377915" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:42.375730" elapsed="0.002222"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:42.378768" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:42.378421" elapsed="0.000374"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:27:42.378265" elapsed="0.000567"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:42.379412" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:42.379087" elapsed="0.000352"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:27:42.378915" elapsed="0.000560"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:27:42.378113" elapsed="0.001392"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:42.379867" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:42.379598" elapsed="0.000328"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:42.380668" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:42.380185" elapsed="0.000511"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:42.379952" elapsed="0.000781"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:42.380921" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:42.380758" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:42.379560" elapsed="0.001439"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:42.381038" elapsed="0.000039"/>
</return>
<msg time="2026-08-22T23:27:42.381204" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:27:42.375229" elapsed="0.006001"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:42.381278" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:27:42.381419" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:27:42.374620" elapsed="0.006825"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:42.388925" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:42.388667" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:42.389367" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:42.389125" 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-08-22T23:27:42.399279" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:42.399452" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:27:42.399561" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:42.391626" elapsed="0.008369">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:42.389476" elapsed="0.010604">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:42.400270" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:42.400114" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:42.389458" elapsed="0.010902">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:42.400749" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:42.400924" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:42.400885" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:42.400866" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:42.401131" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:42.401203" 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-08-22T23:27:42.384322" elapsed="0.016987">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:42.401381" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:42.381684" elapsed="0.019793">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:42.401662" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:27:42.360215" elapsed="0.041558">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:43.420495" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:43.418337" elapsed="0.002192"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:43.421266" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:43.420922" elapsed="0.000371"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:27:43.420767" elapsed="0.000564"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:43.421910" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:43.421572" elapsed="0.000364"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:27:43.421422" elapsed="0.000549"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:27:43.420617" elapsed="0.001384"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:43.422346" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:43.422078" elapsed="0.000327"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:43.423140" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:43.422676" elapsed="0.000492"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:43.422431" elapsed="0.000772"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:43.423390" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:43.423228" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:43.422056" elapsed="0.001412"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:43.423509" elapsed="0.000039"/>
</return>
<msg time="2026-08-22T23:27:43.423694" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:27:43.417854" elapsed="0.005866"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:43.423768" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:27:43.423908" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:27:43.417221" elapsed="0.006713"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:43.431256" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:43.430999" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:43.431804" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:43.431539" 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-08-22T23:27:43.442722" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:43.442882" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:27:43.442994" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:43.433984" elapsed="0.009407">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:43.431917" elapsed="0.011555">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:43.443679" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:43.443506" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:43.431899" elapsed="0.011872">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:43.444141" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:43.444276" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:43.444238" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:43.444221" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:43.444484" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:43.444555" 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-08-22T23:27:43.426664" elapsed="0.018011">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:43.444744" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:43.424159" elapsed="0.020679">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:43.445001" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:27:43.403107" elapsed="0.042003">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:44.463089" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:44.460906" elapsed="0.002218"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:44.463880" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:44.463524" elapsed="0.000382"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:27:44.463349" elapsed="0.000596"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:44.464497" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:44.464177" elapsed="0.000346"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:27:44.464028" elapsed="0.000531"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:27:44.463197" elapsed="0.001477"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:44.465025" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:44.464755" elapsed="0.000328"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:44.465823" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:44.465339" elapsed="0.000512"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:44.465109" elapsed="0.000779"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:44.466076" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:44.465913" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:44.464734" elapsed="0.001420"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:44.466193" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:27:44.466355" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:27:44.460410" elapsed="0.005972"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:44.466430" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:27:44.466588" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:27:44.459836" elapsed="0.006780"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:44.473948" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:44.473691" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:44.474385" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:44.474145" 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-08-22T23:27:44.484997" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:44.485158" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:27:44.485267" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:44.476713" elapsed="0.008971">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:44.474494" elapsed="0.011274">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:44.485958" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:44.485803" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:44.474477" elapsed="0.011572">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:44.486420" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:44.486554" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:44.486517" elapsed="0.000096"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:44.486500" elapsed="0.000135"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:44.486776" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:44.486848" 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-08-22T23:27:44.469338" elapsed="0.017651">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:44.487062" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:44.466841" elapsed="0.020317">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:44.487325" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:27:44.446037" elapsed="0.041399">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:45.504978" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:45.502805" elapsed="0.002207"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:45.505725" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:45.505383" elapsed="0.000369"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:27:45.505230" elapsed="0.000559"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:45.506362" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:45.506037" elapsed="0.000351"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:27:45.505871" elapsed="0.000554"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:27:45.505082" elapsed="0.001371"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:45.506810" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:45.506528" elapsed="0.000342"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:45.507616" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:45.507128" elapsed="0.000516"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:45.506896" elapsed="0.000785"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:45.507868" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:45.507707" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:45.506508" elapsed="0.001437"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:45.507983" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:27:45.508146" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:27:45.502217" elapsed="0.005955"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:45.508218" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:27:45.508360" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:27:45.501572" elapsed="0.006814"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:45.516084" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:45.515777" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:45.516546" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:45.516298" 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-08-22T23:27:45.528015" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:45.528191" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:27:45.528411" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:45.518811" elapsed="0.010028">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:45.516687" elapsed="0.012249">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:45.529187" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:45.528979" elapsed="0.000276"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:45.516663" elapsed="0.012617">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:45.529739" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:45.529886" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:45.529843" elapsed="0.000126"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:45.529824" elapsed="0.000167"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:45.530137" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:45.530208" 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-08-22T23:27:45.511354" elapsed="0.019000">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:45.530509" elapsed="0.000034"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:45.508631" elapsed="0.022124">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:45.531126" elapsed="0.000047"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:27:45.488293" elapsed="0.043071">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:46.550504" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:46.546322" elapsed="0.004215"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:46.551262" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:46.550925" elapsed="0.000366"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:27:46.550768" elapsed="0.000561"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:46.551906" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:46.551561" elapsed="0.000373"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:27:46.551411" elapsed="0.000561"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:27:46.550621" elapsed="0.001381"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:46.552341" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:46.552074" elapsed="0.000327"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:46.553196" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:46.552723" elapsed="0.000501"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:46.552426" elapsed="0.000906"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:46.553519" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:46.553358" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:46.552054" elapsed="0.001558"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:46.553650" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:27:46.553815" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:27:46.545839" elapsed="0.008003"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:46.553889" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:27:46.554032" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:27:46.545232" elapsed="0.008826"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:46.561469" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:46.561206" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:46.561927" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:46.561684" 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-08-22T23:27:46.572860" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:46.573026" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:27:46.573151" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:46.564093" elapsed="0.009723">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:46.562039" elapsed="0.011961">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:46.574422" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:46.574078" elapsed="0.000492"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:46.562021" elapsed="0.012638">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:46.575484" elapsed="0.000058"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:46.575818" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:46.575733" elapsed="0.000181"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:46.575693" 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-08-22T23:27:46.576276" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:46.576434" elapsed="0.000034"/>
</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-08-22T23:27:46.556826" elapsed="0.019958">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:46.576953" elapsed="0.000036"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:46.554280" elapsed="0.022890">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:46.577671" elapsed="0.000051"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:27:46.532306" elapsed="0.045618">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:47.596713" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:47.593705" elapsed="0.003041"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:47.597440" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:47.597110" elapsed="0.000358"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:27:47.596957" elapsed="0.000548"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:47.598076" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:47.597754" elapsed="0.000348"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:27:47.597601" elapsed="0.000538"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:27:47.596814" elapsed="0.001354"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:47.598508" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:47.598242" elapsed="0.000324"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:47.599352" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:47.598842" elapsed="0.000548"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:47.598608" elapsed="0.000836"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:47.599679" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:47.599481" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:47.598221" elapsed="0.001545"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:47.599806" elapsed="0.000038"/>
</return>
<msg time="2026-08-22T23:27:47.599973" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:27:47.593032" elapsed="0.006967"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:27:47.600045" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:27:47.600192" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:27:47.592218" elapsed="0.008000"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:47.607541" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:47.607277" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:47.608000" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:47.607758" 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-08-22T23:27:47.619399" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:47.619631" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:27:47.619780" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:47.610157" elapsed="0.010140">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:47.608110" elapsed="0.012299">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:47.620770" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:47.620528" elapsed="0.000336"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:47.608092" elapsed="0.012806">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:47.621418" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:47.621627" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:47.621553" elapsed="0.000134"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:47.621529" elapsed="0.000188"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:47.621917" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:47.622016" 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-08-22T23:27:47.602916" elapsed="0.019247">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:47.622263" elapsed="0.000023"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:47.600437" elapsed="0.021967">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:47.622660" elapsed="0.000031"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:27:47.578838" elapsed="0.043977">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<msg time="2026-08-22T23:27:47.622947" level="FAIL">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Connected</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:27:26.695058" elapsed="20.928021">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${node2_session}</arg>
<doc>Wait for the device to become connected.
It is more readable to use this keyword in a test case than to put the whole WUKS below into it.</doc>
<status status="FAIL" start="2026-08-22T23:27:26.694587" elapsed="20.928670">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Wait_Device_Connected" owner="NetconfKeywords">
<arg>${DEVICE_NAME}</arg>
<arg>session=${node3_session}</arg>
<doc>Wait for the device to become connected.
It is more readable to use this keyword in a test case than to put the whole WUKS below into it.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:47.623559" elapsed="0.000054"/>
</kw>
<doc>Wait for the whole cluster to see the device.</doc>
<status status="FAIL" start="2026-08-22T23:27:24.214698" elapsed="23.409111">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</test>
<test id="s1-s4-t5" name="Check_Config_Data_Before_Data_Creation" 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-08-22T23:27:47.629209" elapsed="0.000304"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:27:47.628837" elapsed="0.000775"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:27:47.631015" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:47.630858" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:47.630832" elapsed="0.000278"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:27:47.637946" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:47.637837" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:47.637818" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:27:47.639010" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:27:47.638626" elapsed="0.000446"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:27:47.639574" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:27:47.639256" elapsed="0.000360"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:27:47.639661" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:27:47.639816" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:27:47.638238" elapsed="0.001603"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:27:47.645283" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:47.645174" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:47.645155" 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-08-22T23:27:47.646519" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:47.646413" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:47.646394" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:47.647059" level="INFO">${karaf_connection_index} = 25</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:27:47.646758" elapsed="0.000328"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:47.647546" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:27:47.647304" elapsed="0.000268"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:27:47.725377" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:27:47.648092" elapsed="0.077414"/>
</kw>
<msg time="2026-08-22T23:27:47.725710" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:27:47.725759" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:47.647756" elapsed="0.078037"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:27:47.762842" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "D "a "t "a "_ "C "r "e "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-08-22T23:27:47.726392" elapsed="0.036562"/>
</kw>
<msg time="2026-08-22T23:27:47.763132" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:27:47.763178" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "D "a "t "a ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:47.726009" elapsed="0.037204"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:47.763573" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:47.763309" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:47.763282" elapsed="0.000401"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:47.764143" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "D "a "t "a "_ "C "r "e "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-08-22T23:27:47.763829" 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-08-22T23:27:47.764498" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:47.764279" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:47.764261" elapsed="0.000336"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:27:47.764637" 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-08-22T23:27:47.767418" elapsed="0.000200"/>
</kw>
<msg time="2026-08-22T23:27:47.767682" 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-08-22T23:27:47.766153" elapsed="0.001665"/>
</kw>
<kw name="Open 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-08-22T23:27:47.768123" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:47.768630" elapsed="0.000202"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:27:47.765497" 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-08-22T23:27:47.764942" elapsed="0.004079"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:27:47.646111" elapsed="0.123011"/>
</kw>
<msg time="2026-08-22T23:27:47.769217" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:47.769263" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "D "a "t "a ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:47.645499" elapsed="0.123800"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:27:47.769494" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:27:47.769378" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:47.769359" 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-08-22T23:27:47.770020" 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-08-22T23:27:47.770358" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:27:47.770432" 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-08-22T23:27:47.644836" elapsed="0.125708"/>
</kw>
<msg time="2026-08-22T23:27:47.770752" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:47.770798" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "D "a "t "a ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:47.640201" elapsed="0.130632"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:47.771222" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:47.770910" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:47.770893" elapsed="0.000410"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:27:47.640062" elapsed="0.131265"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:27:47.776916" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:47.776807" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:47.776787" 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-08-22T23:27:47.778128" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:47.778020" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:47.778002" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:47.778660" level="INFO">${karaf_connection_index} = 26</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:27:47.778338" elapsed="0.000349"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:47.779074" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:27:47.778845" elapsed="0.000256"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:27:47.824358" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:27:47.779614" elapsed="0.044855"/>
</kw>
<msg time="2026-08-22T23:27:47.824653" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:27:47.824702" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:47.779258" elapsed="0.045478"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:27:47.865470" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "D "a "t "a "_ "C "r "e "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-08-22T23:27:47.825260" elapsed="0.040528"/>
</kw>
<msg time="2026-08-22T23:27:47.865949" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:27:47.865997" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "D "a "t "a ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:47.824910" elapsed="0.041123"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:47.866381" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:47.866158" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:47.866136" elapsed="0.000343"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:47.867299" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "D "a "t "a "_ "C "r "e "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-08-22T23:27:47.866993" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:47.867672" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:47.867433" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:47.867415" elapsed="0.000338"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:27:47.867787" 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-08-22T23:27:47.870408" elapsed="0.000153"/>
</kw>
<msg time="2026-08-22T23:27:47.870646" 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-08-22T23:27:47.869222" elapsed="0.001555"/>
</kw>
<kw name="Open 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-08-22T23:27:47.871083" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:47.871445" 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-08-22T23:27:47.868613" elapsed="0.003138"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:27:47.868058" elapsed="0.003761"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:27:47.777718" elapsed="0.094201"/>
</kw>
<msg time="2026-08-22T23:27:47.872012" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:47.872057" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "D "a "t "a ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:47.777133" elapsed="0.094960"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:27:47.872278" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:27:47.872171" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:47.872152" 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-08-22T23:27:47.872792" 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-08-22T23:27:47.873273" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:27:47.873348" 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-08-22T23:27:47.776421" elapsed="0.097042"/>
</kw>
<msg time="2026-08-22T23:27:47.873558" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:47.873646" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "D "a "t "a ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:47.771614" elapsed="0.102069"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:47.874007" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:47.873760" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:47.873743" elapsed="0.000342"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:27:47.771458" elapsed="0.102650"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:27:47.879608" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:47.879484" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:47.879465" 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-08-22T23:27:47.880865" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:47.880757" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:47.880739" elapsed="0.000248"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:27:47.881436" level="INFO">${karaf_connection_index} = 27</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:27:47.881133" elapsed="0.000330"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:27:47.881853" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:27:47.881637" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:27:47.913909" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:27:47.882374" elapsed="0.031797"/>
</kw>
<msg time="2026-08-22T23:27:47.914456" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:27:47.914522" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:47.882039" elapsed="0.032533"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:27:47.939166" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "D "a "t "a "_ "C "r "e "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-08-22T23:27:47.915561" elapsed="0.023727"/>
</kw>
<msg time="2026-08-22T23:27:47.939462" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:27:47.939512" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "D "a "t "a ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:47.914967" elapsed="0.024581"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:47.939955" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:47.939680" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:47.939649" elapsed="0.000395"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:47.940858" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "D "a "t "a "_ "C "r "e "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-08-22T23:27:47.940193" elapsed="0.000738"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:47.941246" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:47.941004" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:47.940985" elapsed="0.000345"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:27:47.941369" 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-08-22T23:27:47.944347" elapsed="0.000165"/>
</kw>
<msg time="2026-08-22T23:27:47.944598" 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-08-22T23:27:47.943046" 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-08-22T23:27:47.945029" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:47.945604" elapsed="0.000087"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:27:47.942286" 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-08-22T23:27:47.941704" elapsed="0.004175"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:27:47.880399" elapsed="0.065581"/>
</kw>
<msg time="2026-08-22T23:27:47.946078" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:47.946124" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "D "a "t "a ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:47.879828" elapsed="0.066333"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:27:47.946354" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:27:47.946241" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:47.946220" elapsed="0.000221"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:47.947007" 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-08-22T23:27:47.947422" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:27:47.947500" 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-08-22T23:27:47.879142" elapsed="0.068543"/>
</kw>
<msg time="2026-08-22T23:27:47.947785" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:27:47.947830" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "D "a "t "a ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:47.874370" elapsed="0.073495"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:47.948199" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:47.947943" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:47.947924" elapsed="0.000354"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:27:47.874233" elapsed="0.074070"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:27:47.639892" elapsed="0.308444"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:27:47.637459" elapsed="0.310940"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:27:47.630429" elapsed="0.318034"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:27:47.629827" elapsed="0.318682"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:27:47.625461" elapsed="0.323104"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:47.950182" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:47.949788" elapsed="0.000422"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:47.959064" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:47.958667" elapsed="0.000466"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:47.959757" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:47.959361" 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-08-22T23:27:48.007255" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:48.007477" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:27:48.007665" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:27:47.963100" elapsed="0.044609"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:47.959923" elapsed="0.047852"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:48.008055" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:48.007817" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:47.959896" elapsed="0.048291"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:48.013517" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:48.009764" elapsed="0.003850"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:48.009409" elapsed="0.004261"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:48.009382" elapsed="0.004327"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:48.016972" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:48.014121" elapsed="0.002898"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:48.013793" elapsed="0.003262"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:48.013768" elapsed="0.003312"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:48.017685" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:48.017256" 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-08-22T23:27:48.018083" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:48.017838" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:48.018654" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:48.018330" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:48.018167" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:48.017819" elapsed="0.000922"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:27:48.019330" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:48.018952" 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-08-22T23:27:48.019683" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:48.019429" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:48.020226" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:48.019926" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:48.019768" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:48.019410" 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-08-22T23:27:48.020461" elapsed="0.000368"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:27:48.021298" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:27:48.020995" 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-08-22T23:27:48.021480" elapsed="0.002408"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:27:48.008764" elapsed="0.015188"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:27:48.024132" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-08-22T23:27:48.024023" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:48.024005" 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-08-22T23:27:48.024370" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:48.024443" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:27:48.026869" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:27:47.952957" elapsed="0.073941"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:27:48.026960" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:27:48.027111" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:27:47.950426" elapsed="0.076712"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:27:48.027421" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-08-22T23:27:48.027209" elapsed="0.000596"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:48.027192" elapsed="0.000639"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:48.028092" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:48.027888" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-08-22T23:27:48.027871" elapsed="0.000303"/>
</if>
<arg>${node1_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="PASS" start="2026-08-22T23:27:47.949362" elapsed="0.078860"/>
</kw>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${node1_session}</arg>
<arg>${empty_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:27:47.948766" elapsed="0.079507"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:48.029808" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:48.029410" elapsed="0.000426"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:48.037490" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:48.037229" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:48.037959" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:48.037708" 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-08-22T23:27:48.054244" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:48.054489" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:27:48.054708" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:48.040217" elapsed="0.015055">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:48.038072" elapsed="0.017322">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:48.055694" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:48.055444" elapsed="0.000348"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:48.038054" elapsed="0.017774">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:48.056364" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:48.056561" elapsed="0.000045"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:48.056506" elapsed="0.000143"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:48.056481" elapsed="0.000200"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:48.056891" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:48.056993" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:27:48.032769" elapsed="0.024377">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:48.057248" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:48.030091" elapsed="0.027294">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:48.057752" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:48.057501" elapsed="0.000335"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:48.057477" elapsed="0.000395"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:48.058157" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:48.057952" elapsed="0.000285"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:48.057929" elapsed="0.000342"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:27:48.029017" elapsed="0.029368">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:49.061402" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:49.060421" elapsed="0.001053"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:49.079140" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:49.078527" elapsed="0.000722"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:49.080166" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:49.079620" elapsed="0.000646"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:27:49.091754" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:49.091919" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:27:49.092036" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:49.083651" elapsed="0.008779">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:49.080421" elapsed="0.012130">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:49.092860" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:49.092627" elapsed="0.000331"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:49.080377" elapsed="0.012618">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:49.093547" elapsed="0.000074"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:49.093794" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:49.093735" elapsed="0.000124"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:49.093710" elapsed="0.000182"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:49.094105" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:49.094210" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:27:49.068102" elapsed="0.026264">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:49.094472" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:49.062050" elapsed="0.032584">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:49.094967" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:49.094755" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:49.094730" elapsed="0.000356"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:49.095451" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:49.095239" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:49.095214" elapsed="0.000357"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:27:49.059315" elapsed="0.036397">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:50.098656" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:50.097682" elapsed="0.001048"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:50.110314" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:50.109957" elapsed="0.000425"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:50.110963" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:50.110618" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:27:50.121484" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:50.121748" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:27:50.121908" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:50.113979" elapsed="0.008444">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:50.111129" elapsed="0.011411">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:50.122833" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:50.122611" elapsed="0.000318"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:50.111099" elapsed="0.011865">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:50.123478" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:50.123697" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:50.123638" elapsed="0.000123"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:50.123612" elapsed="0.000181"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:50.123993" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:50.124096" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:27:50.103877" elapsed="0.020367">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:50.124345" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:50.099226" elapsed="0.025253">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:50.124915" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:50.124704" elapsed="0.000293"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:50.124678" elapsed="0.000352"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:50.125303" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:50.125107" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:50.125085" elapsed="0.000328"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:27:50.096548" elapsed="0.028976">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:51.128493" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:51.127519" elapsed="0.001044"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:51.139366" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:51.139107" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:51.139834" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:51.139568" 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-08-22T23:27:51.149943" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:51.150145" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:27:51.150297" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:51.142064" elapsed="0.008768">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:51.139954" elapsed="0.010992">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:51.151211" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:51.150995" elapsed="0.000309"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:51.139932" elapsed="0.011406">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:51.151877" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:51.152065" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:51.152011" elapsed="0.000115"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:51.151987" elapsed="0.000170"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:51.152355" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:51.152451" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:27:51.133151" elapsed="0.019467">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:51.152787" elapsed="0.000024"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:51.129086" elapsed="0.023838">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:51.153236" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:51.153035" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:51.153012" elapsed="0.000351"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:51.153659" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:51.153442" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:51.153420" elapsed="0.000353"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:27:51.126408" elapsed="0.027475">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:52.156929" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:52.155879" elapsed="0.001123"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:52.168773" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:52.168461" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:52.169217" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:52.168973" 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-08-22T23:27:52.179302" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:52.179484" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:27:52.179651" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:52.171433" elapsed="0.008852">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:52.169338" elapsed="0.011061">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:52.180688" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:52.180448" elapsed="0.000331"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:52.169314" elapsed="0.011499">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:52.181330" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:52.181517" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:52.181463" elapsed="0.000114"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:52.181439" elapsed="0.000190"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:52.181828" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:52.182071" elapsed="0.000025"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:27:52.162367" elapsed="0.019857">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:52.182321" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:52.157505" elapsed="0.024947">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:52.182790" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:52.182567" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:52.182544" elapsed="0.000356"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:52.183168" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:52.182975" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:52.182954" elapsed="0.000322"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:27:52.154746" elapsed="0.028638">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:53.186543" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:53.185422" elapsed="0.001241"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:53.200095" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:53.199826" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:53.200552" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:53.200300" 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-08-22T23:27:53.210075" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:53.210233" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:27:53.210409" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:53.202935" elapsed="0.007961">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:53.200694" elapsed="0.010318">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:53.211278" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:53.211061" elapsed="0.000307"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:53.200670" elapsed="0.010732">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:53.211941" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:53.212206" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:53.212149" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:53.212124" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:53.212496" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:53.212613" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:27:53.195429" elapsed="0.017332">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:53.212858" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:53.187171" elapsed="0.025818">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:53.213304" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:53.213099" elapsed="0.000283"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:53.213076" elapsed="0.000339"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:53.213703" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:53.213490" elapsed="0.000291"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:53.213468" elapsed="0.000346"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:27:53.184315" elapsed="0.029607">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:54.217086" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:54.216051" elapsed="0.001108"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:54.229449" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:54.229186" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:54.229928" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:54.229677" 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-08-22T23:27:54.240338" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:54.240528" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:27:54.240682" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:54.232171" elapsed="0.008907">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:54.230052" elapsed="0.011110">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:54.241353" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:54.241198" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:54.230029" elapsed="0.011471">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:54.242363" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:54.242704" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:54.242613" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:54.242544" 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-08-22T23:27:54.243175" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:54.243332" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:27:54.223274" elapsed="0.020291">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:54.243753" elapsed="0.000035"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:54.217694" elapsed="0.026272">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:54.244462" elapsed="0.000080"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:54.244143" elapsed="0.000516"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:54.244106" elapsed="0.000609"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:54.245159" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:54.244842" elapsed="0.000440"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:54.244805" elapsed="0.000530"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:27:54.214880" elapsed="0.030630">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:55.248569" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:55.247571" elapsed="0.001101"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:55.260251" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:55.259990" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:55.260719" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:55.260453" 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-08-22T23:27:55.271304" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:55.271530" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:27:55.271730" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:55.263054" elapsed="0.009220">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:55.260843" elapsed="0.011546">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:55.272759" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:55.272516" elapsed="0.000335"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:55.260819" elapsed="0.012066">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:55.273413" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:55.273627" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:55.273548" elapsed="0.000147"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:55.273524" elapsed="0.000202"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:55.273926" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:55.274025" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:27:55.253655" elapsed="0.020517">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:55.274270" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:55.249167" elapsed="0.025234">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:55.274820" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:55.274510" elapsed="0.000409"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:55.274487" elapsed="0.000466"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:55.275229" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:55.275031" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:55.275009" elapsed="0.000331"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:27:55.246455" elapsed="0.028997">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:56.278552" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:56.277558" elapsed="0.001098"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:56.290498" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:56.290220" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:56.290974" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:56.290724" 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-08-22T23:27:56.300924" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:56.301092" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:27:56.301214" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:56.293281" elapsed="0.008560">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:56.291098" elapsed="0.010864">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:56.302230" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:56.302013" elapsed="0.000310"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:56.291074" elapsed="0.011283">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:56.302899" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:56.303094" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:56.303039" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:56.303015" elapsed="0.000172"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:56.303390" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:56.303491" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:27:56.285169" elapsed="0.018491">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:56.303762" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:56.279154" elapsed="0.024741">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:56.304212" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:56.304008" elapsed="0.000284"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:56.303984" elapsed="0.000342"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:56.304699" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:56.304403" elapsed="0.000383"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:56.304381" elapsed="0.000440"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:27:56.276353" elapsed="0.028585">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:57.308088" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:57.307077" elapsed="0.001085"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:57.319932" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:57.319669" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:57.320380" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:57.320135" 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-08-22T23:27:57.330938" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:57.331115" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:27:57.331312" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:57.322683" elapsed="0.009049">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:57.320506" elapsed="0.011314">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:57.332020" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:57.331858" elapsed="0.000229"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:57.320479" elapsed="0.011633">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:57.332519" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:57.332685" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:57.332641" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:57.332620" 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-08-22T23:27:57.332897" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:57.332969" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:27:57.313216" elapsed="0.019861">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:57.333148" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:57.308705" elapsed="0.024540">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:57.333472" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:57.333326" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:57.333310" elapsed="0.000244"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:57.333766" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:57.333624" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:57.333608" elapsed="0.000239"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:27:57.305843" elapsed="0.028084">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:58.337105" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:58.336076" elapsed="0.001102"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:58.349180" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:58.348872" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:58.349673" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:58.349402" 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-08-22T23:27:58.359819" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:58.360028" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:27:58.360247" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:58.351903" elapsed="0.008822">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:58.349800" elapsed="0.011110">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:58.361407" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:58.360989" elapsed="0.000569"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:58.349776" elapsed="0.011865">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:58.362521" elapsed="0.000085"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:58.362859" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:58.362771" elapsed="0.000182"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:58.362731" 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-08-22T23:27:58.363318" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:58.363472" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:27:58.343398" elapsed="0.020336">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:58.363892" elapsed="0.000078"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:58.337716" elapsed="0.026442">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:58.364678" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:58.364330" elapsed="0.000477"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:58.364294" elapsed="0.000566"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:58.365286" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:58.364979" elapsed="0.000428"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:58.364944" elapsed="0.000515"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:27:58.334874" elapsed="0.030785">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:27:59.368832" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:27:59.367823" elapsed="0.001084"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:59.380029" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:59.379768" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:27:59.380479" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:27:59.380232" 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-08-22T23:27:59.390110" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:27:59.390279" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:27:59.390471" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:27:59.382716" elapsed="0.008167">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:27:59.380619" elapsed="0.010349">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:59.391158" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:59.391004" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:27:59.380593" elapsed="0.010658">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:59.391649" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:59.391797" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:27:59.391754" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:59.391734" elapsed="0.000129"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:59.392008" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:27:59.392080" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:27:59.373656" elapsed="0.018531">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:27:59.392259" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:27:59.369405" elapsed="0.022949">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:59.392594" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:59.392435" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:59.392418" elapsed="0.000262"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:27:59.392875" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:27:59.392735" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:27:59.392719" elapsed="0.000238"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:27:59.366652" elapsed="0.026383">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:00.396085" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:00.395092" elapsed="0.001066"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:00.407944" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:00.407683" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:00.408392" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:00.408147" 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-08-22T23:28:00.418426" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:00.418604" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:00.418819" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:00.410772" elapsed="0.008470">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:00.408513" elapsed="0.010812">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:00.419516" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:00.419360" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:00.408491" elapsed="0.011137">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:00.420432" elapsed="0.000058"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:00.420766" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:00.420680" elapsed="0.000182"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:00.420640" 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-08-22T23:28:00.421225" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:00.421381" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:00.402180" elapsed="0.019458">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:00.421795" elapsed="0.000034"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:00.396681" elapsed="0.025323">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:00.422495" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:00.422178" elapsed="0.000473"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:00.422141" elapsed="0.000564"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:00.423153" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:00.422826" elapsed="0.000455"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:00.422791" elapsed="0.000541"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:00.393944" elapsed="0.029561">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:01.426170" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:01.425246" elapsed="0.000990"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:01.437357" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:01.437105" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:01.437817" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:01.437556" 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-08-22T23:28:01.448612" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:01.448741" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:01.448924" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:01.439989" elapsed="0.009546">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:01.437930" elapsed="0.011740">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:01.449931" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:01.449718" elapsed="0.000304"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:01.437911" elapsed="0.012143">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:01.450563" elapsed="0.000061"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:01.450778" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:01.450726" elapsed="0.000111"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:01.450701" elapsed="0.000165"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:01.451063" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:01.451160" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:01.430999" elapsed="0.020304">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:01.451398" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:01.426746" elapsed="0.024781">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:01.451861" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:01.451658" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:01.451634" elapsed="0.000337"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:01.452235" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:01.452044" elapsed="0.000293"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:01.452023" elapsed="0.000345"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:01.424281" elapsed="0.028195">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:02.455819" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:02.454794" elapsed="0.001101"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:02.468696" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:02.468316" elapsed="0.000449"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:02.469323" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:02.468981" 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-08-22T23:28:02.478021" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:02.478191" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:02.478371" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:02.471736" elapsed="0.007128">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:02.469521" elapsed="0.009480">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:02.479266" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:02.479050" elapsed="0.000307"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:02.469459" elapsed="0.009931">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:02.479934" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:02.480126" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:02.480070" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:02.480047" elapsed="0.000172"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:02.480419" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:02.480515" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:02.462042" elapsed="0.018638">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:02.480777" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:02.456543" elapsed="0.024363">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:02.481211" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:02.481013" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:02.480990" elapsed="0.000331"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:02.481630" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:02.481395" elapsed="0.000314"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:02.481374" elapsed="0.000367"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:02.453619" elapsed="0.028228">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:03.484461" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:03.483538" elapsed="0.000989"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:03.496127" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:03.495874" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:03.496572" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:03.496327" 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-08-22T23:28:03.506231" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:03.506360" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:03.506510" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:03.498823" elapsed="0.008109">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:03.496702" elapsed="0.010341">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:03.507303" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:03.507089" elapsed="0.000305"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:03.496684" elapsed="0.010742">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:03.507962" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:03.508147" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:03.508096" elapsed="0.000110"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:03.508072" elapsed="0.000164"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:03.508432" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:03.508530" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:03.489493" elapsed="0.019205">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:03.508794" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:03.485035" elapsed="0.023888">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:03.509225" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:03.509029" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:03.509007" elapsed="0.000328"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:03.509622" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:03.509409" elapsed="0.000291"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:03.509388" elapsed="0.000344"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:03.482534" elapsed="0.027304">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:04.512424" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:04.511477" elapsed="0.001014"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:04.524548" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:04.524194" elapsed="0.000446"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:04.525082" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:04.524835" 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-08-22T23:28:04.535106" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:04.535238" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:04.535387" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:04.527254" elapsed="0.008508">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:04.525196" elapsed="0.010676">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:04.536134" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:04.535919" elapsed="0.000307"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:04.525177" elapsed="0.011083">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:04.536804" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:04.536999" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:04.536944" elapsed="0.000113"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:04.536920" elapsed="0.000168"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:04.537283" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:04.537384" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:04.517828" elapsed="0.019720">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:04.537674" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:04.513002" elapsed="0.024806">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:04.538119" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:04.537920" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:04.537897" elapsed="0.000335"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:04.538501" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:04.538307" elapsed="0.000306"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:04.538286" elapsed="0.000363"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:04.510521" elapsed="0.028240">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:05.541415" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:05.540435" elapsed="0.001046"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:05.555361" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:05.555107" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:05.555824" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:05.555561" 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-08-22T23:28:05.564443" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:05.564598" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:05.564775" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:05.558023" elapsed="0.007164">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:05.555940" elapsed="0.009358">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:05.565557" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:05.565345" elapsed="0.000331"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:05.555920" elapsed="0.009789">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:05.566217" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:05.566405" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:05.566353" elapsed="0.000111"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:05.566330" elapsed="0.000164"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:05.566710" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:05.566810" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:05.546982" elapsed="0.019970">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:05.567049" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:05.541994" elapsed="0.025183">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:05.567482" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:05.567286" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:05.567263" elapsed="0.000352"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:05.567891" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:05.567691" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:05.567669" elapsed="0.000333"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:05.539477" elapsed="0.028633">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:06.571126" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:06.570134" elapsed="0.001065"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:06.582686" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:06.582409" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:06.583133" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:06.582886" 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-08-22T23:28:06.593082" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:06.593283" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:06.593516" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:06.585535" elapsed="0.008559">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:06.583255" elapsed="0.010955">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:06.594474" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:06.594259" elapsed="0.000307"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:06.583233" elapsed="0.011390">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:06.595150" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:06.595340" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:06.595286" elapsed="0.000115"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:06.595263" elapsed="0.000168"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:06.595651" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:06.595752" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:06.576131" elapsed="0.019766">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:06.595994" elapsed="0.000020"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:06.571764" elapsed="0.024360">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:06.596431" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:06.596232" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:06.596209" elapsed="0.000332"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:06.596837" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:06.596637" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:06.596614" elapsed="0.000331"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:06.569016" elapsed="0.028036">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:07.600157" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:07.599155" elapsed="0.001075"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:07.611398" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:07.611141" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:07.611858" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:07.611612" 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-08-22T23:28:07.622202" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:07.622404" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:07.622678" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:07.614232" elapsed="0.008963">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:07.611979" elapsed="0.011329">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:07.623598" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:07.623355" elapsed="0.000339"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:07.611958" elapsed="0.011769">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:07.624244" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:07.624433" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:07.624380" elapsed="0.000113"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:07.624356" elapsed="0.000166"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:07.624741" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:07.624840" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:07.605057" elapsed="0.019927">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:07.625081" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:07.600752" elapsed="0.024460">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:07.625522" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:07.625322" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:07.625299" elapsed="0.000357"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:07.625923" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:07.625730" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:07.625709" elapsed="0.000324"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:07.598007" elapsed="0.028134">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:08.629269" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:08.628212" elapsed="0.001136"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:08.640589" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:08.640313" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:08.641041" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:08.640796" 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-08-22T23:28:08.651487" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:08.651663" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:08.651838" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:08.643485" elapsed="0.008857">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:08.641167" elapsed="0.011288">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:08.652742" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:08.652504" elapsed="0.000333"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:08.641143" elapsed="0.011728">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:08.653392" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:08.653604" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:08.653527" elapsed="0.000141"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:08.653503" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:08.653897" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:08.653995" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:08.634190" elapsed="0.019949">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:08.654235" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:08.629904" elapsed="0.024462">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:08.654696" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:08.654475" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:08.654452" elapsed="0.000357"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:08.655077" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:08.654883" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:08.654862" elapsed="0.000324"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:08.627027" elapsed="0.028283">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:09.658542" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:09.657519" elapsed="0.001127"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:09.669563" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:09.669298" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:09.670038" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:09.669782" 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-08-22T23:28:09.680974" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:09.681293" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:09.681690" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:09.672498" elapsed="0.010074">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:09.670172" elapsed="0.012618">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:09.683232" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:09.682870" elapsed="0.000506"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:09.670143" elapsed="0.013287">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:09.684427" elapsed="0.000061"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:09.684774" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:09.684683" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:09.684642" 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-08-22T23:28:09.685125" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:09.685227" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:09.664955" elapsed="0.020434">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:09.685491" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:09.659142" elapsed="0.026509">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:09.685985" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:09.685767" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:09.685743" elapsed="0.000359"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:09.686384" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:09.686179" elapsed="0.000285"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:09.686157" elapsed="0.000342"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:09.656289" elapsed="0.030341">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:10.689932" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:10.688872" elapsed="0.001142"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:10.701522" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:10.701210" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:10.702011" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:10.701755" 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-08-22T23:28:10.712453" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:10.712719" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:10.713005" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:10.704462" elapsed="0.009490">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:10.702145" elapsed="0.012001">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:10.714648" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:10.714228" elapsed="0.000569"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:10.702117" elapsed="0.012734">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:10.715772" elapsed="0.000061"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:10.716084" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:10.715995" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:10.715955" 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-08-22T23:28:10.716608" elapsed="0.000077"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:10.716797" elapsed="0.000035"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:10.696450" elapsed="0.020589">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:10.717190" elapsed="0.000036"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:10.690522" elapsed="0.026878">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:10.717928" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:10.717572" elapsed="0.000482"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:10.717536" elapsed="0.000571"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:10.718531" elapsed="0.000070"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:10.718224" elapsed="0.000458"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:10.718190" elapsed="0.000545"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:10.687573" elapsed="0.031333">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:11.722112" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:11.721025" elapsed="0.001161"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:11.733978" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:11.733715" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:11.734426" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:11.734178" 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-08-22T23:28:11.744647" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:11.744842" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:11.745063" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:11.736965" elapsed="0.008637">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:11.734557" elapsed="0.011139">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:11.745893" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:11.745735" elapsed="0.000228"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:11.734531" elapsed="0.011469">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:11.746530" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:11.746748" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:11.746691" elapsed="0.000121"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:11.746665" elapsed="0.000176"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:11.747042" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:11.747138" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:11.728359" elapsed="0.018928">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:11.747382" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:11.722716" elapsed="0.024796">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:11.747842" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:11.747644" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:11.747619" elapsed="0.000333"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:11.748218" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:11.748025" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:11.748004" elapsed="0.000322"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:11.719891" elapsed="0.028542">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:12.751613" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:12.750557" elapsed="0.001135"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:12.763321" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:12.763030" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:12.763851" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:12.763594" 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-08-22T23:28:12.773937" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:12.774127" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:12.774356" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:12.766356" elapsed="0.008434">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:12.763986" elapsed="0.010892">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:12.775133" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:12.774917" elapsed="0.000313"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:12.763957" elapsed="0.011309">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:12.775857" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:12.776064" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:12.776003" elapsed="0.000129"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:12.775978" elapsed="0.000185"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:12.776375" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:12.776477" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:12.757988" elapsed="0.018675">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:12.776765" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:12.752192" elapsed="0.024711">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:12.777229" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:12.777016" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:12.776993" elapsed="0.000353"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:12.777652" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:12.777424" elapsed="0.000310"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:12.777401" elapsed="0.000367"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:12.749320" elapsed="0.028606">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:13.781221" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:13.780180" elapsed="0.001119"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:13.792000" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:13.791738" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:13.792456" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:13.792202" 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-08-22T23:28:13.801898" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:13.802090" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:13.802295" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:13.794959" elapsed="0.007775">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:13.792610" elapsed="0.010220">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:13.803026" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:13.802868" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:13.792559" elapsed="0.010558">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:13.803502" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:13.803662" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:13.803618" elapsed="0.000093"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:13.803599" 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-08-22T23:28:13.803878" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:13.803949" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:13.787345" elapsed="0.016715">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:13.804130" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:13.781834" elapsed="0.022391">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:13.804447" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:13.804304" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:13.804287" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:13.804739" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:13.804596" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:13.804566" elapsed="0.000253"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:13.778974" elapsed="0.025924">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:14.807949" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:14.806952" elapsed="0.001074"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:14.820943" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:14.820562" elapsed="0.000469"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:14.821613" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:14.821244" elapsed="0.000437"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:28:14.832290" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:14.832501" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:14.832775" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:14.824461" elapsed="0.008869">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:14.821787" elapsed="0.011662">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:14.833751" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:14.833500" elapsed="0.000348"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:14.821756" elapsed="0.012125">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:14.834446" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:14.834663" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:14.834603" elapsed="0.000124"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:14.834560" elapsed="0.000198"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:14.834994" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:14.835097" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:14.814109" elapsed="0.021136">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:14.835343" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:14.808522" elapsed="0.026953">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:14.835808" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:14.835605" elapsed="0.000283"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:14.835562" elapsed="0.000359"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:14.836189" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:14.835996" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:14.835975" elapsed="0.000325"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:14.805786" elapsed="0.030621">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:15.839401" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:15.838383" elapsed="0.001093"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:15.851616" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:15.851337" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:15.852064" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:15.851818" 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-08-22T23:28:15.861859" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:15.862023" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:15.862218" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:15.854471" elapsed="0.008150">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:15.852189" elapsed="0.010517">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:15.862900" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:15.862743" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:15.852165" elapsed="0.010826">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:15.863387" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:15.863526" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:15.863484" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:15.863467" elapsed="0.000147"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:15.863758" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:15.863828" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:15.845570" elapsed="0.018361">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:15.863999" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:15.840003" elapsed="0.024090">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:15.864312" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:15.864171" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:15.864154" elapsed="0.000238"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:15.864596" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:15.864444" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:15.864429" elapsed="0.000247"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:15.837278" elapsed="0.027476">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:16.867948" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:16.866910" elapsed="0.001112"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:16.880479" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:16.880196" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:16.880964" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:16.880715" 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-08-22T23:28:16.890837" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:16.891029" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:16.891268" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:16.883230" elapsed="0.008627">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:16.881088" elapsed="0.010885">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:16.892243" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:16.892023" elapsed="0.000315"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:16.881063" elapsed="0.011309">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:16.892921" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:16.893111" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:16.893057" elapsed="0.000115"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:16.893033" elapsed="0.000169"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:16.893401" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:16.893498" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:16.873553" elapsed="0.020110">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:16.893761" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:16.868542" elapsed="0.025349">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:16.894197" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:16.893999" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:16.893976" elapsed="0.000332"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:16.894577" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:16.894383" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:16.894361" elapsed="0.000348"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:16.865765" elapsed="0.029051">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:17.898068" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:17.896986" elapsed="0.001172"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:17.913116" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:17.912659" elapsed="0.000530"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:17.913634" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:17.913361" 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-08-22T23:28:17.923347" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:17.923616" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:17.923874" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:17.915881" elapsed="0.008559">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:17.913760" elapsed="0.010800">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:17.924860" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:17.924637" elapsed="0.000316"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:17.913735" elapsed="0.011251">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:17.925516" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:17.925732" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:17.925676" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:17.925651" elapsed="0.000172"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:17.926022" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:17.926120" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:17.903443" elapsed="0.022824">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:17.926361" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:17.898793" elapsed="0.027698">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:17.926873" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:17.926621" elapsed="0.000357"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:17.926596" elapsed="0.000416"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:17.927289" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:17.927090" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:17.927067" elapsed="0.000333"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:17.895776" elapsed="0.031732">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:18.929750" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:18.929064" elapsed="0.000740"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:18.939424" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:18.939164" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:18.939985" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:18.939643" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:28:18.949927" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:18.950090" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:18.950276" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:18.942463" elapsed="0.008226">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:18.940117" elapsed="0.010660">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:18.950973" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:18.950815" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:18.940090" elapsed="0.010976">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:18.951450" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:18.951607" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:18.951549" elapsed="0.000106"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:18.951532" elapsed="0.000146"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:18.951822" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:18.951893" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:18.933706" elapsed="0.018294">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:18.952070" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:18.930127" elapsed="0.022040">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:18.952430" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:18.952251" elapsed="0.000238"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:18.952234" elapsed="0.000280"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:18.952779" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:18.952569" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:18.952553" elapsed="0.000317"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:18.928200" elapsed="0.024752">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:19.956010" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:19.955011" elapsed="0.001074"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:19.971046" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:19.970782" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:19.971495" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:19.971249" 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-08-22T23:28:19.981223" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:19.981459" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:19.981717" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:19.973938" elapsed="0.008302">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:19.971635" elapsed="0.010720">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:19.982645" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:19.982405" elapsed="0.000345"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:19.971611" elapsed="0.011174">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:19.983316" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:19.983509" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:19.983454" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:19.983429" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:19.983829" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:19.983931" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:19.962445" elapsed="0.021635">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:19.984180" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:19.956698" elapsed="0.027618">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:19.984667" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:19.984428" elapsed="0.000329"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:19.984404" elapsed="0.000386"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:19.985061" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:19.984866" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:19.984845" elapsed="0.000327"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:19.953863" elapsed="0.031417">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:20.988257" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:20.987273" elapsed="0.001057"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:21.001091" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:21.000814" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:21.001541" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:21.001295" 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-08-22T23:28:21.011247" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:21.011403" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:21.011603" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:21.003957" elapsed="0.008036">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:21.001685" elapsed="0.010392">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:21.012272" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:21.012112" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:21.001660" elapsed="0.010703">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:21.012760" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:21.012915" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:21.012858" elapsed="0.000102"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:21.012841" elapsed="0.000141"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:21.013131" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:21.013202" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:20.994567" elapsed="0.018740">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:21.013377" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:20.988853" elapsed="0.024620">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:21.013714" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:21.013553" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:21.013536" elapsed="0.000258"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:21.013988" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:21.013848" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:21.013832" elapsed="0.000234"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:20.986119" elapsed="0.028024">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:22.016726" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:22.015798" elapsed="0.000995"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:22.029186" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:22.028815" elapsed="0.000437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:22.029832" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:22.029466" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:28:22.041398" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:22.041526" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:22.041689" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:22.033086" elapsed="0.008937">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:22.029992" elapsed="0.012111">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:22.042289" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:22.042136" elapsed="0.000219"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:22.029966" elapsed="0.012412">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:22.042768" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:22.042905" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:22.042866" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:22.042849" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:22.043112" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:22.043182" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:22.022628" elapsed="0.020658">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:22.043355" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:22.017299" elapsed="0.026149">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:22.043683" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:22.043525" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:22.043509" elapsed="0.000255"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:22.043954" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:22.043817" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:22.043801" elapsed="0.000230"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:22.014848" elapsed="0.029261">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:23.047036" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:23.046060" elapsed="0.001048"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:23.058929" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:23.058670" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:23.059376" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:23.059131" 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-08-22T23:28:23.069050" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:23.069216" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:23.069514" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:23.061799" elapsed="0.008293">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:23.059501" elapsed="0.010716">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:23.070502" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:23.070269" elapsed="0.000374"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:23.059478" elapsed="0.011204">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:23.071244" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:23.071455" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:23.071393" elapsed="0.000129"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:23.071366" elapsed="0.000189"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:23.071809" elapsed="0.000035"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:23.071921" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:23.052303" elapsed="0.019778">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:23.072187" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:23.047618" elapsed="0.024710">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:23.072686" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:23.072448" elapsed="0.000343"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:23.072424" elapsed="0.000409"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:23.073129" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:23.072916" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:23.072893" elapsed="0.000356"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:23.044942" elapsed="0.028445">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:24.076408" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:24.075360" elapsed="0.001122"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:24.087266" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:24.087005" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:24.087731" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:24.087465" 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-08-22T23:28:24.098097" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:24.098266" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:24.098449" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:24.090167" elapsed="0.008695">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:24.087855" elapsed="0.011090">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:24.099136" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:24.098982" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:24.087831" elapsed="0.011395">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:24.099657" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:24.099798" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:24.099758" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:24.099741" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:24.100008" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:24.100080" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:24.081068" elapsed="0.019116">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:24.100253" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:24.077002" elapsed="0.023345">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:24.100614" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:24.100443" elapsed="0.000236"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:24.100420" elapsed="0.000283"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:24.100896" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:24.100756" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:24.100741" elapsed="0.000233"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:24.074257" elapsed="0.026795">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:25.104152" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:25.103105" elapsed="0.001125"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:25.115594" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:25.115210" elapsed="0.000457"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:25.116223" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:25.115879" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:28:25.126926" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:25.127087" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:25.127273" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:25.119239" elapsed="0.008563">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:25.116387" elapsed="0.011531">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:25.128191" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:25.127968" elapsed="0.000315"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:25.116357" elapsed="0.011960">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:25.128883" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:25.129077" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:25.129021" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:25.128997" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:25.129367" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:25.129466" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:25.109102" elapsed="0.020529">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:25.129763" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:25.104797" elapsed="0.025101">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:25.130209" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:25.130007" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:25.129984" elapsed="0.000338"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:25.130613" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:25.130397" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:25.130375" elapsed="0.000350"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:25.101926" elapsed="0.028906">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:26.133910" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:26.132823" elapsed="0.001168"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:26.148657" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:26.148377" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:26.149103" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:26.148857" 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-08-22T23:28:26.158958" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:26.159117" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:26.159287" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:26.151503" elapsed="0.008196">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:26.149225" elapsed="0.010556">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:26.159977" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:26.159818" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:26.149202" elapsed="0.010866">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:26.160450" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:26.160604" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:26.160547" elapsed="0.000103"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:26.160530" elapsed="0.000142"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:26.160816" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:26.160887" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:26.140535" elapsed="0.020457">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:26.161062" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:26.134523" elapsed="0.026633">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:26.161377" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:26.161234" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:26.161218" elapsed="0.000244"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:26.161678" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:26.161515" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:26.161500" elapsed="0.000258"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:26.131723" elapsed="0.030112">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:27.165225" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:27.164205" elapsed="0.001092"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:27.176633" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:27.176198" elapsed="0.000508"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:27.177271" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:27.176920" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:28:27.188305" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:27.188514" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:27.188799" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:27.180145" elapsed="0.009206">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:27.177465" elapsed="0.012010">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:27.189798" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:27.189529" elapsed="0.000368"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:27.177428" elapsed="0.012505">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:27.190536" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:27.190763" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:27.190703" elapsed="0.000123"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:27.190677" elapsed="0.000181"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:27.191073" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:27.191177" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:27.169961" elapsed="0.021373">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:27.191440" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:27.165857" elapsed="0.025739">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:27.191929" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:27.191715" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:27.191691" elapsed="0.000356"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:27.192336" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:27.192127" elapsed="0.000289"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:27.192104" elapsed="0.000346"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:27.163097" elapsed="0.029467">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:28.195809" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:28.194740" elapsed="0.001148"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:28.207466" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:28.207168" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:28.207942" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:28.207693" 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-08-22T23:28:28.218645" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:28.218823" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:28.219009" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:28.210389" elapsed="0.009046">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:28.208069" elapsed="0.011450">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:28.219742" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:28.219557" elapsed="0.000252"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:28.208043" elapsed="0.011791">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:28.220243" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:28.220386" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:28.220344" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:28.220326" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:28.220617" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:28.220691" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:28.201037" elapsed="0.019763">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:28.220870" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:28.196416" elapsed="0.024550">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:28.221192" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:28.221046" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:28.221030" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:28.221467" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:28.221325" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:28.221310" elapsed="0.000236"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:28.193502" elapsed="0.028138">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:29.224655" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:29.223686" elapsed="0.001042"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:29.236142" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:29.235745" elapsed="0.000466"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:29.236805" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:29.236428" 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-08-22T23:28:29.247522" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:29.247750" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:29.247977" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:29.239493" elapsed="0.008994">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:29.236969" elapsed="0.011654">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:29.248900" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:29.248685" elapsed="0.000307"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:29.236940" elapsed="0.012085">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:29.249544" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:29.249756" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:29.249702" elapsed="0.000114"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:29.249677" elapsed="0.000170"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:29.250045" elapsed="0.000038"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:29.250176" elapsed="0.000049"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:29.229279" elapsed="0.021076">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:29.250453" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:29.225241" elapsed="0.025363">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:29.250918" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:29.250717" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:29.250693" elapsed="0.000338"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:29.251299" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:29.251106" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:29.251084" elapsed="0.000326"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:29.222551" elapsed="0.028971">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:30.255141" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:30.254020" elapsed="0.001214"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:30.271689" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:30.271408" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:30.272141" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:30.271893" 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-08-22T23:28:30.282065" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:30.282293" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:30.282504" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:30.274422" elapsed="0.008549">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:30.272273" elapsed="0.010795">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:30.283289" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:30.283112" elapsed="0.000247"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:30.272244" elapsed="0.011140">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:30.283797" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:30.283944" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:30.283900" elapsed="0.000092"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:30.283882" elapsed="0.000132"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:30.284161" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:30.284233" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:30.261711" elapsed="0.022634">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:30.284415" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:30.255779" elapsed="0.028735">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:30.284761" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:30.284612" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:30.284594" elapsed="0.000250"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:30.285050" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:30.284899" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:30.284883" elapsed="0.000248"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:30.252696" elapsed="0.032514">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:31.288358" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:31.287336" elapsed="0.001096"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:31.300419" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:31.300151" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:31.300887" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:31.300638" 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-08-22T23:28:31.310783" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:31.310955" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:31.311152" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:31.303362" elapsed="0.008196">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:31.301015" elapsed="0.010648">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:31.311868" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:31.311701" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:31.300989" elapsed="0.010974">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:31.312357" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:31.312516" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:31.312470" elapsed="0.000093"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:31.312445" 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-08-22T23:28:31.312752" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:31.312825" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:31.295731" elapsed="0.017204">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:31.313006" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:31.288965" elapsed="0.024136">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:31.313328" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:31.313182" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:31.313165" elapsed="0.000244"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:31.313618" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:31.313463" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:31.313448" elapsed="0.000251"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:31.286158" elapsed="0.027620">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:32.317028" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:32.315956" elapsed="0.001150"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:32.329187" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:32.328880" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:32.329704" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:32.329419" 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-08-22T23:28:32.339713" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:32.339923" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:32.340133" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:32.332275" elapsed="0.008277">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:32.329857" elapsed="0.010800">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:32.340870" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:32.340696" elapsed="0.000246"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:32.329825" elapsed="0.011142">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:32.341379" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:32.341525" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:32.341483" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:32.341465" elapsed="0.000147"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:32.341760" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:32.341836" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:32.322149" elapsed="0.019811">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:32.342031" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:32.317651" elapsed="0.024478">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:32.342376" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:32.342211" elapsed="0.000263"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:32.342194" elapsed="0.000308"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:32.342727" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:32.342558" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:32.342542" elapsed="0.000266"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:32.314763" elapsed="0.028126">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:33.346110" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:33.345098" elapsed="0.001089"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:33.358897" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:33.358628" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:33.359348" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:33.359101" 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-08-22T23:28:33.369500" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:33.369687" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:33.369875" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:33.361783" elapsed="0.008486">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:33.359478" elapsed="0.010875">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:33.370597" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:33.370391" elapsed="0.000279"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:33.359453" elapsed="0.011244">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:33.371082" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:33.371221" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:33.371180" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:33.371163" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:33.371428" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:33.371501" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:33.352416" elapsed="0.019208">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:33.371694" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:33.346765" elapsed="0.025022">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:33.372005" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:33.371863" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:33.371847" elapsed="0.000237"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:33.372274" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:33.372137" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:33.372121" elapsed="0.000231"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:33.343922" elapsed="0.028506">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:34.375417" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:34.374370" elapsed="0.001121"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:34.389574" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:34.389315" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:34.390041" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:34.389793" 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-08-22T23:28:34.399919" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:34.400083" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:34.400275" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:34.392568" elapsed="0.008112">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:34.390168" elapsed="0.010595">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:34.400955" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:34.400800" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:34.390144" elapsed="0.010900">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:34.401429" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:34.401573" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:34.401527" elapsed="0.000107"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:34.401510" elapsed="0.000147"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:34.401802" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:34.401872" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:34.381663" elapsed="0.020317">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:34.402050" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:34.376021" elapsed="0.026125">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:34.402369" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:34.402225" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:34.402209" elapsed="0.000258"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:34.402683" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:34.402525" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:34.402507" elapsed="0.000256"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:34.373243" elapsed="0.029599">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:35.405447" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:35.404500" elapsed="0.001014"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:35.416611" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:35.416227" elapsed="0.000455"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:35.417239" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:35.416895" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:28:35.428168" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:35.428318" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:35.428483" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:35.420357" elapsed="0.008664">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:35.417402" elapsed="0.011733">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:35.429398" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:35.429183" elapsed="0.000308"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:35.417375" elapsed="0.012149">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:35.430233" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:35.430423" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:35.430370" elapsed="0.000133"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:35.430345" elapsed="0.000188"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:35.430755" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:35.430854" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:35.410119" elapsed="0.020971">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:35.431188" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:35.406028" elapsed="0.025291">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:35.431649" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:35.431429" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:35.431406" elapsed="0.000355"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:35.432027" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:35.431836" elapsed="0.000268"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:35.431814" elapsed="0.000322"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:35.403511" elapsed="0.028732">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:36.435362" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:36.434298" elapsed="0.001138"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:36.447591" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:36.447318" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:36.448043" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:36.447797" 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-08-22T23:28:36.458129" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:36.458437" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:36.458838" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:36.450453" elapsed="0.009202">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:36.448168" elapsed="0.011674">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:36.460268" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:36.459921" elapsed="0.000495"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:36.448144" elapsed="0.012324">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:36.461331" elapsed="0.000056"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:36.461665" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:36.461548" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:36.461510" 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-08-22T23:28:36.462133" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:36.462288" elapsed="0.000032"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:36.441664" elapsed="0.020893">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:36.462749" elapsed="0.000036"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:36.436030" elapsed="0.026934">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:36.463457" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:36.463141" elapsed="0.000487"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:36.463104" elapsed="0.000591"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:36.464150" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:36.463837" elapsed="0.000438"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:36.463797" elapsed="0.000530"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:36.433169" elapsed="0.031332">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:37.467764" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:37.466726" elapsed="0.001115"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:37.479595" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:37.479216" elapsed="0.000451"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:37.480226" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:37.479881" 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-08-22T23:28:37.490659" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:37.490829" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:37.491022" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:37.483618" elapsed="0.007833">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:37.480400" elapsed="0.011138">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:37.491861" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:37.491601" elapsed="0.000353"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:37.480368" elapsed="0.011620">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:37.492515" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:37.492739" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:37.492682" elapsed="0.000123"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:37.492657" elapsed="0.000179"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:37.493037" elapsed="0.000035"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:37.493145" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:37.473132" elapsed="0.020161">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:37.493390" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:37.468346" elapsed="0.025177">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:37.493855" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:37.493655" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:37.493632" elapsed="0.000335"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:37.494234" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:37.494041" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:37.494019" elapsed="0.000324"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:37.465481" elapsed="0.028983">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:38.497606" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:38.496560" elapsed="0.001124"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:38.514513" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:38.513905" elapsed="0.000761"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:38.515565" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:38.515023" elapsed="0.000682"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:28:38.525324" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:38.525499" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:38.525755" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:38.518116" elapsed="0.008171">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:38.515796" elapsed="0.010608">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:38.526724" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:38.526477" elapsed="0.000341"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:38.515768" elapsed="0.011084">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:38.527373" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:38.527566" elapsed="0.000044"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:38.527509" elapsed="0.000144"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:38.527484" elapsed="0.000200"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:38.527885" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:38.527981" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:38.503933" elapsed="0.024196">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:38.528223" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:38.498179" elapsed="0.030174">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:38.528681" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:38.528460" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:38.528438" elapsed="0.000354"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:38.529092" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:38.528865" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:38.528844" elapsed="0.000357"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:38.495343" elapsed="0.033964">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:39.531922" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:39.530949" elapsed="0.001039"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:39.544189" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:39.543835" elapsed="0.000420"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:39.544844" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:39.544466" elapsed="0.000441"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:28:39.554020" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:39.554156" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:39.554309" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:39.547769" elapsed="0.006948">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:39.545001" elapsed="0.009832">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:39.555095" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:39.554881" elapsed="0.000305"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:39.544975" elapsed="0.010244">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:39.555747" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:39.555933" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:39.555882" elapsed="0.000108"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:39.555858" elapsed="0.000161"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:39.556222" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:39.556318" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:39.537777" elapsed="0.018684">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:39.556555" elapsed="0.000040"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:39.532461" elapsed="0.024246">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:39.557012" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:39.556815" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:39.556792" elapsed="0.000328"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:39.557382" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:39.557192" elapsed="0.000265"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:39.557171" elapsed="0.000318"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:39.529970" elapsed="0.027644">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:40.560385" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:40.559417" elapsed="0.001038"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:40.571523" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:40.571173" elapsed="0.000436"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:40.572160" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:40.571821" 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-08-22T23:28:40.581845" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:40.581995" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:40.582163" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:40.575314" elapsed="0.007250">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:40.572320" elapsed="0.010349">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:40.582941" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:40.582725" elapsed="0.000307"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:40.572292" elapsed="0.010773">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:40.583600" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:40.583790" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:40.583737" elapsed="0.000113"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:40.583713" elapsed="0.000166"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:40.584075" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:40.584170" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:40.565145" elapsed="0.019171">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:40.584410" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:40.560973" elapsed="0.023567">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:40.584865" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:40.584669" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:40.584646" elapsed="0.000327"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:40.585236" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:40.585046" elapsed="0.000266"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:40.585025" elapsed="0.000318"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:40.558366" elapsed="0.027083">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:41.588712" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:41.587640" elapsed="0.001150"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:41.600403" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:41.600005" elapsed="0.000468"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:41.601071" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:41.600715" 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-08-22T23:28:41.611675" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:41.611909" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:41.612153" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:41.603885" elapsed="0.008831">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:41.601246" elapsed="0.011590">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:41.613104" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:41.612887" elapsed="0.000307"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:41.601211" elapsed="0.012016">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:41.613768" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:41.613960" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:41.613904" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:41.613880" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:41.614248" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:41.614370" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:41.593570" elapsed="0.020949">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:41.614636" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:41.589314" elapsed="0.025456">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:41.615078" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:41.614879" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:41.614856" elapsed="0.000332"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:41.615453" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:41.615261" elapsed="0.000268"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:41.615240" elapsed="0.000322"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:41.586370" elapsed="0.029319">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:42.618858" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:42.617826" elapsed="0.001116"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:42.632825" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:42.632545" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:42.633278" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:42.633029" 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-08-22T23:28:42.643634" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:42.643797" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:42.643984" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:42.635493" elapsed="0.008873">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:42.633399" elapsed="0.011048">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:42.644659" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:42.644482" elapsed="0.000243"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:42.633377" elapsed="0.011372">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:42.645127" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:42.645264" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:42.645224" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:42.645207" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:42.645470" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:42.645540" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:42.625019" elapsed="0.020651">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:42.645743" elapsed="0.000018"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:42.619457" elapsed="0.026382">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:42.646058" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:42.645916" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:42.645900" elapsed="0.000237"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:42.646362" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:42.646190" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:42.646174" elapsed="0.000269"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:42.616690" elapsed="0.029830">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:43.649256" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:43.648244" elapsed="0.001081"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:43.660341" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:43.659986" elapsed="0.000422"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:43.660994" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:43.660646" 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-08-22T23:28:43.671663" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:43.671872" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:43.672080" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:43.663978" elapsed="0.008591">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:43.661156" elapsed="0.011550">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:43.672969" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:43.672755" elapsed="0.000307"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:43.661128" elapsed="0.011967">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:43.673634" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:43.673851" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:43.673786" elapsed="0.000135"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:43.673756" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:43.674149" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:43.674268" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:43.653741" elapsed="0.020673">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:43.674511" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:43.649859" elapsed="0.024802">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:43.674975" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:43.674771" elapsed="0.000282"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:43.674748" elapsed="0.000339"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:43.675356" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:43.675162" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:43.675140" elapsed="0.000327"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:43.647240" elapsed="0.028333">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:44.678523" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:44.677491" elapsed="0.001134"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:44.690537" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:44.690272" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:44.691011" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:44.690757" 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-08-22T23:28:44.701287" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:44.701543" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:44.701887" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:44.693410" elapsed="0.008896">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:44.691136" elapsed="0.011254">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:44.702596" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:44.702426" elapsed="0.000238"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:44.691114" elapsed="0.011575">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:44.703075" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:44.703212" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:44.703171" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:44.703155" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:44.703421" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:44.703493" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:44.684657" elapsed="0.018953">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:44.703681" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:44.679122" elapsed="0.024653">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:44.703998" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:44.703854" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:44.703837" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:44.704270" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:44.704132" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:44.704116" elapsed="0.000233"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:44.676416" elapsed="0.028011">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:45.707199" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:45.706233" elapsed="0.001035"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:45.718940" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:45.718563" elapsed="0.000445"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:45.719566" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:45.719220" 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-08-22T23:28:45.730945" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:45.731383" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:45.731749" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:45.722937" elapsed="0.009579">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:45.719754" elapsed="0.012976">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:45.733156" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:45.732809" elapsed="0.000497"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:45.719726" elapsed="0.013635">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:45.734256" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:45.734567" elapsed="0.000062"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:45.734479" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:45.734439" 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-08-22T23:28:45.735071" elapsed="0.000049"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:45.735232" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:45.712424" elapsed="0.023040">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:45.735653" elapsed="0.000036"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:45.707786" elapsed="0.028082">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:45.736365" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:45.736045" elapsed="0.000446"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:45.736009" elapsed="0.000535"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:45.737010" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:45.736698" elapsed="0.000437"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:45.736662" elapsed="0.000526"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:45.705175" elapsed="0.032185">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:46.740657" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:46.739672" elapsed="0.001061"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:46.751816" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:46.751431" elapsed="0.000453"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:46.752446" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:46.752100" 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-08-22T23:28:46.763065" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:46.763223" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:46.763402" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:46.755541" elapsed="0.008268">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:46.752639" elapsed="0.011253">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:46.764083" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:46.763928" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:46.752609" elapsed="0.011565">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:46.764549" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:46.764705" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:46.764664" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:46.764646" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:46.764919" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:46.764989" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:46.745335" elapsed="0.019759">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:46.765164" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:46.741226" elapsed="0.024031">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:46.765480" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:46.765336" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:46.765320" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:46.765771" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:46.765630" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:46.765613" elapsed="0.000236"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:46.738551" elapsed="0.027376">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:47.769077" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:47.768004" elapsed="0.001148"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:47.780727" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:47.780337" elapsed="0.000469"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:47.781366" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:47.781020" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:28:47.791447" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:47.791636" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:47.791840" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:47.784384" elapsed="0.008026">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:47.781539" elapsed="0.010987">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:47.792821" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:47.792598" elapsed="0.000323"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:47.781506" elapsed="0.011449">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:47.793486" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:47.793705" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:47.793648" elapsed="0.000135"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:47.793621" elapsed="0.000197"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:47.794052" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:47.794156" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:47.773793" elapsed="0.020511">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:47.794404" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:47.769693" elapsed="0.024844">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:47.794891" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:47.794675" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:47.794651" elapsed="0.000355"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:47.795281" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:47.795084" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:47.795061" elapsed="0.000333"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:47.766827" elapsed="0.028678">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:48.798558" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:48.797533" elapsed="0.001130"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:48.810656" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:48.810382" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:48.811105" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:48.810857" 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-08-22T23:28:48.821072" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:48.821232" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:48.821419" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:48.813513" elapsed="0.008312">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:48.811227" elapsed="0.010699">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:48.822119" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:48.821962" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:48.811205" elapsed="0.011006">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:48.822608" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:48.822748" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:48.822708" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:48.822691" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:48.822959" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:48.823029" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:48.804742" elapsed="0.018390">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:48.823200" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:48.799156" elapsed="0.024138">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:48.823514" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:48.823373" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:48.823356" elapsed="0.000252"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:48.823801" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:48.823662" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:48.823647" elapsed="0.000232"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:48.796401" elapsed="0.027557">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<msg time="2026-08-22T23:28:48.824054" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:27:48.028443" elapsed="60.795705">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${node3_session}</arg>
<arg>${empty_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:48.824335" elapsed="0.000021"/>
</kw>
<doc>Check if there really is no data present on none of the nodes</doc>
<status status="FAIL" start="2026-08-22T23:27:47.624573" elapsed="61.199933">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</test>
<test id="s1-s4-t6" name="Create_Device_Data" 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-08-22T23:28:48.828372" elapsed="0.000319"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:28:48.828006" elapsed="0.000764"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:28:48.830242" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:48.830085" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:48.830058" elapsed="0.000281"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:28:48.837444" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:48.837335" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:48.837316" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:28:48.838532" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:28:48.838148" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:28:48.839046" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:28:48.838736" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:28:48.839119" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:28:48.839279" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:28:48.837755" 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-08-22T23:28:48.844786" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:48.844678" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:48.844660" 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-08-22T23:28:48.846060" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:48.845950" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:48.845932" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:28:48.846600" level="INFO">${karaf_connection_index} = 25</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:28:48.846275" elapsed="0.000354"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:28:48.847014" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:28:48.846791" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:28:48.897412" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:28:48.847532" elapsed="0.049994"/>
</kw>
<msg time="2026-08-22T23:28:48.897715" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:28:48.897761" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:28:48.847200" elapsed="0.050598"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:28:48.923475" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:28:48.898339" elapsed="0.025267"/>
</kw>
<msg time="2026-08-22T23:28:48.923780" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:28:48.923826" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m             ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:28:48.897997" elapsed="0.025866"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:48.924208" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:48.923948" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:48.923925" elapsed="0.000366"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:48.924765" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:48.924435" 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-08-22T23:28:48.925107" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:48.924895" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:48.924876" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:28:48.925221" 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-08-22T23:28:48.928088" elapsed="0.000377"/>
</kw>
<msg time="2026-08-22T23:28:48.928530" 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-08-22T23:28:48.926808" elapsed="0.001879"/>
</kw>
<kw name="Open 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-08-22T23:28:48.928961" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:48.929292" 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-08-22T23:28:48.926095" elapsed="0.003382"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:28:48.925511" 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-08-22T23:28:48.845617" elapsed="0.084045"/>
</kw>
<msg time="2026-08-22T23:28:48.929756" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:28:48.929801" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m             ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:28:48.845003" elapsed="0.084836"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:28:48.930062" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:28:48.929953" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:48.929934" 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-08-22T23:28:48.930543" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:48.930993" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:28:48.931066" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:28:48.844326" elapsed="0.086849"/>
</kw>
<msg time="2026-08-22T23:28:48.931268" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:28:48.931312" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m             ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:28:48.839697" elapsed="0.091653"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:48.931688" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:48.931425" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:48.931408" elapsed="0.000359"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:28:48.839538" elapsed="0.092253"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:28:48.937174" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:48.937066" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:48.937047" 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-08-22T23:28:48.938394" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:48.938287" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:48.938269" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:28:48.938923" level="INFO">${karaf_connection_index} = 26</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:28:48.938623" elapsed="0.000326"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:28:48.939314" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:28:48.939103" elapsed="0.000237"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:28:48.976855" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:28:48.939850" elapsed="0.037114"/>
</kw>
<msg time="2026-08-22T23:28:48.977140" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:28:48.977186" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:28:48.939497" elapsed="0.037726"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:28:48.994648" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:28:48.977809" elapsed="0.016937"/>
</kw>
<msg time="2026-08-22T23:28:48.994912" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:28:48.994957" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m             ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:28:48.977391" elapsed="0.017604"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:48.995290" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:48.995071" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:48.995052" elapsed="0.000317"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:48.995829" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:48.995509" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:48.996168" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:48.995957" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:48.995939" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:28:48.996279" 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-08-22T23:28:48.998774" elapsed="0.000146"/>
</kw>
<msg time="2026-08-22T23:28:48.998980" 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-08-22T23:28:48.997708" 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-08-22T23:28:48.999545" elapsed="0.000099"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:48.999903" 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-08-22T23:28:48.997072" 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-08-22T23:28:48.996533" 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-08-22T23:28:48.937987" elapsed="0.062261"/>
</kw>
<msg time="2026-08-22T23:28:49.000339" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:28:49.000383" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m             ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:28:48.937389" elapsed="0.063032"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:28:49.000638" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:28:49.000498" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.000479" 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-08-22T23:28:49.001120" 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-08-22T23:28:49.001451" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:28:49.001523" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:28:48.936726" elapsed="0.064930"/>
</kw>
<msg time="2026-08-22T23:28:49.001751" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:28:49.001795" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m             ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:28:48.932059" elapsed="0.069774"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.002186" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:49.001940" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.001922" elapsed="0.000341"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:28:48.931920" elapsed="0.070366"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:28:49.007787" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:49.007679" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.007660" 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-08-22T23:28:49.009021" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:49.008915" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.008897" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:28:49.009519" level="INFO">${karaf_connection_index} = 27</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:28:49.009227" elapsed="0.000318"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:28:49.009966" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:28:49.009717" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:28:49.060911" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:28:49.010483" elapsed="0.050530"/>
</kw>
<msg time="2026-08-22T23:28:49.061191" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:28:49.061238" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:28:49.010148" elapsed="0.051127"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:28:49.081369" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:28:49.061806" elapsed="0.019663"/>
</kw>
<msg time="2026-08-22T23:28:49.081649" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:28:49.081696" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m             ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:28:49.061442" elapsed="0.020292"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.082050" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:49.081811" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.081791" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.082567" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:49.082272" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.082926" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:49.082714" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.082695" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:28:49.083036" 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-08-22T23:28:49.085490" elapsed="0.000166"/>
</kw>
<msg time="2026-08-22T23:28:49.085716" 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-08-22T23:28:49.084439" 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-08-22T23:28:49.086145" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.086471" 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-08-22T23:28:49.083830" elapsed="0.002844"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:28:49.083285" elapsed="0.003459"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:28:49.008611" elapsed="0.078231"/>
</kw>
<msg time="2026-08-22T23:28:49.086933" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:28:49.086978" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m             ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:28:49.008010" elapsed="0.079005"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:28:49.087232" elapsed="0.000189"/>
</return>
<status status="PASS" start="2026-08-22T23:28:49.087124" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.087105" elapsed="0.000376"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.087897" 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-08-22T23:28:49.088227" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:28:49.088298" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:28:49.007325" elapsed="0.081082"/>
</kw>
<msg time="2026-08-22T23:28:49.088500" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:28:49.088543" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m             ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:28:49.002679" elapsed="0.086007"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.089021" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:49.088765" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.088748" elapsed="0.000351"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:28:49.002408" elapsed="0.086714"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:28:48.839361" elapsed="0.249791"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:28:48.836966" elapsed="0.252243"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:28:48.829665" elapsed="0.259603"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:28:48.828980" elapsed="0.260335"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:28:48.825451" elapsed="0.263920"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.090022" level="INFO">${template_as_string} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${template_as_string}</var>
<arg>DEVICE_NAME=${device_name}</arg>
<arg>RESTCONF_ROOT=${RESTCONF_ROOT}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:28:49.089546" elapsed="0.000503"/>
</kw>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.123710" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:49.123313" elapsed="0.000427"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:28:49.124524" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:28:49.124236" elapsed="0.000386">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:28:49.124719" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:28:49.123906" elapsed="0.000837"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.125287" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:28:49.124905" elapsed="0.000409"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:28:49.125629" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:28:49.125817" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:28:49.125474" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.126266" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:49.126020" 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-08-22T23:28:49.127358" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:49.127084" elapsed="0.000320"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.127843" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:28:49.127561" elapsed="0.000308"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.128719" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:28:49.128227" elapsed="0.000518"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:28:49.129483" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:28:49.129256" elapsed="0.000253"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:28:49.129561" elapsed="0.000046"/>
</return>
<msg time="2026-08-22T23:28:49.129734" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:28:49.128933" elapsed="0.000826"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:28:49.129926" elapsed="0.000245"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:28:49.128095" elapsed="0.002118"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.130778" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:28:49.130462" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:28:49.131519" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:28:49.131303" elapsed="0.000242"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:28:49.131610" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:28:49.131762" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:28:49.130987" elapsed="0.000800"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:28:49.131996" elapsed="0.000226"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:28:49.130332" elapsed="0.001930"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:28:49.127919" elapsed="0.004379"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:28:49.132342" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:28:49.132500" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:28:49.126703" elapsed="0.005824"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:49.126380" elapsed="0.006178"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.132748" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:49.132599" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.126360" elapsed="0.006464"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.133541" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:28:49.132966" elapsed="0.000603"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:28:49.133635" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:28:49.122689" elapsed="0.011071"/>
</kw>
<msg time="2026-08-22T23:28:49.133814" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:28:49.110151" elapsed="0.023744"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.146197" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.158454" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.170870" 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-08-22T23:28:49.171062" 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-08-22T23:28:49.171233" 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-08-22T23:28:49.171609" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:49.171453" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:49.171438" 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-08-22T23:28:49.171829" 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-08-22T23:28:49.171993" 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-08-22T23:28:49.172153" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:28:49.171410" elapsed="0.000795"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:28:49.171308" elapsed="0.000923"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.172374" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:49.172449" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:28:49.172569" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:28:49.105896" elapsed="0.066714"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.199053" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:49.198679" elapsed="0.000402"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:28:49.199800" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:28:49.199567" elapsed="0.000297">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:28:49.199956" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:28:49.199239" elapsed="0.000741"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.200516" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:28:49.200138" elapsed="0.000405"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:28:49.200850" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:28:49.200989" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:28:49.200716" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.201451" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:49.201208" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:28:49.201896" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:49.201563" elapsed="0.000393"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.202419" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:49.202127" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:49.201981" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.201545" elapsed="0.000958"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.203101" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:28:49.202665" elapsed="0.000465"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:28:49.203180" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:28:49.198051" elapsed="0.005253"/>
</kw>
<msg time="2026-08-22T23:28:49.203356" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:28:49.185384" elapsed="0.018018"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.215804" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.228157" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.240827" 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-08-22T23:28:49.241022" 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-08-22T23:28:49.241231" 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-08-22T23:28:49.241605" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:49.241450" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:49.241436" 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-08-22T23:28:49.241824" elapsed="0.000050"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.242022" 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-08-22T23:28:49.242181" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:28:49.241408" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:28:49.241305" elapsed="0.000986"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.242439" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:49.242514" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:28:49.242648" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:28:49.184520" elapsed="0.058156"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:28:49.243907" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:28:49.243676" elapsed="0.000294">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:28:49.244062" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:28:49.243327" elapsed="0.000759"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.244398" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:49.244156" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.244956" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:49.244663" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:49.244478" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.244138" elapsed="0.000901"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.247364" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:28:49.245185" elapsed="0.002206"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:28:49.247443" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:28:49.247608" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:28:49.243008" elapsed="0.004627"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.249139" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:49.248892" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.249591" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:49.249335" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.250054" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:49.249789" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.250490" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:49.250248" elapsed="0.000285"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:28:49.251353" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:28:49.251154" elapsed="0.000225"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:28:49.251725" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:28:49.251529" 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-08-22T23:28:49.251897" elapsed="0.000197"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.252493" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:49.252245" elapsed="0.000292"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:28:49.252595" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:28:49.252753" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:28:49.250750" 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-08-22T23:28:49.267519" level="INFO">POST Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Content-Length': '72', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:28:49.267695" level="INFO">POST Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:28:49.267797" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:28:49.255137" elapsed="0.013037">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:49.252848" elapsed="0.015410">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.268446" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:49.268291" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:28:49.252831" elapsed="0.015707">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.268930" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:49.269067" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:49.269030" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:49.269013" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.269272" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:49.269340" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:28:49.247956" elapsed="0.021487">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:49.269523" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:28:49.094785" elapsed="0.174854">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.269948" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:49.269752" elapsed="0.000265"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:49.269736" elapsed="0.000305"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:28:49.270074" elapsed="0.000015"/>
</return>
<arg>${directory_with_template_folders}${/}dataorig</arg>
<arg>${template_as_string}</arg>
<arg>session=${node2_session}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:28:49.090304" elapsed="0.179866">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<doc>Create some data on the device and propagate it throughout the cluster.</doc>
<status status="FAIL" start="2026-08-22T23:28:48.824916" elapsed="0.445450">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</test>
<test id="s1-s4-t7" name="Check_Config_Data_After_Data_Creation" 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-08-22T23:28:49.273727" elapsed="0.000228"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:28:49.273447" 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-08-22T23:28:49.274991" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:49.274881" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.274862" 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-08-22T23:28:49.279993" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:49.279888" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.279870" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.281048" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:28:49.280668" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.281537" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:28:49.281232" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:28:49.281626" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:28:49.281783" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:28:49.280278" 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-08-22T23:28:49.287435" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:49.287324" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.287305" 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-08-22T23:28:49.288697" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:49.288564" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.288546" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:28:49.289206" level="INFO">${karaf_connection_index} = 25</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:28:49.288907" elapsed="0.000325"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:28:49.289626" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:28:49.289388" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:28:49.329487" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:28:49.290170" elapsed="0.039451"/>
</kw>
<msg time="2026-08-22T23:28:49.329811" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:28:49.329884" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:28:49.289810" elapsed="0.040112"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:28:49.355357" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "D "a "t "a "_ "C "r "e "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-08-22T23:28:49.330454" elapsed="0.025005"/>
</kw>
<msg time="2026-08-22T23:28:49.355636" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:28:49.355683" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "D "a "t "a "_ ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:28:49.330101" elapsed="0.025620"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.356027" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:49.355801" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.355779" elapsed="0.000327"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.356547" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "D "a "t "a "_ "C "r "e "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-08-22T23:28:49.356250" elapsed="0.000428"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.356964" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:49.356748" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.356730" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:28:49.357076" 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-08-22T23:28:49.359648" elapsed="0.000148"/>
</kw>
<msg time="2026-08-22T23:28:49.359858" 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-08-22T23:28:49.358549" elapsed="0.001437"/>
</kw>
<kw name="Open 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-08-22T23:28:49.360257" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.360611" 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-08-22T23:28:49.357930" elapsed="0.002865"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:28:49.357348" elapsed="0.003513"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:28:49.288260" elapsed="0.072705"/>
</kw>
<msg time="2026-08-22T23:28:49.361059" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:28:49.361104" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "D "a "t "a "_ ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:28:49.287671" elapsed="0.073471"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:28:49.361325" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:28:49.361218" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.361200" 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-08-22T23:28:49.361851" 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-08-22T23:28:49.362185" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:28:49.362257" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:28:49.286982" elapsed="0.075383"/>
</kw>
<msg time="2026-08-22T23:28:49.362458" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:28:49.362503" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "D "a "t "a "_ ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:28:49.282181" elapsed="0.080360"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.362975" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:49.362726" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.362707" elapsed="0.000346"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:28:49.282044" elapsed="0.081032"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:28:49.368700" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:49.368588" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.368556" 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-08-22T23:28:49.369933" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:49.369802" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.369784" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:28:49.370440" level="INFO">${karaf_connection_index} = 26</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:28:49.370143" elapsed="0.000324"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:28:49.370857" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:28:49.370641" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:28:49.407363" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:28:49.371373" elapsed="0.036128"/>
</kw>
<msg time="2026-08-22T23:28:49.407687" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:28:49.407733" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:28:49.371040" elapsed="0.036731"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:28:49.432255" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "D "a "t "a "_ "C "r "e "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-08-22T23:28:49.408281" elapsed="0.024075"/>
</kw>
<msg time="2026-08-22T23:28:49.432512" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:28:49.432558" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "D "a "t "a "_ ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:28:49.407943" elapsed="0.024694"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.432939" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:49.432715" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.432696" elapsed="0.000322"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.433452" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "D "a "t "a "_ "C "r "e "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-08-22T23:28:49.433157" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.433830" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:49.433603" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.433568" elapsed="0.000343"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:28:49.433944" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<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-08-22T23:28:49.436390" elapsed="0.000145"/>
</kw>
<msg time="2026-08-22T23:28:49.436615" 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-08-22T23:28:49.435348" elapsed="0.001399"/>
</kw>
<kw name="Open 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-08-22T23:28:49.437014" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.437340" 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-08-22T23:28:49.434735" elapsed="0.002787"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:28:49.434193" elapsed="0.003413"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:28:49.369478" elapsed="0.068227"/>
</kw>
<msg time="2026-08-22T23:28:49.437796" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:28:49.437864" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "D "a "t "a "_ ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:28:49.368917" elapsed="0.068985"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:28:49.438085" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:28:49.437980" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.437961" 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-08-22T23:28:49.438548" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.438899" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:28:49.438970" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:28:49.368232" elapsed="0.070846"/>
</kw>
<msg time="2026-08-22T23:28:49.439170" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:28:49.439214" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "D "a "t "a "_ ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:28:49.363335" elapsed="0.075920"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.439722" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:49.439367" elapsed="0.000412"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.439349" elapsed="0.000454"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:28:49.363200" elapsed="0.076627"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:28:49.445422" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:49.445312" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.445293" 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-08-22T23:28:49.446690" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:28:49.446558" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.446540" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:28:49.447196" level="INFO">${karaf_connection_index} = 27</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:28:49.446900" elapsed="0.000323"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:28:49.447609" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:28:49.447377" elapsed="0.000259"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:28:49.491104" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:28:49.448125" elapsed="0.043083"/>
</kw>
<msg time="2026-08-22T23:28:49.491403" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:28:49.491450" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:28:49.447793" elapsed="0.043695"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:28:49.515984" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "D "a "t "a "_ "C "r "e "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-08-22T23:28:49.492018" elapsed="0.024073"/>
</kw>
<msg time="2026-08-22T23:28:49.516250" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:28:49.516296" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "D "a "t "a "_ ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:28:49.491678" elapsed="0.024656"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.516653" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:49.516411" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.516391" elapsed="0.000344"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.517174" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "D "a "t "a "_ "C "r "e "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-08-22T23:28:49.516877" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.517519" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:49.517308" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.517290" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:28:49.517649" 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-08-22T23:28:49.520120" elapsed="0.000147"/>
</kw>
<msg time="2026-08-22T23:28:49.520327" 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-08-22T23:28:49.519080" elapsed="0.001372"/>
</kw>
<kw name="Open 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-08-22T23:28:49.520743" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.521072" 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-08-22T23:28:49.518445" elapsed="0.002808"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:28:49.517921" elapsed="0.003395"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:28:49.446255" elapsed="0.075194"/>
</kw>
<msg time="2026-08-22T23:28:49.521541" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:28:49.521610" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "D "a "t "a "_ ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:28:49.445654" elapsed="0.075996"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:28:49.521861" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-08-22T23:28:49.521727" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.521708" 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-08-22T23:28:49.522342" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.522700" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:28:49.522773" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:28:49.444970" elapsed="0.077911"/>
</kw>
<msg time="2026-08-22T23:28:49.522974" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:28:49.523018" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "D "a "t "a "_ ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:28:49.440085" elapsed="0.082970"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.523376" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:49.523130" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.523113" elapsed="0.000341"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:28:49.439948" elapsed="0.083529"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:28:49.281874" elapsed="0.241632"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:28:49.279514" elapsed="0.244048"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:28:49.274591" elapsed="0.249071"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:28:49.274157" elapsed="0.249550"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:28:49.271297" elapsed="0.252463"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.525369" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:49.524980" elapsed="0.000416"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.532962" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:49.532702" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.533408" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:49.533163" 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-08-22T23:28:49.555940" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:49.556084" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:28:49.556183" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:28:49.535647" elapsed="0.020562"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:49.533520" elapsed="0.022732"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.556483" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:49.556323" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.533502" elapsed="0.023070"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.560069" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:49.557632" elapsed="0.002486"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:49.557397" elapsed="0.002756"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.557378" elapsed="0.002800"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.562806" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:49.560454" elapsed="0.002398"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:49.560236" elapsed="0.002655"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.560218" elapsed="0.002699"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.563476" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:28:49.563085" 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-08-22T23:28:49.563826" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:49.563573" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.564368" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:49.564068" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:49.563908" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.563556" elapsed="0.000896"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.564991" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:28:49.564627" 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-08-22T23:28:49.565317" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:49.565088" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.565897" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:49.565555" elapsed="0.000369"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:49.565398" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.565070" 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-08-22T23:28:49.566128" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:28:49.566953" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:28:49.566658" 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-08-22T23:28:49.567132" elapsed="0.002458"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:28:49.556967" elapsed="0.012689"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:28:49.569849" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-08-22T23:28:49.569726" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:49.569707" 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-08-22T23:28:49.570085" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:49.570156" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:28:49.572499" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:28:49.528287" elapsed="0.044241"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:28:49.572602" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:28:49.572758" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:28:49.525621" elapsed="0.047164"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:28:49.573425" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:28:49.573066" elapsed="0.000481">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:49.572855" elapsed="0.000782">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:28:49.572838" elapsed="0.000835">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:49.573904" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:49.573744" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:49.573727" elapsed="0.000258"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:49.524504" elapsed="0.049563">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:50.577127" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:50.576124" elapsed="0.001078"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:50.588922" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:50.588660" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:50.589372" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:50.589124" 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-08-22T23:28:50.614986" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:50.615317" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:28:50.615572" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:28:50.591621" elapsed="0.024051"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:50.589496" elapsed="0.026288"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:50.616259" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:50.615855" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:50.589472" elapsed="0.026994"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:50.622642" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:50.618758" elapsed="0.003956"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:50.618413" elapsed="0.004349"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:50.618384" elapsed="0.004413"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:50.626393" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:50.623186" elapsed="0.003254"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:50.622877" elapsed="0.003596"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:50.622853" elapsed="0.003645"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:28:50.627113" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:28:50.626697" 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-08-22T23:28:50.627446" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:50.627211" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:50.628005" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:50.627703" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:50.627526" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:50.627193" elapsed="0.000968"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:28:50.628709" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:28:50.628324" 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-08-22T23:28:50.629042" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:50.628806" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:50.629572" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:50.629279" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:50.629123" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:50.628789" 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-08-22T23:28:50.629852" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:28:50.630695" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:28:50.630370" 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-08-22T23:28:50.630876" 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-08-22T23:28:50.617409" elapsed="0.015929"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:28:50.633521" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:28:50.633409" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:50.633391" 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-08-22T23:28:50.633797" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:50.633871" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:28:50.636216" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:28:50.583343" elapsed="0.052902"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:28:50.636306" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:28:50.636458" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:28:50.577755" elapsed="0.058729"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:28:50.637153" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:28:50.636781" elapsed="0.000455">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:50.636554" elapsed="0.000756">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:28:50.636537" elapsed="0.000807">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:50.637560" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:50.637413" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:50.637396" elapsed="0.000262"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:50.574977" elapsed="0.062794">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:51.639397" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:51.638936" elapsed="0.000498"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:51.647245" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:51.646977" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:51.647713" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:51.647446" 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-08-22T23:28:51.671645" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:51.671824" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:28:51.671945" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:28:51.649959" elapsed="0.022014"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:51.647837" elapsed="0.024187"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:51.672239" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:51.672057" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:51.647813" elapsed="0.024520"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:51.676048" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:51.673480" elapsed="0.002619"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:51.673226" elapsed="0.002909"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:51.673205" elapsed="0.002956"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:51.678824" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:51.676437" elapsed="0.002433"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:51.676217" elapsed="0.002688"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:51.676200" elapsed="0.002730"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:28:51.679530" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:28:51.679112" 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-08-22T23:28:51.679883" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:51.679645" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:51.680431" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:51.680131" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:51.679965" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:51.679626" elapsed="0.000891"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:28:51.681058" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:28:51.680689" 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-08-22T23:28:51.681386" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:51.681156" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:51.681972" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:51.681667" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:51.681469" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:51.681138" 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-08-22T23:28:51.682208" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:28:51.683043" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:28:51.682743" 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-08-22T23:28:51.683223" 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-08-22T23:28:51.672756" elapsed="0.012935"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:28:51.685955" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:28:51.685838" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:51.685818" 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-08-22T23:28:51.686204" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:51.686276" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:28:51.688702" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:28:51.642325" elapsed="0.046407"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:28:51.688794" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:28:51.688951" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:28:51.639681" elapsed="0.049302"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:28:51.689661" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:28:51.689265" elapsed="0.000479">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:51.689054" elapsed="0.000782">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:28:51.689037" elapsed="0.000842">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:51.690106" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:51.689959" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:51.689942" elapsed="0.000244"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:51.638333" elapsed="0.051938">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:52.693513" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:52.692468" elapsed="0.001177"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:52.706226" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:52.705928" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:52.706692" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:52.706431" 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-08-22T23:28:52.731001" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:52.731167" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:28:52.731278" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:28:52.708931" elapsed="0.022374"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:52.706816" elapsed="0.024537"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:52.731552" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:52.731384" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:52.706792" elapsed="0.024871"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:52.735287" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:52.732827" elapsed="0.002509"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:52.732591" elapsed="0.002780"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:52.732556" elapsed="0.002841"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:52.737994" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:52.735688" elapsed="0.002353"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:52.735453" elapsed="0.002623"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:52.735437" elapsed="0.002663"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:28:52.738715" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:28:52.738282" 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-08-22T23:28:52.739048" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:52.738813" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:52.739616" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:52.739289" elapsed="0.000356"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:52.739130" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:52.738795" elapsed="0.000908"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:28:52.740289" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:28:52.739861" 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-08-22T23:28:52.740632" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:52.740387" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:52.741204" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:52.740869" elapsed="0.000361"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:52.740713" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:52.740369" 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-08-22T23:28:52.741437" elapsed="0.000395"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:28:52.742292" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:28:52.741992" 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-08-22T23:28:52.742469" 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-08-22T23:28:52.732129" elapsed="0.012882"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:28:52.745191" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:28:52.745080" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:52.745062" 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-08-22T23:28:52.745435" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:52.745506" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:28:52.747889" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:28:52.700928" elapsed="0.046989"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:28:52.747978" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:28:52.748132" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:28:52.694181" elapsed="0.053978"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:28:52.748820" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:28:52.748437" elapsed="0.000466">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:52.748228" elapsed="0.000795">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:28:52.748211" elapsed="0.000850">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:52.749280" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:52.749132" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:52.749115" elapsed="0.000243"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:52.691241" elapsed="0.058201">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:53.752477" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:53.751503" elapsed="0.001045"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:53.767522" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:53.767166" elapsed="0.000409"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:53.767999" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:53.767746" 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-08-22T23:28:53.793996" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:53.794150" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:28:53.794248" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:28:53.770212" elapsed="0.024061"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:53.768121" elapsed="0.026195"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:53.794493" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:53.794343" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:53.768098" elapsed="0.026500"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:53.799730" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:53.795625" elapsed="0.004157"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:53.795377" elapsed="0.004441"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:53.795359" elapsed="0.004485"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:53.802503" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:53.800128" elapsed="0.002423"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:53.799901" elapsed="0.002700"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:53.799884" elapsed="0.002745"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:28:53.803209" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:28:53.802805" 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-08-22T23:28:53.803543" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:53.803308" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:53.804116" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:53.803807" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:53.803645" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:53.803290" elapsed="0.000913"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:28:53.804907" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:28:53.804364" 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-08-22T23:28:53.805296" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:53.805062" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:53.805879" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:53.805560" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:53.805380" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:53.805042" 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-08-22T23:28:53.806119" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:28:53.806942" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:28:53.806645" 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-08-22T23:28:53.807120" 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-08-22T23:28:53.794959" elapsed="0.014603"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:28:53.809757" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:28:53.809648" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:53.809629" 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-08-22T23:28:53.809995" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:53.810071" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:28:53.812465" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:28:53.758710" elapsed="0.053785"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:28:53.812555" elapsed="0.000042"/>
</return>
<msg time="2026-08-22T23:28:53.812724" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:28:53.753072" elapsed="0.059678"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:28:53.813397" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:28:53.813028" elapsed="0.000472">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:53.812821" elapsed="0.000766">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:28:53.812804" elapsed="0.000822">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:53.813844" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:53.813698" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:53.813681" elapsed="0.000245"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:53.750391" elapsed="0.063618">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:54.817041" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:54.816068" elapsed="0.001043"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:54.868828" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:54.868431" elapsed="0.000460"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:54.869386" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:54.869058" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:28:54.900022" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:54.900172" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:28:54.900290" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:28:54.871672" elapsed="0.028645"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:54.869514" elapsed="0.030846"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:54.900544" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:54.900388" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:54.869488" elapsed="0.031176"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:54.904244" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:54.901743" elapsed="0.002551"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:54.901499" elapsed="0.002831"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:54.901481" elapsed="0.002876"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:54.907053" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:54.904653" elapsed="0.002453"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:54.904414" elapsed="0.002729"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:54.904397" elapsed="0.002772"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:28:54.907765" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:28:54.907343" 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-08-22T23:28:54.908101" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:54.907865" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:54.908696" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:54.908373" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:54.908212" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:54.907848" elapsed="0.000935"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:28:54.909308" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:28:54.908941" 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-08-22T23:28:54.909656" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:54.909406" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:54.910197" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:54.909896" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:54.909739" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:54.909387" 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-08-22T23:28:54.910433" elapsed="0.000371"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:28:54.911261" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:28:54.910964" 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-08-22T23:28:54.911438" elapsed="0.002468"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:28:54.901053" elapsed="0.012918"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:28:54.914155" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:28:54.914044" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:54.914025" 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-08-22T23:28:54.914466" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:54.914539" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:28:54.917093" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:28:54.822493" elapsed="0.094630"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:28:54.917186" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:28:54.917340" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:28:54.817602" elapsed="0.099765"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:28:54.918027" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:28:54.917663" elapsed="0.000444">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:54.917438" elapsed="0.000743">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:28:54.917421" elapsed="0.000794">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:54.918430" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:54.918286" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:54.918269" elapsed="0.000241"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:54.815041" elapsed="0.103556">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:55.921852" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:55.920860" elapsed="0.001061"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:55.932827" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:55.932543" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:55.933299" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:55.933029" 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-08-22T23:28:55.959711" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:55.959856" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:28:55.959955" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:28:55.935489" elapsed="0.024492"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:55.933420" elapsed="0.026605"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:55.960208" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:55.960055" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:55.933398" elapsed="0.026898"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:55.964034" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:55.961380" elapsed="0.002704"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:55.961154" elapsed="0.003026"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:55.961135" elapsed="0.003072"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:55.966924" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:55.964484" elapsed="0.002487"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:55.964264" elapsed="0.002743"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:55.964247" elapsed="0.002784"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:28:55.967606" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:28:55.967210" 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-08-22T23:28:55.967957" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:55.967721" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:55.968495" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:55.968197" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:55.968039" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:55.967703" elapsed="0.000884"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:28:55.969121" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:28:55.968758" 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-08-22T23:28:55.969949" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:55.969218" elapsed="0.000872"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:55.971225" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:55.970497" elapsed="0.000788"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:55.970145" elapsed="0.001221"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:55.969200" elapsed="0.002213"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:28:55.971780" elapsed="0.000780"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:28:55.973647" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:28:55.972950" elapsed="0.000761"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:28:55.974047" elapsed="0.004619"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:28:55.960679" elapsed="0.018053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:28:55.978911" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:28:55.978801" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:55.978783" 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-08-22T23:28:55.979156" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:55.979226" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:28:55.981558" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:28:55.927992" elapsed="0.053598"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:28:55.981665" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:28:55.981835" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:28:55.922404" elapsed="0.059459"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:28:55.982509" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:28:55.982145" elapsed="0.000448">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:55.981932" elapsed="0.000750">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:28:55.981915" elapsed="0.000850">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:55.982986" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:55.982841" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:55.982823" elapsed="0.000243"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:55.919821" elapsed="0.063328">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:56.986382" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:56.985380" elapsed="0.001074"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:56.997480" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:56.997207" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:56.997965" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:56.997706" 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-08-22T23:28:57.029839" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:57.030226" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:28:57.030510" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:28:57.000233" elapsed="0.030357"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:56.998095" elapsed="0.032680"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:57.031323" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:57.030854" elapsed="0.000651"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:56.998068" elapsed="0.033496"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:57.039120" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:57.034655" elapsed="0.004516"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:57.034072" elapsed="0.005135"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:57.034025" elapsed="0.005208"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:57.041907" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:57.039512" elapsed="0.002442"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:57.039290" elapsed="0.002699"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:57.039273" elapsed="0.002741"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:28:57.042633" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:28:57.042197" 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-08-22T23:28:57.042971" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:57.042733" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:57.043520" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:57.043217" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:57.043056" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:57.042716" elapsed="0.000906"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:28:57.044146" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:28:57.043782" 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-08-22T23:28:57.044473" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:57.044244" elapsed="0.000355"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:57.045106" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:57.044802" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:57.044640" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:57.044226" 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-08-22T23:28:57.045373" elapsed="0.000375"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:28:57.046223" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:28:57.045914" 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-08-22T23:28:57.046405" 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-08-22T23:28:57.032737" elapsed="0.016122"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:28:57.049042" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:28:57.048929" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:57.048911" 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-08-22T23:28:57.049291" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:57.049366" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:28:57.051796" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:28:56.991053" elapsed="0.060773"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:28:57.051887" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:28:57.052040" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:28:56.986986" elapsed="0.065080"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:28:57.052728" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:28:57.052344" elapsed="0.000465">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:57.052137" elapsed="0.000746">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:28:57.052120" elapsed="0.000797">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:57.053132" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:57.052987" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:57.052970" elapsed="0.000243"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:56.984211" elapsed="0.069086">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:58.056479" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:58.055423" elapsed="0.001133"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:58.068043" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:58.067768" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:58.068553" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:58.068267" 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-08-22T23:28:58.093004" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:58.093161" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:28:58.093262" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:28:58.070946" elapsed="0.022342"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:58.068705" elapsed="0.024627"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:58.093519" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:58.093361" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:58.068681" elapsed="0.024951"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:58.097126" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:58.094680" elapsed="0.002495"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:58.094436" elapsed="0.002774"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:58.094416" elapsed="0.002820"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:58.099866" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:58.097513" elapsed="0.002400"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:58.097293" elapsed="0.002655"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:58.097276" elapsed="0.002697"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:28:58.100556" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:28:58.100150" 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-08-22T23:28:58.100913" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:58.100675" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:58.101457" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:58.101155" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:58.100996" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:58.100656" elapsed="0.000885"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:28:58.102083" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:28:58.101717" 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-08-22T23:28:58.102413" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:58.102184" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:58.102968" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:58.102670" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:58.102494" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:58.102167" 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-08-22T23:28:58.103202" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:28:58.104043" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:28:58.103741" 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-08-22T23:28:58.104219" 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-08-22T23:28:58.094003" elapsed="0.012805"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:28:58.106988" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:28:58.106878" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:58.106859" 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-08-22T23:28:58.107232" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:58.107345" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:28:58.109757" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:28:58.063358" elapsed="0.046430"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:28:58.109849" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:28:58.110001" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:28:58.057109" elapsed="0.052918"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:28:58.110686" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:28:58.110306" elapsed="0.000460">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:58.110098" elapsed="0.000742">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:28:58.110081" elapsed="0.000794">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:58.111092" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:58.110947" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:58.110929" elapsed="0.000244"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:58.054267" elapsed="0.056987">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:59.114492" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:59.113459" elapsed="0.001105"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:59.125675" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:59.125398" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:59.126120" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:59.125876" 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-08-22T23:28:59.149753" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:28:59.149904" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:28:59.150005" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:28:59.128338" elapsed="0.021694"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:59.126243" elapsed="0.023834"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:59.150262" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:59.150105" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:59.126220" elapsed="0.024129"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:59.154008" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:59.151374" elapsed="0.002684"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:59.151152" elapsed="0.002941"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:59.151134" elapsed="0.002990"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:28:59.156830" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:28:59.154493" elapsed="0.002383"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:59.154193" elapsed="0.002718"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:59.154173" elapsed="0.002763"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:28:59.157535" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:28:59.157111" 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-08-22T23:28:59.157891" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:59.157652" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:59.158432" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:59.158132" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:59.157973" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:59.157633" elapsed="0.000884"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:28:59.159052" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:28:59.158690" 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-08-22T23:28:59.159382" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:59.159150" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:28:59.159935" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:28:59.159638" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:28:59.159464" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:59.159132" 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-08-22T23:28:59.160187" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:28:59.161023" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:28:59.160721" 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-08-22T23:28:59.161206" elapsed="0.002346"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:28:59.150729" elapsed="0.012906"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:28:59.163819" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:28:59.163707" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:28:59.163689" 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-08-22T23:28:59.164063" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:28:59.164136" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:28:59.166547" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:28:59.119391" elapsed="0.047185"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:28:59.166655" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:28:59.166809" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:28:59.115093" elapsed="0.051742"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:28:59.167479" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:28:59.167115" elapsed="0.000447">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:28:59.166905" elapsed="0.000749">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:28:59.166889" elapsed="0.000800">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:28:59.167952" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:28:59.167803" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:28:59.167785" elapsed="0.000247"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:28:59.112243" elapsed="0.055874">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:00.171334" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:00.170268" elapsed="0.001137"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:00.183517" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:00.183150" elapsed="0.000439"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:00.184184" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:00.183824" elapsed="0.000437"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:29:00.206609" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:00.206810" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:00.206951" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:00.186444" elapsed="0.020543"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:00.184357" elapsed="0.022690"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:00.207403" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:00.207085" elapsed="0.000462"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:00.184328" elapsed="0.023325"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:00.215427" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:00.209949" elapsed="0.005586"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:00.209424" elapsed="0.006226"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:00.209384" elapsed="0.006324"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:00.218721" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:00.216392" elapsed="0.002375"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:00.215885" elapsed="0.002917"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:00.215845" elapsed="0.002981"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:00.219399" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:00.219002" 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-08-22T23:29:00.219748" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:00.219497" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:00.220310" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:00.220009" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:00.219832" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:00.219478" elapsed="0.000916"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:00.220986" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:00.220549" elapsed="0.000464"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:00.221318" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:00.221084" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:00.221865" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:00.221554" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:00.221399" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:00.221066" 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-08-22T23:29:00.222170" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:00.223012" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:00.222706" 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-08-22T23:29:00.223190" elapsed="0.002339"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:29:00.208452" elapsed="0.017158"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:00.225794" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:29:00.225684" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:00.225665" 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-08-22T23:29:00.226033" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:00.226103" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:29:00.228447" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:00.176703" elapsed="0.051774"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:00.228539" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:29:00.228709" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:00.171942" elapsed="0.056793"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:00.229384" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:00.229015" elapsed="0.000448">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:00.228807" elapsed="0.000729">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:00.228790" elapsed="0.000782">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:00.229807" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:00.229662" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:00.229645" elapsed="0.000243"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:00.169107" elapsed="0.060865">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:01.233020" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:01.232005" elapsed="0.001087"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:01.243827" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:01.243544" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:01.244277" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:01.244030" 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-08-22T23:29:01.267722" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:01.268126" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:01.268382" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:01.246538" elapsed="0.021908"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:01.244400" elapsed="0.024147"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:01.268992" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:01.268646" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:01.244376" elapsed="0.024828"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:01.275237" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:01.271640" elapsed="0.003666"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:01.271109" elapsed="0.004248"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:01.271067" elapsed="0.004326"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:01.279174" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:01.275807" elapsed="0.003449"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:01.275473" elapsed="0.003847"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:01.275449" elapsed="0.003903"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:01.279949" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:01.279533" 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-08-22T23:29:01.280287" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:01.280049" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:01.280856" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:01.280532" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:01.280371" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:01.280031" elapsed="0.000912"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:01.281464" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:01.281100" 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-08-22T23:29:01.281819" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:01.281562" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:01.282353" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:01.282059" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:01.281902" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:01.281544" 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-08-22T23:29:01.282591" elapsed="0.000379"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:01.283434" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:01.283137" 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-08-22T23:29:01.283627" 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-08-22T23:29:01.270068" elapsed="0.016100"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:01.286355" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:29:01.286239" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:01.286220" 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-08-22T23:29:01.286615" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:01.286690" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:29:01.289099" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:01.237779" elapsed="0.051349"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:01.289227" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:29:01.289383" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:01.233621" elapsed="0.055789"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:01.290082" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:01.289719" elapsed="0.000441">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:01.289482" elapsed="0.000751">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:01.289465" elapsed="0.000803">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:01.290485" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:01.290339" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:01.290323" elapsed="0.000243"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:01.230844" elapsed="0.059824">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:02.293776" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:02.292759" elapsed="0.001092"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:02.306346" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:02.305946" elapsed="0.000473"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:02.307006" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:02.306655" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:29:02.329554" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:02.329800" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:02.329944" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:02.309365" elapsed="0.020615"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:02.307191" elapsed="0.022850"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:02.330398" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:02.330085" elapsed="0.000455"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:02.307150" elapsed="0.023473"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:02.339363" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:02.332958" elapsed="0.006463"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:02.332428" elapsed="0.007028"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:02.332386" elapsed="0.007096"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:02.342103" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:02.339788" elapsed="0.002362"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:02.339540" elapsed="0.002644"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:02.339523" elapsed="0.002686"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:02.342842" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:02.342396" 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-08-22T23:29:02.343274" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:02.343032" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:02.343843" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:02.343519" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:02.343358" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:02.343012" elapsed="0.000917"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:02.344450" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:02.344086" 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-08-22T23:29:02.344799" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:02.344548" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:02.345334" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:02.345037" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:02.344881" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:02.344530" 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-08-22T23:29:02.345574" elapsed="0.000372"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:02.346423" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:02.346110" 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-08-22T23:29:02.346621" 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-08-22T23:29:02.331454" elapsed="0.017582"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:02.349219" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-08-22T23:29:02.349107" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:02.349089" 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-08-22T23:29:02.349468" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:02.349539" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:29:02.351905" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:02.299836" elapsed="0.052098"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:02.351994" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:29:02.352144" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:02.294385" elapsed="0.057785"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:02.352837" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:02.352447" elapsed="0.000476">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:02.352239" elapsed="0.000761">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:02.352223" elapsed="0.000811">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:02.353251" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:02.353105" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:02.353088" elapsed="0.000242"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:02.291547" elapsed="0.061868">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:03.356500" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:03.355487" elapsed="0.001090"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:03.368779" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:03.368489" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:03.369231" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:03.368983" 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-08-22T23:29:03.390993" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:03.391291" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:03.391510" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:03.371489" elapsed="0.020077"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:03.369356" elapsed="0.022346"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:03.392105" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:03.391765" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:03.369332" elapsed="0.022965"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:03.400283" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:03.394777" elapsed="0.005618"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:03.394247" elapsed="0.006297"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:03.394205" elapsed="0.006431"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:03.403611" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:03.401270" elapsed="0.002388"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:03.400771" elapsed="0.002922"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:03.400732" elapsed="0.002986"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:03.404295" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:03.403894" 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-08-22T23:29:03.404691" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:03.404393" elapsed="0.000363"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:03.405261" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:03.404945" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:03.404781" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:03.404375" elapsed="0.000971"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:03.405885" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:03.405501" 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-08-22T23:29:03.406212" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:03.405983" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:03.406757" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:03.406445" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:03.406292" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:03.405966" 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-08-22T23:29:03.406989" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:03.407873" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:03.407558" 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-08-22T23:29:03.408051" 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-08-22T23:29:03.393260" elapsed="0.017230"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:03.410687" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:29:03.410560" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:03.410542" 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-08-22T23:29:03.410932" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:03.411003" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:29:03.413365" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:03.361850" elapsed="0.051544"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:03.413454" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:29:03.413623" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:03.357108" elapsed="0.056544"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:03.414289" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:03.413927" elapsed="0.000445">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:03.413722" elapsed="0.000722">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:03.413705" elapsed="0.000773">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:03.414727" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:03.414559" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:03.414539" elapsed="0.000270"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:03.354380" elapsed="0.060512">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:04.418070" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:04.417034" elapsed="0.001109"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:04.430862" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:04.430584" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:04.431319" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:04.431066" 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-08-22T23:29:04.455151" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:04.455424" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:04.455863" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:04.434241" elapsed="0.021688"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:04.431472" elapsed="0.024555"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:04.456438" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:04.456091" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:04.431446" elapsed="0.025229"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:04.464502" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:04.458993" elapsed="0.005558"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:04.458462" elapsed="0.006144"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:04.458419" elapsed="0.006215"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:04.467254" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:04.464912" elapsed="0.002389"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:04.464690" elapsed="0.002646"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:04.464673" elapsed="0.002688"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:04.467998" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:04.467535" 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-08-22T23:29:04.468346" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:04.468111" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:04.468905" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:04.468602" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:04.468428" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:04.468088" elapsed="0.000902"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:04.469511" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:04.469144" 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-08-22T23:29:04.469855" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:04.469625" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:04.470388" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:04.470092" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:04.469936" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:04.469606" elapsed="0.000865"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:29:04.470642" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:04.471474" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:04.471156" 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-08-22T23:29:04.471671" elapsed="0.002468"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:29:04.457476" elapsed="0.016730"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:04.474387" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:29:04.474277" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:04.474259" 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-08-22T23:29:04.474649" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:04.474722" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:29:04.477268" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:04.426027" elapsed="0.051271"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:04.477359" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:29:04.477512" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:04.418676" elapsed="0.058862"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:04.478255" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:04.477888" elapsed="0.000450">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:04.477674" elapsed="0.000739">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:04.477655" elapsed="0.000793">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:04.478682" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:04.478518" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:04.478501" elapsed="0.000261"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:04.415884" elapsed="0.062962">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:05.482064" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:05.481042" elapsed="0.001098"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:05.493768" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:05.493478" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:05.494223" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:05.493971" 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-08-22T23:29:05.514959" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:05.515248" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:05.515469" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:05.496453" elapsed="0.019077"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:05.494351" elapsed="0.021313"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:05.516074" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:05.515727" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:05.494327" elapsed="0.021944"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:05.521938" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:05.518279" elapsed="0.003730"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:05.517968" elapsed="0.004093"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:05.517942" elapsed="0.004155"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:05.525792" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:05.522488" elapsed="0.003351"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:05.522178" elapsed="0.003697"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:05.522154" elapsed="0.003747"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:05.526492" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:05.526080" 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-08-22T23:29:05.526858" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:05.526612" elapsed="0.000367"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:05.527473" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:05.527170" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:05.527007" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:05.526580" elapsed="0.000978"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:05.528102" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:05.527735" 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-08-22T23:29:05.528428" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:05.528198" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:05.528981" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:05.528685" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:05.528509" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:05.528180" 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-08-22T23:29:05.529221" elapsed="0.000403"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:05.530110" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:05.529790" 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-08-22T23:29:05.530298" elapsed="0.002772"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:29:05.517099" elapsed="0.016058"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:05.533425" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-08-22T23:29:05.533251" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:05.533226" 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-08-22T23:29:05.533728" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:05.533802" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:29:05.536300" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:05.487259" elapsed="0.049070"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:05.536390" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:29:05.536546" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:05.482681" elapsed="0.053898"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:05.537238" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:05.536875" elapsed="0.000445">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:05.536665" elapsed="0.000764">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:05.536648" elapsed="0.000817">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:05.537702" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:05.537535" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:05.537519" elapsed="0.000265"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:05.479801" elapsed="0.058066">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:06.541216" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:06.539963" elapsed="0.001326"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:06.553805" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:06.553520" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:06.554258" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:06.554010" 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-08-22T23:29:06.576268" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:06.576557" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:06.576820" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:06.556475" elapsed="0.020463"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:06.554383" elapsed="0.022735"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:06.577548" elapsed="0.000081"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:06.577198" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:06.554361" elapsed="0.023417"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:06.585877" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:06.580081" elapsed="0.005849"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:06.579552" elapsed="0.006415"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:06.579511" elapsed="0.006482"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:06.588686" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:06.586281" elapsed="0.002453"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:06.586053" elapsed="0.002716"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:06.586035" elapsed="0.002759"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:06.589439" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:06.588973" 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-08-22T23:29:06.589794" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:06.589539" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:06.590337" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:06.590036" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:06.589876" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:06.589520" elapsed="0.000902"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:06.590953" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:06.590580" 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-08-22T23:29:06.591280" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:06.591049" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:06.591836" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:06.591520" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:06.591360" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:06.591032" 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-08-22T23:29:06.592069" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:06.592889" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:06.592574" 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-08-22T23:29:06.593165" elapsed="0.002316"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:29:06.578570" elapsed="0.016978"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:06.595746" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:29:06.595635" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:06.595615" 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-08-22T23:29:06.595987" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:06.596058" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:29:06.598418" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:06.548114" elapsed="0.050334"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:06.598510" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:29:06.598681" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:06.542035" elapsed="0.056674"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:06.599355" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:06.598989" elapsed="0.000448">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:06.598781" elapsed="0.000731">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:06.598764" elapsed="0.000783">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:06.599784" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:06.599635" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:06.599617" elapsed="0.000249"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:06.538809" elapsed="0.061142">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:07.603056" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:07.602004" elapsed="0.001124"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:07.615518" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:07.615201" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:07.615987" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:07.615740" 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-08-22T23:29:07.640834" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:07.641150" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:07.641396" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:07.618209" elapsed="0.023246"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:07.616111" elapsed="0.025658"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:07.642214" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:07.641849" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:07.616087" elapsed="0.026327"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:07.648966" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:07.644948" elapsed="0.004068"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:07.644386" elapsed="0.004666"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:07.644344" elapsed="0.004733"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:07.651834" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:07.649369" elapsed="0.002512"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:07.649133" elapsed="0.002784"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:07.649117" elapsed="0.002825"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:07.652562" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:07.652135" 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-08-22T23:29:07.652931" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:07.652682" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:07.653506" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:07.653180" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:07.653015" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:07.652663" elapsed="0.000949"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:07.654145" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:07.653774" 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-08-22T23:29:07.654478" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:07.654243" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:07.655127" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:07.654739" elapsed="0.000415"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:07.654560" elapsed="0.000631"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:07.654225" 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-08-22T23:29:07.655417" elapsed="0.000410"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:07.656300" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:07.655993" 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-08-22T23:29:07.656481" elapsed="0.002572"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:29:07.643335" elapsed="0.015788"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:07.659317" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-08-22T23:29:07.659195" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:07.659176" 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-08-22T23:29:07.659634" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:07.659713" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:29:07.662098" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:07.609002" elapsed="0.053125"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:07.662188" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:29:07.662360" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:07.603670" elapsed="0.058719"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:07.663063" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:07.662690" elapsed="0.000498">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:07.662461" elapsed="0.000804">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:07.662444" elapsed="0.000856">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:07.663571" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:07.663382" elapsed="0.000264"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:07.663356" elapsed="0.000314"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:07.600858" elapsed="0.062898">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:08.667223" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:08.666205" elapsed="0.001090"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:08.679682" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:08.679297" elapsed="0.000452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:08.680368" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:08.679962" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:29:08.701573" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:08.701904" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:08.702123" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:08.682602" elapsed="0.019580"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:08.680493" elapsed="0.021788"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:08.702725" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:08.702342" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:08.680469" elapsed="0.022456"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:08.711167" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:08.705263" elapsed="0.006016"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:08.704765" elapsed="0.006593"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:08.704723" elapsed="0.006692"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:08.715190" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:08.712070" elapsed="0.003166"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:08.711540" elapsed="0.003731"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:08.711502" elapsed="0.003793"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:08.715895" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:08.715467" 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-08-22T23:29:08.716229" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:08.715993" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:08.716805" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:08.716487" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:08.716324" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:08.715975" elapsed="0.000980"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:08.717479" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:08.717113" 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-08-22T23:29:08.717826" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:08.717576" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:08.718359" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:08.718063" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:08.717907" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:08.717558" 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-08-22T23:29:08.718611" elapsed="0.000357"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:08.719434" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:08.719133" 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-08-22T23:29:08.719631" elapsed="0.002351"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:29:08.703750" elapsed="0.018296"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:08.722226" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:29:08.722116" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:08.722098" 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-08-22T23:29:08.722469" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:08.722540" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:29:08.724921" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:08.673182" elapsed="0.051768"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:08.725010" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:29:08.725162" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:08.667841" elapsed="0.057347"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:08.725847" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:08.725468" elapsed="0.000460">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:08.725259" elapsed="0.000741">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:08.725242" elapsed="0.000793">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:08.726250" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:08.726104" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:08.726088" elapsed="0.000241"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:08.664719" elapsed="0.061692">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:09.729517" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:09.728510" elapsed="0.001114"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:09.741353" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:09.741084" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:09.741825" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:09.741557" 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-08-22T23:29:09.763575" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:09.763920" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:09.764167" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:09.744078" elapsed="0.020152"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:09.741953" elapsed="0.022378"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:09.764771" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:09.764394" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:09.741928" elapsed="0.023047"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:09.772767" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:09.767285" elapsed="0.005552"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:09.766790" elapsed="0.006098"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:09.766748" elapsed="0.006176"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:09.776653" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:09.773317" elapsed="0.003402"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:09.773003" elapsed="0.003766"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:09.772979" elapsed="0.003825"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:09.777639" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:09.777048" 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-08-22T23:29:09.778114" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:09.777782" elapsed="0.000413"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:09.778901" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:09.778451" elapsed="0.000488"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:09.778229" elapsed="0.000762"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:09.777757" elapsed="0.001264"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:09.779773" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:09.779240" 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-08-22T23:29:09.780262" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:09.779908" elapsed="0.000438"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:09.781035" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:09.780619" elapsed="0.000453"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:09.780380" elapsed="0.000741"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:09.779884" 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-08-22T23:29:09.781362" elapsed="0.000378"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:09.782203" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:09.781902" 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-08-22T23:29:09.782384" elapsed="0.002359"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:29:09.765805" elapsed="0.019002"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:09.785037" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:29:09.784925" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:09.784906" 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-08-22T23:29:09.785281" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:09.785353" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:29:09.787890" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:09.734623" elapsed="0.053303"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:09.787988" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:29:09.788147" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:09.730273" elapsed="0.057901"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:09.788898" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:09.788501" elapsed="0.000484">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:09.788247" elapsed="0.000813">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:09.788229" elapsed="0.000866">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:09.789312" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:09.789165" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:09.789149" elapsed="0.000243"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:09.727318" elapsed="0.062159">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:10.792441" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:10.791430" elapsed="0.001082"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:10.804186" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:10.803925" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:10.804653" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:10.804388" 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-08-22T23:29:10.826447" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:10.826623" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:10.826726" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:10.806880" elapsed="0.019872"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:10.804777" elapsed="0.022017"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:10.826977" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:10.826823" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:10.804753" elapsed="0.022406"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:10.830619" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:10.828189" elapsed="0.002480"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:10.827969" elapsed="0.002735"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:10.827950" elapsed="0.002780"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:10.833323" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:10.831006" elapsed="0.002364"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:10.830786" elapsed="0.002619"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:10.830770" elapsed="0.002660"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:10.834012" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:10.833621" 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-08-22T23:29:10.834343" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:10.834110" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:10.834907" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:10.834603" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:10.834425" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:10.834092" elapsed="0.000900"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:10.835546" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:10.835183" 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-08-22T23:29:10.835893" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:10.835663" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:10.836426" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:10.836132" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:10.835975" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:10.835644" 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-08-22T23:29:10.836676" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:10.837480" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:10.837189" 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-08-22T23:29:10.837677" 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-08-22T23:29:10.827526" elapsed="0.012673"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:10.840376" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:29:10.840268" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:10.840250" 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-08-22T23:29:10.840632" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:10.840705" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:29:10.843042" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:10.797764" elapsed="0.045307"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:10.843131" elapsed="0.000052"/>
</return>
<msg time="2026-08-22T23:29:10.843311" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:10.793037" elapsed="0.050301"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:10.843999" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:10.843637" elapsed="0.000438">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:10.843411" elapsed="0.000772">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:10.843393" elapsed="0.000826">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:10.844434" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:10.844289" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:10.844272" elapsed="0.000242"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:10.790315" elapsed="0.054296">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:11.847961" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:11.846751" elapsed="0.001308"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:11.861437" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:11.861066" elapsed="0.000440"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:11.861926" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:11.861677" 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-08-22T23:29:11.883087" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:11.883242" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:11.883359" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:11.864141" elapsed="0.019246"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:11.862050" elapsed="0.021381"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:11.883647" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:11.883461" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:11.862026" elapsed="0.021745"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:11.887594" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:11.884858" elapsed="0.002789"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:11.884630" elapsed="0.003053"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:11.884611" elapsed="0.003098"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:11.890469" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:11.888007" elapsed="0.002524"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:11.887770" elapsed="0.002808"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:11.887749" elapsed="0.002884"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:11.891384" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:11.890864" 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-08-22T23:29:11.891865" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:11.891515" elapsed="0.000429"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:11.892506" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:11.892189" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:11.891980" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:11.891490" elapsed="0.001193"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:11.893413" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:11.892903" 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-08-22T23:29:11.893881" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:11.893545" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:11.894629" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:11.894212" elapsed="0.000455"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:11.893995" elapsed="0.000722"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:11.893519" 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-08-22T23:29:11.894929" elapsed="0.000362"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:11.895815" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:11.895457" 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-08-22T23:29:11.895999" 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-08-22T23:29:11.884171" elapsed="0.014325"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:11.898700" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:29:11.898567" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:11.898548" 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-08-22T23:29:11.898962" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:11.899039" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:29:11.901505" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:11.854686" elapsed="0.046857"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:11.901639" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:29:11.901811" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:11.848742" elapsed="0.053097"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:11.902549" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:11.902145" elapsed="0.000509">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:11.901927" elapsed="0.000804">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:11.901902" elapsed="0.000864">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:11.902999" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:11.902837" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:11.902820" elapsed="0.000273"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:11.845515" elapsed="0.057665">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:12.906144" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:12.905170" elapsed="0.001047"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:12.919132" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:12.918760" elapsed="0.000440"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:12.919710" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:12.919411" 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-08-22T23:29:12.943169" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:12.943455" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:12.943714" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:12.921940" elapsed="0.021834"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:12.919834" elapsed="0.024038"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:12.944275" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:12.943933" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:12.919810" elapsed="0.024661"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:12.950543" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:12.946854" elapsed="0.003807"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:12.946273" elapsed="0.004449"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:12.946230" elapsed="0.004537"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:12.954977" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:12.951237" elapsed="0.003804"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:12.950861" elapsed="0.004230"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:12.950833" elapsed="0.004293"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:12.955828" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:12.955366" 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-08-22T23:29:12.956162" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:12.955928" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:12.956727" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:12.956403" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:12.956243" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:12.955909" elapsed="0.000903"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:12.957339" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:12.956976" 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-08-22T23:29:12.957682" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:12.957434" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:12.958217" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:12.957921" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:12.957765" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:12.957416" 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-08-22T23:29:12.958453" elapsed="0.000408"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:12.959322" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:12.959024" 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-08-22T23:29:12.959500" elapsed="0.002390"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:29:12.945297" elapsed="0.016667"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:12.962347" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-08-22T23:29:12.962218" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:12.962195" 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-08-22T23:29:12.962671" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:12.962753" elapsed="0.000018"/>
</return>
<msg time="2026-08-22T23:29:12.965320" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:12.912310" elapsed="0.053040"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:12.965410" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:29:12.965563" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:12.906829" elapsed="0.058779"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:12.966259" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:12.965892" elapsed="0.000449">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:12.965681" elapsed="0.000734">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:12.965664" elapsed="0.000786">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:12.966704" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:12.966519" elapsed="0.000245"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:12.966503" elapsed="0.000285"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:12.904099" elapsed="0.062774">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:13.970011" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:13.969024" elapsed="0.001062"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:13.983754" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:13.983361" elapsed="0.000463"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:13.984381" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:13.984038" 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-08-22T23:29:14.011357" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:14.011714" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:14.011964" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:13.987539" elapsed="0.024483"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:13.984549" elapsed="0.027573"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:14.012531" elapsed="0.000079"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:14.012184" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:13.984516" elapsed="0.028244"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:14.020712" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:14.015166" elapsed="0.005605"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:14.014657" elapsed="0.006150"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:14.014614" elapsed="0.006219"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:14.023483" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:14.021111" elapsed="0.002423"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:14.020890" elapsed="0.002680"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:14.020873" elapsed="0.002737"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:14.024211" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:14.023792" 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-08-22T23:29:14.024546" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:14.024309" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:14.025110" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:14.024811" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:14.024649" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:14.024292" elapsed="0.000904"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:14.025734" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:14.025353" 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-08-22T23:29:14.026063" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:14.025832" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:14.026614" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:14.026302" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:14.026145" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:14.025814" elapsed="0.000886"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:29:14.026854" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:14.027722" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:14.027399" 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-08-22T23:29:14.027902" 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-08-22T23:29:14.013671" elapsed="0.016618"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:14.030471" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:29:14.030359" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:14.030341" 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-08-22T23:29:14.030733" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:14.030804" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:29:14.033300" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:13.977198" elapsed="0.056131"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:14.033392" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:29:14.033543" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:13.970607" elapsed="0.062962"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:14.034234" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:14.033866" elapsed="0.000452">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:14.033658" elapsed="0.000773">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:14.033640" elapsed="0.000828">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:14.034701" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:14.034538" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:14.034521" elapsed="0.000262"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:13.967865" elapsed="0.067001">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:15.037947" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:15.036964" elapsed="0.001055"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:15.049408" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:15.048824" elapsed="0.000693"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:15.050452" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:15.049897" elapsed="0.000656"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:29:15.074274" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:15.074491" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:15.074771" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:15.053941" elapsed="0.020890"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:15.050757" elapsed="0.024173"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:15.075339" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:15.074996" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:15.050705" elapsed="0.024917"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:15.083970" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:15.077943" elapsed="0.006141"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:15.077410" elapsed="0.006756"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:15.077369" elapsed="0.006856"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:15.087198" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:15.084749" elapsed="0.002496"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:15.084351" elapsed="0.002930"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:15.084314" elapsed="0.002992"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:15.087946" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:15.087490" 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-08-22T23:29:15.088287" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:15.088045" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:15.088855" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:15.088533" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:15.088371" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:15.088027" elapsed="0.000915"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:15.089468" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:15.089101" 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-08-22T23:29:15.089898" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:15.089661" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:15.090439" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:15.090140" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:15.089982" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:15.089641" 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-08-22T23:29:15.090696" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:15.091560" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:15.091212" 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-08-22T23:29:15.091772" elapsed="0.002379"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:29:15.076428" elapsed="0.017790"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:15.094400" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:29:15.094289" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:15.094270" 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-08-22T23:29:15.094673" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:15.094747" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:29:15.097217" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:15.042495" elapsed="0.054751"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:15.097308" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:29:15.097459" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:15.038510" elapsed="0.058976"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:15.098156" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:15.097786" elapsed="0.000454">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:15.097557" elapsed="0.000759">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:15.097540" elapsed="0.000811">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:15.098570" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:15.098422" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:15.098405" elapsed="0.000263"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:15.035828" elapsed="0.062925">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:16.101870" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:16.100888" elapsed="0.001054"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:16.112650" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:16.112373" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:16.113182" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:16.112856" 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-08-22T23:29:16.139887" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:16.140069" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:16.140198" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:16.115467" elapsed="0.024760"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:16.113308" elapsed="0.026976"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:16.140513" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:16.140318" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:16.113284" elapsed="0.027342"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:16.144351" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:16.141772" elapsed="0.002630"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:16.141508" elapsed="0.002931"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:16.141488" elapsed="0.002977"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:16.147144" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:16.144765" elapsed="0.002452"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:16.144523" elapsed="0.002732"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:16.144506" elapsed="0.002774"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:16.147883" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:16.147459" 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-08-22T23:29:16.148220" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:16.147982" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:16.148789" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:16.148466" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:16.148303" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:16.147965" elapsed="0.000911"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:16.149397" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:16.149034" 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-08-22T23:29:16.149745" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:16.149494" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:16.150282" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:16.149986" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:16.149827" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:16.149476" 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-08-22T23:29:16.150519" elapsed="0.000371"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:16.151384" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:16.151053" 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-08-22T23:29:16.151566" 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-08-22T23:29:16.141037" elapsed="0.013151"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:16.154372" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:29:16.154260" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:16.154241" 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-08-22T23:29:16.154699" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:16.154774" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:29:16.157205" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:16.107795" elapsed="0.049440"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:16.157297" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:29:16.157450" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:16.102439" elapsed="0.055038"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:16.158141" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:16.157777" elapsed="0.000443">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:16.157548" elapsed="0.000746">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:16.157531" elapsed="0.000797">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:16.158552" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:16.158400" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:16.158383" elapsed="0.000269"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:16.099764" elapsed="0.058973">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:17.161694" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:17.160727" elapsed="0.001039"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:17.172290" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:17.172024" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:17.172763" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:17.172496" 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-08-22T23:29:17.203038" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:17.203375" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:17.203684" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:17.175034" elapsed="0.028716"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:17.172883" elapsed="0.030984"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:17.204371" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:17.203942" elapsed="0.000582"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:17.172861" elapsed="0.031742"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:17.212219" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:17.207129" elapsed="0.005141"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:17.206604" elapsed="0.005781"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:17.206534" elapsed="0.005878"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:17.215201" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:17.212713" elapsed="0.002550"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:17.212469" elapsed="0.002842"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:17.212452" elapsed="0.002893"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:17.216131" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:17.215609" 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-08-22T23:29:17.216477" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:17.216232" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:17.217049" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:17.216742" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:17.216559" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:17.216214" elapsed="0.000922"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:17.217675" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:17.217293" 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-08-22T23:29:17.218005" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:17.217773" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:17.218581" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:17.218244" elapsed="0.000384"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:17.218086" elapsed="0.000579"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:17.217755" 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-08-22T23:29:17.218841" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:17.219807" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:17.219353" 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-08-22T23:29:17.220206" elapsed="0.004368"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:29:17.205491" elapsed="0.019167"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:17.224841" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:29:17.224728" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:17.224710" 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-08-22T23:29:17.225087" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:17.225158" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:29:17.227655" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:17.166289" elapsed="0.061396"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:17.227748" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:29:17.227905" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:17.162261" elapsed="0.065672"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:17.228607" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:17.228218" elapsed="0.000476">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:17.228006" elapsed="0.000764">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:17.227989" elapsed="0.000852">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:17.229068" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:17.228918" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:17.228901" elapsed="0.000249"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:17.159632" elapsed="0.069606">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:18.232044" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:18.231057" elapsed="0.001054"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:18.242736" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:18.242461" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:18.243188" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:18.242938" 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-08-22T23:29:18.269700" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:18.269844" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:18.269945" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:18.245405" elapsed="0.024566"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:18.243307" elapsed="0.026708"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:18.270198" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:18.270044" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:18.243286" elapsed="0.027000"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:18.273993" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:18.271316" elapsed="0.002727"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:18.271090" elapsed="0.002989"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:18.271072" elapsed="0.003034"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:18.276767" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:18.274386" elapsed="0.002428"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:18.274163" elapsed="0.002687"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:18.274146" elapsed="0.002730"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:18.277459" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:18.277044" 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-08-22T23:29:18.277819" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:18.277560" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:18.278403" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:18.278063" elapsed="0.000372"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:18.277903" elapsed="0.000573"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:18.277541" elapsed="0.000960"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:18.279115" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:18.278708" 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-08-22T23:29:18.279455" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:18.279216" elapsed="0.000357"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:18.280082" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:18.279781" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:18.279616" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:18.279198" 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-08-22T23:29:18.280320" elapsed="0.000371"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:18.281147" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:18.280856" 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-08-22T23:29:18.281326" 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-08-22T23:29:18.270666" elapsed="0.013240"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:18.284086" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:29:18.283977" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:18.283958" 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-08-22T23:29:18.284448" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:18.284522" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:29:18.286983" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:18.236608" elapsed="0.050405"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:18.287073" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:29:18.287224" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:18.232638" elapsed="0.054613"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:18.287907" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:18.287529" elapsed="0.000457">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:18.287320" elapsed="0.000738">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:18.287303" elapsed="0.000790">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:18.288310" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:18.288164" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:18.288147" elapsed="0.000244"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:18.230029" elapsed="0.058446">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:19.291413" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:19.290439" elapsed="0.001046"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:19.304926" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:19.304575" elapsed="0.000416"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:19.305406" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:19.305157" 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-08-22T23:29:19.328114" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:19.328283" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:19.328390" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:19.307743" elapsed="0.020674"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:19.305537" elapsed="0.022927"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:19.328704" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:19.328505" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:19.305510" elapsed="0.023288"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:19.332379" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:19.329878" elapsed="0.002551"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:19.329652" elapsed="0.002812"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:19.329633" elapsed="0.002857"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:19.335167" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:19.332783" elapsed="0.002434"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:19.332546" elapsed="0.002708"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:19.332529" elapsed="0.002750"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:19.335907" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:19.335458" 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-08-22T23:29:19.336291" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:19.336052" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:19.336860" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:19.336536" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:19.336375" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:19.336032" elapsed="0.000913"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:19.337495" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:19.337101" 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-08-22T23:29:19.337906" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:19.337628" elapsed="0.000344"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:19.338505" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:19.338188" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:19.338000" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:19.337605" 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-08-22T23:29:19.338770" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:19.339574" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:19.339280" 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-08-22T23:29:19.339784" 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-08-22T23:29:19.329195" elapsed="0.013032"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:19.342410" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:29:19.342298" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:19.342279" 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-08-22T23:29:19.342676" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:19.342784" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:29:19.345174" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:19.296213" elapsed="0.048991"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:19.345266" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:29:19.345421" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:19.292143" elapsed="0.053305"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:19.346119" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:19.345755" elapsed="0.000443">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:19.345519" elapsed="0.000751">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:19.345502" elapsed="0.000802">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:19.346517" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:19.346373" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:19.346356" elapsed="0.000258"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:19.289323" elapsed="0.057374">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:20.349969" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:20.348924" elapsed="0.001123"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:20.360830" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:20.360547" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:20.361277" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:20.361030" 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-08-22T23:29:20.383193" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:20.383513" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:20.383782" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:20.363534" elapsed="0.020306"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:20.361407" elapsed="0.022530"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:20.384342" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:20.384001" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:20.361378" elapsed="0.023157"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:20.391593" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:20.386902" elapsed="0.004742"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:20.386365" elapsed="0.005315"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:20.386320" elapsed="0.005386"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:20.394687" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:20.392077" elapsed="0.002658"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:20.391763" elapsed="0.003008"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:20.391747" elapsed="0.003049"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:20.395412" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:20.394983" 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-08-22T23:29:20.395768" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:20.395512" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:20.396323" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:20.396013" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:20.395852" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:20.395493" elapsed="0.000916"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:20.396951" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:20.396566" 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-08-22T23:29:20.397278" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:20.397049" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:20.397834" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:20.397516" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:20.397360" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:20.397031" 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-08-22T23:29:20.398072" elapsed="0.000395"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:20.398962" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:20.398648" 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-08-22T23:29:20.399142" elapsed="0.002504"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:29:20.385356" elapsed="0.016359"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:20.401900" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-08-22T23:29:20.401787" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:20.401769" 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-08-22T23:29:20.402149" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:20.402221" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:29:20.404700" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:20.355124" elapsed="0.049605"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:20.404791" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:29:20.404942" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:20.350723" elapsed="0.054246"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:20.405636" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:20.405249" elapsed="0.000477">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:20.405040" elapsed="0.000763">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:20.405023" elapsed="0.000814">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:20.406103" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:20.405954" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:20.405936" elapsed="0.000249"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:20.347717" elapsed="0.058555">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:21.409290" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:21.408283" elapsed="0.001078"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:21.422321" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:21.421893" elapsed="0.000511"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:21.423024" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:21.422659" 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-08-22T23:29:21.445092" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:21.445293" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:21.445446" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:21.425815" elapsed="0.019662"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:21.423205" elapsed="0.022346"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:21.445861" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:21.445615" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:21.423171" elapsed="0.022784"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:21.450077" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:21.447182" elapsed="0.002947"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:21.446926" elapsed="0.003240"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:21.446904" elapsed="0.003289"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:21.452914" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:21.450479" elapsed="0.002482"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:21.450252" elapsed="0.002745"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:21.450235" elapsed="0.002788"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:21.453648" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:21.453207" 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-08-22T23:29:21.453994" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:21.453755" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:21.454545" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:21.454241" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:21.454078" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:21.453736" elapsed="0.000913"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:21.455175" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:21.454809" 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-08-22T23:29:21.455507" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:21.455274" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:21.456069" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:21.455772" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:21.455605" elapsed="0.000597"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:21.455256" 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-08-22T23:29:21.456394" elapsed="0.000455"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:21.457525" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:21.457091" 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-08-22T23:29:21.457816" elapsed="0.003403"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:29:21.446393" elapsed="0.014896"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:21.461479" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:29:21.461364" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:21.461344" 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-08-22T23:29:21.461752" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:21.461826" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:29:21.464254" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:21.415307" elapsed="0.048977"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:21.464348" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:29:21.464546" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:21.409884" elapsed="0.054690"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:21.465274" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:21.464886" elapsed="0.000474">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:21.464671" elapsed="0.000764">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:21.464649" elapsed="0.000821">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:21.465707" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:21.465541" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:21.465524" elapsed="0.000265"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:21.407198" elapsed="0.058679">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:22.468963" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:22.467980" elapsed="0.001055"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:22.479860" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:22.479596" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:22.480308" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:22.480063" 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-08-22T23:29:22.503877" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:22.504309" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:22.504566" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:22.482549" elapsed="0.022111"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:22.480430" elapsed="0.024343"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:22.505236" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:22.504839" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:22.480406" elapsed="0.025026"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:22.513494" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:22.507916" elapsed="0.005714"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:22.507363" elapsed="0.006348"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:22.507319" elapsed="0.006447"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:22.516878" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:22.514450" elapsed="0.002474"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:22.513891" elapsed="0.003069"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:22.513854" elapsed="0.003130"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:22.517566" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:22.517161" 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-08-22T23:29:22.517920" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:22.517682" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:22.518502" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:22.518168" elapsed="0.000363"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:22.518005" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:22.517663" elapsed="0.000944"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:22.519127" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:22.518766" 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-08-22T23:29:22.519452" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:22.519223" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:22.520004" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:22.519707" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:22.519533" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:22.519205" 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-08-22T23:29:22.520239" elapsed="0.000363"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:22.521068" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:22.520771" 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-08-22T23:29:22.521246" 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-08-22T23:29:22.506328" elapsed="0.017464"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:22.523979" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:29:22.523865" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:22.523846" 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-08-22T23:29:22.524228" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:22.524300" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:29:22.526714" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:22.475012" elapsed="0.051731"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:22.526883" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:29:22.527042" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:22.469529" elapsed="0.057539"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:22.527762" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:22.527353" elapsed="0.000491">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:22.527140" elapsed="0.000779">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:22.527122" elapsed="0.000831">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:22.528172" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:22.528024" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:22.528007" elapsed="0.000245"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:22.466858" elapsed="0.061480">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:23.531364" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:23.530378" elapsed="0.001056"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:23.543530" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:23.543268" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:23.544033" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:23.543771" 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-08-22T23:29:23.566057" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:23.566210" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:23.566322" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:23.546306" elapsed="0.020043"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:23.544155" elapsed="0.022238"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:23.566595" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:23.566420" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:23.544133" elapsed="0.022555"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:23.570202" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:23.567711" elapsed="0.002541"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:23.567470" elapsed="0.002818"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:23.567452" elapsed="0.002862"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:23.572970" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:23.570608" elapsed="0.002410"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:23.570371" elapsed="0.002682"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:23.570355" elapsed="0.002723"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:23.573657" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:23.573251" 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-08-22T23:29:23.574059" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:23.573818" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:23.574630" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:23.574309" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:23.574144" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:23.573799" elapsed="0.000921"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:23.575247" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:23.574877" 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-08-22T23:29:23.575596" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:23.575347" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:23.576173" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:23.575845" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:23.575682" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:23.575329" 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-08-22T23:29:23.576414" elapsed="0.000374"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:23.577248" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:23.576953" 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-08-22T23:29:23.577429" 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-08-22T23:29:23.567044" elapsed="0.012843"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:23.580091" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:29:23.579958" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:23.579940" 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-08-22T23:29:23.580332" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:23.580406" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:29:23.582920" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:23.538110" elapsed="0.044839"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:23.583011" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:29:23.583169" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:23.532016" elapsed="0.051180"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:23.583850" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:23.583473" elapsed="0.000455">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:23.583266" elapsed="0.000759">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:23.583250" elapsed="0.000812">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:23.584278" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:23.584133" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:23.584117" elapsed="0.000243"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:23.529268" elapsed="0.055173">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:24.588290" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:24.587165" elapsed="0.001210"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:24.599502" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:24.599219" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:24.599984" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:24.599728" 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-08-22T23:29:24.620806" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:24.621185" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:24.621416" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:24.602356" elapsed="0.019119"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:24.600135" elapsed="0.021540"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:24.622115" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:24.621751" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:24.600101" elapsed="0.022217"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:24.630924" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:24.624940" elapsed="0.006034"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:24.624349" elapsed="0.006664"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:24.624299" elapsed="0.006743"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:24.633860" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:24.631348" elapsed="0.002560"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:24.631109" elapsed="0.002837"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:24.631091" elapsed="0.002881"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:24.634681" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:24.634183" elapsed="0.000526"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:24.635033" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:24.634783" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:24.635612" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:24.635282" elapsed="0.000375"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:24.635117" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:24.634763" elapsed="0.000963"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:24.636266" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:24.635887" 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-08-22T23:29:24.636637" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:24.636383" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:24.637186" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:24.636885" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:24.636726" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:24.636364" 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-08-22T23:29:24.637439" elapsed="0.002334"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:24.641516" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:24.640689" elapsed="0.000983"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:29:24.642035" elapsed="0.005486"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:29:24.623253" elapsed="0.024414"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:24.648053" elapsed="0.000065"/>
</return>
<status status="PASS" start="2026-08-22T23:29:24.647844" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:24.647791" elapsed="0.000431"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:24.648492" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:24.648619" elapsed="0.000023"/>
</return>
<msg time="2026-08-22T23:29:24.652183" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:24.594812" elapsed="0.057414"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:24.652324" elapsed="0.000040"/>
</return>
<msg time="2026-08-22T23:29:24.652553" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:24.588948" elapsed="0.063665"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:24.653708" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:24.653036" elapsed="0.000808">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:24.652727" elapsed="0.001226">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:24.652701" elapsed="0.001300">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:24.654322" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:24.654104" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:24.654079" elapsed="0.000355"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:24.585708" elapsed="0.068860">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:25.657772" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:25.656741" elapsed="0.001103"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:25.669044" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:25.668776" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:25.669504" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:25.669252" 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-08-22T23:29:25.694660" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:25.694954" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:25.695336" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:25.671763" elapsed="0.023633"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:25.669644" elapsed="0.025849"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:25.695935" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:25.695552" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:25.669621" elapsed="0.026512"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:25.704001" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:25.698507" elapsed="0.005543"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:25.698010" elapsed="0.006076"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:25.697965" elapsed="0.006146"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:25.706713" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:25.704388" elapsed="0.002372"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:25.704167" elapsed="0.002628"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:25.704150" elapsed="0.002670"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:25.707425" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:25.707010" 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-08-22T23:29:25.707804" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:25.707542" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:25.708346" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:25.708046" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:25.707887" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:25.707523" elapsed="0.000907"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:25.708968" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:25.708605" 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-08-22T23:29:25.709293" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:25.709065" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:25.709857" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:25.709530" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:25.709374" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:25.709047" 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-08-22T23:29:25.710092" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:25.710916" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:25.710615" 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-08-22T23:29:25.711116" 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-08-22T23:29:25.696960" elapsed="0.016606"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:25.713764" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:29:25.713654" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:25.713635" 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-08-22T23:29:25.714015" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:25.714086" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:29:25.716480" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:25.662435" elapsed="0.054074"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:25.716570" elapsed="0.000043"/>
</return>
<msg time="2026-08-22T23:29:25.716739" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:25.658340" elapsed="0.058426"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:25.717463" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:25.717100" elapsed="0.000443">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:25.716887" elapsed="0.000745">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:25.716869" elapsed="0.000800">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:25.717886" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:25.717739" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:25.717722" elapsed="0.000243"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:25.655558" elapsed="0.062490">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:26.721403" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:26.719899" elapsed="0.001577"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:26.733196" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:26.732929" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:26.733662" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:26.733399" 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-08-22T23:29:26.761979" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:26.762282" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:26.762505" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:26.735894" elapsed="0.026669"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:26.733783" elapsed="0.028914"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:26.763119" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:26.762759" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:26.733761" elapsed="0.029557"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:26.771465" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:26.765697" elapsed="0.005914"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:26.765165" elapsed="0.006532"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:26.765123" elapsed="0.006632"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:26.774477" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:26.772082" elapsed="0.002444"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:26.771857" elapsed="0.002703"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:26.771838" elapsed="0.002762"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:26.775168" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:26.774775" 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-08-22T23:29:26.775501" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:26.775266" elapsed="0.000363"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:26.776133" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:26.775828" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:26.775659" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:26.775248" elapsed="0.000988"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:26.776784" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:26.776398" 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-08-22T23:29:26.777117" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:26.776884" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:26.777672" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:26.777358" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:26.777200" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:26.776866" 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-08-22T23:29:26.777909" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:26.778731" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:26.778423" 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-08-22T23:29:26.778912" 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-08-22T23:29:26.764145" elapsed="0.017351"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:26.781694" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:29:26.781567" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:26.781549" 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-08-22T23:29:26.781975" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:26.782049" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:29:26.784488" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:26.728177" elapsed="0.056341"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:26.784594" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:29:26.784751" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:26.722047" elapsed="0.062731"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:26.785417" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:26.785057" elapsed="0.000439">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:26.784849" elapsed="0.000719">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:26.784832" elapsed="0.000788">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:26.785836" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:26.785690" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:26.785674" elapsed="0.000243"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:26.718863" elapsed="0.067136">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:27.789371" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:27.788215" elapsed="0.001229"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:27.800343" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:27.799981" elapsed="0.000430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:27.800988" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:27.800644" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:29:27.826877" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:27.827167" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:27.827385" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:27.803545" elapsed="0.023900"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:27.801186" elapsed="0.026356"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:27.827988" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:27.827639" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:27.801156" elapsed="0.027030"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:27.836678" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:27.830521" elapsed="0.006273"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:27.830023" elapsed="0.006855"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:27.829981" elapsed="0.006957"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:27.840346" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:27.837945" elapsed="0.002448"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:27.837067" elapsed="0.003361"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:27.837029" elapsed="0.003425"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:27.841085" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:27.840674" 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-08-22T23:29:27.841436" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:27.841185" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:27.841999" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:27.841696" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:27.841519" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:27.841166" elapsed="0.000921"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:27.842624" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:27.842243" 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-08-22T23:29:27.842961" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:27.842725" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:27.843494" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:27.843199" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:27.843043" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:27.842706" 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-08-22T23:29:27.843752" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:27.844630" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:27.844281" 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-08-22T23:29:27.844878" 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-08-22T23:29:27.829010" elapsed="0.018355"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:27.847548" elapsed="0.000052"/>
</return>
<status status="PASS" start="2026-08-22T23:29:27.847436" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:27.847417" 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-08-22T23:29:27.847812" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:27.847886" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:29:27.850319" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:27.793881" elapsed="0.056467"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:27.850410" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:29:27.850561" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:27.790028" elapsed="0.060575"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:27.851261" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:27.850887" elapsed="0.000458">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:27.850676" elapsed="0.000743">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:27.850658" elapsed="0.000798">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:27.851732" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:27.851526" elapsed="0.000267"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:27.851509" elapsed="0.000309"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:27.787036" elapsed="0.064869">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:28.855095" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:28.854081" elapsed="0.001087"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:28.866035" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:28.865770" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:28.866484" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:28.866237" 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-08-22T23:29:28.886699" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:28.886927" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:28.887027" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:28.868737" elapsed="0.018316"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:28.866624" elapsed="0.020545"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:28.887359" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:28.887202" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:28.866598" elapsed="0.020852"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:28.891007" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:28.888507" elapsed="0.002549"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:28.888284" elapsed="0.002808"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:28.888265" elapsed="0.002852"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:28.893781" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:28.891395" elapsed="0.002433"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:28.891174" elapsed="0.002689"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:28.891157" elapsed="0.002732"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:28.894472" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:28.894067" 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-08-22T23:29:28.894828" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:28.894572" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:28.895375" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:28.895072" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:28.894912" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:28.894554" elapsed="0.000909"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:28.896036" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:28.895635" 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-08-22T23:29:28.896367" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:28.896135" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:28.896930" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:28.896631" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:28.896450" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:28.896117" 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-08-22T23:29:28.897169" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:28.898001" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:28.897700" 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-08-22T23:29:28.898182" elapsed="0.002382"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:29:28.887853" elapsed="0.012792"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:28.900829" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:29:28.900717" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:28.900698" 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-08-22T23:29:28.901076" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:28.901148" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:29:28.903521" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:28.861201" elapsed="0.042350"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:28.903627" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:29:28.903793" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:28.855733" elapsed="0.048090"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:28.904509" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:28.904136" elapsed="0.000511">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:28.903911" elapsed="0.000814">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:28.903889" elapsed="0.000872">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:28.904981" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:28.904833" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:28.904816" elapsed="0.000248"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:28.852893" elapsed="0.052256">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:29.908316" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:29.907223" elapsed="0.001167"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:29.921152" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:29.920874" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:29.921638" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:29.921362" 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-08-22T23:29:29.943169" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:29.943457" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:29.943759" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:29.923866" elapsed="0.019956"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:29.921763" elapsed="0.022158"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:29.944323" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:29.943981" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:29.921739" elapsed="0.022782"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:29.950723" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:29.946845" elapsed="0.003949"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:29.946323" elapsed="0.004521"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:29.946282" elapsed="0.004599"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:29.954569" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:29.951268" elapsed="0.003396"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:29.950960" elapsed="0.003754"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:29.950936" elapsed="0.003812"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:29.955552" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:29.954984" 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-08-22T23:29:29.956058" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:29.955728" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:29.956840" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:29.956392" elapsed="0.000486"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:29.956173" elapsed="0.000852"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:29.955694" elapsed="0.001364"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:29.957830" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:29.957279" 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-08-22T23:29:29.958296" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:29.957971" elapsed="0.000405"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:29.959102" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:29.958680" elapsed="0.000461"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:29.958411" elapsed="0.000782"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:29.957947" elapsed="0.001276"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:29:29.959471" elapsed="0.000569"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:29.961106" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:29.960223" elapsed="0.000912"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:29:29.961296" elapsed="0.002511"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:29:29.945339" elapsed="0.018533"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:29.964054" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:29:29.963944" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:29.963926" 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-08-22T23:29:29.964296" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:29.964369" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:29:29.966887" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:29.914999" elapsed="0.051918"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:29.966978" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:29:29.967131" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:29.908923" elapsed="0.058234"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:29.967842" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:29.967457" elapsed="0.000463">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:29.967228" elapsed="0.000769">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:29.967211" elapsed="0.000821">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:29.968249" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:29.968103" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:29.968086" elapsed="0.000242"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:29.906097" elapsed="0.062311">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:30.971434" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:30.970461" elapsed="0.001044"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:30.982486" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:30.982125" elapsed="0.000429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:30.983129" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:30.982787" 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-08-22T23:29:31.002858" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:31.003160" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:31.003377" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:30.986048" elapsed="0.017387"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:30.983297" elapsed="0.020235"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:31.003972" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:31.003627" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:30.983266" elapsed="0.020901"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:31.011186" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:31.006482" elapsed="0.004773"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:31.005991" elapsed="0.005315"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:31.005950" elapsed="0.005392"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:31.015099" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:31.011775" elapsed="0.003389"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:31.011421" elapsed="0.003792"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:31.011398" elapsed="0.003849"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:31.016053" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:31.015485" 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-08-22T23:29:31.016539" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:31.016211" elapsed="0.000434"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:31.017318" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:31.016901" elapsed="0.000456"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:31.016679" elapsed="0.000729"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:31.016186" elapsed="0.001252"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:31.018179" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:31.017675" 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-08-22T23:29:31.018662" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:31.018315" elapsed="0.000430"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:31.019409" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:31.018999" elapsed="0.000447"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:31.018779" elapsed="0.000716"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:31.018290" 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-08-22T23:29:31.019758" elapsed="0.000515"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:31.020942" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:31.020500" 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-08-22T23:29:31.021185" 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-08-22T23:29:31.005011" elapsed="0.018617"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:31.023848" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:29:31.023737" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:31.023719" 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-08-22T23:29:31.024148" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:31.024227" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:29:31.026630" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:30.976035" elapsed="0.050625"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:31.026721" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:29:31.026872" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:30.972193" elapsed="0.054705"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:31.027571" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:31.027175" elapsed="0.000494">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:31.026968" elapsed="0.000778">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:31.026952" elapsed="0.000828">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:31.027998" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:31.027853" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:31.027836" elapsed="0.000255"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:30.969336" elapsed="0.058838">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:32.031550" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:32.030490" elapsed="0.001169"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:32.043531" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:32.043264" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:32.044001" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:32.043752" 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-08-22T23:29:32.064651" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:32.064956" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:32.065180" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:32.046399" elapsed="0.018840"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:32.044130" elapsed="0.021207"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:32.065806" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:32.065401" elapsed="0.000735"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:32.044102" elapsed="0.022088"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:32.074241" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:32.068525" elapsed="0.005786"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:32.068030" elapsed="0.006332"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:32.067989" elapsed="0.006408"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:32.078190" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:32.074807" elapsed="0.003448"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:32.074474" elapsed="0.003831"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:32.074451" elapsed="0.003888"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:32.079265" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:32.078613" 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-08-22T23:29:32.079756" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:32.079402" elapsed="0.000437"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:32.080514" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:32.080096" elapsed="0.000455"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:32.079873" elapsed="0.000751"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:32.079378" elapsed="0.001277"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:32.081378" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:32.080873" 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-08-22T23:29:32.081944" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:32.081513" elapsed="0.000519"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:32.082730" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:32.082287" elapsed="0.000480"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:32.082066" elapsed="0.000753"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:32.081489" 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-08-22T23:29:32.083063" elapsed="0.000490"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:32.084227" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:32.083803" 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-08-22T23:29:32.084476" elapsed="0.003012"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:29:32.067044" elapsed="0.020514"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:32.087760" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-08-22T23:29:32.087646" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:32.087627" 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-08-22T23:29:32.088012" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:32.088085" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:29:32.090522" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:32.037995" elapsed="0.052557"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:32.090631" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:29:32.090784" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:32.032169" elapsed="0.058641"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:32.091461" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:32.091090" elapsed="0.000461">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:32.090882" elapsed="0.000840">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:32.090865" elapsed="0.000894">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:32.091978" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:32.091830" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:32.091814" elapsed="0.000243"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:32.029137" elapsed="0.063006">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:33.095163" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:33.094213" elapsed="0.001021"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:33.107826" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:33.107547" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:33.108301" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:33.108034" 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-08-22T23:29:33.130123" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:33.130426" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:33.130706" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:33.110555" elapsed="0.020211"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:33.108448" 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-08-22T23:29:33.131352" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:33.130924" elapsed="0.000583"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:33.108418" elapsed="0.023136"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:33.139537" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:33.133970" elapsed="0.005723"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:33.133448" elapsed="0.006330"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:33.133407" elapsed="0.006429"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:33.143368" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:33.140964" elapsed="0.002451"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:33.139963" elapsed="0.003488"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:33.139925" elapsed="0.003668"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:33.144208" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:33.143777" 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-08-22T23:29:33.144541" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:33.144307" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:33.145111" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:33.144804" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:33.144644" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:33.144288" elapsed="0.000978"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:33.145808" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:33.145427" 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-08-22T23:29:33.146133" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:33.145906" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:33.146689" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:33.146376" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:33.146220" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:33.145888" 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-08-22T23:29:33.146925" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:33.147749" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:33.147434" 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-08-22T23:29:33.147926" elapsed="0.002430"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:29:33.132452" elapsed="0.017970"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:33.150625" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:29:33.150493" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:33.150475" 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-08-22T23:29:33.150868" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:33.150939" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:29:33.153517" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:33.103032" elapsed="0.050517"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:33.153627" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:29:33.153782" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:33.095748" elapsed="0.058060"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:33.154456" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:33.154095" elapsed="0.000443">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:33.153878" elapsed="0.000751">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:33.153861" elapsed="0.000804">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:33.154881" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:33.154736" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:33.154719" elapsed="0.000244"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:33.093049" elapsed="0.061996">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:34.158086" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:34.157119" elapsed="0.001040"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:34.169083" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:34.168784" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:34.169545" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:34.169297" 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-08-22T23:29:34.193459" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:34.193689" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:34.193841" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:34.171893" elapsed="0.021978"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:34.169692" elapsed="0.024240"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:34.194196" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:34.193970" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:34.169667" elapsed="0.024626"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:34.198381" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:34.195511" elapsed="0.002922"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:34.195261" elapsed="0.003209"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:34.195206" elapsed="0.003289"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:34.201195" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:34.198793" elapsed="0.002449"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:34.198552" elapsed="0.002727"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:34.198535" elapsed="0.002769"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:34.201938" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:34.201490" 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-08-22T23:29:34.202278" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:34.202039" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:34.202867" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:34.202524" elapsed="0.000372"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:34.202364" elapsed="0.000569"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:34.202021" elapsed="0.000934"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:34.203535" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:34.203118" 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-08-22T23:29:34.203889" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:34.203655" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:34.204427" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:34.204129" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:34.203972" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:34.203636" 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-08-22T23:29:34.204683" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:34.205511" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:34.205202" 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-08-22T23:29:34.205707" 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-08-22T23:29:34.194737" elapsed="0.013463"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:34.208534" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:29:34.208417" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:34.208396" elapsed="0.000254"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:34.208799" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:34.208872" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:29:34.211304" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:34.164356" elapsed="0.046978"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:34.211396" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:29:34.211551" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:34.158694" elapsed="0.052899"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:34.212261" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:34.211878" elapsed="0.000466">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:34.211668" elapsed="0.000750">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:34.211650" elapsed="0.000803">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:34.212738" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:34.212524" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:34.212507" elapsed="0.000319"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:34.156011" elapsed="0.056901">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:35.215976" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:35.214936" elapsed="0.001114"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:35.228459" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:35.228143" elapsed="0.000374"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:35.228949" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:35.228697" 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-08-22T23:29:35.249494" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:35.249701" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:35.249826" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:35.231188" elapsed="0.018666"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:35.229075" elapsed="0.020831"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:35.250128" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:35.249940" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:35.229049" elapsed="0.021170"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:35.254066" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:35.251488" elapsed="0.002628"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:35.251243" elapsed="0.002908"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:35.251223" elapsed="0.002953"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:35.256796" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:35.254452" elapsed="0.002391"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:35.254232" elapsed="0.002645"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:35.254215" elapsed="0.002687"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:35.257506" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:35.257083" 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-08-22T23:29:35.257860" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:35.257622" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:35.258401" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:35.258101" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:35.257942" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:35.257602" elapsed="0.000883"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:35.259049" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:35.258657" 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-08-22T23:29:35.259377" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:35.259147" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:35.259930" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:35.259632" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:35.259458" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:35.259129" 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-08-22T23:29:35.260165" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:35.260999" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:35.260693" 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-08-22T23:29:35.261179" elapsed="0.002371"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:29:35.250733" elapsed="0.012900"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:35.263819" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:29:35.263706" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:35.263687" 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-08-22T23:29:35.264065" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:35.264137" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:29:35.266491" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:35.222533" elapsed="0.043988"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:35.266598" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:29:35.266757" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:35.216542" elapsed="0.050242"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:35.267526" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:35.267152" elapsed="0.000479">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:35.266923" elapsed="0.000924">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:35.266893" elapsed="0.000995">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:35.268112" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:35.267961" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:35.267943" elapsed="0.000250"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:35.213854" elapsed="0.054427">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:36.271449" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:36.270383" elapsed="0.001141"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:36.286213" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:36.285947" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:36.286681" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:36.286417" 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-08-22T23:29:36.347162" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:36.347477" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:36.347751" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:36.288980" elapsed="0.058833"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:36.286805" elapsed="0.061110"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:36.348345" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:36.347983" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:36.286781" elapsed="0.061762"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:36.355854" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:36.350974" elapsed="0.004929"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:36.350399" elapsed="0.005541"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:36.350358" elapsed="0.005607"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:36.358622" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:36.356242" elapsed="0.002428"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:36.356022" elapsed="0.002683"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:36.356005" elapsed="0.002725"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:36.359343" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:36.358918" 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-08-22T23:29:36.359693" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:36.359441" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:36.360244" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:36.359943" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:36.359778" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:36.359423" elapsed="0.000907"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:36.360871" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:36.360487" 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-08-22T23:29:36.361278" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:36.361040" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:36.361839" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:36.361522" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:36.361362" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:36.361021" 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-08-22T23:29:36.362078" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:36.362943" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:36.362609" 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-08-22T23:29:36.363133" 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-08-22T23:29:36.349395" elapsed="0.016312"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:36.365890" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:29:36.365778" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:36.365760" 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-08-22T23:29:36.366138" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:36.366211" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:29:36.368650" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:36.278280" elapsed="0.090400"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:36.368742" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:29:36.368897" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:36.272057" elapsed="0.096866"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:36.369567" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:36.369204" elapsed="0.000458">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:36.368994" elapsed="0.000740">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:36.368978" elapsed="0.000792">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:36.369987" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:36.369841" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:36.369824" elapsed="0.000243"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:36.269236" elapsed="0.100915">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:37.373204" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:37.372222" elapsed="0.001051"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:37.386367" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:37.386102" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:37.387067" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:37.386574" elapsed="0.000540"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:29:37.410285" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:37.410441" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:37.410543" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:37.389478" elapsed="0.021092"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:37.387193" elapsed="0.023444"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:37.410821" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:37.410666" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:37.387171" elapsed="0.023739"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:37.414710" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:37.412022" elapsed="0.002738"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:37.411782" elapsed="0.003014"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:37.411760" elapsed="0.003063"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:37.417467" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:37.415101" elapsed="0.002413"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:37.414881" elapsed="0.002669"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:37.414864" elapsed="0.002724"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:37.418167" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:37.417767" 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-08-22T23:29:37.418564" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:37.418266" elapsed="0.000376"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:37.419129" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:37.418827" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:37.418666" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:37.418248" elapsed="0.000969"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:37.419779" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:37.419375" 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-08-22T23:29:37.420111" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:37.419878" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:37.420664" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:37.420351" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:37.420193" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:37.419860" 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-08-22T23:29:37.420903" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:37.421737" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:37.421417" 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-08-22T23:29:37.421918" 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-08-22T23:29:37.411278" elapsed="0.013119"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:37.424594" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:29:37.424468" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:37.424450" 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-08-22T23:29:37.424886" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:37.424960" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:29:37.427352" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:37.379498" elapsed="0.047883"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:37.427443" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:29:37.427643" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:37.373793" elapsed="0.053878"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:37.428319" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:37.427953" elapsed="0.000445">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:37.427745" elapsed="0.000727">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:37.427727" elapsed="0.000780">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:37.428745" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:37.428594" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:37.428561" elapsed="0.000266"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:37.371043" elapsed="0.057868">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:38.432039" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:38.431018" elapsed="0.001106"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:38.443645" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:38.443241" elapsed="0.000479"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:38.444350" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:38.443948" elapsed="0.000465"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:29:38.464736" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:38.464897" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:38.464998" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:38.446912" elapsed="0.018113"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:38.444523" elapsed="0.020547"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:38.465391" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:38.465101" elapsed="0.000435"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:38.444489" elapsed="0.021134"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:38.473398" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:38.468015" elapsed="0.005432"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:38.467499" elapsed="0.006057"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:38.467458" elapsed="0.006141"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:38.476241" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:38.473883" elapsed="0.002405"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:38.473660" elapsed="0.002664"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:38.473643" elapsed="0.002706"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:38.476972" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:38.476531" 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-08-22T23:29:38.477307" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:38.477072" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:38.477870" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:38.477551" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:38.477391" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:38.477053" elapsed="0.000903"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:38.478479" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:38.478114" 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-08-22T23:29:38.478824" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:38.478592" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:38.479357" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:38.479062" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:38.478906" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:38.478559" 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-08-22T23:29:38.479610" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:38.480425" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:38.480124" 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-08-22T23:29:38.480634" 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-08-22T23:29:38.466463" elapsed="0.016600"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:38.483244" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:29:38.483134" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:38.483116" 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-08-22T23:29:38.483489" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:38.483560" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:29:38.485986" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:38.436535" elapsed="0.049480"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:38.486076" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:29:38.486228" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:38.432710" elapsed="0.053546"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:38.486915" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:38.486535" elapsed="0.000462">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:38.486327" elapsed="0.000743">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:38.486310" elapsed="0.000838">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:38.487373" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:38.487226" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:38.487208" elapsed="0.000247"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:38.429841" elapsed="0.057698">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:39.490482" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:39.489496" elapsed="0.001057"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:39.502956" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:39.502692" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:39.503404" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:39.503158" 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-08-22T23:29:39.522567" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:39.522899" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:39.523120" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:39.505617" elapsed="0.017560"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:39.503526" elapsed="0.019748"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:39.523707" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:39.523333" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:39.503502" elapsed="0.020402"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:39.530914" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:39.526202" elapsed="0.004762"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:39.525689" elapsed="0.005311"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:39.525647" elapsed="0.005379"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:39.533627" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:39.531309" elapsed="0.002364"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:39.531082" elapsed="0.002627"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:39.531065" elapsed="0.002668"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:39.534326" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:39.533926" 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-08-22T23:29:39.534675" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:39.534424" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:39.535223" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:39.534919" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:39.534759" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:39.534406" elapsed="0.000903"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:39.535847" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:39.535465" 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-08-22T23:29:39.536177" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:39.535945" elapsed="0.000347"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:39.536803" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:39.536482" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:39.536320" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:39.535927" 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-08-22T23:29:39.537042" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:39.537878" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:39.537556" 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-08-22T23:29:39.538087" 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-08-22T23:29:39.524715" elapsed="0.015930"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:39.540827" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:29:39.540717" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:39.540698" 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-08-22T23:29:39.541067" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:39.541140" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:29:39.543508" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:39.497177" elapsed="0.046360"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:39.543617" elapsed="0.000118"/>
</return>
<msg time="2026-08-22T23:29:39.543869" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:39.491074" elapsed="0.052822"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:39.544539" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:39.544178" elapsed="0.000457">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:39.543968" elapsed="0.000740">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:39.543951" elapsed="0.000791">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:39.544960" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:39.544813" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:39.544796" elapsed="0.000246"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:39.488391" elapsed="0.056732">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:40.547726" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:40.546764" elapsed="0.001032"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:40.561955" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:40.561701" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:40.562405" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:40.562155" 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-08-22T23:29:40.582367" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:40.582665" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:40.582887" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:40.564656" elapsed="0.018288"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:40.562519" elapsed="0.020521"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:40.583437" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:40.583097" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:40.562500" elapsed="0.021180"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:40.591822" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:40.585941" elapsed="0.005993"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:40.585420" elapsed="0.006593"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:40.585380" elapsed="0.006691"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:40.594706" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:40.592387" elapsed="0.002365"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:40.592167" elapsed="0.002620"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:40.592149" elapsed="0.002663"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:40.595344" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:40.594972" 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-08-22T23:29:40.595703" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:40.595440" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:40.596248" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:40.595944" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:40.595786" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:40.595423" elapsed="0.000910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:40.596867" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:40.596486" 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-08-22T23:29:40.597192" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:40.596964" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:40.597747" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:40.597429" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:40.597273" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:40.596946" 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-08-22T23:29:40.597975" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:40.598768" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:40.598476" 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-08-22T23:29:40.598944" elapsed="0.002320"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:29:40.584450" elapsed="0.016876"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:40.601500" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-08-22T23:29:40.601394" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:40.601376" 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-08-22T23:29:40.601745" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:40.601855" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:29:40.604212" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:40.553841" elapsed="0.050401"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:40.604302" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:29:40.604454" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:40.548279" elapsed="0.056201"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:40.605135" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:40.604786" elapsed="0.000416">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:40.604551" elapsed="0.000719">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:40.604534" elapsed="0.000770">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:40.605516" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:40.605373" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:40.605356" elapsed="0.000255"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:40.545823" elapsed="0.059869">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:41.608234" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:41.607311" elapsed="0.000987"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:41.619620" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:41.619350" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:41.620068" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:41.619825" 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-08-22T23:29:41.639468" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:41.639771" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:41.639991" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:41.622254" elapsed="0.017796"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:41.620180" elapsed="0.019972"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:41.640548" elapsed="0.000079"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:41.640211" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:41.620161" elapsed="0.020613"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:41.648930" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:41.643083" elapsed="0.005958"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:41.642559" elapsed="0.006561"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:41.642518" elapsed="0.006659"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:41.652379" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:41.649966" elapsed="0.002459"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:41.649300" elapsed="0.003160"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:41.649263" elapsed="0.003222"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:41.653052" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:41.652668" 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-08-22T23:29:41.653400" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:41.653151" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:41.653966" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:41.653664" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:41.653481" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:41.653132" elapsed="0.000919"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:41.654570" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:41.654207" 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-08-22T23:29:41.654912" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:41.654682" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:41.655439" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:41.655146" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:41.654992" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:41.654664" elapsed="0.000858"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:29:41.655684" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:41.656471" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:41.656190" 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-08-22T23:29:41.656664" 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-08-22T23:29:41.641617" elapsed="0.017499"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:41.659292" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-08-22T23:29:41.659185" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:41.659168" 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-08-22T23:29:41.659522" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:41.659608" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:29:41.661968" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:41.612940" elapsed="0.049057"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:41.662056" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:29:41.662211" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:41.608813" elapsed="0.053424"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:41.662883" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:41.662513" elapsed="0.000440">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:41.662307" elapsed="0.000713">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:41.662290" elapsed="0.000764">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:41.663305" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:41.663158" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:41.663140" elapsed="0.000247"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:41.606349" elapsed="0.057118">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:42.666554" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:42.665620" elapsed="0.001034"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:42.680933" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:42.680669" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:42.681387" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:42.681135" 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-08-22T23:29:42.702290" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:42.702436" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:42.702546" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:42.683629" elapsed="0.018944"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:42.681508" elapsed="0.021136"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:42.702829" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:42.702673" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:42.681486" elapsed="0.021430"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:42.706394" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:42.703960" elapsed="0.002485"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:42.703739" elapsed="0.002741"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:42.703721" elapsed="0.002785"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:42.709210" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:42.706802" elapsed="0.002460"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:42.706564" elapsed="0.002734"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:42.706548" elapsed="0.002776"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:42.709908" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:42.709497" 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-08-22T23:29:42.710246" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:42.710009" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:42.710812" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:42.710491" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:42.710330" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:42.709990" elapsed="0.000910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:42.711452" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:42.711057" 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-08-22T23:29:42.711807" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:42.711554" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:42.712348" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:42.712050" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:42.711891" elapsed="0.000578"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:42.711535" 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-08-22T23:29:42.712659" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:42.713469" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:42.713176" 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-08-22T23:29:42.713664" 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-08-22T23:29:42.703277" elapsed="0.012866"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:42.716323" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:29:42.716213" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:42.716195" 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-08-22T23:29:42.716563" elapsed="0.000039"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:42.716654" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:29:42.719163" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:42.676293" elapsed="0.042900"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:42.719256" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:29:42.719427" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:42.667143" elapsed="0.052314"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:42.720129" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:42.719763" elapsed="0.000443">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:42.719531" elapsed="0.000748">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:42.719513" elapsed="0.000802">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:42.720634" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:42.720456" elapsed="0.000240"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:42.720435" elapsed="0.000285"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:42.664493" elapsed="0.056312">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:43.723377" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:43.722456" elapsed="0.000986"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:43.734962" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:43.734606" elapsed="0.000423"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:43.735604" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:43.735240" 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-08-22T23:29:43.755563" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:43.755757" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:43.755858" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:43.738596" elapsed="0.017289"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:43.735765" elapsed="0.020165"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:43.756112" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:43.755957" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:43.735739" 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-08-22T23:29:43.764396" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:43.758490" elapsed="0.006017"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:43.757995" elapsed="0.006624"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:43.757953" elapsed="0.006728"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:43.768343" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:43.765311" elapsed="0.003079"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:43.764812" elapsed="0.003614"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:43.764775" elapsed="0.003677"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:43.769026" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:43.768641" 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-08-22T23:29:43.769363" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:43.769126" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:43.769948" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:43.769622" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:43.769448" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:43.769108" elapsed="0.000927"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:43.770557" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:43.770194" 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-08-22T23:29:43.770912" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:43.770675" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:43.771444" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:43.771150" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:43.770993" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:43.770658" elapsed="0.000870"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:29:43.771691" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:43.772479" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:43.772199" elapsed="0.000307"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:29:43.772672" 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-08-22T23:29:43.756969" elapsed="0.018145"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:43.775296" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-08-22T23:29:43.775184" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:43.775165" 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-08-22T23:29:43.775532" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:43.775620" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:29:43.778020" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:43.728400" elapsed="0.049649"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:43.778190" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:29:43.778354" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:43.723950" elapsed="0.054432"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:43.779038" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:43.778683" elapsed="0.000426">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:43.778453" elapsed="0.000724">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:43.778436" elapsed="0.000776">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:43.779432" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:43.779287" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:43.779270" elapsed="0.000242"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:43.721476" elapsed="0.058132">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:44.782499" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:44.781517" elapsed="0.001052"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:44.794308" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:44.793926" elapsed="0.000469"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:44.794977" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:44.794630" 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-08-22T23:29:44.816655" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:44.816814" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:44.816913" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:44.797891" elapsed="0.019049"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:44.795142" elapsed="0.021842"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:44.817165" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:44.817012" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:44.795112" elapsed="0.022141"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:44.820753" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:44.818290" elapsed="0.002513"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:44.818065" elapsed="0.002774"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:44.818047" elapsed="0.002818"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:44.823517" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:44.821142" elapsed="0.002421"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:44.820922" elapsed="0.002691"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:44.820905" elapsed="0.002735"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:44.824221" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:44.823816" 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-08-22T23:29:44.824642" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:44.824386" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:44.825197" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:44.824892" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:44.824729" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:44.824367" elapsed="0.000924"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:44.825845" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:44.825450" elapsed="0.000423"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:44.826177" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:44.825945" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:44.826745" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:44.826427" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:44.826264" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:44.825927" 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-08-22T23:29:44.826984" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:44.827812" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:44.827504" 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-08-22T23:29:44.827992" 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-08-22T23:29:44.817638" elapsed="0.012838"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:44.830698" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:29:44.830547" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:44.830528" 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-08-22T23:29:44.830941" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:44.831014" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:29:44.833419" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:44.787495" elapsed="0.045953"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:44.833509" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:29:44.833678" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:44.783106" elapsed="0.050599"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:44.834345" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:44.833985" elapsed="0.000435">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:44.833777" elapsed="0.000714">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:44.833760" elapsed="0.000772">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:44.834769" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:44.834622" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:44.834603" elapsed="0.000247"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:44.780440" elapsed="0.054540">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:45.838210" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:45.837222" elapsed="0.001060"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:45.851146" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:45.850883" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:45.851618" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:45.851354" 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-08-22T23:29:45.871440" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:45.871777" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:45.872000" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:45.853856" elapsed="0.018203"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:45.851741" elapsed="0.020417"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:45.872563" elapsed="0.000085"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:45.872220" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:45.851719" 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-08-22T23:29:45.880974" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:45.875134" elapsed="0.005962"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:45.874568" elapsed="0.006618"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:45.874526" elapsed="0.006721"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:45.885079" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:45.881911" elapsed="0.003214"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:45.881381" elapsed="0.003780"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:45.881343" elapsed="0.003843"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:45.885799" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:45.885370" 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-08-22T23:29:45.886134" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:45.885897" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:45.886705" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:45.886375" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:45.886216" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:45.885880" elapsed="0.000917"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:45.887318" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:45.886955" 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-08-22T23:29:45.887661" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:45.887415" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:45.888197" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:45.887901" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:45.887745" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:45.887398" 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-08-22T23:29:45.888432" elapsed="0.000368"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:45.889342" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:45.889040" 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-08-22T23:29:45.889523" 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-08-22T23:29:45.873612" elapsed="0.018491"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:45.892286" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-08-22T23:29:45.892174" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:45.892156" 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-08-22T23:29:45.892535" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:45.892625" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:29:45.895142" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:45.845067" elapsed="0.050105"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:45.895235" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:29:45.895390" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:45.838848" elapsed="0.056570"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:45.896082" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:45.895717" elapsed="0.000442">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:45.895490" elapsed="0.000743">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:45.895473" elapsed="0.000795">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:45.896492" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:45.896345" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:45.896328" elapsed="0.000245"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:45.836022" elapsed="0.060651">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:46.899566" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:46.898568" elapsed="0.001099"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:46.911137" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:46.910780" elapsed="0.000424"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:46.911774" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:46.911413" elapsed="0.000425"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:29:46.930636" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:46.930787" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:46.930961" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:46.914732" elapsed="0.016256"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:46.911940" elapsed="0.019092"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:46.931215" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:46.931060" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:46.911910" elapsed="0.019392"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:46.935848" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:46.932330" elapsed="0.003630"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:46.932107" elapsed="0.003933"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:46.932088" elapsed="0.004009"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:46.942045" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:46.936753" elapsed="0.005397"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:46.936223" elapsed="0.006006"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:46.936185" elapsed="0.006101"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:46.943552" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:46.942694" 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-08-22T23:29:46.944393" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:46.943808" elapsed="0.000719"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:46.945736" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:46.944972" elapsed="0.000824"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:46.944608" elapsed="0.001272"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:46.943767" elapsed="0.002160"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:46.946788" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:46.946287" elapsed="0.000528"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:46.947117" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:46.946886" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:46.947667" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:46.947356" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:46.947197" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:46.946868" 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-08-22T23:29:46.947901" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:46.948725" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:46.948415" 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-08-22T23:29:46.948905" 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-08-22T23:29:46.931682" elapsed="0.019765"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:46.951645" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:29:46.951517" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:46.951498" 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-08-22T23:29:46.951884" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:46.951955" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:29:46.954299" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:46.904562" elapsed="0.049766"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:46.954390" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:29:46.954541" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:46.900159" elapsed="0.054408"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:46.955275" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:46.954912" elapsed="0.000443">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:46.954700" elapsed="0.000731">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:46.954682" elapsed="0.000784">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:46.955698" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:46.955535" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:46.955519" elapsed="0.000263"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:46.897495" elapsed="0.058369">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:47.959325" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:47.958302" elapsed="0.001097"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:47.971926" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:47.971541" elapsed="0.000454"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:47.972614" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:47.972243" 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-08-22T23:29:47.992871" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:47.993028" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:47.993129" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:47.975114" elapsed="0.018042"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:47.972785" elapsed="0.020416"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:47.993388" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:47.993229" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:47.972753" elapsed="0.020725"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:47.997044" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:47.994519" elapsed="0.002575"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:47.994294" elapsed="0.002837"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:47.994275" elapsed="0.002882"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:48.000855" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:47.997512" elapsed="0.003407"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:47.997214" elapsed="0.003756"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:47.997197" elapsed="0.003810"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:48.001825" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:48.001251" 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-08-22T23:29:48.002294" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:48.001964" elapsed="0.000499"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:48.003184" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:48.002757" elapsed="0.000465"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:48.002503" elapsed="0.000772"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:48.001938" elapsed="0.001367"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:48.004058" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:48.003526" 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-08-22T23:29:48.004538" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:48.004213" elapsed="0.000429"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:48.005318" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:48.004901" elapsed="0.000454"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:48.004678" elapsed="0.000729"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:48.004186" 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-08-22T23:29:48.005670" elapsed="0.000490"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:48.006830" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:48.006388" 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-08-22T23:29:48.007081" 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-08-22T23:29:47.993867" elapsed="0.016188"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:48.010240" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:29:48.010128" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:48.010108" 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-08-22T23:29:48.010486" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:48.010559" elapsed="0.000014"/>
</return>
<msg time="2026-08-22T23:29:48.012971" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:47.965228" elapsed="0.047772"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:48.013061" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:29:48.013213" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:47.959933" elapsed="0.053307"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:48.013898" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:48.013517" elapsed="0.000459">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:48.013310" elapsed="0.000740">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:48.013293" elapsed="0.000791">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:48.014300" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:48.014154" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:48.014138" elapsed="0.000244"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:47.956978" elapsed="0.057486">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:49.017700" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:49.016547" elapsed="0.001228"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:49.030656" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:49.030379" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:49.031118" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:49.030857" 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-08-22T23:29:49.056718" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:49.057003" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:49.057223" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:49.033328" elapsed="0.023956"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:49.031241" elapsed="0.026141"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:49.057818" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:49.057442" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:49.031217" elapsed="0.026802"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:49.065047" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:49.060349" elapsed="0.004776"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:49.059856" elapsed="0.005321"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:49.059815" elapsed="0.005399"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:49.068987" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:49.065639" elapsed="0.003413"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:49.065294" elapsed="0.003808"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:49.065270" elapsed="0.003866"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:49.069965" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:49.069377" 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-08-22T23:29:49.070429" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:49.070103" elapsed="0.000407"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:49.071347" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:49.070788" elapsed="0.000586"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:49.070544" elapsed="0.000868"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:49.070077" elapsed="0.001357"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:49.071974" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:49.071607" 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-08-22T23:29:49.072302" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:49.072072" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:49.072854" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:49.072540" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:49.072384" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:49.072053" 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-08-22T23:29:49.073095" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:49.073931" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:49.073629" 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-08-22T23:29:49.074183" 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-08-22T23:29:49.058843" elapsed="0.017940"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:49.076965" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-08-22T23:29:49.076855" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:49.076837" 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-08-22T23:29:49.077222" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:49.077295" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:29:49.079719" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:49.024326" elapsed="0.055422"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:49.079810" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:29:49.079964" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:49.018270" elapsed="0.061721"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:49.080662" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:49.080273" elapsed="0.000474">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:49.080062" elapsed="0.000761">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:49.080045" elapsed="0.000813">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:49.081075" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:49.080928" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:49.080912" elapsed="0.000244"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:49.015410" elapsed="0.065830">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.084197" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:50.083236" elapsed="0.001030"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.095600" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:50.095221" elapsed="0.000452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.096236" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:50.095888" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:29:50.117808" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:29:50.118134" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:29:50.118371" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:29:50.099243" elapsed="0.019191"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:50.096419" elapsed="0.022266"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.119131" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:50.118760" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.096383" elapsed="0.022962"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.125775" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:50.121881" elapsed="0.003964"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:50.121318" elapsed="0.004578"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.121275" elapsed="0.004657"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.129620" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:50.126340" elapsed="0.003347"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:50.126032" elapsed="0.003704"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.126007" elapsed="0.003764"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.130601" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:50.130030" 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-08-22T23:29:50.131069" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:50.130741" elapsed="0.000410"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.131852" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:50.131406" elapsed="0.000484"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:50.131185" elapsed="0.000756"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.130716" elapsed="0.001255"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.132727" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:50.132186" 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-08-22T23:29:50.133184" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:50.132865" elapsed="0.000400"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.133950" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:50.133516" elapsed="0.000502"/>
</kw>
<status status="PASS" start="2026-08-22T23:29:50.133299" elapsed="0.000772"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.132840" elapsed="0.001261"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:29:50.134310" elapsed="0.000387"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:29:50.135156" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:29:50.134859" 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-08-22T23:29:50.135334" elapsed="0.002380"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:29:50.120244" elapsed="0.017534"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:29:50.137959" elapsed="0.000047"/>
</return>
<status status="PASS" start="2026-08-22T23:29:50.137849" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.137831" 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-08-22T23:29:50.138215" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:29:50.138288" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:29:50.140692" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:29:50.089032" elapsed="0.051689"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:29:50.140782" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:29:50.140934" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:29:50.084784" elapsed="0.056176"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.141617" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:29:50.141236" elapsed="0.000497">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:50.141030" elapsed="0.000778">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:50.141013" elapsed="0.000831">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.142072" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:50.141915" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:29:50.141898" elapsed="0.000256"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:29:50.082148" elapsed="0.060089">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<msg time="2026-08-22T23:29:50.142333" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:28:49.523926" elapsed="60.618507">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${node2_session}</arg>
<arg>${original_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.142636" elapsed="0.000023"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${node3_session}</arg>
<arg>${original_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.142820" elapsed="0.000021"/>
</kw>
<doc>Check if the data we just added into the cluster is really there</doc>
<status status="FAIL" start="2026-08-22T23:28:49.270743" elapsed="60.872251">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</test>
<test id="s1-s4-t8" name="Find_And_Shutdown_Device_Entity_Owner" 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-08-22T23:29:50.146454" elapsed="0.000227"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:29:50.146189" 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-08-22T23:29:50.147727" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:29:50.147615" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.147596" 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-08-22T23:29:50.152873" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:29:50.152765" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.152747" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.153940" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:29:50.153537" elapsed="0.000441"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.154441" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:29:50.154136" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:29:50.154512" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:29:50.154684" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:29:50.153164" 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-08-22T23:29:50.160140" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:29:50.160032" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.160013" 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-08-22T23:29:50.161429" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:29:50.161322" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.161303" elapsed="0.000331"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:29:50.162097" level="INFO">${karaf_connection_index} = 25</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:29:50.161778" elapsed="0.000346"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:29:50.162503" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:29:50.162280" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:29:50.198552" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:29:50.163034" elapsed="0.035632"/>
</kw>
<msg time="2026-08-22T23:29:50.198828" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:29:50.198874" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:29:50.162702" elapsed="0.036207"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:29:50.222020" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "F "i "n "d "_ "A "n "d "_ "S "h "u "t "d "o "w "n "_ "D "e "v "i "c "e "_ "E "n "t "i "t "y "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:29:50.199410" elapsed="0.022711"/>
</kw>
<msg time="2026-08-22T23:29:50.222278" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:29:50.222324" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "F "i "n "d "_ "A "n "d "_ "S "h "u "t "d "o "w "n "_ "D "e "v "i "c "e "_ "E "n "t "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:29:50.199077" elapsed="0.023282"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.222679" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:50.222437" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.222417" elapsed="0.000341"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.223205" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "F "i "n "d "_ "A "n "d "_ "S "h "u "t "d "o "w "n "_ "D "e "v "i "c "e "_ "E "n "t "i "t "y "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:50.222901" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.223548" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:50.223336" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.223319" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:29:50.223680" 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-08-22T23:29:50.226200" elapsed="0.001835"/>
</kw>
<msg time="2026-08-22T23:29:50.228100" 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-08-22T23:29:50.225109" elapsed="0.003119"/>
</kw>
<kw name="Open 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-08-22T23:29:50.228502" elapsed="0.000098"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.228864" 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-08-22T23:29:50.224460" elapsed="0.004590"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:29:50.223936" elapsed="0.005189"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:29:50.161021" elapsed="0.068211"/>
</kw>
<msg time="2026-08-22T23:29:50.229324" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:29:50.229370" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "F "i "n "d "_ "A "n "d "_ "S "h "u "t "d "o "w "n "_ "D "e "v "i "c "e "_ "E "n "t "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:29:50.160356" elapsed="0.069050"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:29:50.229670" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-08-22T23:29:50.229483" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.229465" 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 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.230183" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.230547" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:29:50.230653" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:29:50.159695" elapsed="0.071067"/>
</kw>
<msg time="2026-08-22T23:29:50.230854" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:29:50.230897" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "F "i "n "d "_ "A "n "d "_ "S "h "u "t "d "o "w "n "_ "D "e "v "i "c "e "_ "E "n "t "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:29:50.155082" elapsed="0.075849"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.231252" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:50.231006" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.230989" elapsed="0.000342"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:29:50.154942" elapsed="0.076412"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:29:50.236729" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:29:50.236622" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.236602" 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-08-22T23:29:50.237949" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:29:50.237826" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.237808" elapsed="0.000210"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:29:50.238451" level="INFO">${karaf_connection_index} = 26</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:29:50.238159" elapsed="0.000319"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:29:50.238865" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:29:50.238651" elapsed="0.000240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:29:50.277380" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:29:50.239380" elapsed="0.038115"/>
</kw>
<msg time="2026-08-22T23:29:50.277690" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:29:50.277739" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:29:50.239049" elapsed="0.038726"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:29:50.299475" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "F "i "n "d "_ "A "n "d "_ "S "h "u "t "d "o "w "n "_ "D "e "v "i "c "e "_ "E "n "t "i "t "y "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:29:50.278344" elapsed="0.021250"/>
</kw>
<msg time="2026-08-22T23:29:50.299758" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:29:50.299804" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "F "i "n "d "_ "A "n "d "_ "S "h "u "t "d "o "w "n "_ "D "e "v "i "c "e "_ "E "n "t "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:29:50.277988" elapsed="0.021852"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.300139" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:50.299918" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.299898" elapsed="0.000320"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.300671" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "F "i "n "d "_ "A "n "d "_ "S "h "u "t "d "o "w "n "_ "D "e "v "i "c "e "_ "E "n "t "i "t "y "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:50.300358" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.301018" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:50.300804" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.300786" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:29:50.301130" 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-08-22T23:29:50.303691" elapsed="0.000149"/>
</kw>
<msg time="2026-08-22T23:29:50.303901" 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-08-22T23:29:50.302628" 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-08-22T23:29:50.304302" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.304657" 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-08-22T23:29:50.302001" elapsed="0.002839"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:29:50.301422" elapsed="0.003484"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:29:50.237504" elapsed="0.067500"/>
</kw>
<msg time="2026-08-22T23:29:50.305097" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:29:50.305141" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "F "i "n "d "_ "A "n "d "_ "S "h "u "t "d "o "w "n "_ "D "e "v "i "c "e "_ "E "n "t "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:29:50.236947" elapsed="0.068229"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:29:50.305361" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:29:50.305254" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.305235" 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-08-22T23:29:50.306090" 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-08-22T23:29:50.306430" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:29:50.306504" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:29:50.236269" elapsed="0.070456"/>
</kw>
<msg time="2026-08-22T23:29:50.306822" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:29:50.306865" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "F "i "n "d "_ "A "n "d "_ "S "h "u "t "d "o "w "n "_ "D "e "v "i "c "e "_ "E "n "t "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:29:50.231636" elapsed="0.075264"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.307226" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:50.306975" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.306957" elapsed="0.000346"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:29:50.231476" elapsed="0.075850"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:29:50.312698" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:29:50.312572" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.312554" 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-08-22T23:29:50.313925" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:29:50.313794" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.313775" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:29:50.314430" level="INFO">${karaf_connection_index} = 27</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:29:50.314134" elapsed="0.000322"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:29:50.314843" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:29:50.314628" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:29:50.350708" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:29:50.315357" elapsed="0.035629"/>
</kw>
<msg time="2026-08-22T23:29:50.351295" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:29:50.351371" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:29:50.315026" elapsed="0.036403"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:29:50.377653" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "F "i "n "d "_ "A "n "d "_ "S "h "u "t "d "o "w "n "_ "D "e "v "i "c "e "_ "E "n "t "i "t "y "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:29:50.352536" elapsed="0.025371"/>
</kw>
<msg time="2026-08-22T23:29:50.378138" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:29:50.378186" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "F "i "n "d "_ "A "n "d "_ "S "h "u "t "d "o "w "n "_ "D "e "v "i "c "e "_ "E "n "t "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:29:50.351912" elapsed="0.026312"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.378694" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:50.378341" elapsed="0.000416"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.378308" elapsed="0.000476"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.379319" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "F "i "n "d "_ "A "n "d "_ "S "h "u "t "d "o "w "n "_ "D "e "v "i "c "e "_ "E "n "t "i "t "y "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:50.378938" 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-08-22T23:29:50.379702" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:50.379463" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.379444" elapsed="0.000341"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:29:50.379824" 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-08-22T23:29:50.382635" elapsed="0.000157"/>
</kw>
<msg time="2026-08-22T23:29:50.382856" 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-08-22T23:29:50.381413" 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-08-22T23:29:50.383276" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.383637" 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-08-22T23:29:50.380746" elapsed="0.003082"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:29:50.380140" elapsed="0.003754"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:29:50.313470" elapsed="0.070526"/>
</kw>
<msg time="2026-08-22T23:29:50.384095" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:29:50.384141" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "F "i "n "d "_ "A "n "d "_ "S "h "u "t "d "o "w "n "_ "D "e "v "i "c "e "_ "E "n "t "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:29:50.312913" elapsed="0.071269"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:29:50.384375" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:29:50.384262" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.384243" elapsed="0.000217"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.384923" 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-08-22T23:29:50.385527" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:29:50.385724" 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-08-22T23:29:50.312233" elapsed="0.073642"/>
</kw>
<msg time="2026-08-22T23:29:50.385974" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:29:50.386019" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "F "i "n "d "_ "A "n "d "_ "S "h "u "t "d "o "w "n "_ "D "e "v "i "c "e "_ "E "n "t "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:29:50.307602" elapsed="0.078454"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.386392" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:50.386135" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.386117" elapsed="0.000408"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:29:50.307446" elapsed="0.079107"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:29:50.154765" elapsed="0.231843"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:29:50.152386" elapsed="0.234288"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:29:50.147309" elapsed="0.239423"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:29:50.146885" elapsed="0.239895"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:29:50.143996" elapsed="0.242840"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-08-22T23:29:50.400093" level="INFO">${device_type} = netconf</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-08-22T23:29:50.399877" elapsed="0.000248"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:29:50.400286" elapsed="0.000200"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:29:50.400872" level="INFO">${device_id_prefix} = KeyedInstanceIdentifier{targetType=interface org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node, path=[org.opendaylight.yang.gen.v1.urn.t...</msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:29:50.400656" elapsed="0.000245"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.401345" level="INFO">KeyedInstanceIdentifier{targetType=interface org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node, path=[org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology, org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology[key=TopologyKey{_topologyId=Uri{_value=topology-netconf}}], org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node[key=NodeKey{_nodeId=Uri{_value=</msg>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:50.401086" elapsed="0.000309"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:29:50.401540" elapsed="0.000225"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:29:50.402139" level="INFO">${device_id_suffix} = }}]]}</msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:29:50.401929" elapsed="0.000236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.402590" level="INFO">}}]]}</msg>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:50.402331" elapsed="0.000306"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.403133" level="INFO">${id} = KeyedInstanceIdentifier{targetType=interface org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node, path=[org.opendaylight.yang.gen.v1.urn.t...</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:50.402789" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.403558" level="INFO">KeyedInstanceIdentifier{targetType=interface org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node, path=[org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology, org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology[key=TopologyKey{_topologyId=Uri{_value=topology-netconf}}], org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node[key=NodeKey{_nodeId=Uri{_value=netconf-test-device}}]]}</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:50.403322" elapsed="0.000362"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.404124" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:29:50.403837" elapsed="0.000313"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:29:50.411052" elapsed="0.000220"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:29:50.416495" elapsed="0.000241"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.417220" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-08-22T23:29:50.416896" elapsed="0.000351"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:29:50.418134" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:29:50.417861" elapsed="0.000301"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:29:50.418214" elapsed="0.000040"/>
</return>
<msg time="2026-08-22T23:29:50.418462" level="INFO">${ip} = 10.30.170.200</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:29:50.417447" elapsed="0.001041"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.419067" level="INFO">${entity_type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:29:50.418668" elapsed="0.000426"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.419620" level="INFO">${url} = http://10.30.170.200:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-08-22T23:29:50.419251" elapsed="0.000397"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-08-22T23:29:50.420053" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "org.opendaylight.mdsal.ServiceEntityType",
            "name": "KeyedInstanceIdentifier{targetType=interface org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node, path=[org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology, org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology[key=TopologyKey{_topologyId=Uri{_value=topology-netconf}}], org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node[key=NodeKey{_nodeId=Uri{_value=netconf-test-device}}]]}"
        }
    }
    </msg>
<msg time="2026-08-22T23:29:50.458782" level="INFO">Response &lt;Response [200]&gt;</msg>
<msg time="2026-08-22T23:29:50.458987" level="INFO">Response JSON {'odl-entity-owners:output': {}}</msg>
<msg time="2026-08-22T23:29:50.459222" level="FAIL">KeyError: 'candidate-nodes'</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-08-22T23:29:50.419811" elapsed="0.040210">KeyError: 'candidate-nodes'</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.460491" elapsed="0.000056"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.460915" elapsed="0.000048"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.461286" elapsed="0.000046"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.461704" elapsed="0.000048"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.462090" elapsed="0.000045"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.462451" elapsed="0.000045"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.463091" elapsed="0.000045"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.463468" elapsed="0.000044"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.463853" elapsed="0.000045"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-08-22T23:29:50.462806" elapsed="0.001167"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-08-22T23:29:50.462632" elapsed="0.001403"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.464344" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-08-22T23:29:50.464485" elapsed="0.000041"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-08-22T23:29:50.415973" elapsed="0.048809">KeyError: 'candidate-nodes'</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-08-22T23:29:50.464941" elapsed="0.000035"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and KeyedInstanceIdentifier{targetType=interface org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node, path=[org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology, org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology[key=TopologyKey{_topologyId=Uri{_value=topology-netconf}}], org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node[key=NodeKey{_nodeId=Uri{_value=netconf-test-device}}]]}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-08-22T23:29:50.408689" elapsed="0.056474">KeyError: 'candidate-nodes'</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.465555" elapsed="0.000075"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and KeyedInstanceIdentifier{targetType=interface org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node, path=[org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology, org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology[key=TopologyKey{_topologyId=Uri{_value=topology-netconf}}], org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node[key=NodeKey{_nodeId=Uri{_value=netconf-test-device}}]]}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.470815" elapsed="0.000031"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.471019" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-08-22T23:29:50.471086" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type netconf. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-08-22T23:29:50.399301" elapsed="0.071893">KeyError: 'candidate-nodes'</status>
</kw>
<msg time="2026-08-22T23:29:50.471325" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:29:50.471370" level="INFO">${results} = KeyError: 'candidate-nodes'</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:29:50.398672" elapsed="0.072722"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-08-22T23:29:50.471639" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:29:50.471493" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.471470" elapsed="0.000237"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:29:50.473128" elapsed="0.000213"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.473849" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-08-22T23:29:50.473493" elapsed="0.000384"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:29:50.474709" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:29:50.474414" elapsed="0.000322"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:29:50.474786" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:29:50.474943" level="INFO">${ip} = 10.30.170.200</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:29:50.474069" elapsed="0.000900"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.475529" level="INFO">${entity_type} = netconf-node/netconf-test-device</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:29:50.475143" elapsed="0.000413"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.476312" level="INFO">${url} = http://10.30.170.200:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-08-22T23:29:50.475732" elapsed="0.000612"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-08-22T23:29:50.476763" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "netconf-node/netconf-test-device",
            "name": "netconf-test-device"
        }
    }
    </msg>
<msg time="2026-08-22T23:29:50.485490" level="INFO">Response &lt;Response [200]&gt;</msg>
<msg time="2026-08-22T23:29:50.485564" level="INFO">Response JSON {'odl-entity-owners:output': {}}</msg>
<msg time="2026-08-22T23:29:50.485726" level="FAIL">KeyError: 'candidate-nodes'</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-08-22T23:29:50.476531" elapsed="0.009412">KeyError: 'candidate-nodes'</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.486123" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.486293" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.486626" elapsed="0.000049"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.486998" elapsed="0.000045"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.487372" elapsed="0.000044"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.487851" elapsed="0.000047"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.488433" elapsed="0.000045"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.488846" elapsed="0.000046"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.489204" elapsed="0.000045"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-08-22T23:29:50.488151" elapsed="0.001172"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-08-22T23:29:50.487999" elapsed="0.001383"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.489746" elapsed="0.000047"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-08-22T23:29:50.489883" elapsed="0.000037"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type netconf. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-08-22T23:29:50.472540" elapsed="0.017584">KeyError: 'candidate-nodes'</status>
</kw>
<msg time="2026-08-22T23:29:50.490378" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:29:50.490476" level="INFO">${results} = KeyError: 'candidate-nodes'</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:29:50.471862" elapsed="0.018666"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.491978" level="FAIL">Could not parse owner and candidates for device netconf-test-device</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-08-22T23:29:50.491229" elapsed="0.000886">Could not parse owner and candidates for device netconf-test-device</status>
</kw>
<status status="FAIL" start="2026-08-22T23:29:50.490751" elapsed="0.001501">Could not parse owner and candidates for device netconf-test-device</status>
</branch>
<status status="FAIL" start="2026-08-22T23:29:50.490708" elapsed="0.001618">Could not parse owner and candidates for device netconf-test-device</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-08-22T23:29:50.492429" elapsed="0.000036"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type netconf. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-08-22T23:29:50.398057" elapsed="0.094623">Could not parse owner and candidates for device netconf-test-device</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.493075" elapsed="0.000049"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.493442" elapsed="0.000044"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-08-22T23:29:50.493609" elapsed="0.000037"/>
</return>
<var>${owner}</var>
<var>${followers}</var>
<arg>${DEVICE NAME}</arg>
<arg>netconf</arg>
<arg>1</arg>
<doc>Returns the owner and a list of successors for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-08-22T23:29:50.395347" elapsed="0.098506">Could not parse owner and candidates for device netconf-test-device</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${followers}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.494289" elapsed="0.000047"/>
</kw>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${followers}</arg>
<arg>2</arg>
<arg>Wrong count of followers returned</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.494715" elapsed="0.000045"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_device_owner}</arg>
<arg>${owner}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.495108" elapsed="0.000046"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${follower1}</arg>
<arg>${followers}[0]</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.495485" elapsed="0.000045"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${follower2}</arg>
<arg>${followers}[1]</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.495892" elapsed="0.000045"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<var>${original_device_owner_session}</var>
<arg>member_index=${original_device_owner}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.496393" elapsed="0.000053"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<var>${follower1_session}</var>
<arg>member_index=${follower1}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.496918" elapsed="0.000127"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<var>${follower2_session}</var>
<arg>member_index=${follower2}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.497500" elapsed="0.000051"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_device_owner_session}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.497977" elapsed="0.000047"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${follower1_session}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.498357" elapsed="0.000051"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${follower2_session}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.498637" elapsed="0.000021"/>
</kw>
<kw name="Kill_Single_Member" owner="ClusterManagement">
<arg>${owner}</arg>
<doc>Convenience keyword that kills the specified member of the cluster.
The KW will return a list of available members: ${updated index_list}=${original_index_list}-${member}</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.498890" elapsed="0.000023"/>
</kw>
<doc>Simulate a failure of the owner of the entity that represents the device.</doc>
<status status="FAIL" start="2026-08-22T23:29:50.143401" elapsed="0.355655">Could not parse owner and candidates for device netconf-test-device</status>
</test>
<test id="s1-s4-t9" name="Wait_For_New_Owner_To_Appear" line="161">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:29:50.502572" elapsed="0.000228"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:29:50.502310" 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-08-22T23:29:50.503844" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:29:50.503733" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.503714" 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-08-22T23:29:50.508957" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:29:50.508850" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.508832" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.510041" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:29:50.509631" elapsed="0.000437"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.510530" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:29:50.510226" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:29:50.510616" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:29:50.510773" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:29:50.509245" 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-08-22T23:29:50.516200" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:29:50.516092" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.516074" 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-08-22T23:29:50.517430" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:29:50.517319" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.517301" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:29:50.517988" level="INFO">${karaf_connection_index} = 25</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:29:50.517681" elapsed="0.000333"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:29:50.518394" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:29:50.518172" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:29:50.551164" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:29:50.518925" elapsed="0.032341"/>
</kw>
<msg time="2026-08-22T23:29:50.551433" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:29:50.551479" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:29:50.518594" elapsed="0.032919"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:29:50.569242" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "N "e "w "_ "O "w "n "e "r "_ "T "o "_ "A "p "p "e "a "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:29:50.552042" elapsed="0.017336"/>
</kw>
<msg time="2026-08-22T23:29:50.569540" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:29:50.569626" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "N "e "w "_ "O "w "n "e "r "_ "T "o "_ "A "p "p "e "a "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-08-22T23:29:50.551704" elapsed="0.017961"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.569965" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:50.569744" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.569725" elapsed="0.000320"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.570488" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "N "e "w "_ "O "w "n "e "r "_ "T "o "_ "A "p "p "e "a "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:50.570186" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.570852" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:50.570637" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.570618" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:29:50.570964" 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-08-22T23:29:50.573480" elapsed="0.000190"/>
</kw>
<msg time="2026-08-22T23:29:50.573732" 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-08-22T23:29:50.572389" elapsed="0.001472"/>
</kw>
<kw name="Open 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-08-22T23:29:50.574141" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.574472" 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-08-22T23:29:50.571772" elapsed="0.002905"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:29:50.571219" elapsed="0.003523"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:29:50.517020" elapsed="0.057820"/>
</kw>
<msg time="2026-08-22T23:29:50.574934" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:29:50.574977" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "N "e "w "_ "O "w "n "e "r "_ "T "o "_ "A "p "p "e "a "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-08-22T23:29:50.516415" elapsed="0.058597"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:29:50.575196" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:29:50.575089" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.575070" 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-08-22T23:29:50.575694" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.576022" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:29:50.576092" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:29:50.515758" elapsed="0.060441"/>
</kw>
<msg time="2026-08-22T23:29:50.576293" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:29:50.576337" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "N "e "w "_ "O "w "n "e "r "_ "T "o "_ "A "p "p "e "a "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-08-22T23:29:50.511157" elapsed="0.065217"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.576826" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:50.576473" elapsed="0.000417"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.576450" elapsed="0.000464"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:29:50.511019" elapsed="0.065918"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:29:50.582369" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:29:50.582258" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.582239" 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-08-22T23:29:50.583786" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:29:50.583545" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.583527" elapsed="0.000330"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:29:50.584303" level="INFO">${karaf_connection_index} = 26</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:29:50.584003" elapsed="0.000327"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:29:50.584725" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:29:50.584486" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:29:50.619352" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:29:50.585249" elapsed="0.034206"/>
</kw>
<msg time="2026-08-22T23:29:50.619640" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:29:50.619689" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:29:50.584914" elapsed="0.034811"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:29:50.639699" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "N "e "w "_ "O "w "n "e "r "_ "T "o "_ "A "p "p "e "a "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:29:50.620235" elapsed="0.019565"/>
</kw>
<msg time="2026-08-22T23:29:50.639964" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:29:50.640011" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "N "e "w "_ "O "w "n "e "r "_ "T "o "_ "A "p "p "e "a "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-08-22T23:29:50.619894" elapsed="0.020153"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.640344" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:50.640123" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.640104" elapsed="0.000320"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.640903" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "N "e "w "_ "O "w "n "e "r "_ "T "o "_ "A "p "p "e "a "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:50.640561" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.641252" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:50.641035" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.641016" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:29:50.641363" 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-08-22T23:29:50.643871" elapsed="0.000146"/>
</kw>
<msg time="2026-08-22T23:29:50.644076" 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-08-22T23:29:50.642823" elapsed="0.001380"/>
</kw>
<kw name="Open 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-08-22T23:29:50.644472" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.644820" 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-08-22T23:29:50.642187" elapsed="0.002815"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:29:50.641660" elapsed="0.003405"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:29:50.583235" elapsed="0.061928"/>
</kw>
<msg time="2026-08-22T23:29:50.645253" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:29:50.645297" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "N "e "w "_ "O "w "n "e "r "_ "T "o "_ "A "p "p "e "a "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-08-22T23:29:50.582659" elapsed="0.062673"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:29:50.645571" elapsed="0.000071"/>
</return>
<status status="PASS" start="2026-08-22T23:29:50.645408" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.645390" elapsed="0.000319"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.646153" 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-08-22T23:29:50.646504" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:29:50.646601" 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-08-22T23:29:50.581916" elapsed="0.064803"/>
</kw>
<msg time="2026-08-22T23:29:50.646816" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:29:50.646860" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "N "e "w "_ "O "w "n "e "r "_ "T "o "_ "A "p "p "e "a "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-08-22T23:29:50.577200" elapsed="0.069697"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.647226" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:50.646973" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.646955" elapsed="0.000351"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:29:50.577062" elapsed="0.070269"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:29:50.653048" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:29:50.652937" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.652918" 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-08-22T23:29:50.654330" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:29:50.654220" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.654202" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:29:50.654868" level="INFO">${karaf_connection_index} = 27</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:29:50.654544" elapsed="0.000352"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:29:50.655268" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:29:50.655052" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:29:50.697332" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:29:50.655814" elapsed="0.041696"/>
</kw>
<msg time="2026-08-22T23:29:50.697731" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:29:50.697778" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:29:50.655455" elapsed="0.042358"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:29:50.721216" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "N "e "w "_ "O "w "n "e "r "_ "T "o "_ "A "p "p "e "a "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:29:50.698411" elapsed="0.022914"/>
</kw>
<msg time="2026-08-22T23:29:50.721508" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:29:50.721557" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "N "e "w "_ "O "w "n "e "r "_ "T "o "_ "A "p "p "e "a "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-08-22T23:29:50.698020" elapsed="0.023595"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.721965" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:50.721709" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.721683" elapsed="0.000365"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.722512" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "N "e "w "_ "O "w "n "e "r "_ "T "o "_ "A "p "p "e "a "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:29:50.722191" 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-08-22T23:29:50.722877" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:50.722662" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.722643" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:29:50.722994" 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-08-22T23:29:50.725721" elapsed="0.000153"/>
</kw>
<msg time="2026-08-22T23:29:50.725934" 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-08-22T23:29:50.724551" 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-08-22T23:29:50.726339" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.726695" 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-08-22T23:29:50.723927" 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-08-22T23:29:50.723348" elapsed="0.003599"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:29:50.653913" elapsed="0.073134"/>
</kw>
<msg time="2026-08-22T23:29:50.727142" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:29:50.727186" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "N "e "w "_ "O "w "n "e "r "_ "T "o "_ "A "p "p "e "a "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-08-22T23:29:50.653268" elapsed="0.073954"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:29:50.727408" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:29:50.727300" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.727281" 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-08-22T23:29:50.727921" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.728262" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:29:50.728334" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:29:50.652587" elapsed="0.075860"/>
</kw>
<msg time="2026-08-22T23:29:50.728543" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:29:50.728674" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "N "e "w "_ "O "w "n "e "r "_ "T "o "_ "A "p "p "e "a "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-08-22T23:29:50.647702" elapsed="0.081010"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.729038" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:29:50.728790" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:29:50.728772" elapsed="0.000343"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:29:50.647458" elapsed="0.081681"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:29:50.510848" elapsed="0.218324"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:29:50.508478" elapsed="0.220755"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:29:50.503423" elapsed="0.225869"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:29:50.503001" elapsed="0.226337"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:29:50.499862" elapsed="0.229535"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:50.734708" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:29:50.730441" elapsed="0.004308">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.734929" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.735104" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.743682" elapsed="0.000098"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:50.744003" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:29:50.730151" elapsed="0.013974">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:51.753238" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:29:51.745798" elapsed="0.007504">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:51.753562" elapsed="0.000049"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:51.753832" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:51.764461" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:51.764681" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:29:51.744883" elapsed="0.019926">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:52.770294" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:29:52.765984" elapsed="0.004358">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:52.770533" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:52.770726" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:52.779155" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:52.779350" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:29:52.765451" elapsed="0.014023">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:53.787983" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:29:53.781064" elapsed="0.006981">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:53.788303" elapsed="0.000031"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:53.788552" elapsed="0.000046"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:53.799401" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:53.799615" elapsed="0.000023"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:29:53.780163" elapsed="0.019576">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:54.808883" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:29:54.800967" elapsed="0.007972">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:54.809184" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:54.809430" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:54.820474" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:54.820743" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:29:54.800255" elapsed="0.020603">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:55.829664" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:29:55.822102" elapsed="0.007618">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:55.829966" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:55.830212" elapsed="0.000029"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:55.840104" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:55.840294" elapsed="0.000023"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:29:55.821365" elapsed="0.019045">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:56.850927" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:29:56.842045" elapsed="0.008946">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:56.851248" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:56.851494" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:56.863034" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:56.863228" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:29:56.841159" elapsed="0.022190">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:57.873167" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:29:57.864978" elapsed="0.008269">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:57.873541" elapsed="0.000079"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:57.873887" elapsed="0.000037"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:57.884354" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:57.884552" elapsed="0.000044"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:29:57.863978" elapsed="0.020735">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:58.894369" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:29:58.886368" elapsed="0.008066">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:58.894819" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:58.895067" elapsed="0.000027"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:58.909801" elapsed="0.000045"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:58.910101" elapsed="0.000031"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:29:58.885421" elapsed="0.024868">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:29:59.920639" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:29:59.911886" elapsed="0.008802">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:59.920877" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:59.921055" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:59.931687" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:29:59.931885" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:29:59.911028" elapsed="0.020979">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:00.941762" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:00.933625" elapsed="0.008207">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:00.942164" elapsed="0.000041"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:00.942499" elapsed="0.000037"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:00.953551" elapsed="0.000049"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:00.953767" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:00.932843" elapsed="0.021041">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:01.962913" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:01.955273" elapsed="0.007699">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:01.963229" elapsed="0.000041"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:01.963496" elapsed="0.000030"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:01.974353" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:01.974547" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:01.954454" elapsed="0.020294">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:02.983782" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:02.976268" elapsed="0.007572">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:02.984089" elapsed="0.000043"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:02.984348" elapsed="0.000035"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:02.995346" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:02.995539" elapsed="0.000020"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:02.975484" elapsed="0.020186">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:04.004573" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:03.997689" elapsed="0.006969">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:04.004929" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:04.005176" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:04.015488" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:04.015709" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:03.996650" elapsed="0.019196">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:05.026375" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:05.017447" elapsed="0.008978">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:05.026629" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:05.026809" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:05.035349" elapsed="0.000027"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:05.035544" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:05.016496" elapsed="0.019186">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:06.047152" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:06.037614" elapsed="0.009638">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:06.047684" elapsed="0.000051"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:06.048109" elapsed="0.000049"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:06.059642" elapsed="0.000042"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:06.060019" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:06.036706" elapsed="0.023465">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:07.069409" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:07.061806" elapsed="0.007668">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:07.069750" elapsed="0.000035"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:07.070002" elapsed="0.000027"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:07.080388" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:07.080612" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:07.060917" elapsed="0.019825">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:08.091501" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:08.082043" elapsed="0.009576">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:08.092027" elapsed="0.000050"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:08.092419" elapsed="0.000044"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:08.102831" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:08.103022" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:08.081269" elapsed="0.021873">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:09.111123" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:09.104329" elapsed="0.006852">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:09.111433" elapsed="0.000030"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:09.111695" elapsed="0.000029"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:09.122339" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:09.122531" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:09.103642" elapsed="0.019021">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:10.132526" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:10.124553" elapsed="0.008039">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:10.132799" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:10.132976" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:10.141401" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:10.141718" elapsed="0.000023"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:10.123662" elapsed="0.018185">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:11.153904" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:11.143768" elapsed="0.010210">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:11.154243" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:11.154492" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:11.166213" elapsed="0.000039"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:11.166482" elapsed="0.000030"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:11.142758" elapsed="0.023916">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:12.175318" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:12.168196" elapsed="0.007186">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:12.175660" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:12.175912" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:12.186659" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:12.186854" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:12.167332" elapsed="0.019644">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:13.197925" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:13.188341" elapsed="0.009679">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:13.198422" elapsed="0.000050"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:13.198845" elapsed="0.000047"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:13.208440" elapsed="0.000027"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:13.208657" elapsed="0.000024"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:13.187537" elapsed="0.021244">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:14.218865" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:14.210281" elapsed="0.008631">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:14.219193" elapsed="0.000024"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:14.219377" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:14.227751" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:14.227945" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:14.209420" elapsed="0.018674">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:15.236911" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:15.229659" elapsed="0.007313">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:15.237233" elapsed="0.000031"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:15.237482" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:15.248310" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:15.248505" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:15.228777" elapsed="0.019866">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:16.254120" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:16.249733" elapsed="0.004434">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:16.254358" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:16.254536" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:16.263065" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:16.263262" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:16.249202" elapsed="0.014190">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:17.274737" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:17.264985" elapsed="0.009848">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:17.275241" elapsed="0.000050"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:17.275673" elapsed="0.000047"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:17.285557" elapsed="0.000043"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:17.285767" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:17.264120" elapsed="0.021867">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:18.295020" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:18.287463" elapsed="0.007634">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:18.295422" elapsed="0.000033"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:18.295697" elapsed="0.000030"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:18.306615" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:18.306813" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:18.286685" elapsed="0.020250">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:19.315864" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:19.308532" elapsed="0.007394">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:19.316183" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:19.316430" elapsed="0.000027"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:19.327069" elapsed="0.000027"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:19.327262" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:19.307670" elapsed="0.019716">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:20.338769" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:20.328951" elapsed="0.009915">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:20.339274" elapsed="0.000050"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:20.339709" elapsed="0.000046"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:20.349531" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:20.349736" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:20.328067" elapsed="0.021793">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:21.359285" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:21.351620" elapsed="0.007729">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:21.359629" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:21.359875" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:21.370987" elapsed="0.000036"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:21.371319" elapsed="0.000023"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:21.350712" elapsed="0.020750">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:22.381199" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:22.373016" elapsed="0.008252">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:22.381886" elapsed="0.000036"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:22.382153" elapsed="0.000029"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:22.393273" elapsed="0.000037"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:22.393524" elapsed="0.000024"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:22.372172" elapsed="0.021516">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:23.403335" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:23.395300" elapsed="0.008098">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:23.403674" elapsed="0.000057"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:23.403967" elapsed="0.000029"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:23.414304" elapsed="0.000027"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:23.414498" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:23.394380" elapsed="0.020255">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:24.424489" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:24.415839" elapsed="0.008707">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:24.424808" elapsed="0.000041"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:24.425062" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:24.436558" elapsed="0.000040"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:24.436763" elapsed="0.000023"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:24.415126" elapsed="0.021753">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:25.449210" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:25.438649" elapsed="0.010617">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:25.449459" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:25.449650" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:25.458131" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:25.458451" elapsed="0.000023"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:25.437643" elapsed="0.020955">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:26.469124" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:26.460275" elapsed="0.008898">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:26.469363" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:26.469541" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:26.477890" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:26.478082" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:26.459284" elapsed="0.018922">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:27.485328" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:27.479334" elapsed="0.006057">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:27.485665" elapsed="0.000033"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:27.485915" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:27.496399" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:27.496607" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:27.478751" elapsed="0.017980">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:28.507189" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:28.498361" elapsed="0.008877">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:28.507428" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:28.507618" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:28.515978" elapsed="0.000027"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:28.516170" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:28.497443" elapsed="0.018852">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:29.525983" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:29.517500" elapsed="0.008539">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:29.526422" elapsed="0.000033"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:29.526695" elapsed="0.000030"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:29.537925" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:29.538116" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:29.516812" elapsed="0.021420">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:30.547555" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:30.539883" elapsed="0.007754">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:30.547898" elapsed="0.000033"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:30.548146" elapsed="0.000029"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:30.560033" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:30.560232" elapsed="0.000024"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:30.538932" elapsed="0.021429">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:31.571237" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:31.561647" elapsed="0.009684">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:31.571555" elapsed="0.000036"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:31.571749" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:31.580095" elapsed="0.000027"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:31.580288" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:31.560893" elapsed="0.019513">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:32.591001" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:32.582012" elapsed="0.009033">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:32.591228" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:32.591403" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:32.599759" elapsed="0.000027"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:32.599950" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:32.581198" elapsed="0.018951">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:33.610100" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:33.601417" elapsed="0.008726">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:33.610323" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:33.610499" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:33.619165" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:33.619357" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:33.600705" elapsed="0.018770">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:34.628782" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:34.621526" elapsed="0.007323">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:34.629112" elapsed="0.000031"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:34.629355" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:34.638818" elapsed="0.000027"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:34.639012" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:34.620499" elapsed="0.018645">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:35.646092" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:35.641676" elapsed="0.004465">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:35.646333" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:35.646515" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:35.655042" elapsed="0.000027"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:35.655233" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:35.640044" elapsed="0.015314">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:36.665120" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:36.657052" elapsed="0.008192">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:36.665554" elapsed="0.000057"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:36.665838" elapsed="0.000029"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:36.676550" elapsed="0.000035"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:36.676829" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:36.656120" elapsed="0.020835">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:37.686773" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:37.678504" elapsed="0.008330">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:37.687090" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:37.687337" elapsed="0.000029"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:37.697201" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:37.697393" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:37.677684" elapsed="0.019830">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:38.706942" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:38.698888" elapsed="0.008112">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:38.707250" elapsed="0.000031"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:38.707498" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:38.717340" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:38.717534" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:38.698113" elapsed="0.019558">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:39.726242" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:39.719096" elapsed="0.007201">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:39.726563" elapsed="0.000059"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:39.726885" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:39.736954" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:39.737146" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:39.718354" elapsed="0.018907">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:40.746182" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:40.738607" elapsed="0.007640">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:40.746514" elapsed="0.000031"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:40.746788" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:40.756709" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:40.757002" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:40.737963" elapsed="0.019170">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:41.768080" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:41.758868" elapsed="0.009278">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:41.768426" elapsed="0.000033"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:41.768697" elapsed="0.000029"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:41.778908" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:41.779104" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:41.757855" elapsed="0.021381">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:42.791029" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:42.780850" elapsed="0.010288">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:42.791608" elapsed="0.000057"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:42.792057" elapsed="0.000048"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:42.803437" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:42.803647" elapsed="0.000023"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:42.779981" elapsed="0.023790">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:43.814485" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:43.805486" elapsed="0.009066">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:43.814856" elapsed="0.000034"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:43.815111" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:43.825355" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:43.825555" elapsed="0.000025"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:43.804502" elapsed="0.021206">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:44.837323" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:44.827346" elapsed="0.010032">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:44.837701" elapsed="0.000029"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:44.837896" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:44.846512" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:44.846726" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:44.826406" elapsed="0.020446">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:45.856115" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:45.848499" elapsed="0.007686">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:45.856475" elapsed="0.000034"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:45.856801" elapsed="0.000033"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:45.866407" elapsed="0.000034"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:45.866637" elapsed="0.000037"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:45.847570" elapsed="0.019240">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:46.877880" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:46.868363" elapsed="0.009567">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:46.878125" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:46.878304" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:46.886851" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:46.887050" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:46.867475" elapsed="0.019703">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:47.899065" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:47.889416" elapsed="0.009702">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:47.899313" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:47.899492" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:47.908196" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:47.908390" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:47.888449" elapsed="0.020202">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:48.917916" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:48.910179" elapsed="0.007800">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:48.918237" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:48.918509" elapsed="0.000030"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:48.928519" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:48.928734" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:48.909283" elapsed="0.019577">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:49.938054" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:49.930253" elapsed="0.007862">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:49.938369" elapsed="0.000031"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:49.939625" elapsed="0.000033"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:49.949034" elapsed="0.000027"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:49.949226" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:49.929435" elapsed="0.019911">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:50.958368" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:50.950903" elapsed="0.007527">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:50.958709" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:50.958962" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:50.968479" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:50.968690" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:50.950025" elapsed="0.018787">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:51.977742" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:51.970337" elapsed="0.007469">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:51.978064" elapsed="0.000031"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:51.978314" elapsed="0.000029"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:51.988001" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:51.988281" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:51.969493" elapsed="0.018911">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:52.998703" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:52.990023" elapsed="0.008742">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:52.999028" elapsed="0.000031"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:52.999277" elapsed="0.000029"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:53.009528" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:53.009739" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:52.989125" elapsed="0.020741">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:54.019429" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:54.011526" elapsed="0.007971">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:54.019782" elapsed="0.000031"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:54.020031" elapsed="0.000027"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:54.029646" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:54.029845" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:54.010612" elapsed="0.019365">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:55.041532" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:55.031715" elapsed="0.009945">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:55.042114" elapsed="0.000034"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:55.042308" elapsed="0.000019"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:55.051131" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:55.051330" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:55.030736" elapsed="0.020728">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:56.060166" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:56.053009" elapsed="0.007221">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:56.060490" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:56.060761" elapsed="0.000035"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:56.070242" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:56.070528" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:56.052115" elapsed="0.018560">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:57.082106" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:57.072311" elapsed="0.009845">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:57.082356" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:57.082533" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:57.091013" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:57.091213" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:57.071371" elapsed="0.019974">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:58.102830" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:58.092983" elapsed="0.010048">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:58.103480" elapsed="0.000052"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:58.103921" elapsed="0.000045"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:58.112783" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:58.112980" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:58.092021" elapsed="0.021091">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:30:59.121780" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:30:59.114541" elapsed="0.007306">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:59.122143" elapsed="0.000033"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:59.122406" elapsed="0.000029"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:59.131722" elapsed="0.000034"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:30:59.131933" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:30:59.113743" elapsed="0.018326">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:00.143488" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:00.133746" elapsed="0.009796">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:00.143854" elapsed="0.000024"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:00.144038" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:00.152526" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:00.152747" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:00.132808" elapsed="0.020069">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:01.158097" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:01.153809" elapsed="0.004335">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:01.158332" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:01.158508" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:01.167192" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:01.167408" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:01.153310" elapsed="0.014222">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:02.178807" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:02.169207" elapsed="0.009699">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:02.179332" elapsed="0.000051"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:02.179760" elapsed="0.000046"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:02.189128" elapsed="0.000031"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:02.189330" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:02.168233" elapsed="0.021229">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:03.199861" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:03.191172" elapsed="0.008758">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:03.200196" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:03.200444" elapsed="0.000029"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:03.210506" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:03.210720" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:03.190259" elapsed="0.020695">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:04.222381" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:04.212916" elapsed="0.009537">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:04.222762" elapsed="0.000034"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:04.223033" elapsed="0.000031"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:04.233854" elapsed="0.000033"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:04.234073" elapsed="0.000023"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:04.211941" elapsed="0.022262">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:05.245525" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:05.236059" elapsed="0.009513">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:05.245778" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:05.245957" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:05.254479" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:05.254691" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:05.235134" elapsed="0.019683">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:06.265099" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:06.256314" elapsed="0.008826">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:06.265319" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:06.265495" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:06.273920" elapsed="0.000027"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:06.274109" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:06.255569" elapsed="0.018654">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:07.283504" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:07.275902" elapsed="0.007668">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:07.283899" elapsed="0.000035"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:07.284155" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:07.294109" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:07.294390" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:07.274950" elapsed="0.019566">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:08.303484" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:08.296388" elapsed="0.007158">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:08.303823" elapsed="0.000031"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:08.304068" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:08.313767" elapsed="0.000037"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:08.313979" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:08.295499" elapsed="0.018606">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:09.324834" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:09.315781" elapsed="0.009101">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:09.325072" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:09.325248" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:09.333624" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:09.333816" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:09.314914" elapsed="0.019028">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:10.341108" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:10.335074" elapsed="0.006106">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:10.341439" elapsed="0.000031"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:10.341710" elapsed="0.000029"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:10.351630" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:10.351827" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:10.334449" elapsed="0.017507">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:11.360403" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:11.353677" elapsed="0.006791">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:11.360747" elapsed="0.000033"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:11.360997" elapsed="0.000027"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:11.370439" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:11.370746" elapsed="0.000023"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:11.352745" elapsed="0.018130">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:12.380236" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:12.372668" elapsed="0.007636">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:12.380522" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:12.380718" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:12.389126" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:12.389325" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:12.371742" elapsed="0.017710">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:13.400020" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:13.391232" elapsed="0.008839">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:13.400268" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:13.400444" elapsed="0.000019"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:13.410525" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:13.410741" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:13.390219" elapsed="0.020650">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:14.416118" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:14.411787" elapsed="0.004379">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:14.416354" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:14.416531" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:14.425105" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:14.425300" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:14.411293" elapsed="0.014133">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:15.435528" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:15.427225" elapsed="0.008349">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:15.435858" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:15.436036" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:15.444434" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:15.444644" elapsed="0.000023"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:15.426345" elapsed="0.018422">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:16.455738" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:16.446148" elapsed="0.009690">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:16.456245" elapsed="0.000051"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:16.456624" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:16.465265" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:16.465461" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:16.445311" elapsed="0.020286">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:17.470848" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:17.466512" elapsed="0.004382">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:17.471081" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:17.471260" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:17.479654" elapsed="0.000027"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:17.479848" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:17.466043" elapsed="0.013926">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:18.485110" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:18.480804" elapsed="0.004353">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:18.485344" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:18.485521" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:18.494003" elapsed="0.000027"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:18.494210" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:18.480345" elapsed="0.014064">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:19.503821" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:19.495691" elapsed="0.008173">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:19.504045" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:19.504219" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:19.512867" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:19.513060" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:19.494949" elapsed="0.018230">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:20.521435" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:20.514731" elapsed="0.006766">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:20.521777" elapsed="0.000031"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:20.522026" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:20.531308" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:20.531505" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:20.513859" elapsed="0.017785">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:21.540863" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:21.533172" elapsed="0.007754">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:21.541185" elapsed="0.000031"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:21.541453" elapsed="0.000030"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:21.551090" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:21.551286" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:21.532297" elapsed="0.019114">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:22.561526" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:22.553152" elapsed="0.008464">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:22.561897" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:22.562233" elapsed="0.000032"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:22.572442" elapsed="0.000031"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:22.572755" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:22.552162" elapsed="0.020732">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:23.583470" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:23.574545" elapsed="0.008976">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:23.583730" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:23.583908" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:23.592751" elapsed="0.000042"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:23.593034" elapsed="0.000031"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:23.573574" elapsed="0.019638">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:24.602361" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:24.594914" elapsed="0.007513">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:24.602736" elapsed="0.000038"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:24.603015" elapsed="0.000030"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:24.612608" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:24.612806" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:24.593990" elapsed="0.018945">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:25.624620" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:25.614538" elapsed="0.010190">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:25.625228" elapsed="0.000056"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:25.625687" elapsed="0.000042"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:25.634514" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:25.634732" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:25.613688" elapsed="0.021176">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:26.645084" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:26.636416" elapsed="0.008727">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:26.645387" elapsed="0.000025"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:26.645570" elapsed="0.000035"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:26.662635" elapsed="0.000112"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:26.663379" elapsed="0.000055"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:26.635537" elapsed="0.028188">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:27.674263" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:27.665418" elapsed="0.008906">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:27.674612" elapsed="0.000034"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:27.674867" elapsed="0.000029"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:27.684807" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:27.685001" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:27.664482" elapsed="0.020645">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:28.693731" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:28.686617" elapsed="0.007175">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:28.694048" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:28.694306" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:28.703898" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:28.704092" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:28.685785" elapsed="0.018430">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:29.713765" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:29.705454" elapsed="0.008370">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:29.714075" elapsed="0.000031"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:29.714321" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:29.724244" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:29.724434" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:29.704742" elapsed="0.019811">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:30.733254" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:30.725830" elapsed="0.007481">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:30.733670" elapsed="0.000034"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:30.733930" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:30.743666" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:30.743859" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:30.725113" elapsed="0.018863">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:31.754019" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:31.745506" elapsed="0.008580">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:31.754359" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:31.754638" elapsed="0.000031"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:31.765178" elapsed="0.000036"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:31.765399" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:31.744672" elapsed="0.020868">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:32.773331" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:32.766841" elapsed="0.006592">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:32.773872" elapsed="0.000050"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:32.774311" elapsed="0.000050"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:32.784760" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:32.784965" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:32.766132" elapsed="0.018963">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:33.794245" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:33.786630" elapsed="0.007677">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:33.794566" elapsed="0.000052"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:33.794839" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:33.804473" elapsed="0.000027"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:33.804678" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:33.785788" elapsed="0.019094">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:34.816155" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:34.806499" elapsed="0.009706">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:34.816406" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:34.816597" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:34.825265" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:34.825460" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:34.805618" elapsed="0.019981">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:35.836906" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:35.827223" elapsed="0.009768">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:35.837251" elapsed="0.000031"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:35.837500" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:35.847020" elapsed="0.000027"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:35.847215" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:35.826308" elapsed="0.021029">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:36.858388" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:36.848883" elapsed="0.009553">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:36.858644" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:36.858827" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:36.867287" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:36.867485" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:36.848006" elapsed="0.019617">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:37.877570" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:37.869232" elapsed="0.008423">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:37.877923" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:37.878175" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:37.889441" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:37.889721" elapsed="0.000023"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:37.868311" elapsed="0.021536">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:38.900925" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:38.891340" elapsed="0.009723">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:38.901474" elapsed="0.000051"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:38.901909" elapsed="0.000046"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:38.910427" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:38.910662" elapsed="0.000025"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:38.890425" elapsed="0.020367">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:39.922128" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:39.912337" elapsed="0.009865">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:39.922463" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:39.922730" elapsed="0.000030"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:39.934381" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:39.934587" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:39.911491" elapsed="0.023217">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:40.944720" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:40.936375" elapsed="0.008397">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:40.944972" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:40.945156" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:40.954031" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:40.954231" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:40.935411" elapsed="0.018956">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:41.965854" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:41.956059" elapsed="0.009913">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:41.966381" elapsed="0.000049"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:41.966810" elapsed="0.000047"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:41.977219" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:41.977493" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:41.955122" elapsed="0.022510">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:42.986739" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:42.979205" elapsed="0.007596">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:42.987060" elapsed="0.000031"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:42.987305" elapsed="0.000027"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:42.997566" elapsed="0.000040"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:42.997773" elapsed="0.000020"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:42.978327" elapsed="0.019568">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:44.007336" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:43.999458" elapsed="0.007940">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:44.007673" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:44.007924" elapsed="0.000029"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:44.018743" elapsed="0.000027"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:44.018948" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:43.998569" elapsed="0.020501">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:45.028501" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:45.020679" elapsed="0.007891">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:45.028852" elapsed="0.000048"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:45.029118" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:45.040300" elapsed="0.000038"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:45.040520" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:45.019758" elapsed="0.020920">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:46.050634" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:46.042343" elapsed="0.008356">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:46.051074" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:46.051327" elapsed="0.000029"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:46.062354" elapsed="0.000032"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:46.062554" elapsed="0.000033"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:46.041417" elapsed="0.021285">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:47.073688" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:47.064137" elapsed="0.009650">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:47.074193" elapsed="0.000049"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:47.074614" elapsed="0.000061"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:47.085967" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:47.086162" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:47.063269" elapsed="0.023021">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:48.096641" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:48.087965" elapsed="0.008726">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:48.096886" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:48.097075" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:48.105574" elapsed="0.000042"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:48.105785" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:48.087009" elapsed="0.018903">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:49.116238" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:49.107568" elapsed="0.008717">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:49.116475" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:49.116665" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:49.124993" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:49.125186" elapsed="0.000020"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:49.106680" elapsed="0.018707">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:50.136457" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:50.126915" elapsed="0.009608">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:50.136724" elapsed="0.000036"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:50.136916" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:50.146745" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:50.146940" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:50.126064" elapsed="0.021002">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:51.153852" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:31:51.148391" elapsed="0.005526">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:51.154235" elapsed="0.000026"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:51.154428" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:51.164118" elapsed="0.000038"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:51.164358" elapsed="0.000024"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:31:51.147677" elapsed="0.016821">Variable '${original_device_owner}' not found.</status>
</kw>
<msg time="2026-08-22T23:31:51.164613" level="FAIL">Keyword 'Check_Owner_Reconfigured' failed after retrying for 2 minutes. The last error was: Variable '${original_device_owner}' not found.</msg>
<arg>${CLUSTER_RECOVERY_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Owner_Reconfigured</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:29:50.729643" elapsed="120.435118">Keyword 'Check_Owner_Reconfigured' failed after retrying for 2 minutes. The last error was: Variable '${original_device_owner}' not found.</status>
</kw>
<doc>Wait for the cluster to recover from the failure and choose a new owner for the entity.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-08-22T23:29:50.499292" elapsed="120.665655">Keyword 'Check_Owner_Reconfigured' failed after retrying for 2 minutes. The last error was: Variable '${original_device_owner}' not found.</status>
</test>
<test id="s1-s4-t10" name="Check_Config_Data_Before_Modification_With_Original_Owner_Down" 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-08-22T23:31:51.169405" elapsed="0.000294"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:31:51.169127" elapsed="0.000631"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:31:51.170884" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:31:51.170730" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-08-22T23:31:51.170698" elapsed="0.000266"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:31:51.176878" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:31:51.176746" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-08-22T23:31:51.176724" elapsed="0.000237"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:31:51.178222" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:31:51.177746" elapsed="0.000510"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:31:51.178850" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:31:51.178454" elapsed="0.000427"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:31:51.178935" elapsed="0.000041"/>
</return>
<msg time="2026-08-22T23:31:51.179210" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:31:51.177250" elapsed="0.001992"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:31:51.186521" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:31:51.186386" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-08-22T23:31:51.186361" elapsed="0.000261"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:31:51.188172" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:31:51.188036" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-08-22T23:31:51.188014" elapsed="0.000259"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:31:51.188858" level="INFO">${karaf_connection_index} = 25</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:31:51.188465" elapsed="0.000425"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:31:51.189350" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:31:51.189086" elapsed="0.000294"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:31:51.236193" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:31:51.190011" elapsed="0.046392"/>
</kw>
<msg time="2026-08-22T23:31:51.236661" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:31:51.236713" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:31:51.189595" elapsed="0.047156"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:31:51.264895" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:31:51.237497" elapsed="0.027522"/>
</kw>
<msg time="2026-08-22T23:31:51.265179" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:31:51.265226" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "M "o "d "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:31:51.237015" elapsed="0.028248"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:51.265647" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:31:51.265362" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-08-22T23:31:51.265334" elapsed="0.000399"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:51.266190" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:31:51.265879" 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-08-22T23:31:51.266554" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:31:51.266340" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-08-22T23:31:51.266322" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:31:51.266691" 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-08-22T23:31:51.269508" elapsed="0.000174"/>
</kw>
<msg time="2026-08-22T23:31:51.269744" 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-08-22T23:31:51.268277" elapsed="0.001601"/>
</kw>
<kw name="Open 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-08-22T23:31:51.270152" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:51.270690" 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-08-22T23:31:51.267605" elapsed="0.003274"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:31:51.267020" elapsed="0.003932"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:31:51.187661" elapsed="0.083448"/>
</kw>
<msg time="2026-08-22T23:31:51.271206" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:31:51.271250" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "M "o "d "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:31:51.186832" elapsed="0.084457"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:31:51.271473" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:31:51.271365" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:31:51.271347" 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-08-22T23:31:51.272003" 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-08-22T23:31:51.272343" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:31:51.272421" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:31:51.185967" elapsed="0.086564"/>
</kw>
<msg time="2026-08-22T23:31:51.272673" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:31:51.272718" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "M "o "d "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:31:51.179732" elapsed="0.093023"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:51.273081" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:31:51.272833" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:31:51.272816" elapsed="0.000342"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:31:51.179535" elapsed="0.093648"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:31:51.278950" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:31:51.278841" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:31:51.278822" 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-08-22T23:31:51.280176" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:31:51.280068" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:31:51.280050" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:31:51.280704" level="INFO">${karaf_connection_index} = 26</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:31:51.280384" elapsed="0.000348"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:31:51.281099" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:31:51.280885" elapsed="0.000240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:31:51.318073" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:31:51.281636" elapsed="0.036535"/>
</kw>
<msg time="2026-08-22T23:31:51.318346" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:31:51.318393" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:31:51.281282" elapsed="0.037149"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:31:51.350998" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:31:51.318959" elapsed="0.032255"/>
</kw>
<msg time="2026-08-22T23:31:51.351423" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:31:51.351471" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "M "o "d "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:31:51.318618" elapsed="0.032891"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:51.351922" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:31:51.351630" elapsed="0.000431"/>
</branch>
<status status="PASS" start="2026-08-22T23:31:51.351602" elapsed="0.000488"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:51.352601" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:31:51.352235" elapsed="0.000447"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:51.352962" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:31:51.352750" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-08-22T23:31:51.352731" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:31:51.353074" 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-08-22T23:31:51.356028" elapsed="0.000189"/>
</kw>
<msg time="2026-08-22T23:31:51.356280" 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-08-22T23:31:51.354611" elapsed="0.001815"/>
</kw>
<kw name="Open 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-08-22T23:31:51.356925" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:51.357261" 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-08-22T23:31:51.353956" elapsed="0.003491"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:31:51.353372" elapsed="0.004140"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:31:51.279752" elapsed="0.077883"/>
</kw>
<msg time="2026-08-22T23:31:51.357731" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:31:51.357776" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "M "o "d "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:31:51.279167" elapsed="0.078648"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:31:51.357998" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:31:51.357892" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:31:51.357873" 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-08-22T23:31:51.358484" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:51.358898" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:31:51.358971" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:31:51.278478" elapsed="0.080603"/>
</kw>
<msg time="2026-08-22T23:31:51.359178" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:31:51.359223" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "M "o "d "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:31:51.273454" elapsed="0.085808"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:51.359645" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:31:51.359337" elapsed="0.000364"/>
</branch>
<status status="PASS" start="2026-08-22T23:31:51.359320" elapsed="0.000405"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:31:51.273316" elapsed="0.086456"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:31:51.365442" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:31:51.365334" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:31:51.365315" 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-08-22T23:31:51.366673" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:31:51.366537" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:31:51.366519" elapsed="0.000221"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:31:51.367179" level="INFO">${karaf_connection_index} = 27</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:31:51.366880" elapsed="0.000325"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:31:51.367716" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:31:51.367477" elapsed="0.000290"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:31:51.404783" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:31:51.368256" elapsed="0.036632"/>
</kw>
<msg time="2026-08-22T23:31:51.405071" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:31:51.405119" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:31:51.367925" elapsed="0.037232"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:31:51.439761" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:31:51.405703" elapsed="0.034173"/>
</kw>
<msg time="2026-08-22T23:31:51.440038" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:31:51.440086" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "M "o "d "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:31:51.405331" elapsed="0.034793"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:51.440432" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:31:51.440204" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-08-22T23:31:51.440183" elapsed="0.000329"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:31:51.440978" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:31:51.440676" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:51.441337" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:31:51.441123" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-22T23:31:51.441105" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:31:51.441448" 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-08-22T23:31:51.444083" elapsed="0.000149"/>
</kw>
<msg time="2026-08-22T23:31:51.444294" 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-08-22T23:31:51.442909" elapsed="0.001517"/>
</kw>
<kw name="Open 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-08-22T23:31:51.444777" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:51.445145" 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-08-22T23:31:51.442271" elapsed="0.003063"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:31:51.441734" 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-08-22T23:31:51.366239" elapsed="0.079423"/>
</kw>
<msg time="2026-08-22T23:31:51.445756" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:31:51.445801" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "M "o "d "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:31:51.365677" elapsed="0.080162"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:31:51.446022" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:31:51.445916" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:31:51.445897" 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-08-22T23:31:51.446496" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:51.446849" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:31:51.446963" 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-08-22T23:31:51.364991" elapsed="0.082083"/>
</kw>
<msg time="2026-08-22T23:31:51.447168" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:31:51.447213" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "M "o "d "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:31:51.360044" elapsed="0.087207"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:31:51.447690" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:31:51.447329" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-08-22T23:31:51.447309" elapsed="0.000463"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:31:51.359906" elapsed="0.087890"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:31:51.179314" elapsed="0.268513"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:31:51.176282" elapsed="0.271605"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:31:51.170370" elapsed="0.277577"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:31:51.169916" elapsed="0.278078"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:31:51.166347" elapsed="0.281701"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:31:51.453411" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:31:51.448838" elapsed="0.004612">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:31:52.464656" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:31:52.454242" elapsed="0.010520">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:31:53.475870" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:31:53.465771" elapsed="0.010204">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:31:54.485213" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:31:54.476970" elapsed="0.008318">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:31:55.492530" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:31:55.486024" elapsed="0.006599">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:31:56.501771" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:31:56.493562" elapsed="0.008283">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:31:57.508823" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:31:57.502502" elapsed="0.006410">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:31:58.520628" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:31:58.509842" elapsed="0.010934">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:31:59.529683" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:31:59.521814" elapsed="0.007949">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:00.541309" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:00.530800" elapsed="0.010594">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:01.551033" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:01.542636" elapsed="0.008459">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:02.561967" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:02.552267" elapsed="0.009760">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:03.573759" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:03.562981" elapsed="0.010882">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:04.583698" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:04.574793" elapsed="0.008987">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:05.593787" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:05.584758" elapsed="0.009102">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:06.604064" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:06.594803" elapsed="0.009333">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:07.614655" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:07.605073" elapsed="0.009659">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:08.625895" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:08.615738" elapsed="0.010233">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:09.637241" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:09.626894" elapsed="0.010403">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:10.646890" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:10.638175" elapsed="0.008768">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:11.655653" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:11.647925" elapsed="0.007798">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:12.664296" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:12.656723" elapsed="0.007646">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:13.673432" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:13.665397" elapsed="0.008105">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:14.682316" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:14.674535" elapsed="0.007852">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:15.687800" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:15.682926" elapsed="0.004923">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:16.698945" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:16.688731" elapsed="0.010275">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:17.708911" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:17.699846" elapsed="0.009138">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:18.720024" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:18.710021" elapsed="0.010084">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:19.728826" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:19.721070" elapsed="0.007828">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:20.738200" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:20.730033" elapsed="0.008238">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:21.747778" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:21.739124" elapsed="0.008723">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:22.756956" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:22.748884" elapsed="0.008146">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:23.767349" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:23.758012" elapsed="0.009492">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:24.772841" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:24.768285" elapsed="0.004607">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:25.782254" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:25.773619" elapsed="0.008694">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:26.790462" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:26.783055" elapsed="0.007466">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:27.800409" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:27.791485" elapsed="0.008995">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:28.809922" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:28.801294" elapsed="0.008697">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:29.820972" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:29.810923" elapsed="0.010190">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:30.831959" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:30.822085" elapsed="0.009931">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:31.841054" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:31.833247" elapsed="0.007863">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:32.852395" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:32.841983" elapsed="0.010514">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:33.863531" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:33.853477" elapsed="0.010153">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:34.874609" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:34.864520" elapsed="0.010162">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:35.885637" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:35.875527" elapsed="0.010220">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:36.896230" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:36.886757" elapsed="0.009528">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:37.905288" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:37.897227" elapsed="0.008134">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:38.915294" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:38.906198" elapsed="0.009162">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:39.927782" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:39.916303" elapsed="0.011532">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:40.938984" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:40.928804" elapsed="0.010286">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:41.949562" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:41.940217" elapsed="0.009565">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:42.959062" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:42.950831" elapsed="0.008334">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:43.969705" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:43.960333" elapsed="0.009476">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:44.979194" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:44.970775" elapsed="0.008497">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:46.030927" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:45.980233" elapsed="0.050773">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:47.041555" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:47.032408" elapsed="0.009351">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:48.051651" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:48.042733" elapsed="0.008998">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:49.062727" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:49.052706" elapsed="0.010131">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:50.068174" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:50.063570" elapsed="0.004665">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:51.079160" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:51.069154" elapsed="0.010064">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:52.084427" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:52.079951" elapsed="0.004529">Variable '${follower1_session}' not found.</status>
</kw>
<msg time="2026-08-22T23:32:52.084620" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: Variable '${follower1_session}' not found.</msg>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:31:51.448221" elapsed="60.636562">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${follower2_session}</arg>
<arg>${original_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-08-22T23:32:52.085035" elapsed="0.000024"/>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:32:52.086741" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:32:52.085925" elapsed="0.000845"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-08-22T23:32:52.087009" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:32:52.086855" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.086832" elapsed="0.000244"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:32:52.087272" elapsed="0.000221"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:32:52.088449" level="FAIL">'6067' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:32:52.088058" elapsed="0.000455">'6067' does not contain '-'</status>
</kw>
<msg time="2026-08-22T23:32:52.088621" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:32:52.087687" elapsed="0.000960"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:32:52.089151" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=6067</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:32:52.088815" elapsed="0.000363"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:32:52.089652" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=6067</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:32:52.089344" elapsed="0.000336"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:32:52.090126" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:32:52.089831" elapsed="0.000321"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-08-22T23:32:52.090787" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=6067

Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: Variable '${follower1_session}' not found.</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-08-22T23:32:52.090317" elapsed="0.000521"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:32:52.091236" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=6067</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:32:52.090993" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-08-22T23:32:52.091989" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=6067'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-08-22T23:32:52.091598" elapsed="0.000438"/>
</kw>
<status status="PASS" start="2026-08-22T23:32:52.091346" elapsed="0.000800"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.091328" elapsed="0.000844"/>
</if>
<arg>6067</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:32:52.085531" elapsed="0.006689"/>
</kw>
<doc>Check if data is present and retrievable from follower nodes</doc>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=6067</tag>
<status status="FAIL" start="2026-08-22T23:31:51.165596" elapsed="60.926668">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=6067

Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: Variable '${follower1_session}' not found.</status>
</test>
<test id="s1-s4-t11" name="Modify_Device_Data_When_Original_Owner_Is_Down" line="182">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:32:52.095868" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:32:52.095572" elapsed="0.000562"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:32:52.097127" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:32:52.097017" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.096998" 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-08-22T23:32:52.102269" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:32:52.102161" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.102143" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:32:52.103325" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:32:52.102947" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:32:52.103868" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:32:52.103513" elapsed="0.000381"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:32:52.103939" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:32:52.104101" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:32:52.102559" 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-08-22T23:32:52.109612" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:32:52.109489" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.109470" 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-08-22T23:32:52.110863" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:32:52.110756" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.110738" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:32:52.111372" level="INFO">${karaf_connection_index} = 25</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:32:52.111072" elapsed="0.000326"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:32:52.111808" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:32:52.111554" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:32:52.150036" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:32:52.112320" elapsed="0.037811"/>
</kw>
<msg time="2026-08-22T23:32:52.150309" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:32:52.150355" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:32:52.111990" elapsed="0.038400"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:32:52.182254" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "h "e "n "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "I "s "_ "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-08-22T23:32:52.151048" elapsed="0.031308"/>
</kw>
<msg time="2026-08-22T23:32:52.182512" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:32:52.182557" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "h "e "n "_ "O "r "i "g "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:32:52.150556" elapsed="0.032055"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:32:52.182951" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:32:52.182728" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.182708" elapsed="0.000321"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:32:52.183462" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "h "e "n "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "I "s "_ "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-08-22T23:32:52.183167" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:32:52.183842" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:32:52.183612" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.183592" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:32:52.183954" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<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-08-22T23:32:52.186430" elapsed="0.000165"/>
</kw>
<msg time="2026-08-22T23:32:52.186659" 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-08-22T23:32:52.185356" elapsed="0.001430"/>
</kw>
<kw name="Open 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-08-22T23:32:52.187056" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:32:52.187392" 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-08-22T23:32:52.184751" elapsed="0.002908"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:32:52.184209" 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="PASS" start="2026-08-22T23:32:52.110433" elapsed="0.077427"/>
</kw>
<msg time="2026-08-22T23:32:52.187953" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:32:52.187997" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "h "e "n "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:32:52.109829" elapsed="0.078203"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:32:52.188213" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:32:52.188108" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.188089" 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-08-22T23:32:52.188721" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:32:52.189046" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:32:52.189116" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:32:52.109153" elapsed="0.080070"/>
</kw>
<msg time="2026-08-22T23:32:52.189315" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:32:52.189359" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "h "e "n "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:32:52.104501" elapsed="0.084892"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:32:52.189788" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:32:52.189468" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.189451" elapsed="0.000415"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:32:52.104361" elapsed="0.085528"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:32:52.195331" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:32:52.195223" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.195205" 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-08-22T23:32:52.196566" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:32:52.196459" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.196441" elapsed="0.000247"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:32:52.197128" level="INFO">${karaf_connection_index} = 26</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:32:52.196835" elapsed="0.000319"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:32:52.197522" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:32:52.197310" elapsed="0.000238"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:32:52.243069" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:32:52.198056" elapsed="0.045108"/>
</kw>
<msg time="2026-08-22T23:32:52.243340" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:32:52.243386" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:32:52.197727" elapsed="0.045694"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:32:52.271050" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "h "e "n "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "I "s "_ "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-08-22T23:32:52.243970" elapsed="0.027191"/>
</kw>
<msg time="2026-08-22T23:32:52.271325" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:32:52.271373" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "h "e "n "_ "O "r "i "g "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:32:52.243606" elapsed="0.027801"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:32:52.271745" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:32:52.271489" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.271468" elapsed="0.000359"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:32:52.272297" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "h "e "n "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "I "s "_ "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-08-22T23:32:52.271985" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:32:52.272669" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:32:52.272432" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.272415" elapsed="0.000334"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:32:52.272783" 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-08-22T23:32:52.275275" elapsed="0.000149"/>
</kw>
<msg time="2026-08-22T23:32:52.275484" 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-08-22T23:32:52.274212" elapsed="0.001421"/>
</kw>
<kw name="Open 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-08-22T23:32:52.275906" elapsed="0.000103"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:32:52.276267" 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-08-22T23:32:52.273597" elapsed="0.002946"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:32:52.273050" 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-08-22T23:32:52.196159" elapsed="0.080574"/>
</kw>
<msg time="2026-08-22T23:32:52.276826" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:32:52.276869" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "h "e "n "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:32:52.195546" elapsed="0.081359"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:32:52.277084" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:32:52.276979" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.276961" 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-08-22T23:32:52.277555" elapsed="0.000043"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:32:52.277944" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:32:52.278016" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:32:52.194889" elapsed="0.083234"/>
</kw>
<msg time="2026-08-22T23:32:52.278219" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:32:52.278263" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "h "e "n "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:32:52.190151" elapsed="0.088148"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:32:52.278728" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:32:52.278374" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.278357" elapsed="0.000451"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:32:52.190013" elapsed="0.088819"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:32:52.284292" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:32:52.284185" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.284166" 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-08-22T23:32:52.285498" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:32:52.285391" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.285373" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:32:52.286026" level="INFO">${karaf_connection_index} = 27</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:32:52.285728" elapsed="0.000325"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:32:52.286420" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:32:52.286208" elapsed="0.000238"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:32:52.323367" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:32:52.287018" elapsed="0.036446"/>
</kw>
<msg time="2026-08-22T23:32:52.323646" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:32:52.323693" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:32:52.286617" elapsed="0.037111"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:32:52.347649" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "h "e "n "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "I "s "_ "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-08-22T23:32:52.324258" elapsed="0.023503"/>
</kw>
<msg time="2026-08-22T23:32:52.347925" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:32:52.347973" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "h "e "n "_ "O "r "i "g "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:32:52.323893" elapsed="0.024116"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:32:52.348330" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:32:52.348104" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.348084" elapsed="0.000325"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:32:52.348876" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "h "e "n "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "I "s "_ "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-08-22T23:32:52.348549" 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-08-22T23:32:52.349229" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:32:52.349013" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.348995" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:32:52.349340" 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-08-22T23:32:52.351813" elapsed="0.000147"/>
</kw>
<msg time="2026-08-22T23:32:52.352083" 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-08-22T23:32:52.350770" elapsed="0.001443"/>
</kw>
<kw name="Open 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-08-22T23:32:52.352483" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:32:52.352836" 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-08-22T23:32:52.350139" elapsed="0.002880"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:32:52.349612" elapsed="0.003471"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:32:52.285086" elapsed="0.068094"/>
</kw>
<msg time="2026-08-22T23:32:52.353271" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:32:52.353316" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "h "e "n "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:32:52.284510" elapsed="0.068841"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:32:52.353535" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:32:52.353429" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.353410" 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 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:32:52.354038" 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-08-22T23:32:52.354369" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:32:52.354440" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:32:52.283808" elapsed="0.070741"/>
</kw>
<msg time="2026-08-22T23:32:52.354665" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:32:52.354709" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "h "e "n "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:32:52.279098" elapsed="0.075647"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:32:52.355067" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:32:52.354820" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.354803" elapsed="0.000342"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:32:52.278959" elapsed="0.076209"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:32:52.104183" elapsed="0.251013"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:32:52.101800" elapsed="0.253454"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:32:52.096725" elapsed="0.258584"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:32:52.096282" elapsed="0.259071"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:32:52.093080" elapsed="0.262325"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:32:52.356126" level="INFO">${template_as_string} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${template_as_string}</var>
<arg>DEVICE_NAME=${device_name}</arg>
<arg>RESTCONF_ROOT=${RESTCONF_ROOT}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:32:52.355667" elapsed="0.000486"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<msg time="2026-08-22T23:32:52.360934" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${directory_with_template_folders}${/}datamod1</arg>
<arg>${template_as_string}</arg>
<arg>session=${follower1_session}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:32:52.356408" elapsed="0.004566">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:32:52.362251" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:32:52.361762" elapsed="0.000517"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-08-22T23:32:52.362498" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:32:52.362354" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.362336" elapsed="0.000276"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:32:52.362781" elapsed="0.000222"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:32:52.363898" level="FAIL">'4968' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:32:52.363527" elapsed="0.000439">'4968' does not contain '-'</status>
</kw>
<msg time="2026-08-22T23:32:52.364074" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:32:52.363167" elapsed="0.000933"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:32:52.364616" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:32:52.364267" elapsed="0.000377"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:32:52.365155" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:32:52.364856" elapsed="0.000328"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:32:52.365649" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:32:52.365337" elapsed="0.000339"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-08-22T23:32:52.366416" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968

Variable '${follower1_session}' not found.</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-08-22T23:32:52.365829" elapsed="0.000635"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:32:52.366878" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:32:52.366633" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-08-22T23:32:52.367567" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=4968'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-08-22T23:32:52.367227" elapsed="0.000404"/>
</kw>
<status status="PASS" start="2026-08-22T23:32:52.366990" elapsed="0.000676"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.366972" elapsed="0.000719"/>
</if>
<arg>4968</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:32:52.361395" elapsed="0.006343"/>
</kw>
<doc>Attempt to modify the data on the device after recovery and see if it still works.</doc>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=4968</tag>
<status status="FAIL" start="2026-08-22T23:32:52.092489" elapsed="0.275294">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968

Variable '${follower1_session}' not found.</status>
</test>
<test id="s1-s4-t12" name="Check_Config_Data_After_Modification_With_Original_Owner_Down" 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-08-22T23:32:52.371219" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:32:52.370956" elapsed="0.000528"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:32:52.372479" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:32:52.372368" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.372349" 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-08-22T23:32:52.377544" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:32:52.377437" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.377419" elapsed="0.000209"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:32:52.378618" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:32:52.378224" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:32:52.379153" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:32:52.378804" elapsed="0.000379"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:32:52.379265" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:32:52.379494" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:32:52.377852" elapsed="0.001669"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:32:52.385157" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:32:52.385049" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.385030" 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-08-22T23:32:52.386411" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:32:52.386298" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.386234" elapsed="0.000247"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:32:52.386943" level="INFO">${karaf_connection_index} = 25</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:32:52.386644" elapsed="0.000325"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:32:52.387340" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:32:52.387124" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:32:52.423989" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:32:52.387873" elapsed="0.036215"/>
</kw>
<msg time="2026-08-22T23:32:52.424282" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:32:52.424328" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:32:52.387521" elapsed="0.036842"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:32:52.458684" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:32:52.424890" elapsed="0.033903"/>
</kw>
<msg time="2026-08-22T23:32:52.458951" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:32:52.458998" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:32:52.424532" elapsed="0.034501"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:32:52.459329" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:32:52.459110" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.459090" elapsed="0.000317"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:32:52.459872" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:32:52.459549" 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-08-22T23:32:52.460253" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:32:52.460012" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.459994" elapsed="0.000340"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:32:52.460367" 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-08-22T23:32:52.462836" elapsed="0.000147"/>
</kw>
<msg time="2026-08-22T23:32:52.463043" 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-08-22T23:32:52.461785" elapsed="0.001387"/>
</kw>
<kw name="Open 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-08-22T23:32:52.463441" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:32:52.463789" 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-08-22T23:32:52.461158" 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-08-22T23:32:52.460637" elapsed="0.003475"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:32:52.385951" elapsed="0.078274"/>
</kw>
<msg time="2026-08-22T23:32:52.464318" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:32:52.464361" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:32:52.385373" elapsed="0.079024"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:32:52.464605" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-08-22T23:32:52.464473" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.464454" elapsed="0.000236"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:32:52.465073" elapsed="0.000059"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:32:52.465444" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:32:52.465515" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:32:52.384703" elapsed="0.080942"/>
</kw>
<msg time="2026-08-22T23:32:52.465738" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:32:52.465782" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:32:52.379906" elapsed="0.085911"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:32:52.466142" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:32:52.465893" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.465876" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:32:52.379766" elapsed="0.086478"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:32:52.472048" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:32:52.471938" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.471918" 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-08-22T23:32:52.473283" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:32:52.473177" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.473160" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:32:52.473925" level="INFO">${karaf_connection_index} = 26</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:32:52.473490" elapsed="0.000462"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:32:52.474333" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:32:52.474114" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:32:52.509746" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:32:52.474875" elapsed="0.034979"/>
</kw>
<msg time="2026-08-22T23:32:52.510017" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:32:52.510064" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:32:52.474517" elapsed="0.035582"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:32:52.537784" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:32:52.510709" elapsed="0.027192"/>
</kw>
<msg time="2026-08-22T23:32:52.538062" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:32:52.538110" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:32:52.510266" elapsed="0.027880"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:32:52.538477" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:32:52.538234" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.538210" elapsed="0.000350"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:32:52.539032" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:32:52.538724" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:32:52.539391" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:32:52.539176" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.539158" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:32:52.539567" elapsed="0.000059"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<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-08-22T23:32:52.542223" elapsed="0.000147"/>
</kw>
<msg time="2026-08-22T23:32:52.542431" 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-08-22T23:32:52.541114" elapsed="0.001448"/>
</kw>
<kw name="Open 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-08-22T23:32:52.542854" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:32:52.543266" 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-08-22T23:32:52.540472" 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-08-22T23:32:52.539891" elapsed="0.003632"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:32:52.472878" elapsed="0.070768"/>
</kw>
<msg time="2026-08-22T23:32:52.543743" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:32:52.543788" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:32:52.472292" elapsed="0.071532"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:32:52.544008" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:32:52.543901" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.543883" 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-08-22T23:32:52.544510" 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-08-22T23:32:52.544866" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:32:52.544939" 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-08-22T23:32:52.471592" elapsed="0.073459"/>
</kw>
<msg time="2026-08-22T23:32:52.545146" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:32:52.545192" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:32:52.466504" elapsed="0.078724"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:32:52.545552" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:32:52.545306" elapsed="0.000344"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.545288" elapsed="0.000387"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:32:52.466367" elapsed="0.079333"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:32:52.551475" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:32:52.551365" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.551346" 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-08-22T23:32:52.552733" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:32:52.552623" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.552603" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:32:52.553238" level="INFO">${karaf_connection_index} = 27</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:32:52.552941" elapsed="0.000324"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:32:52.553649" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:32:52.553418" elapsed="0.000257"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:32:52.595456" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:32:52.554164" elapsed="0.041438"/>
</kw>
<msg time="2026-08-22T23:32:52.595788" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:32:52.595839" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:32:52.553831" elapsed="0.042043"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:32:52.619666" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:32:52.596600" elapsed="0.023176"/>
</kw>
<msg time="2026-08-22T23:32:52.619936" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:32:52.619983" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:32:52.596196" elapsed="0.023823"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:32:52.620334" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:32:52.620104" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.620081" elapsed="0.000332"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:32:52.620899" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:32:52.620576" 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-08-22T23:32:52.621251" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:32:52.621039" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.621021" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:32:52.621363" 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">
<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-08-22T23:32:52.623929" elapsed="0.000148"/>
</kw>
<msg time="2026-08-22T23:32:52.624137" 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-08-22T23:32:52.622842" 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-08-22T23:32:52.624564" elapsed="0.000096"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:32:52.624923" 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-08-22T23:32:52.622203" elapsed="0.002902"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:32:52.621662" elapsed="0.003506"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:32:52.552284" elapsed="0.072982"/>
</kw>
<msg time="2026-08-22T23:32:52.625358" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:32:52.625404" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:32:52.551710" elapsed="0.073731"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:32:52.625644" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:32:52.625517" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.625499" elapsed="0.000229"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:32:52.626124" 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-08-22T23:32:52.626451" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:32:52.626522" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:32:52.551017" elapsed="0.075719"/>
</kw>
<msg time="2026-08-22T23:32:52.626831" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:32:52.626875" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:32:52.545969" elapsed="0.080940"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:32:52.627229" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:32:52.626985" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-08-22T23:32:52.626968" elapsed="0.000376"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:32:52.545831" elapsed="0.081537"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:32:52.379589" elapsed="0.247811"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:32:52.377079" elapsed="0.250381"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:32:52.372078" elapsed="0.255440"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:32:52.371647" elapsed="0.255918"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:32:52.368734" elapsed="0.258905"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:52.633043" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:52.628391" elapsed="0.004693">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:53.644298" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:53.633989" elapsed="0.010493">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:54.656222" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:54.645554" elapsed="0.010744">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:55.666119" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:55.657267" elapsed="0.008911">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:56.676901" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:56.667052" elapsed="0.009953">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:57.687948" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:57.677994" elapsed="0.010026">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:58.698268" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:58.688982" elapsed="0.009339">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:32:59.710468" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:32:59.699203" elapsed="0.011328">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:00.719024" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:00.711426" elapsed="0.007670">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:01.728440" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:01.720672" elapsed="0.007848">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:02.737164" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:02.729567" elapsed="0.007665">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:03.747400" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:03.738203" elapsed="0.009250">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:04.760076" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:04.748432" elapsed="0.011704">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:05.771001" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:05.761091" elapsed="0.010013">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:06.780167" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:06.772071" elapsed="0.008169">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:07.790811" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:07.781161" elapsed="0.009704">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:08.802244" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:08.791755" elapsed="0.010595">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:09.811567" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:09.803960" elapsed="0.007698">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:10.820696" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:10.812532" elapsed="0.008236">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:11.831236" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:11.821489" elapsed="0.009842">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:12.842389" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:12.832284" elapsed="0.010176">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:13.853349" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:13.843354" elapsed="0.010102">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:14.863914" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:14.854406" elapsed="0.009566">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:15.874881" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:15.864911" elapsed="0.010075">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:16.886569" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:16.875974" elapsed="0.010721">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:17.897916" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:17.887666" elapsed="0.010323">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:18.906499" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:18.898955" elapsed="0.007613">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:19.915097" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:19.907510" elapsed="0.007673">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:20.923755" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:20.916081" elapsed="0.007747">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:21.932778" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:21.924812" elapsed="0.008046">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:22.941748" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:22.933545" elapsed="0.008280">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:23.949756" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:23.942517" elapsed="0.007300">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:24.959665" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:24.950652" elapsed="0.009124">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:25.971346" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:25.960677" elapsed="0.010720">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:26.979925" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:26.972318" elapsed="0.007687">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:27.990941" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:27.980962" elapsed="0.010091">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:29.002759" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:28.992035" elapsed="0.010835">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:30.013941" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:30.003863" elapsed="0.010143">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:31.025068" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:31.014945" elapsed="0.010234">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:32.035759" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:32.026331" elapsed="0.009491">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:33.047011" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:33.036774" elapsed="0.010304">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:34.054208" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:34.048062" elapsed="0.006196">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:35.063569" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:35.055156" elapsed="0.008595">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:36.072336" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:36.064508" elapsed="0.007886">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:37.080991" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:37.073092" elapsed="0.007957">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:38.089551" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:38.081901" elapsed="0.007733">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:39.098287" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:39.090413" elapsed="0.007965">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:40.107340" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:40.099301" elapsed="0.008135">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:41.116265" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:41.108326" elapsed="0.008008">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:42.124475" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:42.117246" elapsed="0.007298">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:43.136456" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:43.125830" elapsed="0.010784">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:44.145716" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:44.137508" elapsed="0.008275">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:45.154373" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:45.146801" elapsed="0.007650">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:46.165255" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:46.155347" elapsed="0.010013">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:47.175939" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:47.166390" elapsed="0.009612">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:48.186926" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:48.176929" elapsed="0.010101">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:49.196133" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:49.188076" elapsed="0.008134">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:50.204850" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:50.197101" elapsed="0.007826">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:51.213648" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:51.206018" elapsed="0.007708">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:52.223361" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:52.214485" elapsed="0.008946">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:53.228856" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:53.224016" elapsed="0.004897">Variable '${follower1_session}' not found.</status>
</kw>
<msg time="2026-08-22T23:33:53.229043" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: Variable '${follower1_session}' not found.</msg>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:32:52.627814" elapsed="60.601383">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${follower2_session}</arg>
<arg>${modified_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-08-22T23:33:53.229442" elapsed="0.000025"/>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:33:53.230939" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:33:53.230331" elapsed="0.000637"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-08-22T23:33:53.231210" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:33:53.231055" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.231032" elapsed="0.000247"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:33:53.231474" elapsed="0.000239"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:33:53.232617" level="FAIL">'6067' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:33:53.232241" elapsed="0.000439">'6067' does not contain '-'</status>
</kw>
<msg time="2026-08-22T23:33:53.232774" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:33:53.231878" elapsed="0.000921"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:33:53.233304" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=6067</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:33:53.232965" elapsed="0.000366"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:33:53.233823" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=6067</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:33:53.233509" elapsed="0.000341"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:33:53.234296" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:33:53.234003" elapsed="0.000320"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-08-22T23:33:53.234859" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=6067

Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: Variable '${follower1_session}' not found.</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-08-22T23:33:53.234473" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:33:53.235300" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=6067</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:33:53.235058" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-08-22T23:33:53.236009" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=6067'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-08-22T23:33:53.235668" elapsed="0.000389"/>
</kw>
<status status="PASS" start="2026-08-22T23:33:53.235412" elapsed="0.000678"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.235394" elapsed="0.000721"/>
</if>
<arg>6067</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:33:53.229945" elapsed="0.006217"/>
</kw>
<doc>Check if data is written correctly when original owner is shut down</doc>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=6067</tag>
<status status="FAIL" start="2026-08-22T23:32:52.368114" elapsed="60.868093">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=6067

Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: Variable '${follower1_session}' not found.</status>
</test>
<test id="s1-s4-t13" name="Restart_Original_Entity_Owner" line="209">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:33:53.239893" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:33:53.239619" 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-08-22T23:33:53.241157" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:33:53.241038" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.241020" 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-08-22T23:33:53.246386" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:33:53.246277" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.246259" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:33:53.247453" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:33:53.247068" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:33:53.247977" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:33:53.247657" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:33:53.248048" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:33:53.248209" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:33:53.246693" elapsed="0.001541"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:33:53.253765" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:33:53.253656" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.253637" 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-08-22T23:33:53.255027" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:33:53.254918" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.254899" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:33:53.255544" level="INFO">${karaf_connection_index} = 25</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:33:53.255238" elapsed="0.000332"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:33:53.256006" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:33:53.255760" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:33:53.293591" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:33:53.256561" elapsed="0.037147"/>
</kw>
<msg time="2026-08-22T23:33:53.293881" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:33:53.293927" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:33:53.256205" elapsed="0.037757"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:33:53.314857" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "R "e "s "t "a "r "t "_ "O "r "i "g "i "n "a "l "_ "E "n "t "i "t "y "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:33:53.294499" elapsed="0.020458"/>
</kw>
<msg time="2026-08-22T23:33:53.315114" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:33:53.315160" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "R "e "s "t "a "r "t "_ "O "r "i "g "i "n "a "l "_ "E "n "t "i "t "y "_ "O "w "n "e "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-08-22T23:33:53.294142" elapsed="0.021082"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:33:53.315543" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:33:53.315308" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.315286" elapsed="0.000358"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:33:53.316088" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "R "e "s "t "a "r "t "_ "O "r "i "g "i "n "a "l "_ "E "n "t "i "t "y "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:33:53.315790" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:33:53.316433" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:33:53.316220" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.316202" elapsed="0.000417"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:33:53.316660" 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-08-22T23:33:53.319791" elapsed="0.000154"/>
</kw>
<msg time="2026-08-22T23:33:53.320007" 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-08-22T23:33:53.318176" elapsed="0.001975"/>
</kw>
<kw name="Open 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-08-22T23:33:53.320428" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:33:53.320795" elapsed="0.000252"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:33:53.317528" 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-08-22T23:33:53.316954" elapsed="0.004275"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:33:53.254612" elapsed="0.066717"/>
</kw>
<msg time="2026-08-22T23:33:53.321423" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:33:53.321483" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "R "e "s "t "a "r "t "_ "O "r "i "g "i "n "a "l "_ "E "n "t "i "t "y "_ "O "w "n "e "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-08-22T23:33:53.253982" elapsed="0.067538"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:33:53.321734" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:33:53.321624" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.321604" 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-08-22T23:33:53.322219" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:33:53.322552" elapsed="0.000039"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:33:53.322640" 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-08-22T23:33:53.253286" elapsed="0.069465"/>
</kw>
<msg time="2026-08-22T23:33:53.322845" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:33:53.322889" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "R "e "s "t "a "r "t "_ "O "r "i "g "i "n "a "l "_ "E "n "t "i "t "y "_ "O "w "n "e "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-08-22T23:33:53.248626" elapsed="0.074299"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:33:53.323247" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:33:53.323000" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.322983" elapsed="0.000341"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:33:53.248472" elapsed="0.074876"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:33:53.329006" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:33:53.328898" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.328880" 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-08-22T23:33:53.330229" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:33:53.330120" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.330101" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:33:53.330770" level="INFO">${karaf_connection_index} = 26</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:33:53.330440" elapsed="0.000357"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:33:53.331168" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:33:53.330955" elapsed="0.000238"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:33:53.365300" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:33:53.331698" elapsed="0.033698"/>
</kw>
<msg time="2026-08-22T23:33:53.365635" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:33:53.365684" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:33:53.331349" elapsed="0.034503"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:33:53.386901" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "R "e "s "t "a "r "t "_ "O "r "i "g "i "n "a "l "_ "E "n "t "i "t "y "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:33:53.366392" elapsed="0.020607"/>
</kw>
<msg time="2026-08-22T23:33:53.387155" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:33:53.387201" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "R "e "s "t "a "r "t "_ "O "r "i "g "i "n "a "l "_ "E "n "t "i "t "y "_ "O "w "n "e "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-08-22T23:33:53.366032" elapsed="0.021205"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:33:53.387533" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:33:53.387314" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.387293" elapsed="0.000346"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:33:53.388079" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "R "e "s "t "a "r "t "_ "O "r "i "g "i "n "a "l "_ "E "n "t "i "t "y "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:33:53.387782" elapsed="0.000360"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:33:53.388422" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:33:53.388210" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.388192" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:33:53.388532" 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-08-22T23:33:53.391116" elapsed="0.000147"/>
</kw>
<msg time="2026-08-22T23:33:53.391324" 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-08-22T23:33:53.389992" 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-08-22T23:33:53.391753" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:33:53.392084" 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-08-22T23:33:53.389339" 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-08-22T23:33:53.388814" elapsed="0.003517"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:33:53.329816" elapsed="0.062612"/>
</kw>
<msg time="2026-08-22T23:33:53.392520" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:33:53.392565" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "R "e "s "t "a "r "t "_ "O "r "i "g "i "n "a "l "_ "E "n "t "i "t "y "_ "O "w "n "e "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-08-22T23:33:53.329223" elapsed="0.063400"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:33:53.392808" elapsed="0.000199"/>
</return>
<status status="PASS" start="2026-08-22T23:33:53.392702" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.392683" 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-08-22T23:33:53.393459" 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-08-22T23:33:53.393823" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:33:53.393897" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:33:53.328529" elapsed="0.065478"/>
</kw>
<msg time="2026-08-22T23:33:53.394099" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:33:53.394143" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "R "e "s "t "a "r "t "_ "O "r "i "g "i "n "a "l "_ "E "n "t "i "t "y "_ "O "w "n "e "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-08-22T23:33:53.323649" elapsed="0.070529"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:33:53.394500" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:33:53.394254" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.394236" elapsed="0.000393"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:33:53.323476" elapsed="0.071178"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:33:53.400108" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:33:53.400002" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.399983" 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-08-22T23:33:53.401325" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:33:53.401218" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.401200" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:33:53.401869" level="INFO">${karaf_connection_index} = 27</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:33:53.401549" elapsed="0.000347"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:33:53.402261" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:33:53.402051" elapsed="0.000236"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:33:53.436574" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:33:53.402789" elapsed="0.033945"/>
</kw>
<msg time="2026-08-22T23:33:53.436920" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:33:53.436966" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:33:53.402445" elapsed="0.034556"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:33:53.456743" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "R "e "s "t "a "r "t "_ "O "r "i "g "i "n "a "l "_ "E "n "t "i "t "y "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:33:53.437639" elapsed="0.019272"/>
</kw>
<msg time="2026-08-22T23:33:53.457158" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:33:53.457228" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "R "e "s "t "a "r "t "_ "O "r "i "g "i "n "a "l "_ "E "n "t "i "t "y "_ "O "w "n "e "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-08-22T23:33:53.437201" elapsed="0.020079"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:33:53.457816" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:33:53.457408" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.457372" elapsed="0.000566"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:33:53.458659" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "R "e "s "t "a "r "t "_ "O "r "i "g "i "n "a "l "_ "E "n "t "i "t "y "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:33:53.458158" 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-08-22T23:33:53.459177" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:33:53.458858" elapsed="0.000398"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.458831" elapsed="0.000461"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:33:53.459343" 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-08-22T23:33:53.462930" elapsed="0.000152"/>
</kw>
<msg time="2026-08-22T23:33:53.463143" 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-08-22T23:33:53.461573" elapsed="0.001706"/>
</kw>
<kw name="Open 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-08-22T23:33:53.463555" elapsed="0.000101"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:33:53.463911" 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-08-22T23:33:53.460616" elapsed="0.003479"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:33:53.459778" elapsed="0.004382"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:33:53.400917" elapsed="0.063343"/>
</kw>
<msg time="2026-08-22T23:33:53.464353" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:33:53.464397" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "R "e "s "t "a "r "t "_ "O "r "i "g "i "n "a "l "_ "E "n "t "i "t "y "_ "O "w "n "e "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-08-22T23:33:53.400322" elapsed="0.064162"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:33:53.464693" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:33:53.464565" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.464546" 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-08-22T23:33:53.466044" 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-08-22T23:33:53.466394" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:33:53.466471" 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-08-22T23:33:53.399660" elapsed="0.066963"/>
</kw>
<msg time="2026-08-22T23:33:53.466725" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:33:53.466770" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "R "e "s "t "a "r "t "_ "O "r "i "g "i "n "a "l "_ "E "n "t "i "t "y "_ "O "w "n "e "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-08-22T23:33:53.394918" elapsed="0.071888"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:33:53.467135" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:33:53.466884" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.466866" elapsed="0.000347"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:33:53.394780" elapsed="0.072458"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:33:53.248292" elapsed="0.218977"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:33:53.245912" elapsed="0.221416"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:33:53.240748" elapsed="0.226634"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:33:53.240308" elapsed="0.227117"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:33:53.237195" elapsed="0.230282"/>
</kw>
<kw name="Start_Single_Member" owner="ClusterManagement">
<msg time="2026-08-22T23:33:53.471977" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>${original_device_owner}</arg>
<doc>Convenience keyword that starts the specified member of the cluster.</doc>
<status status="FAIL" start="2026-08-22T23:33:53.467780" elapsed="0.004239">Variable '${original_device_owner}' not found.</status>
</kw>
<doc>Restart the original entity owner and see if it can still see the device and the new data on it.</doc>
<status status="FAIL" start="2026-08-22T23:33:53.236603" elapsed="0.235573">Variable '${original_device_owner}' not found.</status>
</test>
<test id="s1-s4-t14" name="Check_Config_Data_After_Original_Owner_Restart" 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-08-22T23:33:53.475534" elapsed="0.000231"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:33:53.475275" 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-08-22T23:33:53.476818" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:33:53.476706" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.476687" 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-08-22T23:33:53.481855" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:33:53.481749" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.481730" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:33:53.482925" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:33:53.482521" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:33:53.483409" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:33:53.483107" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:33:53.483479" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:33:53.483656" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:33:53.482142" 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-08-22T23:33:53.489413" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:33:53.489305" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.489286" 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-08-22T23:33:53.490659" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:33:53.490523" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.490505" elapsed="0.000221"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:33:53.491173" level="INFO">${karaf_connection_index} = 25</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:33:53.490870" elapsed="0.000330"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:33:53.491570" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:33:53.491356" elapsed="0.000256"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:33:53.524533" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:33:53.492153" elapsed="0.032507"/>
</kw>
<msg time="2026-08-22T23:33:53.524829" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:33:53.524875" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:33:53.491820" elapsed="0.033090"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:33:53.545649" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:33:53.525430" elapsed="0.020352"/>
</kw>
<msg time="2026-08-22T23:33:53.545958" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:33:53.546005" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "O "r "i "g "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:33:53.525084" elapsed="0.020957"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:33:53.546401" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:33:53.546137" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.546109" elapsed="0.000374"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:33:53.546976" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:33:53.546653" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:33:53.547329" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:33:53.547116" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.547097" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:33:53.547445" 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-08-22T23:33:53.550136" elapsed="0.000152"/>
</kw>
<msg time="2026-08-22T23:33:53.550350" 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-08-22T23:33:53.549010" elapsed="0.001479"/>
</kw>
<kw name="Open 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-08-22T23:33:53.550790" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:33:53.551120" 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-08-22T23:33:53.548329" elapsed="0.002973"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:33:53.547770" 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-08-22T23:33:53.490224" elapsed="0.061241"/>
</kw>
<msg time="2026-08-22T23:33:53.551560" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:33:53.551637" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:33:53.489657" elapsed="0.062019"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:33:53.551929" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:33:53.551821" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.551801" 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-08-22T23:33:53.552418" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:33:53.552778" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:33:53.552850" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:33:53.488963" elapsed="0.063997"/>
</kw>
<msg time="2026-08-22T23:33:53.553057" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:33:53.553102" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:33:53.484053" elapsed="0.069085"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:33:53.553463" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:33:53.553215" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.553197" elapsed="0.000344"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:33:53.483914" elapsed="0.069795"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:33:53.559480" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:33:53.559372" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.559352" 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-08-22T23:33:53.560781" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:33:53.560674" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.560655" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:33:53.561297" level="INFO">${karaf_connection_index} = 26</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:33:53.560992" elapsed="0.000331"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:33:53.561739" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:33:53.561477" elapsed="0.000288"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:33:53.596428" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:33:53.562249" elapsed="0.034449"/>
</kw>
<msg time="2026-08-22T23:33:53.596943" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:33:53.596991" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:33:53.561921" elapsed="0.035106"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:33:53.618157" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:33:53.597818" elapsed="0.020463"/>
</kw>
<msg time="2026-08-22T23:33:53.618447" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:33:53.618493" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "O "r "i "g "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:33:53.597302" elapsed="0.021228"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:33:53.618942" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:33:53.618662" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.618627" elapsed="0.000402"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:33:53.619503" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:33:53.619174" elapsed="0.000421"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:33:53.619982" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:33:53.619667" elapsed="0.000373"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.619648" elapsed="0.000416"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:33:53.620105" 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-08-22T23:33:53.622928" elapsed="0.000158"/>
</kw>
<msg time="2026-08-22T23:33:53.623149" 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-08-22T23:33:53.621752" 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-08-22T23:33:53.623560" elapsed="0.000096"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:33:53.623914" 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-08-22T23:33:53.621062" elapsed="0.003040"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:33:53.620441" elapsed="0.003728"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:33:53.560336" elapsed="0.063932"/>
</kw>
<msg time="2026-08-22T23:33:53.624372" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:33:53.624417" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:33:53.559713" elapsed="0.064741"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:33:53.624676" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:33:53.624535" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.624515" 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-08-22T23:33:53.625187" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:33:53.625550" elapsed="0.000139"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:33:53.625746" 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-08-22T23:33:53.559014" elapsed="0.066849"/>
</kw>
<msg time="2026-08-22T23:33:53.625963" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:33:53.626008" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:33:53.554001" elapsed="0.072046"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:33:53.626374" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:33:53.626124" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.626106" elapsed="0.000344"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:33:53.553858" elapsed="0.072617"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:33:53.632383" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:33:53.632273" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.632254" 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-08-22T23:33:53.633643" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:33:53.633490" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.633472" elapsed="0.000241"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:33:53.634170" level="INFO">${karaf_connection_index} = 27</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:33:53.633857" elapsed="0.000340"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:33:53.634574" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:33:53.634355" elapsed="0.000261"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:33:53.667976" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:33:53.635106" elapsed="0.033065"/>
</kw>
<msg time="2026-08-22T23:33:53.668505" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:33:53.668553" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:33:53.634775" elapsed="0.033838"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:33:53.695266" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:33:53.669278" elapsed="0.026102"/>
</kw>
<msg time="2026-08-22T23:33:53.695544" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:33:53.695613" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "O "r "i "g "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:33:53.668851" elapsed="0.026800"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:33:53.696008" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:33:53.695750" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.695721" elapsed="0.000372"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:33:53.696551" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:33:53.696236" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:33:53.696924" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:33:53.696711" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.696692" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:33:53.697041" 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-08-22T23:33:53.699780" elapsed="0.000154"/>
</kw>
<msg time="2026-08-22T23:33:53.699996" 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-08-22T23:33:53.698643" elapsed="0.001490"/>
</kw>
<kw name="Open 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-08-22T23:33:53.700405" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:33:53.700758" 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-08-22T23:33:53.697971" elapsed="0.002972"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:33:53.697361" elapsed="0.003647"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:33:53.633190" elapsed="0.067917"/>
</kw>
<msg time="2026-08-22T23:33:53.701203" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:33:53.701248" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:33:53.632620" elapsed="0.068668"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:33:53.701473" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:33:53.701367" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.701348" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:33:53.702004" 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-08-22T23:33:53.702350" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:33:53.702422" 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-08-22T23:33:53.631905" elapsed="0.070629"/>
</kw>
<msg time="2026-08-22T23:33:53.702711" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:33:53.702757" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:33:53.626820" elapsed="0.075975"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:33:53.703171" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:33:53.702918" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-08-22T23:33:53.702899" elapsed="0.000350"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:33:53.626678" elapsed="0.076595"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:33:53.483736" elapsed="0.219573"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:33:53.481335" elapsed="0.222040"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:33:53.476391" elapsed="0.227045"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:33:53.475968" elapsed="0.227516"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:33:53.473112" elapsed="0.230429"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:53.708454" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:53.704375" elapsed="0.004120">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:54.719235" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:54.709414" elapsed="0.009943">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:55.727152" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:55.720325" elapsed="0.006902">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:56.737085" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:56.728193" elapsed="0.008995">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:57.746228" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:57.738163" elapsed="0.008144">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:58.754445" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:58.747047" elapsed="0.007456">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:33:59.763093" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:33:59.755085" elapsed="0.008065">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:00.773245" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:00.764223" elapsed="0.009194">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:01.783336" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:01.774560" elapsed="0.008884">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:02.792440" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:02.784430" elapsed="0.008088">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:03.802307" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:03.793481" elapsed="0.008929">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:04.807609" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:04.803512" elapsed="0.004152">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:05.817387" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:05.808726" elapsed="0.008717">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:06.827596" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:06.818305" elapsed="0.009515">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:07.836315" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:07.828822" elapsed="0.007565">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:08.846005" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:08.837356" elapsed="0.008711">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:09.853563" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:09.846795" elapsed="0.006840">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:10.861386" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:10.854317" elapsed="0.007127">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:11.870888" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:11.862538" elapsed="0.008426">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:12.880320" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:12.871938" elapsed="0.008437">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:13.889649" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:13.881534" elapsed="0.008178">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:14.899482" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:14.890653" elapsed="0.008955">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:15.908534" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:15.900690" elapsed="0.007933">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:16.918805" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:16.910075" elapsed="0.008832">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:17.930147" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:17.920424" elapsed="0.009788">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:18.940259" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:18.931298" elapsed="0.009073">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:19.949618" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:19.941261" elapsed="0.008428">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:20.958926" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:20.950694" elapsed="0.008302">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:21.968529" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:21.960243" elapsed="0.008360">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:22.973757" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:22.969464" elapsed="0.004348">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:23.984274" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:23.974915" elapsed="0.009422">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:24.993740" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:24.985247" elapsed="0.008550">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:26.002885" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:25.994674" elapsed="0.008268">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:27.012735" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:27.003845" elapsed="0.009018">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:28.021793" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:28.013892" elapsed="0.007975">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:29.030371" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:29.022750" elapsed="0.007699">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:30.038603" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:30.031340" elapsed="0.007335">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:31.046962" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:31.039541" elapsed="0.007497">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:32.055470" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:32.048072" elapsed="0.007477">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:33.063504" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:33.056458" elapsed="0.007252">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:34.076335" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:34.066109" elapsed="0.010300">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:35.086102" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:35.077267" elapsed="0.008945">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:36.095351" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:36.087198" elapsed="0.008225">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:37.104180" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:37.096258" elapsed="0.007988">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:38.114126" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:38.105251" elapsed="0.008937">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:39.122540" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:39.115132" elapsed="0.007542">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:40.132302" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:40.123550" elapsed="0.008916">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:41.142201" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:41.133460" elapsed="0.008843">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:42.153419" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:42.143319" elapsed="0.010161">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:43.164340" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:43.154718" elapsed="0.009758">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:44.171345" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:44.165367" elapsed="0.006056">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:45.181215" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:45.172325" elapsed="0.008992">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:46.192979" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:46.182796" elapsed="0.010397">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:47.203162" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:47.194225" elapsed="0.009046">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:48.213840" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:48.204389" elapsed="0.009560">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:49.223933" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:49.215009" elapsed="0.008995">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:50.231807" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:50.224958" elapsed="0.006926">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:51.242601" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:51.233278" elapsed="0.009514">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:52.253451" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:52.244111" elapsed="0.009470">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:53.262143" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:53.255047" elapsed="0.007256">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:34:54.272440" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:54.263783" elapsed="0.008750">Variable '${original_device_owner_session}' not found.</status>
</kw>
<msg time="2026-08-22T23:34:54.272745" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: Variable '${original_device_owner_session}' not found.</msg>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:33:53.703795" elapsed="60.569859">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.278110" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:34:54.276732" elapsed="0.001426"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-08-22T23:34:54.278538" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:34:54.278302" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.278258" elapsed="0.000421"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:34:54.278977" elapsed="0.000320"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.280658" level="FAIL">'5761' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:34:54.280080" elapsed="0.000676">'5761' does not contain '-'</status>
</kw>
<msg time="2026-08-22T23:34:54.280894" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:34:54.279529" elapsed="0.001400"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.281735" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=5761</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:34:54.281171" elapsed="0.000606"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.282431" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5761</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:34:54.282010" elapsed="0.000458"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.283137" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:34:54.282712" elapsed="0.000461"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.283933" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5761

Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: Variable '${original_device_owner_session}' not found.</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-08-22T23:34:54.283388" elapsed="0.000731"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.284705" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5761</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:34:54.284337" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.285710" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=5761'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-08-22T23:34:54.285200" elapsed="0.000623"/>
</kw>
<status status="PASS" start="2026-08-22T23:34:54.284861" elapsed="0.001010"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.284836" elapsed="0.001070"/>
</if>
<arg>5761</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:34:54.275503" elapsed="0.010474"/>
</kw>
<doc>Sanity check if we still can retrieve our data from the original device owner.</doc>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=5761</tag>
<status status="FAIL" start="2026-08-22T23:33:53.472493" elapsed="60.813552">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5761

Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: Variable '${original_device_owner_session}' not found.</status>
</test>
<test id="s1-s4-t15" name="Modify_Device_Data_With_Original_Owner" line="223">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:34:54.290541" elapsed="0.000236"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:34:54.290272" elapsed="0.000562"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:34:54.291857" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:34:54.291738" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.291720" 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-08-22T23:34:54.297189" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:34:54.297077" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.297058" elapsed="0.000201"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.298392" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:34:54.297948" elapsed="0.000472"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.298952" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:34:54.298627" elapsed="0.000352"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:34:54.299027" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:34:54.299194" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:34:54.297523" elapsed="0.001696"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:34:54.305021" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:34:54.304891" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.304872" 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-08-22T23:34:54.306388" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:34:54.306222" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.306203" elapsed="0.000261"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:34:54.306978" level="INFO">${karaf_connection_index} = 25</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:34:54.306656" elapsed="0.000349"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:34:54.307398" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:34:54.307168" elapsed="0.000255"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:34:54.354000" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:34:54.307956" elapsed="0.046154"/>
</kw>
<msg time="2026-08-22T23:34:54.354296" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:34:54.354342" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:34:54.307585" elapsed="0.046792"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:34:54.377109" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:34:54.354942" elapsed="0.022425"/>
</kw>
<msg time="2026-08-22T23:34:54.377571" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:34:54.377642" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "O "r "i "g "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:34:54.354549" elapsed="0.023131"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:54.378040" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:54.377773" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.377746" elapsed="0.000376"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.378647" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:34:54.378269" elapsed="0.000449"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:54.379013" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:54.378788" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.378770" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:34:54.379126" 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-08-22T23:34:54.381952" elapsed="0.000154"/>
</kw>
<msg time="2026-08-22T23:34:54.382168" 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-08-22T23:34:54.380735" 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-08-22T23:34:54.382626" elapsed="0.000082"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:54.383002" elapsed="0.000255"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:34:54.380026" elapsed="0.003357"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:34:54.379409" elapsed="0.004047"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:34:54.305910" elapsed="0.077685"/>
</kw>
<msg time="2026-08-22T23:34:54.383725" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:34:54.383774" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:34:54.305246" elapsed="0.078565"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:34:54.384009" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-08-22T23:34:54.383893" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.383872" 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-08-22T23:34:54.384558" 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-08-22T23:34:54.384974" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:34:54.385048" 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-08-22T23:34:54.304532" elapsed="0.080629"/>
</kw>
<msg time="2026-08-22T23:34:54.385258" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:34:54.385303" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:34:54.299651" elapsed="0.085689"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:54.385733" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:54.385415" elapsed="0.000376"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.385398" elapsed="0.000417"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:34:54.299487" elapsed="0.086351"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:34:54.391408" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:34:54.391299" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.391280" elapsed="0.000236"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:34:54.392754" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:34:54.392590" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.392569" elapsed="0.000256"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:34:54.393274" level="INFO">${karaf_connection_index} = 26</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:34:54.392970" elapsed="0.000331"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:34:54.393730" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:34:54.393475" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:34:54.434142" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:34:54.394254" elapsed="0.039999"/>
</kw>
<msg time="2026-08-22T23:34:54.434422" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:34:54.434470" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:34:54.393919" elapsed="0.040586"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:34:54.456283" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:34:54.435217" elapsed="0.021335"/>
</kw>
<msg time="2026-08-22T23:34:54.456844" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:34:54.456892" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "O "r "i "g "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:34:54.434720" elapsed="0.022209"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:54.457478" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:54.457079" elapsed="0.000464"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.457029" elapsed="0.000549"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.458204" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:34:54.457755" 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-08-22T23:34:54.458582" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:54.458364" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.458346" elapsed="0.000345"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:34:54.458732" 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-08-22T23:34:54.461454" elapsed="0.000176"/>
</kw>
<msg time="2026-08-22T23:34:54.461692" 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-08-22T23:34:54.460396" 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-08-22T23:34:54.462114" elapsed="0.000370"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:54.462787" 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-08-22T23:34:54.459720" elapsed="0.003291"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:34:54.459098" 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-08-22T23:34:54.392253" elapsed="0.070925"/>
</kw>
<msg time="2026-08-22T23:34:54.463274" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:34:54.463319" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:34:54.391688" elapsed="0.071667"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:34:54.463542" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:34:54.463434" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.463416" elapsed="0.000318"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:54.464160" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:54.464502" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:34:54.464577" 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-08-22T23:34:54.390951" elapsed="0.073752"/>
</kw>
<msg time="2026-08-22T23:34:54.464802" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:34:54.464847" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:34:54.386113" elapsed="0.078768"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:54.465208" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:54.464957" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.464940" elapsed="0.000345"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:34:54.385971" elapsed="0.079339"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:34:54.471073" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:34:54.470964" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.470945" 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-08-22T23:34:54.472300" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:34:54.472190" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.472171" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:34:54.472844" level="INFO">${karaf_connection_index} = 27</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:34:54.472509" elapsed="0.000362"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:34:54.473239" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:34:54.473027" elapsed="0.000237"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:34:54.506373" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:34:54.473778" elapsed="0.032708"/>
</kw>
<msg time="2026-08-22T23:34:54.506677" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:34:54.506724" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:34:54.473422" elapsed="0.033338"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:34:54.529589" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:34:54.507293" elapsed="0.022466"/>
</kw>
<msg time="2026-08-22T23:34:54.529944" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:34:54.529992" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "O "r "i "g "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:34:54.506937" elapsed="0.023090"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:54.530370" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:54.530120" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.530094" elapsed="0.000360"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.530951" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:34:54.530630" 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-08-22T23:34:54.531304" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:54.531088" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.531070" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:34:54.531467" 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-08-22T23:34:54.534039" elapsed="0.000146"/>
</kw>
<msg time="2026-08-22T23:34:54.534247" 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-08-22T23:34:54.533002" elapsed="0.001380"/>
</kw>
<kw name="Open 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-08-22T23:34:54.534680" elapsed="0.000260"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:54.535203" 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-08-22T23:34:54.532356" 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-08-22T23:34:54.531785" elapsed="0.003673"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:34:54.471888" elapsed="0.063670"/>
</kw>
<msg time="2026-08-22T23:34:54.535671" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:34:54.535716" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:34:54.471291" elapsed="0.064461"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:34:54.535937" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:34:54.535828" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.535809" 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-08-22T23:34:54.536463" 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-08-22T23:34:54.536823" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:34:54.536896" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:34:54.470557" elapsed="0.066450"/>
</kw>
<msg time="2026-08-22T23:34:54.537103" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:34:54.537148" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:34:54.465595" elapsed="0.071588"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:54.537508" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:54.537258" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.537241" elapsed="0.000348"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:34:54.465450" elapsed="0.072185"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:34:54.299288" elapsed="0.238382"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:34:54.296699" elapsed="0.241045"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:34:54.291419" elapsed="0.246390"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:34:54.290988" elapsed="0.246873"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:34:54.287472" elapsed="0.250450"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.538570" level="INFO">${template_as_string} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${template_as_string}</var>
<arg>DEVICE_NAME=${device_name}</arg>
<arg>RESTCONF_ROOT=${RESTCONF_ROOT}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:34:54.538109" elapsed="0.000510"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<msg time="2026-08-22T23:34:54.543061" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${directory_with_template_folders}${/}datamod2</arg>
<arg>${template_as_string}</arg>
<arg>session=${original_device_owner_session}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:34:54.538881" elapsed="0.004223">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.544490" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:34:54.543953" elapsed="0.000591"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-08-22T23:34:54.544864" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:34:54.544704" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.544683" elapsed="0.000245"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:34:54.545096" elapsed="0.000216"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.546241" level="FAIL">'5761' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:34:54.545859" elapsed="0.000470">'5761' does not contain '-'</status>
</kw>
<msg time="2026-08-22T23:34:54.546428" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:34:54.545476" elapsed="0.000977"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.546979" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=5761</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:34:54.546641" elapsed="0.000364"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.547457" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5761</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:34:54.547167" elapsed="0.000316"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.547967" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:34:54.547653" elapsed="0.000340"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.548508" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5761

Variable '${original_device_owner_session}' not found.</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-08-22T23:34:54.548146" elapsed="0.000408"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.548976" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5761</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:34:54.548737" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.549687" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=5761'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-08-22T23:34:54.549323" elapsed="0.000411"/>
</kw>
<status status="PASS" start="2026-08-22T23:34:54.549084" elapsed="0.000684"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.549067" elapsed="0.000725"/>
</if>
<arg>5761</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:34:54.543562" elapsed="0.006281"/>
</kw>
<doc>Check that the original owner of the entity is still able to modify the data on the device</doc>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=5761</tag>
<status status="FAIL" start="2026-08-22T23:34:54.286749" elapsed="0.263139">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5761

Variable '${original_device_owner_session}' not found.</status>
</test>
<test id="s1-s4-t16" name="Check_Config_Data_After_Modification_With_Original_Owner_Up" line="234">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:34:54.553520" elapsed="0.000234"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:34:54.553256" 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-08-22T23:34:54.554807" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:34:54.554697" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.554678" 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-08-22T23:34:54.559808" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:34:54.559700" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.559681" elapsed="0.000215"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.560979" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:34:54.560494" elapsed="0.000514"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.561473" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:34:54.561169" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:34:54.561542" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:34:54.561717" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:34:54.560120" elapsed="0.001623"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:34:54.567238" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:34:54.567092" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.567073" elapsed="0.000236"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:34:54.568454" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:34:54.568345" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.568327" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:34:54.568998" level="INFO">${karaf_connection_index} = 25</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:34:54.568690" elapsed="0.000334"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:34:54.569428" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:34:54.569209" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:34:54.602705" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:34:54.569967" elapsed="0.032890"/>
</kw>
<msg time="2026-08-22T23:34:54.603059" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:34:54.603105" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:34:54.569630" elapsed="0.033512"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:34:54.628389" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "U "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:34:54.603793" elapsed="0.024716"/>
</kw>
<msg time="2026-08-22T23:34:54.628700" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:34:54.628748" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:34:54.603360" elapsed="0.025424"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:54.629122" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:54.628878" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.628850" elapsed="0.000356"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.629678" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "U "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:34:54.629350" 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-08-22T23:34:54.630040" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:54.629823" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.629804" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:34:54.630157" 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-08-22T23:34:54.632813" elapsed="0.000154"/>
</kw>
<msg time="2026-08-22T23:34:54.633028" 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-08-22T23:34:54.631739" 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-08-22T23:34:54.633440" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:54.633794" 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-08-22T23:34:54.631073" elapsed="0.002909"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:34:54.630461" 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-08-22T23:34:54.568043" elapsed="0.066104"/>
</kw>
<msg time="2026-08-22T23:34:54.634240" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:34:54.634284" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:34:54.567461" elapsed="0.066861"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:34:54.634630" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:34:54.634496" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.634475" 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-08-22T23:34:54.635163" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:54.635499" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:34:54.635569" 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-08-22T23:34:54.566757" elapsed="0.069004"/>
</kw>
<msg time="2026-08-22T23:34:54.635857" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:34:54.635901" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:34:54.562126" elapsed="0.073810"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:54.636260" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:54.636011" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.635994" elapsed="0.000343"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:34:54.561985" elapsed="0.074376"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:34:54.642111" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:34:54.642001" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.641977" 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-08-22T23:34:54.643368" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:34:54.643260" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.643242" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:34:54.643917" level="INFO">${karaf_connection_index} = 26</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:34:54.643578" elapsed="0.000366"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:34:54.644314" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:34:54.644099" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:34:54.678544" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:34:54.644883" elapsed="0.033790"/>
</kw>
<msg time="2026-08-22T23:34:54.678833" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:34:54.678880" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:34:54.644495" elapsed="0.034420"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:34:54.714384" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "U "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:34:54.679428" elapsed="0.035274"/>
</kw>
<msg time="2026-08-22T23:34:54.714979" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:34:54.715027" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:34:54.679086" elapsed="0.035980"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:54.715680" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:54.715234" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.715176" elapsed="0.000608"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.716414" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "U "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:34:54.715937" elapsed="0.000558"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:54.716923" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:54.716564" elapsed="0.000415"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.716545" elapsed="0.000459"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:34:54.717077" 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">
<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-08-22T23:34:54.719901" elapsed="0.000160"/>
</kw>
<msg time="2026-08-22T23:34:54.720123" 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-08-22T23:34:54.718849" elapsed="0.001419"/>
</kw>
<kw name="Open 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-08-22T23:34:54.720543" elapsed="0.000102"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:54.720906" 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-08-22T23:34:54.718128" 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-08-22T23:34:54.717460" elapsed="0.003738"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:34:54.642929" elapsed="0.078371"/>
</kw>
<msg time="2026-08-22T23:34:54.721398" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:34:54.721442" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:34:54.642335" elapsed="0.079144"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:34:54.721698" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:34:54.721557" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.721539" elapsed="0.000244"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:54.722221" 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-08-22T23:34:54.722567" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:34:54.722666" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:34:54.641623" elapsed="0.081154"/>
</kw>
<msg time="2026-08-22T23:34:54.722876" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:34:54.722920" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:34:54.636704" elapsed="0.086252"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:54.723283" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:54.723035" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.723017" elapsed="0.000343"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:34:54.636499" elapsed="0.086886"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:34:54.729222" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:34:54.729107" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.729087" 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-08-22T23:34:54.730502" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:34:54.730393" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.730374" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:34:54.731065" level="INFO">${karaf_connection_index} = 27</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:34:54.730741" elapsed="0.000351"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:34:54.731473" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:34:54.731251" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:34:54.763526" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:34:54.732084" elapsed="0.031625"/>
</kw>
<msg time="2026-08-22T23:34:54.764094" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:34:54.764143" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:34:54.731674" elapsed="0.032505"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:34:54.790062" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "U "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:34:54.764815" elapsed="0.025466"/>
</kw>
<msg time="2026-08-22T23:34:54.790516" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:34:54.790563" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:34:54.764393" elapsed="0.026234"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:54.791179" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:54.790771" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.790721" elapsed="0.000558"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.791877" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "U "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:34:54.791427" 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-08-22T23:34:54.792240" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:54.792024" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.792006" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:34:54.792363" 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">
<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-08-22T23:34:54.795222" elapsed="0.000167"/>
</kw>
<msg time="2026-08-22T23:34:54.795450" 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-08-22T23:34:54.794119" elapsed="0.001502"/>
</kw>
<kw name="Open 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-08-22T23:34:54.795905" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:54.796237" 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-08-22T23:34:54.793404" 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-08-22T23:34:54.792771" elapsed="0.003725"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:34:54.730090" elapsed="0.066534"/>
</kw>
<msg time="2026-08-22T23:34:54.796731" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:34:54.796775" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:34:54.729471" elapsed="0.067343"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:34:54.797013" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:34:54.796900" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.796881" 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-08-22T23:34:54.797538" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:54.797969" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:34:54.798041" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:34:54.728719" elapsed="0.069432"/>
</kw>
<msg time="2026-08-22T23:34:54.798253" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:34:54.798298" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:34:54.723784" elapsed="0.074551"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:54.798806" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:54.798477" elapsed="0.000388"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.798458" elapsed="0.000431"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:34:54.723536" elapsed="0.075378"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:34:54.561805" elapsed="0.237152"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:34:54.559326" elapsed="0.239704"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:34:54.554386" elapsed="0.244707"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:34:54.553964" elapsed="0.245214"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:34:54.550826" elapsed="0.248417"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.800937" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:34:54.800514" elapsed="0.000451"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.808739" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:34:54.808457" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.809195" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:34:54.808946" 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-08-22T23:34:54.833701" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:34:54.834100" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:34:54.834461" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:34:54.811506" elapsed="0.023022"/>
</kw>
<status status="PASS" start="2026-08-22T23:34:54.809314" elapsed="0.025390"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:54.835288" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:54.834790" elapsed="0.000661"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.809293" elapsed="0.026211"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.843953" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:34:54.838242" elapsed="0.005821"/>
</kw>
<status status="PASS" start="2026-08-22T23:34:54.837732" elapsed="0.006406"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.837685" elapsed="0.006635"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.847212" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:34:54.844911" elapsed="0.002349"/>
</kw>
<status status="PASS" start="2026-08-22T23:34:54.844475" elapsed="0.002820"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.844436" elapsed="0.002884"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.847968" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:34:54.847510" 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-08-22T23:34:54.848339" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:54.848067" elapsed="0.000330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.848907" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:34:54.848584" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-08-22T23:34:54.848422" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.848047" elapsed="0.001045"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.849649" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:34:54.849257" 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-08-22T23:34:54.849978" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:54.849748" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.850511" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:34:54.850215" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:34:54.850059" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.849729" 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-08-22T23:34:54.850770" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:34:54.851636" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:34:54.851292" 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-08-22T23:34:54.851817" elapsed="0.004325"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:34:54.836542" elapsed="0.019672"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:34:54.856403" elapsed="0.000073"/>
</return>
<status status="PASS" start="2026-08-22T23:34:54.856288" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:54.856269" 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-08-22T23:34:54.856707" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:34:54.856780" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:34:54.859158" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:34:54.804105" elapsed="0.055083"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:34:54.859250" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:34:54.859402" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:34:54.801180" elapsed="0.058249"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:34:54.860109" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:34:54.859724" elapsed="0.000479">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:34:54.859499" elapsed="0.000784">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:34:54.859482" elapsed="0.000837">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:54.860543" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:54.860390" elapsed="0.000252"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:34:54.860373" elapsed="0.000295"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:54.800085" elapsed="0.060675">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:34:55.864556" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:34:55.862917" elapsed="0.001772"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:34:55.876302" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:34:55.876014" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:34:55.876770" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:34:55.876502" 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-08-22T23:34:55.896614" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:34:55.896780" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:34:55.896883" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:34:55.878990" elapsed="0.017922"/>
</kw>
<status status="PASS" start="2026-08-22T23:34:55.876894" elapsed="0.020060"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:55.897136" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:55.896982" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:55.876871" elapsed="0.020351"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:34:55.900992" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:34:55.898258" elapsed="0.002806"/>
</kw>
<status status="PASS" start="2026-08-22T23:34:55.898035" elapsed="0.003079"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:55.898017" elapsed="0.003133"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:34:55.904986" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:34:55.901640" elapsed="0.003412"/>
</kw>
<status status="PASS" start="2026-08-22T23:34:55.901230" elapsed="0.003873"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:55.901207" elapsed="0.003931"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:34:55.905952" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:34:55.905380" 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-08-22T23:34:55.906415" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:55.906090" elapsed="0.000406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:34:55.907194" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:34:55.906776" elapsed="0.000456"/>
</kw>
<status status="PASS" start="2026-08-22T23:34:55.906530" elapsed="0.000752"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:55.906064" elapsed="0.001248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:34:55.908058" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:34:55.907531" 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-08-22T23:34:55.908552" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:55.908192" elapsed="0.000464"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:34:55.909193" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:34:55.908899" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:34:55.908691" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:55.908167" 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-08-22T23:34:55.909425" elapsed="0.000365"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:34:55.910255" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:34:55.909951" 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-08-22T23:34:55.910431" 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-08-22T23:34:55.897610" elapsed="0.015304"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:34:55.913136" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:34:55.913024" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:55.913005" 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-08-22T23:34:55.913378" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:34:55.913449" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:34:55.915816" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:34:55.869861" elapsed="0.045985"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:34:55.915907" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:34:55.916060" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:34:55.865365" elapsed="0.050721"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:34:55.916783" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:34:55.916366" elapsed="0.000495">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:34:55.916158" elapsed="0.000774">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:34:55.916141" elapsed="0.000826">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:55.917186" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:55.917039" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:34:55.917022" elapsed="0.000244"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:55.861726" elapsed="0.055622">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:34:56.920366" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:34:56.919392" elapsed="0.001046"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:34:56.933658" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:34:56.933236" elapsed="0.000501"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:34:56.934191" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:34:56.933944" 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-08-22T23:34:56.955907" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:34:56.956215" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:34:56.956442" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:34:56.936417" elapsed="0.020083"/>
</kw>
<status status="PASS" start="2026-08-22T23:34:56.934316" elapsed="0.022322"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:56.957062" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:56.956708" elapsed="0.000589"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:56.934290" elapsed="0.023193"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:34:56.965566" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:34:56.959892" elapsed="0.005820"/>
</kw>
<status status="PASS" start="2026-08-22T23:34:56.959352" elapsed="0.006441"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:56.959312" elapsed="0.006538"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:34:56.968527" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:34:56.966168" elapsed="0.002405"/>
</kw>
<status status="PASS" start="2026-08-22T23:34:56.965946" elapsed="0.002678"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:56.965928" elapsed="0.002723"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:34:56.969234" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:34:56.968833" 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-08-22T23:34:56.969590" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:56.969334" elapsed="0.000333"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:34:56.970154" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:34:56.969853" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:34:56.969692" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:56.969316" elapsed="0.000924"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:34:56.970778" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:34:56.970396" 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-08-22T23:34:56.971107" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:56.970876" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:34:56.971657" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:34:56.971344" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-08-22T23:34:56.971189" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:56.970858" 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-08-22T23:34:56.971892" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:34:56.972720" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:34:56.972402" 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-08-22T23:34:56.972899" elapsed="0.002424"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:34:56.958352" elapsed="0.017037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:34:56.975571" elapsed="0.000053"/>
</return>
<status status="PASS" start="2026-08-22T23:34:56.975461" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:56.975442" 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-08-22T23:34:56.975831" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:34:56.975906" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:34:56.978305" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:34:56.926262" elapsed="0.052073"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:34:56.978398" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:34:56.978551" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:34:56.920993" elapsed="0.057588"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:34:56.979238" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:34:56.978875" elapsed="0.000445">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:34:56.978667" elapsed="0.000762">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:34:56.978649" elapsed="0.000817">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:56.979701" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:56.979537" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:34:56.979520" elapsed="0.000264"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:56.918285" elapsed="0.061583">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:34:57.983053" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:34:57.982028" elapsed="0.001101"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:34:57.993915" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:34:57.993650" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:34:57.994370" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:34:57.994118" 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-08-22T23:34:58.016265" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:34:58.016571" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:34:58.016847" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:34:57.996674" elapsed="0.020235"/>
</kw>
<status status="PASS" start="2026-08-22T23:34:57.994493" elapsed="0.022521"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:58.017428" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:58.017082" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:57.994469" 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-08-22T23:34:58.024854" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:34:58.020207" elapsed="0.004697"/>
</kw>
<status status="PASS" start="2026-08-22T23:34:58.019459" elapsed="0.005481"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:58.019418" elapsed="0.005547"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:34:58.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-08-22T23:34:58.025239" elapsed="0.002420"/>
</kw>
<status status="PASS" start="2026-08-22T23:34:58.025021" elapsed="0.002687"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:58.025005" elapsed="0.002729"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:34:58.028307" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:34:58.027911" 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-08-22T23:34:58.028669" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:58.028405" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:34:58.029223" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:34:58.028919" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:34:58.028755" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:58.028388" elapsed="0.000921"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:34:58.029888" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:34:58.029464" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:58.030308" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:58.030066" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:34:58.030870" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:34:58.030551" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-08-22T23:34:58.030392" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:58.030047" 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-08-22T23:34:58.031110" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:34:58.031996" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:34:58.031637" 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-08-22T23:34:58.032180" 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-08-22T23:34:58.018474" elapsed="0.016297"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:34:58.034953" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:34:58.034842" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:58.034824" 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-08-22T23:34:58.035193" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:34:58.035266" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:34:58.037642" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:34:57.987883" elapsed="0.049790"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:34:58.037735" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:34:58.037893" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:34:57.983670" elapsed="0.054250"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:34:58.038563" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:34:58.038200" elapsed="0.000459">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:34:58.037991" elapsed="0.000740">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:34:58.037973" elapsed="0.000793">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:58.038983" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:58.038836" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:34:58.038819" elapsed="0.000244"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:57.980902" elapsed="0.058242">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:34:59.042155" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:34:59.041140" elapsed="0.001087"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:34:59.052923" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:34:59.052658" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:34:59.053464" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:34:59.053211" 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-08-22T23:34:59.094951" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:34:59.095104" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:34:59.095205" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:34:59.055713" elapsed="0.039519"/>
</kw>
<status status="PASS" start="2026-08-22T23:34:59.053604" elapsed="0.041671"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:59.095456" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:59.095303" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:59.053566" elapsed="0.041978"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:34:59.099243" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:34:59.096645" elapsed="0.002648"/>
</kw>
<status status="PASS" start="2026-08-22T23:34:59.096381" elapsed="0.002948"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:59.096363" elapsed="0.002992"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:34:59.101994" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:34:59.099651" elapsed="0.002389"/>
</kw>
<status status="PASS" start="2026-08-22T23:34:59.099412" elapsed="0.002664"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:59.099395" elapsed="0.002707"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:34:59.102730" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:34:59.102277" 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-08-22T23:34:59.103070" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:59.102830" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:34:59.103632" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:34:59.103311" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-08-22T23:34:59.103152" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:59.102811" elapsed="0.000910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:34:59.104274" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:34:59.103878" elapsed="0.000423"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:59.104618" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:59.104373" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:34:59.105158" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:34:59.104859" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:34:59.104702" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:59.104355" 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-08-22T23:34:59.105393" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:34:59.106212" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:34:59.105921" 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-08-22T23:34:59.106388" elapsed="0.002323"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:34:59.095961" elapsed="0.012815"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:34:59.108959" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:34:59.108845" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-08-22T23:34:59.108827" elapsed="0.000286"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:59.109262" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:34:59.109334" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:34:59.111696" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:34:59.048221" elapsed="0.063504"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:34:59.111786" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:34:59.111942" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:34:59.042758" elapsed="0.069213"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:34:59.112673" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:34:59.112280" elapsed="0.000473">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:34:59.112042" elapsed="0.000782">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:34:59.112025" elapsed="0.000835">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:34:59.113079" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:34:59.112930" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:34:59.112914" elapsed="0.000246"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:34:59.039988" elapsed="0.073253">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:00.116162" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:00.115175" elapsed="0.001058"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:00.127171" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:00.126905" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:00.127638" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:00.127372" 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-08-22T23:35:00.148297" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:00.148451" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:00.148552" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:00.129861" elapsed="0.018738"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:00.127759" elapsed="0.020887"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:00.148828" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:00.148674" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:00.127737" elapsed="0.021177"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:00.156862" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:00.151310" elapsed="0.005663"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:00.150712" elapsed="0.006341"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:00.150670" elapsed="0.006441"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:00.160813" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:00.157767" elapsed="0.003092"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:00.157239" elapsed="0.003655"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:00.157202" elapsed="0.003717"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:00.161510" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:00.161114" 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-08-22T23:35:00.161862" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:00.161626" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:00.162425" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:00.162122" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:00.161944" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:00.161607" elapsed="0.000903"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:00.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-08-22T23:35:00.162693" 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-08-22T23:35:00.163381" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:00.163152" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:00.163939" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:00.163644" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:00.163462" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:00.163135" 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-08-22T23:35:00.164173" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:00.164995" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:00.164699" 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-08-22T23:35:00.165170" elapsed="0.002327"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:35:00.149708" elapsed="0.017853"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:00.167897" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:35:00.167777" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:00.167632" 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-08-22T23:35:00.168137" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:00.168207" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:35:00.170566" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:00.122252" elapsed="0.048362"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:00.170675" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:35:00.170827" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:00.116775" elapsed="0.054078"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:00.171482" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:00.171128" elapsed="0.000432">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:00.170922" elapsed="0.000730">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:00.170905" elapsed="0.000815">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:00.171940" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:00.171794" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:00.171777" elapsed="0.000249"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:00.114083" elapsed="0.058026">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:01.175166" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:01.174174" elapsed="0.001064"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:01.187085" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:01.186716" elapsed="0.000426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:01.187540" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:01.187293" 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-08-22T23:35:01.210825" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:01.211118" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:01.211340" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:01.189776" elapsed="0.021622"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:01.187682" elapsed="0.023830"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:01.211963" elapsed="0.000070"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:01.211575" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:01.187658" elapsed="0.024521"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:01.219624" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:01.214677" elapsed="0.004999"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:01.214097" elapsed="0.005616"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:01.214054" elapsed="0.005684"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:01.222402" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:01.220015" elapsed="0.002445"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:01.219793" elapsed="0.002702"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:01.219777" elapsed="0.002743"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:01.223129" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:01.222713" 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-08-22T23:35:01.223469" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:01.223225" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:01.224038" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:01.223738" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:01.223551" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:01.223207" elapsed="0.000928"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:01.224698" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:01.224291" 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-08-22T23:35:01.225086" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:01.224852" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:01.225695" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:01.225364" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:01.225181" elapsed="0.000578"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:01.224833" 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-08-22T23:35:01.225930" elapsed="0.000392"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:01.226851" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:01.226503" 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-08-22T23:35:01.227043" 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-08-22T23:35:01.213068" elapsed="0.016494"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:01.229759" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:35:01.229650" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:01.229631" 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-08-22T23:35:01.229999" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:01.230071" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:35:01.232496" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:01.180500" elapsed="0.052026"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:01.232604" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:35:01.232761" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:01.175773" elapsed="0.057015"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:01.233428" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:01.233068" elapsed="0.000437">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:01.232859" elapsed="0.000716">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:01.232842" elapsed="0.000788">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:01.233848" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:01.233702" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:01.233685" elapsed="0.000243"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:01.173003" elapsed="0.061007">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:02.236949" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:02.235943" elapsed="0.001080"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:02.248889" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:02.248612" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:02.249414" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:02.249166" 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-08-22T23:35:02.269799" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:02.270089" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:02.270308" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:02.251627" elapsed="0.018739"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:02.249538" elapsed="0.020926"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:02.270908" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:02.270525" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:02.249514" elapsed="0.021591"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:02.278850" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:02.273485" elapsed="0.005415"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:02.272988" elapsed="0.005949"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:02.272945" elapsed="0.006017"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:02.281558" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:02.279238" elapsed="0.002384"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:02.279018" elapsed="0.002640"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:02.279001" elapsed="0.002682"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:02.282259" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:02.281860" 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-08-22T23:35:02.282615" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:02.282357" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:02.283153" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:02.282856" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:02.282698" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:02.282339" elapsed="0.000899"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:02.283770" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:02.283393" 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-08-22T23:35:02.284093" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:02.283866" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:02.284636" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:02.284327" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:02.284172" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:02.283848" 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-08-22T23:35:02.284872" elapsed="0.000380"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:02.285729" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:02.285414" 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-08-22T23:35:02.286011" elapsed="0.002317"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:35:02.271924" elapsed="0.016466"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:02.288569" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-08-22T23:35:02.288460" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:02.288442" 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-08-22T23:35:02.288868" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:02.288939" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:35:02.291277" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:02.243124" elapsed="0.048182"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:02.291365" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:35:02.291514" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:02.237512" elapsed="0.054028"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:02.292198" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:02.291834" elapsed="0.000444">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:02.291627" elapsed="0.000723">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:02.291609" elapsed="0.000776">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:02.292616" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:02.292454" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:02.292437" elapsed="0.000260"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:02.234846" elapsed="0.057933">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:03.295472" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:03.294534" elapsed="0.001005"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:03.307260" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:03.306997" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:03.307729" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:03.307462" 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-08-22T23:35:03.334310" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:03.334656" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:03.334881" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:03.310004" elapsed="0.024935"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:03.307847" elapsed="0.027191"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:03.335440" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:03.335098" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:03.307826" elapsed="0.027845"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:03.344943" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:03.337960" elapsed="0.007201"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:03.337431" elapsed="0.007812"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:03.337389" elapsed="0.007911"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:03.348961" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:03.345969" elapsed="0.003039"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:03.345428" elapsed="0.003616"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:03.345390" elapsed="0.003679"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:03.349652" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:03.349244" 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-08-22T23:35:03.349988" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:03.349752" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:03.350543" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:03.350228" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:03.350071" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:03.349733" elapsed="0.000919"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:03.351177" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:03.350808" 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-08-22T23:35:03.351504" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:03.351275" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:03.352058" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:03.351762" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:03.351603" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:03.351257" elapsed="0.000886"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:35:03.352294" elapsed="0.000369"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:03.353121" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:03.352825" 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-08-22T23:35:03.353299" 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-08-22T23:35:03.336449" elapsed="0.019311"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:03.355939" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:35:03.355830" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:03.355812" 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-08-22T23:35:03.356177" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:03.356248" elapsed="0.000014"/>
</return>
<msg time="2026-08-22T23:35:03.358681" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:03.301517" elapsed="0.057194"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:03.358772" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:35:03.358926" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:03.296058" elapsed="0.062895"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:03.359610" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:03.359232" elapsed="0.000459">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:03.359022" elapsed="0.000757">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:03.359006" elapsed="0.000846">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:03.360084" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:03.359929" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:03.359912" elapsed="0.000255"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:03.293497" elapsed="0.066755">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:04.363245" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:04.362234" elapsed="0.001084"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:04.375337" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:04.375073" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:04.375801" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:04.375537" 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-08-22T23:35:04.398050" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:04.398348" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:04.398567" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:04.378003" elapsed="0.020718"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:04.375925" elapsed="0.022895"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:04.399228" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:04.398880" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:04.375901" elapsed="0.023521"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:04.407239" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:04.401760" elapsed="0.005534"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:04.401233" elapsed="0.006095"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:04.401193" elapsed="0.006160"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:04.409932" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:04.407643" elapsed="0.002334"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:04.407408" elapsed="0.002603"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:04.407392" elapsed="0.002643"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:04.410627" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:04.410214" 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-08-22T23:35:04.410976" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:04.410737" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:04.411519" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:04.411221" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:04.411058" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:04.410718" elapsed="0.000902"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:04.412135" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:04.411775" 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-08-22T23:35:04.412457" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:04.412230" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:04.413075" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:04.412776" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:04.412616" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:04.412213" 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-08-22T23:35:04.413308" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:04.414133" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:04.413837" 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-08-22T23:35:04.414327" elapsed="0.003952"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:35:04.400247" elapsed="0.018097"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:04.418522" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:35:04.418414" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:04.418395" 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-08-22T23:35:04.418796" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:04.418869" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:35:04.421318" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:04.368871" elapsed="0.052476"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:04.421407" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:35:04.421558" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:04.363851" elapsed="0.057751"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:04.422241" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:04.421880" elapsed="0.000437">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:04.421672" elapsed="0.000716">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:04.421655" elapsed="0.000768">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:04.422658" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:04.422494" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:04.422477" elapsed="0.000265"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:04.361119" elapsed="0.061733">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:05.425834" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:05.424754" elapsed="0.001154"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:05.435748" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:05.435468" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:05.436196" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:05.435947" 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-08-22T23:35:05.474732" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:05.474926" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:05.475066" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:05.438469" elapsed="0.036633"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:05.436390" elapsed="0.038772"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:05.475413" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:05.475199" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:05.436367" elapsed="0.039168"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:05.480676" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:05.476986" elapsed="0.003761"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:05.476675" elapsed="0.004124"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:05.476649" elapsed="0.004187"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:05.484649" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:05.481225" elapsed="0.003491"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:05.480917" elapsed="0.003850"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:05.480894" elapsed="0.003910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:05.485611" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:05.485045" 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-08-22T23:35:05.486111" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:05.485751" elapsed="0.000443"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:05.486900" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:05.486453" elapsed="0.000486"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:05.486230" elapsed="0.000760"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:05.485726" elapsed="0.001295"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:05.487621" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:05.487241" 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-08-22T23:35:05.487950" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:05.487720" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:05.488487" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:05.488191" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:05.488033" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:05.487702" elapsed="0.000870"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:35:05.488743" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:05.489550" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:05.489258" 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-08-22T23:35:05.489746" elapsed="0.002366"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:35:05.476058" elapsed="0.016118"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:05.492354" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-08-22T23:35:05.492246" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:05.492227" 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-08-22T23:35:05.492609" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:05.492815" elapsed="0.000018"/>
</return>
<msg time="2026-08-22T23:35:05.495230" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:05.429946" elapsed="0.065314"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:05.495320" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:35:05.495474" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:05.426291" elapsed="0.069210"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:05.496159" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:05.495797" elapsed="0.000440">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:05.495571" elapsed="0.000738">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:05.495555" elapsed="0.000790">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:05.496561" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:05.496415" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:05.496399" elapsed="0.000260"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:05.423654" elapsed="0.073087">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:06.500014" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:06.498979" elapsed="0.001111"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:06.510714" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:06.510425" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:06.511169" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:06.510917" 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-08-22T23:35:06.530546" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:06.530737" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:06.530842" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:06.513459" elapsed="0.017410"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:06.511294" elapsed="0.019618"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:06.531098" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:06.530942" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:06.511269" elapsed="0.019993"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:06.539497" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:06.533750" elapsed="0.005898"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:06.533205" elapsed="0.006628"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:06.533161" elapsed="0.006735"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:06.543368" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:06.540684" elapsed="0.002731"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:06.540042" elapsed="0.003408"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:06.539993" elapsed="0.003482"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:06.544098" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:06.543676" 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-08-22T23:35:06.544472" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:06.544202" elapsed="0.000334"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:06.545051" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:06.544745" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:06.544563" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:06.544183" elapsed="0.000967"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:06.545697" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:06.545309" 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-08-22T23:35:06.546028" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:06.545795" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:06.546613" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:06.546294" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:06.546111" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:06.545777" elapsed="0.000920"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:35:06.546852" elapsed="0.000363"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:06.547699" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:06.547378" 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-08-22T23:35:06.547877" 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-08-22T23:35:06.532129" elapsed="0.018194"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:06.550506" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:35:06.550394" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:06.550375" 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-08-22T23:35:06.550780" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:06.550853" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:35:06.553341" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:06.505778" elapsed="0.047594"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:06.553433" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:35:06.553606" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:06.500691" elapsed="0.052944"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:06.554290" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:06.553918" elapsed="0.000473">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:06.553708" elapsed="0.000759">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:06.553691" elapsed="0.000849">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:06.554790" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:06.554637" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:06.554619" elapsed="0.000255"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:06.497753" elapsed="0.057207">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:07.558004" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:07.556968" elapsed="0.001109"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:07.568008" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:07.567745" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:07.568465" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:07.568217" 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-08-22T23:35:07.588858" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:07.589021" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:07.589137" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:07.570714" elapsed="0.018496"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:07.568606" elapsed="0.020759"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:07.590022" elapsed="0.000070"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:07.589455" elapsed="0.000773"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:07.568565" elapsed="0.021738"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:07.599754" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:07.593255" elapsed="0.006550"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:07.592670" elapsed="0.007171"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:07.592575" elapsed="0.007292"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:07.602517" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:07.600144" elapsed="0.002419"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:07.599922" elapsed="0.002694"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:07.599906" elapsed="0.002735"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:07.603352" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:07.602823" 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-08-22T23:35:07.603714" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:07.603449" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:07.604257" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:07.603957" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:07.603798" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:07.603431" elapsed="0.000909"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:07.604876" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:07.604494" 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-08-22T23:35:07.605202" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:07.604974" elapsed="0.000357"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:07.605835" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:07.605519" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:07.605356" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:07.604956" 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-08-22T23:35:07.606095" elapsed="0.000357"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:07.606940" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:07.606633" 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-08-22T23:35:07.607119" elapsed="0.002430"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:35:07.591499" elapsed="0.018137"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:07.609818" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:35:07.609706" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:07.609688" 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-08-22T23:35:07.610103" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:07.610176" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:35:07.612606" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:07.562249" elapsed="0.050387"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:07.612698" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:35:07.612850" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:07.558415" elapsed="0.054461"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:07.613511" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:07.613152" elapsed="0.000456">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:07.612946" elapsed="0.000736">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:07.612929" elapsed="0.000788">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:07.613933" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:07.613787" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:07.613771" elapsed="0.000242"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:07.555869" elapsed="0.058245">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:08.617316" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:08.616294" elapsed="0.001097"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:08.628125" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:08.627859" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:08.628601" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:08.628336" 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-08-22T23:35:08.648709" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:08.648863" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:08.648964" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:08.630946" elapsed="0.018044"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:08.628803" elapsed="0.020231"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:08.649386" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:08.649062" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:08.628780" elapsed="0.020862"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:08.657949" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:08.652036" elapsed="0.006027"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:08.651514" elapsed="0.006632"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:08.651471" elapsed="0.006732"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:08.661438" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:08.658948" elapsed="0.002537"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:08.658328" elapsed="0.003192"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:08.658291" elapsed="0.003255"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:08.662133" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:08.661739" 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-08-22T23:35:08.662472" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:08.662237" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:08.663122" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:08.662799" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:08.662554" elapsed="0.000633"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:08.662219" elapsed="0.000990"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:08.663765" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:08.663366" 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-08-22T23:35:08.664094" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:08.663863" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:08.664652" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:08.664336" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:08.664177" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:08.663845" 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-08-22T23:35:08.664889" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:08.665711" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:08.665401" 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-08-22T23:35:08.665892" elapsed="0.002369"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:35:08.650452" elapsed="0.017873"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:08.668505" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:35:08.668396" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:08.668377" 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-08-22T23:35:08.668762" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:08.668874" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:35:08.671241" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:08.623488" elapsed="0.047782"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:08.671330" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:35:08.671484" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:08.618048" elapsed="0.053463"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:08.672171" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:08.671808" elapsed="0.000443">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:08.671598" elapsed="0.000725">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:08.671564" elapsed="0.000794">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:08.672573" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:08.672428" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:08.672411" elapsed="0.000260"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:08.615147" elapsed="0.057606">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:09.675700" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:09.674702" elapsed="0.001069"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:09.688026" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:09.687662" elapsed="0.000433"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:09.688535" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:09.688285" 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-08-22T23:35:09.707304" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:09.707627" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:09.707854" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:09.690768" elapsed="0.017146"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:09.688673" elapsed="0.019338"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:09.708416" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:09.708072" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:09.688651" elapsed="0.019999"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:09.715277" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:09.710935" elapsed="0.004414"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:09.710407" elapsed="0.005070"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:09.710366" elapsed="0.005152"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:09.719300" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:09.715944" elapsed="0.003423"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:09.715621" elapsed="0.003797"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:09.715577" elapsed="0.003876"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:09.720261" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:09.719713" 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-08-22T23:35:09.720756" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:09.720402" elapsed="0.000439"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:09.721528" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:09.721102" elapsed="0.000465"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:09.720876" elapsed="0.000768"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:09.720376" elapsed="0.001300"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:09.722410" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:09.721897" 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-08-22T23:35:09.722902" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:09.722550" elapsed="0.000436"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:09.723719" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:09.723243" elapsed="0.000514"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:09.723021" elapsed="0.000788"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:09.722525" 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-08-22T23:35:09.724050" elapsed="0.000400"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:09.724925" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:09.724630" 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-08-22T23:35:09.725106" elapsed="0.002390"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:35:09.709438" elapsed="0.018123"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:09.727758" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:35:09.727648" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:09.727629" 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-08-22T23:35:09.727998" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:09.728070" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:35:09.730468" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:09.681243" elapsed="0.049254"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:09.730558" elapsed="0.000043"/>
</return>
<msg time="2026-08-22T23:35:09.730728" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:09.676263" elapsed="0.054492"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:09.731439" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:09.731035" elapsed="0.000480">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:09.730827" elapsed="0.000775">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:09.730810" elapsed="0.000869">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:09.731904" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:09.731756" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:09.731738" elapsed="0.000249"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:09.673618" elapsed="0.058451">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:10.735002" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:10.733997" elapsed="0.001076"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:10.747153" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:10.746878" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:10.747622" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:10.747360" 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-08-22T23:35:10.775937" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:10.776090" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:10.776191" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:10.749846" elapsed="0.026371"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:10.747743" elapsed="0.028517"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:10.776441" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:10.776287" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:10.747722" elapsed="0.028808"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:10.780064" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:10.777556" elapsed="0.002557"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:10.777336" elapsed="0.002812"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:10.777317" elapsed="0.002857"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:10.782821" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:10.780448" elapsed="0.002419"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:10.780230" elapsed="0.002672"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:10.780213" elapsed="0.002714"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:10.783512" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:10.783117" 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-08-22T23:35:10.783866" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:10.783630" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:10.784414" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:10.784110" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:10.783950" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:10.783611" elapsed="0.000889"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:10.785044" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:10.784677" 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-08-22T23:35:10.785378" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:10.785142" elapsed="0.000349"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:10.786003" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:10.785698" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:10.785517" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:10.785124" 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-08-22T23:35:10.786246" elapsed="0.000412"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:10.787185" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:10.786826" 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-08-22T23:35:10.787382" 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-08-22T23:35:10.776911" elapsed="0.012989"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:10.790079" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:35:10.789971" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:10.789952" 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-08-22T23:35:10.790317" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:10.790389" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:35:10.792745" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:10.741606" elapsed="0.051169"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:10.792835" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:35:10.792986" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:10.735568" elapsed="0.057444"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:10.793684" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:10.793284" elapsed="0.000480">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:10.793082" elapsed="0.000753">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:10.793065" elapsed="0.000804">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:10.794081" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:10.793938" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:10.793921" elapsed="0.000239"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:10.732931" elapsed="0.061313">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:11.795935" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:11.795517" elapsed="0.000449"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:11.803225" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:11.802974" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:11.803686" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:11.803424" 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-08-22T23:35:11.830413" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:11.830556" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:11.830677" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:11.805918" elapsed="0.024785"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:11.803850" elapsed="0.026897"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:11.830925" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:11.830773" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:11.803830" elapsed="0.027181"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:11.834640" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:11.832025" elapsed="0.002666"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:11.831807" elapsed="0.002920"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:11.831788" elapsed="0.002965"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:11.837420" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:11.835031" elapsed="0.002435"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:11.834810" elapsed="0.002691"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:11.834793" elapsed="0.002733"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:11.838087" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:11.837705" 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-08-22T23:35:11.838426" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:11.838187" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:11.839022" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:11.838719" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:11.838540" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:11.838169" elapsed="0.000940"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:11.839646" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:11.839266" 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-08-22T23:35:11.839978" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:11.839746" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:11.840517" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:11.840220" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:11.840062" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:11.839727" 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-08-22T23:35:11.840770" elapsed="0.000357"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:11.841568" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:11.841290" 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-08-22T23:35:11.841765" elapsed="0.002380"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:35:11.831366" elapsed="0.012843"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:11.844388" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-08-22T23:35:11.844281" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:11.844262" 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-08-22T23:35:11.844639" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:11.844749" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:35:11.847190" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:11.798648" elapsed="0.048572"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:11.847281" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:35:11.847435" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:11.796179" elapsed="0.051283"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:11.848107" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:11.847758" elapsed="0.000422">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:11.847533" elapsed="0.000716">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:11.847516" elapsed="0.000772">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:11.848500" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:11.848357" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:11.848340" elapsed="0.000257"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:11.794961" elapsed="0.053719">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:12.851907" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:12.850905" elapsed="0.001076"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:12.863270" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:12.863007" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:12.863739" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:12.863471" 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-08-22T23:35:12.885575" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:12.885963" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:12.886189" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:12.866036" elapsed="0.020214"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:12.863864" elapsed="0.022487"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:12.886788" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:12.886413" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:12.863839" elapsed="0.023149"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:12.894652" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:12.889280" elapsed="0.005423"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:12.888785" elapsed="0.006021"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:12.888743" elapsed="0.006091"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:12.897480" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:12.895115" elapsed="0.002413"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:12.894893" elapsed="0.002711"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:12.894876" elapsed="0.002767"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:12.898266" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:12.897856" 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-08-22T23:35:12.898669" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:12.898411" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:12.899216" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:12.898913" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:12.898754" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:12.898348" elapsed="0.000955"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:12.899930" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:12.899549" 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-08-22T23:35:12.900258" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:12.900028" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:12.900817" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:12.900501" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:12.900345" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:12.900010" 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-08-22T23:35:12.901053" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:12.901970" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:12.901627" 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-08-22T23:35:12.902151" elapsed="0.002369"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:35:12.887800" elapsed="0.016802"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:12.904787" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:35:12.904676" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:12.904657" 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-08-22T23:35:12.905032" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:12.905104" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:35:12.907602" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:12.858272" elapsed="0.049361"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:12.907694" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:35:12.907845" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:12.852482" elapsed="0.055390"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:12.908518" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:12.908153" elapsed="0.000467">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:12.907943" elapsed="0.000755">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:12.907926" elapsed="0.000841">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:12.908992" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:12.908843" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:12.908826" elapsed="0.000247"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:12.849727" elapsed="0.059431">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:13.912223" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:13.911189" elapsed="0.001111"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:13.922610" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:13.922328" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:13.923066" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:13.922816" 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-08-22T23:35:13.945140" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:13.945338" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:13.945476" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:13.925315" elapsed="0.020197"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:13.923190" elapsed="0.022413"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:13.945864" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:13.945647" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:13.923166" elapsed="0.022823"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:13.950938" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:13.947408" elapsed="0.003598"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:13.947097" elapsed="0.003959"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:13.947072" elapsed="0.004019"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:13.954802" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:13.951476" elapsed="0.003392"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:13.951169" elapsed="0.003748"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:13.951146" elapsed="0.003806"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:13.955755" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:13.955189" 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-08-22T23:35:13.956222" elapsed="0.000070"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:13.955892" elapsed="0.000464"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:13.957070" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:13.956646" elapsed="0.000461"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:13.956392" elapsed="0.000767"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:13.955868" elapsed="0.001321"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:13.957758" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:13.957378" 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-08-22T23:35:13.958083" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:13.957854" elapsed="0.000347"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:13.958701" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:13.958387" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:13.958227" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:13.957837" 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-08-22T23:35:13.958937" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:13.959770" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:13.959454" 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-08-22T23:35:13.959948" elapsed="0.004248"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:35:13.946482" elapsed="0.017779"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:13.964469" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:35:13.964358" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:13.964339" 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-08-22T23:35:13.964728" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:13.964801" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:35:13.967142" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:13.916834" elapsed="0.050337"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:13.967231" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:35:13.967381" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:13.912831" elapsed="0.054577"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:13.968060" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:13.967700" elapsed="0.000439">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:13.967476" elapsed="0.000735">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:13.967460" elapsed="0.000785">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:13.968476" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:13.968328" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:13.968311" elapsed="0.000246"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:13.910069" elapsed="0.058583">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:14.971964" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:14.970958" elapsed="0.001083"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:14.983727" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:14.983441" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:14.984177" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:14.983929" 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-08-22T23:35:15.006512" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:15.006982" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:15.007289" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:14.986501" elapsed="0.020860"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:14.984397" elapsed="0.023281"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:15.008200" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:15.007759" elapsed="0.000600"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:14.984372" elapsed="0.024040"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:15.015043" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:15.011209" elapsed="0.003905"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:15.010491" elapsed="0.004675"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:15.010444" elapsed="0.004757"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:15.018874" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:15.015613" elapsed="0.003328"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:15.015279" elapsed="0.003712"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:15.015256" elapsed="0.003771"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:15.019722" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:15.019281" 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-08-22T23:35:15.020059" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:15.019821" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:15.020625" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:15.020301" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:15.020141" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:15.019804" elapsed="0.000908"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:15.021229" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:15.020869" 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-08-22T23:35:15.021554" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:15.021325" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:15.022109" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:15.021811" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:15.021654" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:15.021307" 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-08-22T23:35:15.022350" elapsed="0.000394"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:15.023210" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:15.022908" 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-08-22T23:35:15.023390" 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-08-22T23:35:15.009366" elapsed="0.016586"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:15.026142" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-08-22T23:35:15.026025" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:15.026005" 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-08-22T23:35:15.026417" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:15.026562" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:35:15.029028" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:14.977282" elapsed="0.051776"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:15.029120" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:35:15.029273" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:14.972540" elapsed="0.056760"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:15.029967" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:15.029600" elapsed="0.000450">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:15.029377" elapsed="0.000747">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:15.029359" elapsed="0.000800">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:15.030373" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:15.030228" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:15.030212" elapsed="0.000241"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:14.969760" elapsed="0.060776">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:16.033681" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:16.032624" elapsed="0.001154"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:16.046038" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:16.045754" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:16.046528" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:16.046265" 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-08-22T23:35:16.069192" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:16.069468" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:16.069676" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:16.049090" elapsed="0.020629"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:16.046671" elapsed="0.023124"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:16.070146" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:16.069843" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:16.046646" elapsed="0.023632"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:16.075552" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:16.071938" elapsed="0.003709"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:16.071573" elapsed="0.004215"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:16.071544" elapsed="0.004285"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:16.079651" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:16.076234" elapsed="0.003484"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:16.075913" elapsed="0.003855"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:16.075889" elapsed="0.003915"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:16.080624" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:16.080049" 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-08-22T23:35:16.081115" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:16.080765" elapsed="0.000432"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:16.081905" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:16.081455" elapsed="0.000489"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:16.081231" elapsed="0.000770"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:16.080739" elapsed="0.001293"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:16.082795" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:16.082252" 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-08-22T23:35:16.083355" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:16.082934" elapsed="0.000512"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:16.084164" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:16.083736" elapsed="0.000464"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:16.083482" elapsed="0.000769"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:16.082909" 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-08-22T23:35:16.084489" elapsed="0.000555"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:16.085620" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:16.085280" 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-08-22T23:35:16.085802" elapsed="0.002335"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:35:16.070888" elapsed="0.017317"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:16.088390" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:35:16.088277" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:16.088258" 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-08-22T23:35:16.088653" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:16.088725" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:35:16.091159" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:16.040604" elapsed="0.050584"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:16.091249" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:35:16.091406" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:16.034271" elapsed="0.057162"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:16.092100" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:16.091731" elapsed="0.000451">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:16.091503" elapsed="0.000758">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:16.091487" elapsed="0.000848">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:16.092563" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:16.092413" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:16.092395" elapsed="0.000266"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:16.031443" elapsed="0.061305">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:17.095807" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:17.094822" elapsed="0.001056"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:17.107591" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:17.107316" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:17.108047" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:17.107798" 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-08-22T23:35:17.126045" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:17.126198" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:17.126298" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:17.110267" elapsed="0.016057"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:17.108169" elapsed="0.018209"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:17.126851" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:17.126442" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:17.108146" elapsed="0.018905"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:17.134643" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:17.129347" elapsed="0.005346"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:17.128855" elapsed="0.005873"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:17.128813" elapsed="0.005941"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:17.137368" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:17.135055" elapsed="0.002363"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:17.134825" elapsed="0.002627"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:17.134793" elapsed="0.002684"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:17.138230" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:17.137833" 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-08-22T23:35:17.138561" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:17.138327" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:17.139136" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:17.138835" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:17.138661" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:17.138309" elapsed="0.000912"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:17.139753" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:17.139377" 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-08-22T23:35:17.140079" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:17.139851" elapsed="0.000414"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:17.140783" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:17.140459" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:17.140294" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:17.139833" 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-08-22T23:35:17.141022" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:17.141857" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:17.141537" 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-08-22T23:35:17.142037" 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-08-22T23:35:17.127880" elapsed="0.016689"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:17.144764" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:35:17.144655" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:17.144636" 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-08-22T23:35:17.145004" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:17.145077" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:35:17.147428" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:17.102414" elapsed="0.045044"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:17.147518" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:35:17.147686" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:17.096371" elapsed="0.051342"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:17.148349" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:17.147991" elapsed="0.000437">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:17.147784" elapsed="0.000716">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:17.147767" elapsed="0.000768">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:17.148768" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:17.148622" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:17.148604" elapsed="0.000244"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:17.093664" elapsed="0.055265">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:18.151953" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:18.150971" elapsed="0.001055"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:18.162530" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:18.162268" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:18.162995" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:18.162749" 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-08-22T23:35:18.182805" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:18.183106" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:18.183327" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:18.165328" elapsed="0.018058"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:18.163211" elapsed="0.020277"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:18.183930" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:18.183550" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:18.163186" elapsed="0.020944"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:18.192649" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:18.186490" elapsed="0.006280"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:18.185991" elapsed="0.006864"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:18.185951" elapsed="0.006961"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:18.195863" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:18.193469" elapsed="0.002442"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:18.193042" elapsed="0.002905"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:18.193004" elapsed="0.002968"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:18.196549" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:18.196152" 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-08-22T23:35:18.196933" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:18.196687" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:18.197482" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:18.197176" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:18.197016" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:18.196669" elapsed="0.000900"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:18.198183" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:18.197751" 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-08-22T23:35:18.198510" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:18.198281" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:18.199080" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:18.198781" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:18.198618" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:18.198263" 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-08-22T23:35:18.199317" elapsed="0.000373"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:18.200148" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:18.199853" 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-08-22T23:35:18.200328" 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-08-22T23:35:18.185005" elapsed="0.017811"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:18.202996" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:35:18.202887" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:18.202868" 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-08-22T23:35:18.203276" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:18.203391" elapsed="0.000019"/>
</return>
<msg time="2026-08-22T23:35:18.205750" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:18.156370" elapsed="0.049410"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:18.205845" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:35:18.205995" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:18.152605" elapsed="0.053416"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:18.206681" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:18.206298" elapsed="0.000463">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:18.206091" elapsed="0.000742">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:18.206074" elapsed="0.000793">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:18.207080" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:18.206936" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:18.206920" elapsed="0.000239"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:18.149839" elapsed="0.057401">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:19.210416" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:19.209356" elapsed="0.001135"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:19.220375" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:19.220112" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:19.220849" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:19.220599" 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-08-22T23:35:19.240029" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:19.240196" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:19.240298" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:19.223163" elapsed="0.017162"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:19.220977" elapsed="0.019392"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:19.240783" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:19.240398" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:19.220953" elapsed="0.020032"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:19.249795" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:19.243483" elapsed="0.006363"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:19.242952" elapsed="0.006997"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:19.242897" elapsed="0.007080"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:19.252805" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:19.250415" elapsed="0.002438"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:19.250036" elapsed="0.002852"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:19.250019" elapsed="0.002894"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:19.253512" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:19.253095" 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-08-22T23:35:19.253868" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:19.253628" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:19.254449" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:19.254112" elapsed="0.000364"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:19.253951" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:19.253609" elapsed="0.000925"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:19.255074" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:19.254708" 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-08-22T23:35:19.255400" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:19.255171" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:19.255952" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:19.255655" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:19.255481" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:19.255153" 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-08-22T23:35:19.256184" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:19.257008" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:19.256711" 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-08-22T23:35:19.257186" elapsed="0.002334"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:35:19.241861" elapsed="0.017738"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:19.259781" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:35:19.259671" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:19.259652" 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-08-22T23:35:19.260022" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:19.260093" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:35:19.262466" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:19.215498" elapsed="0.046997"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:19.262558" elapsed="0.000041"/>
</return>
<msg time="2026-08-22T23:35:19.262727" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:19.211058" elapsed="0.051697"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:19.263397" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:19.263037" elapsed="0.000442">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:19.262827" elapsed="0.000726">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:19.262809" elapsed="0.000836">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:19.263874" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:19.263723" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:19.263706" elapsed="0.000250"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:19.208181" elapsed="0.055858">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:20.267149" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:20.266156" elapsed="0.001066"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:20.277978" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:20.277655" elapsed="0.000381"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:20.278485" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:20.278232" 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-08-22T23:35:20.298953" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:20.299108" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:20.299210" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:20.280773" elapsed="0.018464"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:20.278625" 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-08-22T23:35:20.299507" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:20.299310" elapsed="0.000418"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:20.278600" elapsed="0.021190"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:20.308265" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:20.302367" elapsed="0.006011"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:20.301851" elapsed="0.006608"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:20.301809" elapsed="0.006708"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:20.314422" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:20.309176" elapsed="0.005351"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:20.308677" elapsed="0.005957"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:20.308637" elapsed="0.006053"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:20.315988" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:20.315057" elapsed="0.000991"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:20.316642" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:20.316204" elapsed="0.000527"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:20.317451" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:20.317005" elapsed="0.000486"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:20.316767" elapsed="0.000778"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:20.316164" elapsed="0.001412"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:20.318363" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:20.317830" 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-08-22T23:35:20.318869" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:20.318506" elapsed="0.000521"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:20.319781" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:20.319301" elapsed="0.000520"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:20.319064" elapsed="0.000811"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:20.318480" elapsed="0.001428"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:35:20.320126" elapsed="0.000544"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:20.321339" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:20.320911" 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-08-22T23:35:20.321624" elapsed="0.003412"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:35:20.300830" elapsed="0.024271"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:20.325281" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:35:20.325172" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:20.325153" 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-08-22T23:35:20.325522" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:20.325610" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:35:20.327960" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:20.271891" elapsed="0.056098"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:20.328049" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:35:20.328201" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:20.267811" elapsed="0.060416"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:20.328879" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:20.328502" elapsed="0.000458">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:20.328297" elapsed="0.000735">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:20.328280" elapsed="0.000786">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:20.329280" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:20.329135" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:20.329119" elapsed="0.000240"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:20.265010" elapsed="0.064433">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:21.332393" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:21.331392" elapsed="0.001085"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:21.344911" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:21.344651" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:21.345409" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:21.345158" 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-08-22T23:35:21.368008" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:21.368160" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:21.368261" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:21.347726" elapsed="0.020561"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:21.345633" elapsed="0.022698"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:21.368513" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:21.368359" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:21.345609" 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-08-22T23:35:21.372340" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:21.369668" elapsed="0.002722"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:21.369433" elapsed="0.002994"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:21.369414" elapsed="0.003039"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:21.375196" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:21.372748" elapsed="0.002495"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:21.372509" elapsed="0.002770"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:21.372493" elapsed="0.002812"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:21.375914" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:21.375490" 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-08-22T23:35:21.376249" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:21.376012" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:21.376816" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:21.376496" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:21.376332" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:21.375995" elapsed="0.000906"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:21.377480" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:21.377101" 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-08-22T23:35:21.377828" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:21.377592" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:21.378365" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:21.378068" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:21.377911" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:21.377559" 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-08-22T23:35:21.378615" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:21.379441" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:21.379145" 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-08-22T23:35:21.379641" 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-08-22T23:35:21.368989" elapsed="0.013110"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:21.382280" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:35:21.382171" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:21.382152" 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-08-22T23:35:21.382521" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:21.382645" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:35:21.385093" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:21.338683" elapsed="0.046447"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:21.385192" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:35:21.385345" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:21.333065" elapsed="0.052307"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:21.386028" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:21.385665" elapsed="0.000442">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:21.385442" elapsed="0.000738">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:21.385426" elapsed="0.000789">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:21.386432" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:21.386286" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:21.386269" elapsed="0.000244"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:21.330269" elapsed="0.056341">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:22.389917" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:22.388856" elapsed="0.001135"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:22.402452" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:22.402041" elapsed="0.000473"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:22.402936" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:22.402685" 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-08-22T23:35:22.426323" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:22.426661" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:22.426885" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:22.405176" elapsed="0.021769"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:22.403060" elapsed="0.023984"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:22.427450" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:22.427105" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:22.403035" elapsed="0.024646"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:22.433709" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:22.430011" elapsed="0.003768"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:22.429482" elapsed="0.004427"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:22.429441" elapsed="0.004509"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:22.437701" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:22.434362" elapsed="0.003406"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:22.434032" elapsed="0.003788"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:22.434008" elapsed="0.003847"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:22.438690" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:22.438098" 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-08-22T23:35:22.439030" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:22.438792" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:22.439594" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:22.439276" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:22.439113" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:22.438773" elapsed="0.000909"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:22.440206" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:22.439840" 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-08-22T23:35:22.440534" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:22.440304" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:22.441090" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:22.440793" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:22.440633" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:22.440285" 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-08-22T23:35:22.441337" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:22.442164" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:22.441866" 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-08-22T23:35:22.442359" elapsed="0.002349"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:35:22.428469" elapsed="0.016303"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:22.444952" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:35:22.444842" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:22.444823" 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-08-22T23:35:22.445190" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:22.445261" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:35:22.447656" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:22.395692" elapsed="0.051994"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:22.447746" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:35:22.447898" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:22.390688" elapsed="0.057236"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:22.448565" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:22.448204" elapsed="0.000461">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:22.447995" elapsed="0.000744">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:22.447978" elapsed="0.000830">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:22.449030" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:22.448883" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:22.448866" elapsed="0.000244"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:22.387569" elapsed="0.061624">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:23.452338" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:23.451349" elapsed="0.001060"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:23.465424" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:23.465148" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:23.465893" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:23.465644" 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-08-22T23:35:23.487404" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:23.487754" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:23.487976" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:23.468101" elapsed="0.019933"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:23.466016" elapsed="0.022113"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:23.488532" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:23.488189" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:23.465993" elapsed="0.022773"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:23.494308" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:23.490912" elapsed="0.003469"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:23.490571" elapsed="0.003862"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:23.490546" elapsed="0.003923"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:23.498229" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:23.494887" elapsed="0.003418"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:23.494548" elapsed="0.003808"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:23.494525" elapsed="0.003907"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:23.499247" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:23.498701" 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-08-22T23:35:23.499681" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:23.499382" elapsed="0.000358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:23.500221" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:23.499922" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:23.499764" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:23.499357" elapsed="0.000948"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:23.500839" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:23.500459" 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-08-22T23:35:23.501163" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:23.500936" elapsed="0.000344"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:23.501780" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:23.501465" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:23.501305" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:23.500918" 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-08-22T23:35:23.502017" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:23.502885" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:23.502555" 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-08-22T23:35:23.503065" elapsed="0.004199"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:35:23.489548" elapsed="0.017781"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:23.507506" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:35:23.507399" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:23.507380" 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-08-22T23:35:23.507768" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:23.507839" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:35:23.510166" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:23.459289" elapsed="0.050907"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:23.510255" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:35:23.510405" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:23.452941" elapsed="0.057490"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:23.511102" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:23.510724" elapsed="0.000458">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:23.510500" elapsed="0.000754">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:23.510483" elapsed="0.000805">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:23.511503" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:23.511358" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:23.511342" elapsed="0.000249"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:23.450221" elapsed="0.061467">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:24.514772" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:24.513763" elapsed="0.001084"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:24.527132" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:24.526767" elapsed="0.000433"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:24.527755" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:24.527449" 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-08-22T23:35:24.550327" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:24.550528" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:24.550790" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:24.530049" elapsed="0.020799"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:24.527958" elapsed="0.022987"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:24.551347" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:24.551005" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:24.527935" elapsed="0.023611"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:24.559947" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:24.553936" elapsed="0.006121"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:24.553401" elapsed="0.006791"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:24.553361" elapsed="0.006893"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:24.563119" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:24.560763" elapsed="0.002401"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:24.560380" elapsed="0.002820"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:24.560344" elapsed="0.002881"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:24.563815" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:24.563403" 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-08-22T23:35:24.564148" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:24.563914" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:24.564734" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:24.564408" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:24.564247" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:24.563896" elapsed="0.000924"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:24.565338" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:24.564977" 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-08-22T23:35:24.565683" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:24.565434" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:24.566223" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:24.565926" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:24.565767" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:24.565416" 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-08-22T23:35:24.566458" elapsed="0.000365"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:24.567412" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:24.566984" 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-08-22T23:35:24.567598" 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-08-22T23:35:24.552418" elapsed="0.017708"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:24.570306" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:35:24.570197" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:24.570178" 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-08-22T23:35:24.570550" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:24.570683" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:35:24.573090" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:24.520629" elapsed="0.052490"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:24.573181" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:35:24.573333" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:24.515377" elapsed="0.057983"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:24.574035" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:24.573673" elapsed="0.000442">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:24.573431" elapsed="0.000757">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:24.573414" elapsed="0.000808">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:24.574438" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:24.574293" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:24.574276" elapsed="0.000244"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:24.512592" elapsed="0.062028">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:25.577692" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:25.576683" elapsed="0.001082"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:25.589927" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:25.589659" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:25.590398" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:25.590131" 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-08-22T23:35:25.609382" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:25.609640" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:25.609912" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:25.592653" elapsed="0.017323"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:25.590525" elapsed="0.019553"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:25.610513" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:25.610139" elapsed="0.000572"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:25.590501" elapsed="0.020260"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:25.618641" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:25.613081" elapsed="0.005611"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:25.612547" elapsed="0.006241"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:25.612506" elapsed="0.006311"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:25.621447" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:25.619118" elapsed="0.002376"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:25.618875" elapsed="0.002654"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:25.618858" elapsed="0.002696"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:25.622190" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:25.621751" 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-08-22T23:35:25.622549" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:25.622296" elapsed="0.000336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:25.623140" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:25.622836" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:25.622657" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:25.622278" elapsed="0.000947"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:25.623770" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:25.623381" 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-08-22T23:35:25.624101" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:25.623868" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:25.624661" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:25.624341" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:25.624182" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:25.623850" 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-08-22T23:35:25.624900" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:25.625742" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:25.625414" 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-08-22T23:35:25.625921" 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-08-22T23:35:25.611566" elapsed="0.016810"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:25.628558" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-08-22T23:35:25.628446" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:25.628428" 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-08-22T23:35:25.628831" elapsed="0.000150"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:25.629037" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:35:25.631447" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:25.583140" elapsed="0.048337"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:25.631538" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:35:25.631714" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:25.578254" elapsed="0.053487"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:25.632400" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:25.632023" elapsed="0.000463">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:25.631813" elapsed="0.000748">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:25.631796" elapsed="0.000880">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:25.632903" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:25.632753" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:25.632736" elapsed="0.000248"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:25.575540" elapsed="0.057529">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:26.636250" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:26.635155" elapsed="0.001168"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:26.648676" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:26.648394" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:26.649128" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:26.648881" 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-08-22T23:35:26.669495" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:26.669939" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:26.670227" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:26.651352" elapsed="0.018941"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:26.649249" elapsed="0.021162"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:26.671125" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:26.670481" elapsed="0.000811"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:26.649226" elapsed="0.022121"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:26.678740" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:26.674027" elapsed="0.004765"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:26.673428" elapsed="0.005401"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:26.673382" elapsed="0.005473"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:26.681567" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:26.679140" elapsed="0.002506"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:26.678913" elapsed="0.002771"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:26.678896" elapsed="0.002813"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:26.682327" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:26.681888" elapsed="0.000467"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:26.682698" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:26.682430" elapsed="0.000331"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:26.683261" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:26.682948" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:26.682786" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:26.682411" elapsed="0.000938"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:26.683904" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:26.683509" 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-08-22T23:35:26.684239" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:26.684004" elapsed="0.000382"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:26.684963" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:26.684594" elapsed="0.000397"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:26.684416" elapsed="0.000613"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:26.683986" 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-08-22T23:35:26.685206" elapsed="0.000360"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:26.686053" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:26.685749" 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-08-22T23:35:26.686234" 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-08-22T23:35:26.672292" elapsed="0.016481"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:26.688977" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:35:26.688844" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:26.688825" 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-08-22T23:35:26.689262" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:26.689336" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:35:26.691678" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:26.643025" elapsed="0.048682"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:26.691769" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:35:26.691925" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:26.636864" elapsed="0.055087"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:26.692615" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:26.692234" elapsed="0.000464">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:26.692023" elapsed="0.000748">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:26.692006" elapsed="0.000800">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:26.693097" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:26.692876" elapsed="0.000284"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:26.692859" elapsed="0.000326"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:26.634023" elapsed="0.059246">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:27.696321" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:27.695288" elapsed="0.001108"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:27.708349" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:27.707981" elapsed="0.000436"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:27.708903" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:27.708651" 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-08-22T23:35:27.727522" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:27.727815" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:27.728040" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:27.711225" elapsed="0.016873"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:27.709125" elapsed="0.019071"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:27.728676" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:27.728257" elapsed="0.000570"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:27.709099" elapsed="0.019776"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:27.737329" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:27.731253" elapsed="0.006188"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:27.730702" elapsed="0.006819"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:27.730656" elapsed="0.006929"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:27.740238" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:27.737914" elapsed="0.002371"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:27.737692" elapsed="0.002628"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:27.737674" elapsed="0.002671"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:27.740980" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:27.740546" 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-08-22T23:35:27.741315" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:27.741079" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:27.741876" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:27.741557" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:27.741397" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:27.741061" elapsed="0.000901"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:27.742486" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:27.742120" 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-08-22T23:35:27.742833" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:27.742586" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:27.743367" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:27.743072" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:27.742915" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:27.742564" 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-08-22T23:35:27.743718" elapsed="0.000357"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:27.744545" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:27.744239" 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-08-22T23:35:27.744782" 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-08-22T23:35:27.729716" elapsed="0.017477"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:27.747372" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:35:27.747263" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:27.747244" 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-08-22T23:35:27.747632" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:27.747754" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:35:27.750130" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:27.701871" elapsed="0.048288"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:27.750220" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:35:27.750373" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:27.696929" elapsed="0.053470"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:27.751070" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:27.750700" elapsed="0.000456">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:27.750470" elapsed="0.000762">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:27.750452" elapsed="0.000816">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:27.751487" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:27.751339" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:27.751322" elapsed="0.000247"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:27.694172" elapsed="0.057501">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:28.755051" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:28.753932" elapsed="0.001213"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:28.766625" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:28.766347" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:28.767076" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:28.766831" 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-08-22T23:35:28.786103" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:28.786282" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:28.786391" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:28.769333" elapsed="0.017085"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:28.767198" elapsed="0.019264"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:28.786671" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:28.786489" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:28.767175" elapsed="0.019587"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:28.790247" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:28.787802" elapsed="0.002495"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:28.787555" elapsed="0.002839"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:28.787536" elapsed="0.002887"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:28.793061" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:28.790736" elapsed="0.002372"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:28.790481" elapsed="0.002662"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:28.790464" elapsed="0.002704"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:28.793784" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:28.793347" 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-08-22T23:35:28.794122" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:28.793884" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:28.794685" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:28.794365" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:28.794205" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:28.793866" elapsed="0.000904"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:28.795288" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:28.794926" 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-08-22T23:35:28.795633" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:28.795385" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:28.796168" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:28.795871" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:28.795715" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:28.795368" 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-08-22T23:35:28.796403" elapsed="0.000370"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:28.797232" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:28.796935" 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-08-22T23:35:28.797410" 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-08-22T23:35:28.787119" elapsed="0.012817"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:28.800116" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:35:28.800006" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:28.799988" 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-08-22T23:35:28.800357" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:28.800427" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:35:28.802799" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:28.761779" elapsed="0.041049"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:28.802889" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:35:28.803039" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:28.755712" elapsed="0.047354"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:28.803777" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:28.803343" elapsed="0.000515">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:28.803137" elapsed="0.000793">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:28.803120" elapsed="0.000880">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:28.804223" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:28.804076" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:28.804058" elapsed="0.000246"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:28.752679" elapsed="0.051709">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:29.807803" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:29.806690" elapsed="0.001195"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:29.818858" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:29.818559" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:29.819349" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:29.819080" 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-08-22T23:35:29.839036" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:29.839361" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:29.839632" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:29.821713" elapsed="0.017985"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:29.819476" elapsed="0.020326"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:29.840225" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:29.839864" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:29.819453" elapsed="0.020979"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:29.848621" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:29.842872" elapsed="0.005870"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:29.842319" elapsed="0.006558"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:29.842276" elapsed="0.006662"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:29.852074" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:29.849618" elapsed="0.002505"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:29.849071" elapsed="0.003088"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:29.849032" elapsed="0.003152"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:29.852827" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:29.852369" 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-08-22T23:35:29.853168" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:29.852928" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:29.853742" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:29.853413" elapsed="0.000357"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:29.853252" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:29.852909" elapsed="0.000919"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:29.854354" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:29.853986" 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-08-22T23:35:29.854702" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:29.854452" elapsed="0.000433"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:29.855383" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:29.855080" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:29.854913" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:29.854434" 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-08-22T23:35:29.855642" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:29.856471" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:29.856165" 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-08-22T23:35:29.856672" 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-08-22T23:35:29.841300" elapsed="0.017930"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:29.859416" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:35:29.859304" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:29.859284" 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-08-22T23:35:29.859683" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:29.859760" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:35:29.862134" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:29.812829" elapsed="0.049341"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:29.862240" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:35:29.862399" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:29.808525" elapsed="0.053901"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:29.863110" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:29.862734" elapsed="0.000461">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:29.862503" elapsed="0.000767">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:29.862485" elapsed="0.000820">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:29.863524" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:29.863375" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:29.863358" elapsed="0.000265"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:29.805360" elapsed="0.058350">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:30.867033" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:30.865979" elapsed="0.001130"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:30.883482" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:30.883119" elapsed="0.000436"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:30.884014" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:30.883752" 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-08-22T23:35:30.905904" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:30.906286" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:30.906526" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:30.886434" elapsed="0.020248"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:30.884255" elapsed="0.022542"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:30.907231" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:30.906859" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:30.884227" elapsed="0.023207"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:30.914124" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:30.909890" elapsed="0.004308"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:30.909337" elapsed="0.004913"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:30.909292" elapsed="0.004994"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:30.918181" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:30.914736" elapsed="0.003515"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:30.914367" elapsed="0.003936"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:30.914343" elapsed="0.003997"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:30.919182" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:30.918629" 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-08-22T23:35:30.919537" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:30.919294" elapsed="0.000333"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:30.920153" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:30.919837" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:30.919659" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:30.919267" elapsed="0.000975"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:30.920817" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:30.920405" 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-08-22T23:35:30.921156" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:30.920918" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:30.921734" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:30.921402" elapsed="0.000360"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:30.921241" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:30.920900" 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-08-22T23:35:30.921982" elapsed="0.000387"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:30.922889" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:30.922536" 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-08-22T23:35:30.923074" 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-08-22T23:35:30.908312" elapsed="0.017250"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:30.925783" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:35:30.925654" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:30.925634" 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-08-22T23:35:30.926036" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:30.926155" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:35:30.928633" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:30.874177" elapsed="0.054488"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:30.928727" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:35:30.928899" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:30.867652" elapsed="0.061275"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:30.929611" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:30.929216" elapsed="0.000485">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:30.929001" elapsed="0.000777">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:30.928983" elapsed="0.000831">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:30.930047" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:30.929897" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:30.929879" elapsed="0.000251"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:30.864758" elapsed="0.065461">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:31.933291" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:31.932273" elapsed="0.001092"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:31.945616" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:31.945316" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:31.946071" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:31.945820" 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-08-22T23:35:31.967698" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:31.967985" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:31.968208" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:31.948283" elapsed="0.019986"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:31.946193" elapsed="0.022174"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:31.968818" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:31.968428" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:31.946170" elapsed="0.022853"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:31.976988" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:31.971366" elapsed="0.005735"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:31.970870" elapsed="0.006410"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:31.970829" elapsed="0.006515"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:31.980843" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:31.978061" elapsed="0.002829"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:31.977476" elapsed="0.003451"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:31.977438" elapsed="0.003514"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:31.981535" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:31.981135" 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-08-22T23:35:31.981916" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:31.981662" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:31.982463" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:31.982161" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:31.982001" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:31.981643" elapsed="0.000907"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:31.983134" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:31.982758" 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-08-22T23:35:31.983465" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:31.983234" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:31.984021" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:31.983722" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:31.983548" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:31.983216" 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-08-22T23:35:31.984256" elapsed="0.000368"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:31.985144" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:31.984842" 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-08-22T23:35:31.985324" elapsed="0.002432"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:35:31.969877" elapsed="0.017944"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:31.988139" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:35:31.988029" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:31.987873" 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-08-22T23:35:31.988383" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:31.988455" elapsed="0.000014"/>
</return>
<msg time="2026-08-22T23:35:31.990875" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:31.939468" elapsed="0.051437"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:31.990967" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:35:31.991119" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:31.933903" elapsed="0.057243"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:31.991808" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:31.991427" elapsed="0.000460">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:31.991218" elapsed="0.000740">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:31.991201" elapsed="0.000825">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:31.992250" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:31.992102" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:31.992085" elapsed="0.000246"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:31.931153" elapsed="0.061263">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:32.995391" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:32.994414" elapsed="0.001107"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:33.005542" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:33.005283" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:33.006004" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:33.005760" 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-08-22T23:35:33.025733" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:33.026008" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:33.026226" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:33.008244" elapsed="0.018039"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:33.006125" elapsed="0.020254"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:33.026816" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:33.026439" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:33.006102" elapsed="0.020910"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:33.034894" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:33.029327" elapsed="0.005676"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:33.028837" elapsed="0.006245"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:33.028796" elapsed="0.006345"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:33.038724" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:33.035833" elapsed="0.002937"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:33.035268" elapsed="0.003543"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:33.035231" elapsed="0.003605"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:33.039415" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:33.039015" 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-08-22T23:35:33.039770" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:33.039515" elapsed="0.000329"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:33.040331" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:33.040030" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:33.039870" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:33.039497" elapsed="0.000921"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:33.040958" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:33.040573" 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-08-22T23:35:33.041331" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:33.041072" elapsed="0.000389"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:33.041978" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:33.041671" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:33.041489" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:33.041049" elapsed="0.001016"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:35:33.042218" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:33.043059" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:33.042756" 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-08-22T23:35:33.043240" elapsed="0.004190"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:35:33.027854" elapsed="0.019643"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:33.047700" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:35:33.047569" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:33.047550" 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-08-22T23:35:33.047970" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:33.048045" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:35:33.050397" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:32.999770" elapsed="0.050657"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:33.050488" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:35:33.050662" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:32.995946" elapsed="0.054743"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:33.051337" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:33.050971" elapsed="0.000445">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:33.050761" elapsed="0.000726">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:33.050744" elapsed="0.000778">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:33.051763" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:33.051612" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:33.051580" elapsed="0.000269"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:32.993304" elapsed="0.058629">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:34.055089" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:34.054087" elapsed="0.001078"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:34.065839" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:34.065558" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:34.066291" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:34.066042" 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-08-22T23:35:34.085681" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:34.085923" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:34.086146" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:34.068689" elapsed="0.017515"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:34.066560" elapsed="0.019742"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:34.086742" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:34.086362" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:34.066536" elapsed="0.020405"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:34.095181" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:34.089295" elapsed="0.005996"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:34.088802" elapsed="0.006569"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:34.088760" elapsed="0.006667"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:34.099399" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:34.096089" elapsed="0.003357"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:34.095552" elapsed="0.003930"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:34.095515" elapsed="0.003992"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:34.100103" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:34.099707" 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-08-22T23:35:34.100434" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:34.100201" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:34.101007" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:34.100692" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:34.100515" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:34.100183" elapsed="0.000910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:34.101629" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:34.101248" 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-08-22T23:35:34.101963" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:34.101727" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:34.102498" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:34.102202" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:34.102045" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:34.101710" elapsed="0.000886"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:35:34.102751" elapsed="0.000452"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:34.103725" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:34.103365" 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-08-22T23:35:34.103908" 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-08-22T23:35:34.087790" elapsed="0.018609"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:34.106595" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:35:34.106470" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:34.106451" 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-08-22T23:35:34.106838" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:34.106949" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:35:34.109289" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:34.059636" elapsed="0.049682"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:34.109380" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:35:34.109533" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:34.055702" elapsed="0.053858"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:34.110222" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:34.109857" elapsed="0.000446">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:34.109648" elapsed="0.000728">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:34.109630" elapsed="0.000780">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:34.110642" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:34.110480" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:34.110463" elapsed="0.000262"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:34.052914" elapsed="0.057893">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:35.113055" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:35.112556" elapsed="0.000537"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:35.120816" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:35.120526" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:35.121274" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:35.121023" 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-08-22T23:35:35.143174" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:35.143336" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:35.143439" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:35.123515" elapsed="0.019952"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:35.121396" elapsed="0.022116"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:35.143718" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:35.143540" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:35.121374" elapsed="0.022435"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:35.147313" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:35.144875" elapsed="0.002487"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:35.144647" elapsed="0.002817"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:35.144628" elapsed="0.002865"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:35.150137" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:35.147795" elapsed="0.002390"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:35.147553" elapsed="0.002667"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:35.147535" elapsed="0.002710"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:35.150839" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:35.150423" 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-08-22T23:35:35.151180" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:35.150944" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:35.151740" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:35.151422" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:35.151263" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:35.150926" elapsed="0.000900"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:35.152342" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:35.151981" 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-08-22T23:35:35.152718" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:35.152467" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:35.153252" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:35.152958" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:35.152801" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:35.152421" 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-08-22T23:35:35.153484" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:35.154306" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:35.154013" 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-08-22T23:35:35.154484" elapsed="0.002380"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:35:35.144173" elapsed="0.012755"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:35.157107" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:35:35.156997" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:35.156980" 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-08-22T23:35:35.157348" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:35.157418" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:35:35.159781" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:35.115880" elapsed="0.043929"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:35.159869" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:35:35.160032" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:35.113328" elapsed="0.046730"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:35.160742" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:35.160336" elapsed="0.000488">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:35.160128" elapsed="0.000769">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:35.160111" elapsed="0.000858">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:35.161193" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:35.161044" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:35.161027" elapsed="0.000247"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:35.111889" elapsed="0.049467">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:36.164475" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:36.163477" elapsed="0.001069"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:36.176519" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:36.176253" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:36.176990" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:36.176741" 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-08-22T23:35:36.198016" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:36.198178" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:36.198280" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:36.179300" elapsed="0.019006"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:36.177114" elapsed="0.021236"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:36.198535" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:36.198378" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:36.177090" elapsed="0.021559"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:36.202153" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:36.199703" elapsed="0.002499"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:36.199459" elapsed="0.002778"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:36.199440" elapsed="0.002823"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:36.204893" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:36.202540" elapsed="0.002400"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:36.202319" elapsed="0.002656"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:36.202302" elapsed="0.002697"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:36.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-08-22T23:35:36.205177" 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-08-22T23:35:36.205932" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:36.205694" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:36.206477" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:36.206176" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:36.206015" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:36.205676" elapsed="0.000885"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:36.207111" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:36.206740" 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-08-22T23:35:36.207466" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:36.207208" elapsed="0.000398"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:36.208109" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:36.207794" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:36.207633" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:36.207190" 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-08-22T23:35:36.208348" elapsed="0.000376"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:36.209190" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:36.208888" 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-08-22T23:35:36.209372" 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-08-22T23:35:36.199009" elapsed="0.012923"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:36.212114" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:35:36.212003" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:36.211984" 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-08-22T23:35:36.212358" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:36.212430" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:35:36.214884" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:36.171533" elapsed="0.043381"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:36.214976" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:35:36.215130" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:36.165086" elapsed="0.050071"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:36.215859" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:36.215474" elapsed="0.000467">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:36.215228" elapsed="0.000786">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:36.215211" elapsed="0.000839">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:36.216268" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:36.216121" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:36.216105" elapsed="0.000245"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:36.162272" elapsed="0.054160">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:37.219477" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:37.218474" elapsed="0.001079"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:37.231132" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:37.230837" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:37.231615" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:37.231350" 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-08-22T23:35:37.252090" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:37.252311" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:37.252465" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:37.234193" elapsed="0.018309"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:37.231860" elapsed="0.020711"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:37.252882" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:37.252648" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:37.231832" elapsed="0.021173"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:37.261084" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:37.255046" elapsed="0.006205"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:37.254498" elapsed="0.006840"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:37.254454" elapsed="0.006942"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:37.264377" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:37.261974" elapsed="0.002451"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:37.261527" elapsed="0.002935"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:37.261489" elapsed="0.002999"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:37.265178" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:37.264739" 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-08-22T23:35:37.265563" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:37.265312" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:37.266130" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:37.265826" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:37.265664" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:37.265291" elapsed="0.000925"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:37.266753" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:37.266370" 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-08-22T23:35:37.267086" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:37.266850" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:37.267678" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:37.267349" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:37.267186" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:37.266832" 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-08-22T23:35:37.267916" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:37.268758" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:37.268433" 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-08-22T23:35:37.268939" 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-08-22T23:35:37.253627" elapsed="0.017795"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:37.271630" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:35:37.271495" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:37.271475" elapsed="0.000256"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:37.271877" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:37.272019" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:35:37.274466" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:37.224653" elapsed="0.049844"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:37.274559" elapsed="0.000045"/>
</return>
<msg time="2026-08-22T23:35:37.274752" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:37.220084" elapsed="0.054698"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:37.275492" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:37.275070" elapsed="0.000527">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:37.274855" elapsed="0.000823">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:37.274837" elapsed="0.000876">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:37.275933" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:37.275784" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:37.275767" elapsed="0.000247"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:37.217330" elapsed="0.058772">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:38.279162" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:38.278102" elapsed="0.001131"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:38.291344" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:38.291077" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:38.291814" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:38.291547" 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-08-22T23:35:38.311379" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:38.311529" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:38.311651" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:38.294059" elapsed="0.017620"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:38.291937" elapsed="0.019786"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:38.311909" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:38.311752" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:38.291913" elapsed="0.020210"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:38.320002" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:38.314467" elapsed="0.005646"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:38.313946" elapsed="0.006350"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:38.313904" elapsed="0.006456"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:38.327306" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:38.321040" elapsed="0.006327"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:38.320491" elapsed="0.006924"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:38.320452" elapsed="0.006999"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:38.328147" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:38.327693" 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-08-22T23:35:38.328495" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:38.328253" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:38.329069" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:38.328762" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:38.328596" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:38.328233" elapsed="0.000924"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:38.329701" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:38.329317" 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-08-22T23:35:38.330031" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:38.329800" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:38.330618" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:38.330271" elapsed="0.000375"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:38.330113" elapsed="0.000569"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:38.329782" 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-08-22T23:35:38.330950" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:38.331786" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:38.331463" 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-08-22T23:35:38.331966" elapsed="0.002357"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:35:38.312953" elapsed="0.021438"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:38.334609" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:35:38.334463" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:38.334445" 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-08-22T23:35:38.334858" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:38.334930" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:35:38.337378" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:38.284544" elapsed="0.052864"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:38.337469" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:35:38.337641" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:38.279772" elapsed="0.057896"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:38.338314" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:38.337953" elapsed="0.000440">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:38.337742" elapsed="0.000721">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:38.337724" elapsed="0.000889">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:38.338847" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:38.338696" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:38.338677" elapsed="0.000252"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:38.277017" elapsed="0.061995">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:39.342033" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:39.341053" elapsed="0.001050"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:39.354678" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:39.354292" elapsed="0.000455"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:39.355452" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:39.355103" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:35:39.376252" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:39.376535" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:39.376806" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:39.357825" elapsed="0.019042"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:39.355651" elapsed="0.021316"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:39.377371" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:39.377029" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:39.355612" elapsed="0.021962"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:39.383443" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:39.379964" elapsed="0.003549"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:39.379438" elapsed="0.004125"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:39.379395" elapsed="0.004225"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:39.387346" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:39.384009" elapsed="0.003403"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:39.383702" elapsed="0.003760"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:39.383679" elapsed="0.003818"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:39.388210" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:39.387754" 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-08-22T23:35:39.388545" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:39.388310" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:39.389113" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:39.388811" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:39.388649" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:39.388292" elapsed="0.000906"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:39.389732" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:39.389353" 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-08-22T23:35:39.390060" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:39.389830" elapsed="0.000352"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:39.390839" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:39.390372" elapsed="0.000501"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:39.390209" elapsed="0.000711"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:39.389812" 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-08-22T23:35:39.391103" elapsed="0.000383"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:39.392012" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:39.391668" 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-08-22T23:35:39.392283" 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-08-22T23:35:39.378394" elapsed="0.016590"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:39.395189" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:35:39.395054" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:39.395035" 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-08-22T23:35:39.395509" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:39.395599" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:35:39.397938" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:39.348142" elapsed="0.049824"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:39.398025" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:35:39.398177" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:39.342631" elapsed="0.055573"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:39.398857" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:39.398478" elapsed="0.000460">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:39.398273" elapsed="0.000737">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:39.398256" elapsed="0.000789">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:39.399288" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:39.399116" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:39.399099" elapsed="0.000270"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:39.339938" elapsed="0.059514">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:40.402418" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:40.401444" elapsed="0.001047"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:40.414843" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:40.414458" elapsed="0.000454"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:40.415505" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:40.415124" elapsed="0.000444"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:35:40.436851" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:40.437006" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:40.437107" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:40.417936" elapsed="0.019197"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:40.415790" elapsed="0.021386"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:40.437359" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:40.437204" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:40.415758" elapsed="0.021688"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:40.441125" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:40.438490" elapsed="0.002685"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:40.438272" elapsed="0.002939"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:40.438254" elapsed="0.002983"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:40.443891" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:40.441518" elapsed="0.002421"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:40.441294" elapsed="0.002685"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:40.441277" elapsed="0.002728"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:40.444574" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:40.444182" 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-08-22T23:35:40.444939" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:40.444699" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:40.445490" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:40.445185" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:40.445023" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:40.444681" elapsed="0.000895"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:40.446120" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:40.445753" 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-08-22T23:35:40.446448" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:40.446217" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:40.447007" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:40.446706" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:40.446531" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:40.446199" 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-08-22T23:35:40.447244" elapsed="0.000398"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:40.448096" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:40.447805" 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-08-22T23:35:40.448275" elapsed="0.002339"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:35:40.437846" elapsed="0.012833"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:40.450860" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-08-22T23:35:40.450750" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:40.450731" 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-08-22T23:35:40.451103" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:40.451222" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:35:40.453601" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:40.408382" elapsed="0.045249"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:40.453692" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:35:40.453845" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:40.403020" elapsed="0.050852"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:40.454624" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:40.454152" elapsed="0.000551">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:40.453942" elapsed="0.000834">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:40.453925" elapsed="0.000886">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:40.455028" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:40.454881" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:40.454864" elapsed="0.000245"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:40.400313" elapsed="0.054877">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:41.458141" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:41.457161" elapsed="0.001049"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:41.472829" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:41.472436" elapsed="0.000463"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:41.473464" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:41.473120" 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-08-22T23:35:41.494951" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:41.495264" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:41.495501" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:41.476244" elapsed="0.019321"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:41.473650" elapsed="0.022060"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:41.496149" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:41.495777" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:41.473620" elapsed="0.022744"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:41.502388" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:41.498929" elapsed="0.003530"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:41.498317" elapsed="0.004292"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:41.498273" elapsed="0.004378"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:41.506322" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:41.503066" elapsed="0.003321"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:41.502734" elapsed="0.003702"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:41.502710" elapsed="0.003761"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:41.507310" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:41.506731" 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-08-22T23:35:41.507866" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:41.507449" elapsed="0.000506"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:41.508499" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:41.508189" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:41.507998" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:41.507423" elapsed="0.001181"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:41.509133" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:41.508765" 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-08-22T23:35:41.509466" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:41.509231" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:41.510030" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:41.509725" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:41.509549" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:41.509214" 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-08-22T23:35:41.510264" elapsed="0.000368"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:41.511104" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:41.510802" 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-08-22T23:35:41.511282" elapsed="0.002335"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:35:41.497251" elapsed="0.016430"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:41.513863" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:35:41.513753" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:41.513735" 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-08-22T23:35:41.514106" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:41.514177" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:35:41.516531" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:41.464799" elapsed="0.051762"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:41.516638" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:35:41.516790" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:41.458785" elapsed="0.058031"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:41.517448" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:41.517093" elapsed="0.000432">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:41.516887" elapsed="0.000728">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:41.516870" elapsed="0.000814">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:41.517908" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:41.517760" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:41.517743" elapsed="0.000246"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:41.456055" elapsed="0.062015">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:42.519712" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:42.519222" elapsed="0.000528"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:42.528275" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:42.527995" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:42.528754" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:42.528486" 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-08-22T23:35:42.548957" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:42.549139" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:42.549263" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:42.531021" elapsed="0.018268"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:42.528880" elapsed="0.020463"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:42.549559" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:42.549377" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:42.528855" elapsed="0.020813"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:42.553295" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:42.550805" elapsed="0.002540"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:42.550556" elapsed="0.002824"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:42.550536" elapsed="0.002870"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:42.556063" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:42.553727" elapsed="0.002384"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:42.553463" elapsed="0.002683"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:42.553446" elapsed="0.002724"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:42.556809" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:42.556346" 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-08-22T23:35:42.557181" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:42.556927" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:42.557771" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:42.557425" elapsed="0.000376"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:42.557265" elapsed="0.000573"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:42.556905" elapsed="0.000955"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:42.558429" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:42.558018" 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-08-22T23:35:42.558787" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:42.558528" elapsed="0.000418"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:42.559442" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:42.559137" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:42.558974" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:42.558510" 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-08-22T23:35:42.559701" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:42.560533" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:42.560232" 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-08-22T23:35:42.560740" 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-08-22T23:35:42.550080" elapsed="0.015095"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:42.565360" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:35:42.565248" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:42.565228" 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-08-22T23:35:42.565625" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:42.565699" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:35:42.568112" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:42.523625" elapsed="0.044517"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:42.568203" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:35:42.568357" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:42.519985" elapsed="0.048398"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:42.569066" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:42.568682" elapsed="0.000468">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:42.568453" elapsed="0.000770">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:42.568436" elapsed="0.000821">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:42.569491" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:42.569327" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:42.569310" elapsed="0.000263"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:42.518645" elapsed="0.051030">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:43.573223" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:43.572153" elapsed="0.001164"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:43.583829" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:43.583503" elapsed="0.000380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:43.584323" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:43.584059" 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-08-22T23:35:43.604444" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:43.604814" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:43.605138" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:43.586709" elapsed="0.018496"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:43.584547" elapsed="0.020779"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:43.605839" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:43.605405" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:43.584522" elapsed="0.021518"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:43.614465" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:43.608611" elapsed="0.005910"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:43.608043" elapsed="0.006518"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:43.607997" elapsed="0.006613"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:43.617276" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:43.614903" elapsed="0.002421"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:43.614671" elapsed="0.002689"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:43.614654" elapsed="0.002731"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:43.618084" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:43.617573" 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-08-22T23:35:43.618427" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:43.618184" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:43.619020" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:43.618707" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:43.618511" elapsed="0.000576"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:43.618165" elapsed="0.000943"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:43.619672" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:43.619268" 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-08-22T23:35:43.620018" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:43.619778" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:43.620637" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:43.620261" elapsed="0.000413"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:43.620102" elapsed="0.000624"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:43.619760" 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-08-22T23:35:43.620909" elapsed="0.000406"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:43.621815" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:43.621479" 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-08-22T23:35:43.621999" 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-08-22T23:35:43.606964" elapsed="0.017502"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:43.624674" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:35:43.624539" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:43.624520" 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-08-22T23:35:43.624933" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:43.625098" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:35:43.627488" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:43.579040" elapsed="0.048479"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:43.627598" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:35:43.627758" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:43.573919" elapsed="0.053868"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:43.628459" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:43.628082" elapsed="0.000461">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:43.627868" elapsed="0.000769">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:43.627850" elapsed="0.000824">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:43.628903" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:43.628746" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:43.628729" elapsed="0.000258"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:43.570954" elapsed="0.058153">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:44.632351" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:44.631283" elapsed="0.001138"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:44.644267" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:44.644004" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:44.644735" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:44.644470" 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-08-22T23:35:44.664025" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:44.664311" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:44.664540" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:44.646962" elapsed="0.017687"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:44.644854" elapsed="0.019902"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:44.665181" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:44.664820" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:44.644831" elapsed="0.020545"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:44.672718" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:44.667808" elapsed="0.004960"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:44.667256" elapsed="0.005623"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:44.667215" elapsed="0.005693"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:44.675563" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:44.673189" elapsed="0.002450"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:44.672966" elapsed="0.002710"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:44.672949" elapsed="0.002752"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:44.676289" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:44.675882" 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-08-22T23:35:44.676640" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:44.676388" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:44.677199" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:44.676888" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:44.676726" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:44.676370" elapsed="0.000915"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:44.677826" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:44.677443" 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-08-22T23:35:44.678156" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:44.677924" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:44.678710" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:44.678396" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:44.678239" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:44.677907" 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-08-22T23:35:44.678947" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:44.679842" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:44.679496" 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-08-22T23:35:44.680040" elapsed="0.002409"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:35:44.666255" elapsed="0.016262"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:44.682720" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:35:44.682605" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:44.682570" 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-08-22T23:35:44.682967" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:44.683040" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:35:44.685552" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:44.638503" elapsed="0.047094"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:44.685664" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:35:44.685823" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:44.632953" elapsed="0.052898"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:44.686511" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:44.686140" elapsed="0.000479">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:44.685925" elapsed="0.000773">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:44.685907" elapsed="0.000888">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:44.687025" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:44.686873" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:44.686856" elapsed="0.000251"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:44.630207" elapsed="0.056987">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:45.690338" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:45.689267" elapsed="0.001130"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:45.700594" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:45.700311" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:45.701054" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:45.700803" 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-08-22T23:35:45.721066" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:45.721392" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:45.721654" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:45.703320" elapsed="0.018396"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:45.701182" elapsed="0.020635"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:45.722266" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:45.721908" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:45.701157" elapsed="0.021353"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:45.730892" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:45.724962" elapsed="0.006044"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:45.724389" elapsed="0.006680"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:45.724347" elapsed="0.006749"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:45.733741" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:45.731390" elapsed="0.002398"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:45.731160" elapsed="0.002664"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:45.731140" elapsed="0.002708"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:45.734463" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:45.734043" 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-08-22T23:35:45.734824" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:45.734564" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:45.735398" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:45.735070" elapsed="0.000356"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:45.734908" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:45.734546" elapsed="0.000939"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:45.736033" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:45.735660" 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-08-22T23:35:45.736383" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:45.736133" elapsed="0.000378"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:45.737034" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:45.736727" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:45.736538" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:45.736115" 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-08-22T23:35:45.737287" elapsed="0.000519"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:45.738356" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:45.738008" 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-08-22T23:35:45.738540" 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-08-22T23:35:45.723363" elapsed="0.017716"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:45.741262" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:35:45.741150" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:45.741130" 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-08-22T23:35:45.741523" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:45.741640" elapsed="0.000023"/>
</return>
<msg time="2026-08-22T23:35:45.744032" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:45.694669" elapsed="0.049394"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:45.744123" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:35:45.744280" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:45.690743" elapsed="0.053564"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:45.744988" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:45.744621" elapsed="0.000448">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:45.744390" elapsed="0.000753">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:45.744368" elapsed="0.000810">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:45.745402" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:45.745248" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:45.745231" elapsed="0.000255"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:45.688100" elapsed="0.057469">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:46.748890" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:46.747856" elapsed="0.001120"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:46.760932" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:46.760666" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:46.761385" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:46.761136" 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-08-22T23:35:46.782282" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:46.782623" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:46.782850" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:46.763715" elapsed="0.019194"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:46.761610" elapsed="0.021397"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:46.783410" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:46.783069" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:46.761571" elapsed="0.022074"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:46.790837" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:46.785989" elapsed="0.004918"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:46.785467" elapsed="0.005491"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:46.785426" elapsed="0.005568"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:46.794679" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:46.791382" elapsed="0.003363"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:46.791073" elapsed="0.003722"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:46.791049" elapsed="0.003781"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:46.795632" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:46.795064" 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-08-22T23:35:46.796155" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:46.795773" elapsed="0.000466"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:46.796945" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:46.796498" elapsed="0.000485"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:46.796275" elapsed="0.000759"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:46.795747" elapsed="0.001317"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:46.797637" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:46.797253" 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-08-22T23:35:46.798069" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:46.797735" elapsed="0.000394"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:46.798630" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:46.798312" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:46.798154" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:46.797717" 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-08-22T23:35:46.798866" elapsed="0.000369"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:46.799726" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:46.799397" 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-08-22T23:35:46.799907" elapsed="0.002381"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:35:46.784497" elapsed="0.017856"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:46.802535" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:35:46.802425" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:46.802405" 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-08-22T23:35:46.802799" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:46.802920" elapsed="0.000018"/>
</return>
<msg time="2026-08-22T23:35:46.805440" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:46.754440" elapsed="0.051029"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:46.805530" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:35:46.805702" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:46.749466" elapsed="0.056263"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:46.806367" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:46.806007" elapsed="0.000438">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:46.805800" elapsed="0.000716">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:46.805783" elapsed="0.000768">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:46.806787" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:46.806640" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:46.806622" elapsed="0.000248"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:46.746743" elapsed="0.060210">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:47.809928" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:47.808903" elapsed="0.001097"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:47.822268" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:47.822003" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:47.822737" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:47.822470" 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-08-22T23:35:47.844216" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:47.844369" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:47.844468" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:47.824958" elapsed="0.019537"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:47.822859" elapsed="0.021679"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:47.844744" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:47.844566" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:47.822836" elapsed="0.021996"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:47.848290" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:47.845871" elapsed="0.002468"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:47.845632" elapsed="0.002805"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:47.845612" elapsed="0.002853"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:47.851087" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:47.848762" elapsed="0.002373"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:47.848522" elapsed="0.002652"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:47.848505" elapsed="0.002694"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:47.851786" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:47.851373" 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-08-22T23:35:47.852121" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:47.851886" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:47.852679" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:47.852361" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:47.852204" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:47.851866" elapsed="0.000898"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:47.853280" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:47.852919" 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-08-22T23:35:47.853622" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:47.853377" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:47.854182" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:47.853883" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:47.853704" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:47.853359" 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-08-22T23:35:47.854420" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:47.855241" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:47.854948" 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-08-22T23:35:47.855420" elapsed="0.002329"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:35:47.845194" elapsed="0.012619"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:47.858005" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:35:47.857896" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:47.857864" 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-08-22T23:35:47.858245" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:47.858317" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:35:47.860659" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:47.816085" elapsed="0.044604"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:47.860749" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:35:47.860901" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:47.810501" elapsed="0.050427"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:47.861573" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:47.861213" elapsed="0.000455">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:47.860999" elapsed="0.000741">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:47.860982" elapsed="0.000834">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:47.862072" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:47.861922" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:47.861903" elapsed="0.000251"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:47.807804" elapsed="0.054432">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:48.865228" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:48.864245" elapsed="0.001054"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:48.876868" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:48.876606" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:48.877318" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:48.877070" 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-08-22T23:35:48.896834" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:48.896980" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:48.897080" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:48.879550" elapsed="0.017558"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:48.877438" elapsed="0.019720"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:48.897564" elapsed="0.000085"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:48.897222" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:48.877416" elapsed="0.020386"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:48.905770" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:48.900142" elapsed="0.005743"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:48.899643" elapsed="0.006322"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:48.899573" elapsed="0.006451"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:48.910292" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:48.906725" elapsed="0.003616"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:48.906155" elapsed="0.004222"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:48.906116" elapsed="0.004287"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:48.910993" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:48.910595" 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-08-22T23:35:48.911335" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:48.911094" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:48.911916" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:48.911612" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:48.911421" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:48.911075" elapsed="0.000926"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:48.912522" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:48.912158" 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-08-22T23:35:48.912872" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:48.912640" elapsed="0.000358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:48.913491" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:48.913188" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:48.913026" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:48.912621" 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-08-22T23:35:48.913748" elapsed="0.000479"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:48.914707" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:48.914391" 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-08-22T23:35:48.914890" 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-08-22T23:35:48.898621" elapsed="0.018842"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:48.917661" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:35:48.917535" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:48.917515" 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-08-22T23:35:48.917902" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:48.917975" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:35:48.920372" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:48.870652" elapsed="0.049749"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:48.920462" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:35:48.920629" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:48.865829" elapsed="0.054828"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:48.921293" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:48.920935" elapsed="0.000435">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:48.920728" elapsed="0.000714">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:48.920711" elapsed="0.000766">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:48.921707" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:48.921546" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:48.921529" elapsed="0.000261"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:48.863128" elapsed="0.058744">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:49.924850" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:49.923884" elapsed="0.001038"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:49.935209" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:49.934952" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:49.935672" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:49.935409" 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-08-22T23:35:49.954942" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:49.955136" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:49.955273" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:49.937977" elapsed="0.017332"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:49.935878" elapsed="0.019491"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:49.955640" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:49.955406" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:49.935854" elapsed="0.019912"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:49.960792" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:49.957196" elapsed="0.003666"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:49.956870" elapsed="0.004043"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:49.956845" elapsed="0.004103"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:49.964721" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:49.961466" elapsed="0.003321"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:49.961028" elapsed="0.003807"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:49.961004" elapsed="0.003867"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:49.965677" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:49.965104" 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-08-22T23:35:49.966141" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:49.965815" elapsed="0.000407"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:49.966922" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:49.966478" elapsed="0.000481"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:49.966256" elapsed="0.000753"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:49.965790" elapsed="0.001248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:49.967850" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:49.967254" 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-08-22T23:35:49.968331" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:49.967988" elapsed="0.000426"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:49.969109" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:49.968693" elapsed="0.000493"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:49.968447" elapsed="0.000790"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:49.967962" elapsed="0.001306"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:35:49.969476" elapsed="0.000514"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:49.970520" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:49.970215" 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-08-22T23:35:49.970713" elapsed="0.002315"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:35:49.956262" elapsed="0.016830"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:49.973285" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-08-22T23:35:49.973177" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:49.973158" 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-08-22T23:35:49.973524" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:49.973668" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:35:49.976000" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:49.929191" elapsed="0.046839"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:49.976091" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:35:49.976242" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:49.925471" elapsed="0.050798"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:49.976923" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:49.976545" elapsed="0.000457">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:49.976339" elapsed="0.000737">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:49.976322" elapsed="0.000788">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:49.977358" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:49.977207" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:49.977189" elapsed="0.000268"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:49.922768" elapsed="0.054783">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:50.980773" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:50.979764" elapsed="0.001084"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:50.993165" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:50.992805" elapsed="0.000427"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:50.993815" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:50.993445" elapsed="0.000433"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:35:51.013463" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:51.013820" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:51.014046" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:50.996553" elapsed="0.017553"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:50.993989" elapsed="0.020214"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:51.014676" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:51.014267" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:50.993955" elapsed="0.020924"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:51.021649" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:51.017166" elapsed="0.004554"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:51.016669" elapsed="0.005208"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:51.016625" elapsed="0.005293"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:51.025637" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:51.022310" elapsed="0.003394"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:51.021999" elapsed="0.003755"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:51.021976" elapsed="0.003812"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:51.026661" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:51.026033" elapsed="0.000671"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:51.027139" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:51.026806" elapsed="0.000419"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:51.027773" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:51.027454" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:51.027261" elapsed="0.000576"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:51.026780" elapsed="0.001078"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:51.028377" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:51.028015" 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-08-22T23:35:51.028721" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:51.028474" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:51.029254" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:51.028961" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:51.028804" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:51.028457" 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-08-22T23:35:51.029491" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:51.030324" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:51.030020" 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-08-22T23:35:51.030505" 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-08-22T23:35:51.015692" elapsed="0.017273"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:51.033146" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:35:51.033036" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:51.033018" 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-08-22T23:35:51.033391" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:51.033463" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:35:51.035907" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:50.986442" elapsed="0.049494"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:51.035998" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:35:51.036148" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:50.981347" elapsed="0.054827"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:51.036832" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:51.036450" elapsed="0.000467">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:51.036245" elapsed="0.000748">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:51.036229" elapsed="0.000839">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:51.037341" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:51.037160" elapsed="0.000262"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:51.037140" elapsed="0.000313"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:50.978554" elapsed="0.058999">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:52.040800" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:52.039761" elapsed="0.001116"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:52.052737" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:52.052455" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:52.053189" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:52.052941" 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-08-22T23:35:52.072169" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:52.072379" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:52.072640" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:52.055433" elapsed="0.017269"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:52.053323" elapsed="0.019475"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:52.073197" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:52.072859" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:52.053295" elapsed="0.020097"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:52.080782" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:52.075708" elapsed="0.005124"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:52.075181" elapsed="0.005685"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:52.075140" elapsed="0.005751"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:52.083475" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:52.081164" elapsed="0.002357"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:52.080946" elapsed="0.002610"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:52.080930" elapsed="0.002664"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:52.084213" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:52.083776" 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-08-22T23:35:52.084543" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:52.084309" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:52.085102" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:52.084802" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:52.084643" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:52.084291" elapsed="0.000895"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:52.085724" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:52.085346" 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-08-22T23:35:52.086052" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:52.085822" elapsed="0.000347"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:52.086668" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:52.086356" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:52.086195" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:52.085804" 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-08-22T23:35:52.086905" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:52.087739" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:52.087417" 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-08-22T23:35:52.087948" elapsed="0.004206"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:35:52.074200" elapsed="0.018088"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:52.092474" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:35:52.092361" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:52.092341" 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-08-22T23:35:52.092738" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:52.092811" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:35:52.095151" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:52.047532" elapsed="0.047647"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:52.095239" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:35:52.095393" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:52.041381" elapsed="0.054038"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:52.096108" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:52.095710" elapsed="0.000479">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:52.095487" elapsed="0.000776">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:52.095471" elapsed="0.000826">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:52.096514" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:52.096368" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:52.096351" elapsed="0.000261"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:52.038532" elapsed="0.058163">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:53.099814" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:53.098819" elapsed="0.001071"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:53.110541" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:53.110278" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:53.111009" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:53.110760" 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-08-22T23:35:53.130552" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:53.130758" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:53.130861" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:53.113350" elapsed="0.017537"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:53.111224" elapsed="0.019707"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:53.131117" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:53.130961" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:53.111197" elapsed="0.020006"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:53.139804" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:53.133448" elapsed="0.006477"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:53.132889" elapsed="0.007121"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:53.132848" elapsed="0.007223"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:53.143651" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:53.140769" elapsed="0.002929"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:53.140206" elapsed="0.003526"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:53.140166" elapsed="0.003591"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:53.144351" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:53.143936" 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-08-22T23:35:53.144706" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:53.144454" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:53.145272" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:53.144949" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:53.144789" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:53.144436" elapsed="0.000928"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:53.145907" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:53.145523" 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-08-22T23:35:53.146235" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:53.146004" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:53.146792" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:53.146474" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:53.146317" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:53.145986" 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-08-22T23:35:53.147032" elapsed="0.000359"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:53.147874" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:53.147554" 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-08-22T23:35:53.148055" elapsed="0.002361"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:35:53.131917" elapsed="0.018565"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:53.150679" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:35:53.150553" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:53.150534" 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-08-22T23:35:53.150924" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:53.151047" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:35:53.153654" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:53.104399" elapsed="0.049286"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:53.153747" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:35:53.153901" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:53.100385" elapsed="0.053543"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:53.154607" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:53.154207" elapsed="0.000490">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:53.153998" elapsed="0.000776">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:53.153981" elapsed="0.000829">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:53.155028" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:53.154880" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:53.154863" elapsed="0.000246"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:53.097675" elapsed="0.057518">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:54.158380" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:54.157270" elapsed="0.001188"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:54.169391" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:54.169118" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:54.169866" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:54.169612" 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-08-22T23:35:54.189040" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:54.189206" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:54.189316" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:54.172144" elapsed="0.017216"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:54.169993" elapsed="0.019472"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:54.189949" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:54.189537" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:54.169968" elapsed="0.020210"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:54.198639" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:54.192717" elapsed="0.006040"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:54.192123" elapsed="0.006831"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:54.192081" elapsed="0.006938"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:54.201967" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:54.199601" elapsed="0.002414"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:54.199151" elapsed="0.002899"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:54.199112" elapsed="0.002963"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:54.202728" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:54.202275" 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-08-22T23:35:54.203104" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:54.202829" elapsed="0.000340"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:54.203696" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:54.203358" elapsed="0.000378"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:54.203195" elapsed="0.000581"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:54.202811" elapsed="0.000987"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:54.204333" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:54.203958" 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-08-22T23:35:54.204686" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:54.204436" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:54.205249" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:54.204947" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:54.204772" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:54.204418" 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-08-22T23:35:54.205487" elapsed="0.000428"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:54.206436" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:54.206086" 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-08-22T23:35:54.206635" 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-08-22T23:35:54.191068" elapsed="0.017999"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:54.209271" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:35:54.209149" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:54.209123" 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-08-22T23:35:54.209519" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:54.209608" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:35:54.212004" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:54.164272" elapsed="0.047762"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:54.212095" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:35:54.212249" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:54.159029" elapsed="0.053252"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:54.212977" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:54.212607" elapsed="0.000453">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:54.212364" elapsed="0.000771">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:54.212343" elapsed="0.000864">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:54.213443" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:54.213285" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:54.213267" elapsed="0.000272"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:54.156130" elapsed="0.057513">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.216709" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:55.215657" elapsed="0.001131"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.228993" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:55.228721" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.229451" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:55.229201" 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-08-22T23:35:55.249569" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:55.249932" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:35:55.250184" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:55.231724" elapsed="0.018518"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:55.229592" elapsed="0.020760"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.250850" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.250420" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.229551" elapsed="0.021500"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.259813" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:55.253698" elapsed="0.006169"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:55.253113" elapsed="0.006790"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.253065" elapsed="0.006864"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.262543" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:55.260212" elapsed="0.002393"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:55.259987" elapsed="0.002654"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.259970" elapsed="0.002697"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.263287" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:55.262851" 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-08-22T23:35:55.263641" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.263386" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.264191" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:55.263888" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:55.263726" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.263368" elapsed="0.000907"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.264826" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:55.264440" 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-08-22T23:35:55.265157" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.264924" elapsed="0.000393"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.265828" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:55.265508" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:55.265344" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.264907" 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-08-22T23:35:55.266066" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:55.266906" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:55.266600" 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-08-22T23:35:55.267086" 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-08-22T23:35:55.251977" elapsed="0.017723"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:55.269888" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:35:55.269773" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.269754" 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-08-22T23:35:55.270137" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:35:55.270209" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:35:55.272642" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:55.222537" elapsed="0.050136"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:55.272735" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:35:55.272893" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:35:55.217326" elapsed="0.055594"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.273608" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:35:55.273209" elapsed="0.000485">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:35:55.272992" elapsed="0.000777">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:35:55.272975" elapsed="0.000829">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.274024" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.273875" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:55.273857" elapsed="0.000248"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:35:55.214475" elapsed="0.059716">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<msg time="2026-08-22T23:35:55.274293" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:34:54.799429" elapsed="60.474968">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${node2_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.274606" elapsed="0.000023"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${node3_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.274877" elapsed="0.000022"/>
</kw>
<doc>Check if data has really been written as we expect. Fails if Modify_Device_Data_With_Original_Owner fails.</doc>
<status status="FAIL" start="2026-08-22T23:34:54.550140" elapsed="60.724925">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</test>
<test id="s1-s4-t17" name="Deconfigure_Device_In_Netconf" line="255">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:35:55.284394" elapsed="0.000780"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:35:55.283492" elapsed="0.001834"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:35:55.288072" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:35:55.287772" elapsed="0.000417"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.287719" elapsed="0.000527"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:35:55.293525" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:35:55.293412" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.293394" elapsed="0.000218"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.294700" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:35:55.294240" elapsed="0.000490"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.295208" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:35:55.294895" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:35:55.295281" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:35:55.295530" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:35:55.293853" elapsed="0.001706"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:35:55.301398" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:35:55.301287" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.301267" 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-08-22T23:35:55.302695" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:35:55.302561" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.302543" elapsed="0.000220"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:35:55.303217" level="INFO">${karaf_connection_index} = 25</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:35:55.302907" elapsed="0.000337"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:35:55.303686" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:35:55.303439" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:35:55.337344" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:35:55.304205" elapsed="0.033249"/>
</kw>
<msg time="2026-08-22T23:35:55.337657" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:35:55.337705" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:35:55.303870" elapsed="0.033871"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:35:55.357658" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:35:55.338262" elapsed="0.019498"/>
</kw>
<msg time="2026-08-22T23:35:55.357917" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:35:55.357964" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:35:55.337913" elapsed="0.020088"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.358308" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.358082" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.358061" elapsed="0.000395"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.358930" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:55.358622" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.359281" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.359064" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.359046" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:35:55.359394" 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">
<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-08-22T23:35:55.361960" elapsed="0.000147"/>
</kw>
<msg time="2026-08-22T23:35:55.362169" 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-08-22T23:35:55.360912" 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-08-22T23:35:55.362623" elapsed="0.000082"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.362970" 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-08-22T23:35:55.360264" elapsed="0.002890"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:35:55.359725" elapsed="0.003494"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:35:55.302255" elapsed="0.061063"/>
</kw>
<msg time="2026-08-22T23:35:55.363412" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:35:55.363456" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:35:55.301636" elapsed="0.061858"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:35:55.363723" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:35:55.363571" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.363553" 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-08-22T23:35:55.364209" 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-08-22T23:35:55.364542" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:35:55.364637" 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-08-22T23:35:55.300938" elapsed="0.063810"/>
</kw>
<msg time="2026-08-22T23:35:55.364842" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:35:55.364888" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:35:55.295986" elapsed="0.068940"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.365249" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.365002" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.364984" elapsed="0.000343"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:35:55.295840" elapsed="0.069510"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:35:55.371180" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:35:55.371070" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.371050" 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-08-22T23:35:55.372410" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:35:55.372302" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.372284" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:35:55.372940" level="INFO">${karaf_connection_index} = 26</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:35:55.372640" elapsed="0.000327"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:35:55.373382" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:35:55.373164" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:35:55.408426" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:35:55.373920" elapsed="0.034605"/>
</kw>
<msg time="2026-08-22T23:35:55.408705" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:35:55.408781" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:35:55.373566" elapsed="0.035253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:35:55.427810" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:35:55.409328" elapsed="0.018583"/>
</kw>
<msg time="2026-08-22T23:35:55.428070" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:35:55.428117" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:35:55.408989" elapsed="0.019164"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.428451" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.428230" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.428211" elapsed="0.000320"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.429015" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:55.428711" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.429365" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.429149" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.429131" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:35:55.429477" 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-08-22T23:35:55.431979" elapsed="0.000147"/>
</kw>
<msg time="2026-08-22T23:35:55.432188" 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-08-22T23:35:55.430915" elapsed="0.001413"/>
</kw>
<kw name="Open 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-08-22T23:35:55.432643" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.432984" 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-08-22T23:35:55.430280" 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-08-22T23:35:55.429754" elapsed="0.003483"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:35:55.371999" elapsed="0.061335"/>
</kw>
<msg time="2026-08-22T23:35:55.433425" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:35:55.433469" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:35:55.371406" elapsed="0.062100"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:35:55.433720" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:35:55.433610" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.433564" 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-08-22T23:35:55.434201" 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-08-22T23:35:55.434532" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:35:55.434717" 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-08-22T23:35:55.370677" elapsed="0.064163"/>
</kw>
<msg time="2026-08-22T23:35:55.434934" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:35:55.434977" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:35:55.365741" elapsed="0.069273"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.435343" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.435090" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.435072" elapsed="0.000349"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:35:55.365499" elapsed="0.069946"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:35:55.441961" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:35:55.441838" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.441816" 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-08-22T23:35:55.443554" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:35:55.443435" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.443414" elapsed="0.000245"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:35:55.444208" level="INFO">${karaf_connection_index} = 27</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:35:55.443870" elapsed="0.000373"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:35:55.444683" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:35:55.444426" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:35:55.478821" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:35:55.445290" elapsed="0.033648"/>
</kw>
<msg time="2026-08-22T23:35:55.479102" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:35:55.479149" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:35:55.444893" elapsed="0.034292"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:35:55.510643" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:35:55.479727" elapsed="0.031051"/>
</kw>
<msg time="2026-08-22T23:35:55.510957" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:35:55.511005" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:35:55.479355" elapsed="0.031688"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.511406" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.511137" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.511111" elapsed="0.000378"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.511992" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:55.511658" elapsed="0.000442"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.512397" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.512175" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.512155" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:35:55.512515" 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-08-22T23:35:55.515209" elapsed="0.000152"/>
</kw>
<msg time="2026-08-22T23:35:55.515423" 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-08-22T23:35:55.514158" 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-08-22T23:35:55.515926" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.516292" 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-08-22T23:35:55.513452" 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-08-22T23:35:55.512848" 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-08-22T23:35:55.443067" elapsed="0.073614"/>
</kw>
<msg time="2026-08-22T23:35:55.516779" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:35:55.516825" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:35:55.442213" elapsed="0.074652"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:35:55.517052" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:35:55.516943" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.516925" 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-08-22T23:35:55.517545" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.517960" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:35:55.518033" 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-08-22T23:35:55.441417" elapsed="0.076730"/>
</kw>
<msg time="2026-08-22T23:35:55.518244" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:35:55.518288" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:35:55.435825" elapsed="0.082500"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.518725" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.518404" elapsed="0.000378"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.518386" elapsed="0.000420"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:35:55.435570" elapsed="0.083261"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:35:55.295643" elapsed="0.223221"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:35:55.293037" elapsed="0.225890"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:35:55.286888" elapsed="0.232098"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:35:55.285770" elapsed="0.233262"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:35:55.278037" elapsed="0.241052"/>
</kw>
<kw name="Remove_Device_From_Netconf" owner="NetconfKeywords">
<kw name="Pop From Dictionary" owner="Collections">
<msg time="2026-08-22T23:35:55.520051" level="INFO">${device_type} = configure-via-topology</msg>
<var>${device_type}</var>
<arg>${NetconfKeywords__mounted_device_types}</arg>
<arg>${device_name}</arg>
<doc>Pops the given ``key`` from the ``dictionary`` and returns its value.</doc>
<status status="PASS" start="2026-08-22T23:35:55.519785" elapsed="0.000329"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.520753" level="INFO">${mapping} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping}</var>
<arg>DEVICE_NAME=${device_name}</arg>
<arg>RESTCONF_ROOT=${RESTCONF_ROOT}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:35:55.520296" elapsed="0.000485"/>
</kw>
<kw name="Set_Variable_If_At_Least_Scandium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Set_Variable_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Set Variable If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:35:55.539596" elapsed="0.000481"/>
</kw>
<msg time="2026-08-22T23:35:55.540156" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>BuiltIn.Set_Variable_If</arg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:35:55.539213" elapsed="0.000994"/>
</kw>
<arg>scandium</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Compare ${lower_bound} to titanium and return scandium if titanium is at least ${lower_bound},
return calcium otherwise.</doc>
<status status="PASS" start="2026-08-22T23:35:55.538823" elapsed="0.001459"/>
</kw>
<msg time="2026-08-22T23:35:55.540327" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Set_Variable_If_At_Least</arg>
<arg>scandium</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:35:55.530010" elapsed="0.010360"/>
</kw>
<msg time="2026-08-22T23:35:55.540513" level="INFO">${version} = scandium</msg>
<var>${version}</var>
<arg>scandium</arg>
<arg>calcium</arg>
<doc>Compare scandium to titanium and return ${value_if_true} if titanium is at least scandium, return ${value_if_false} otherwise.</doc>
<status status="PASS" start="2026-08-22T23:35:55.529682" elapsed="0.010855"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.584058" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:55.583673" elapsed="0.000414"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:35:55.584903" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:35:55.584624" elapsed="0.000356">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:35:55.585075" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:35:55.584249" elapsed="0.000851"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.585692" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:35:55.585259" elapsed="0.000460"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:35:55.586017" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:35:55.586176" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:35:55.585879" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.586619" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:55.586357" 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-08-22T23:35:55.587618" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:55.587345" elapsed="0.000319"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.588078" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:35:55.587817" elapsed="0.000286"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.588978" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:35:55.588489" elapsed="0.000515"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:35:55.589756" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:35:55.589513" elapsed="0.000270"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:35:55.589834" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:35:55.589988" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:35:55.589192" elapsed="0.000821"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:35:55.590163" elapsed="0.000233"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:35:55.588355" elapsed="0.002083"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.591003" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:35:55.590700" elapsed="0.000329"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:35:55.591756" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:35:55.591525" elapsed="0.000257"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:35:55.591832" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:35:55.591982" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:35:55.591211" elapsed="0.000795"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:35:55.592151" elapsed="0.000240"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:35:55.590553" elapsed="0.001879"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:35:55.588153" elapsed="0.004348"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:35:55.592549" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:35:55.592726" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:35:55.587026" elapsed="0.005726"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:55.586733" elapsed="0.006050"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.592954" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.592807" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.586714" elapsed="0.006317"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.593764" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:55.593171" elapsed="0.000621"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:35:55.593841" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:35:55.583037" elapsed="0.010928"/>
</kw>
<msg time="2026-08-22T23:35:55.594018" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:35:55.569564" elapsed="0.024500"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.606463" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.618856" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.631357" 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-08-22T23:35:55.631550" 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-08-22T23:35:55.631739" 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-08-22T23:35:55.632101" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.631958" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:35:55.631944" 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-08-22T23:35:55.632319" 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-08-22T23:35:55.632500" 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-08-22T23:35:55.632677" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:35:55.631916" elapsed="0.000815"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:35:55.631815" 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-08-22T23:35:55.632903" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:35:55.633013" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:35:55.633135" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:35:55.565271" elapsed="0.067889"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.634274" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:55.634020" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:35:55.652056" level="INFO">DELETE Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:55.652105" level="INFO">DELETE Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:55.652197" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:55.636646" elapsed="0.015577"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:55.634387" elapsed="0.017876"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.652444" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.652290" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.634369" elapsed="0.018269"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.655987" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:55.653651" elapsed="0.002380"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:55.653412" elapsed="0.002653"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.653393" elapsed="0.002697"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.658695" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:55.656363" elapsed="0.002379"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:55.656145" elapsed="0.002631"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.656128" elapsed="0.002672"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.659342" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:55.658966" 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-08-22T23:35:55.659690" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.659439" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.660232" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:55.659931" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:55.659774" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.659421" elapsed="0.000894"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.660868" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:55.660471" 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-08-22T23:35:55.661195" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.660964" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.661747" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:55.661435" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:55.661277" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.660947" 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-08-22T23:35:55.661976" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:55.662800" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:55.662481" 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-08-22T23:35:55.663046" elapsed="0.002337"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_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-08-22T23:35:55.653001" elapsed="0.012447"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:35:55.665494" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:35:55.667755" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-08-22T23:35:55.633422" elapsed="0.034361"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:55.667838" elapsed="0.000027"/>
</return>
<arg>${DIRECTORY_WITH_DEVICE_TEMPLATES}${/}${version}${/}${device_type}</arg>
<arg>${mapping}</arg>
<arg>session=${session}</arg>
<arg>location=${location}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-08-22T23:35:55.540775" elapsed="0.127187"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${node1_session}</arg>
<doc>Tell Netconf to deconfigure the specified device</doc>
<status status="PASS" start="2026-08-22T23:35:55.519319" elapsed="0.148707"/>
</kw>
<kw name="Wait_Device_Fully_Removed" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Completely_Gone" owner="NetconfKeywords">
<kw name="Check_Device_Has_No_Netconf_Connector" owner="NetconfKeywords">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.680965" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:55.678804" elapsed="0.002188"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.681359" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-22T23:35:55.681204" elapsed="0.000215"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-22T23:35:55.681046" elapsed="0.000398"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.681766" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.681507" elapsed="0.000317"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.682545" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:55.682078" elapsed="0.000494"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:55.681849" elapsed="0.000779"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.682816" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.682653" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.681491" elapsed="0.001402"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:35:55.682927" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:35:55.683075" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:35:55.678330" elapsed="0.004770"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:35:55.683146" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:35:55.683288" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:35:55.677830" elapsed="0.005484"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.690668" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:55.690403" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.691107" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:55.690865" 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-08-22T23:35:55.699645" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:55.699819" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1011'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}} 
 </msg>
<msg time="2026-08-22T23:35:55.699959" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:55.693301" elapsed="0.006686"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:55.691217" elapsed="0.008814"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.700212" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.700058" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.691199" elapsed="0.009101"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.707419" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:55.701767" elapsed="0.005731"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:55.701436" elapsed="0.006113"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.701410" elapsed="0.006198"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.710885" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:55.708009" elapsed="0.002925"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:55.707692" elapsed="0.003279"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.707668" elapsed="0.003329"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.711543" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:55.711162" 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-08-22T23:35:55.711914" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.711677" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.712474" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:55.712162" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:55.712000" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.711658" elapsed="0.000904"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.713145" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:55.712766" 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-08-22T23:35:55.713476" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.713244" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.714039" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:55.713741" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:55.713559" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.713225" 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-08-22T23:35:55.714271" elapsed="0.000373"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:55.715085" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:55.714807" 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-08-22T23:35:55.715264" elapsed="0.002415"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:35:55.700838" elapsed="0.016907"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:35:55.717922" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:35:55.717815" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.717797" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:35:55.721326" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:35:55.718133" elapsed="0.003224"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:35:55.721449" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:35:55.721638" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:55.686094" elapsed="0.035573"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:55.721726" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:35:55.721877" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:35:55.683687" elapsed="0.038217"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.722317" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:55.722065" elapsed="0.000308"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.722940" level="INFO">${actual_count} = 0</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:55.722527" elapsed="0.000440"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-22T23:35:55.723014" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:35:55.723165" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-22T23:35:55.670255" elapsed="0.052935"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.723631" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:35:55.723345" elapsed="0.000342"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="PASS" start="2026-08-22T23:35:55.669808" elapsed="0.053940"/>
</kw>
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.734353" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:55.732187" elapsed="0.002194"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.735067" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:55.734739" elapsed="0.000355"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:35:55.734569" elapsed="0.000562"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.735706" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:55.735362" elapsed="0.000371"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:35:55.735211" elapsed="0.000559"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:35:55.734436" elapsed="0.001364"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.736571" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:55.736103" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:55.735865" elapsed="0.000790"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.736866" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.736680" elapsed="0.000245"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.737108" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.736949" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.735847" elapsed="0.001338"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:35:55.737220" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:35:55.737419" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:35:55.731730" elapsed="0.005716"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:35:55.737494" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:35:55.737655" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>config</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:35:55.731156" elapsed="0.006526"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:35:55.750004" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01ubmdl4d2u7jymnmfyu34g7em1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:55.810293" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:35:55.810559" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:55.738457" elapsed="0.072153"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} == 404 or ${resp.status_code} == 409">
<return>
<status status="PASS" start="2026-08-22T23:35:55.815363" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-08-22T23:35:55.810760" elapsed="0.004684"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.810720" elapsed="0.004750"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.815708" elapsed="0.000030"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The request failed with code ${resp.status_code}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.815886" elapsed="0.000021"/>
</kw>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config in ClusterManagement__session_1 using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="PASS" start="2026-08-22T23:35:55.738050" elapsed="0.077929"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device has no Netconf connectors nor associated data.</doc>
<status status="PASS" start="2026-08-22T23:35:55.669292" elapsed="0.146755"/>
</kw>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Completely_Gone</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:35:55.668733" elapsed="0.147369"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${node1_session}</arg>
<doc>Wait until all netconf connectors for the device with the given name disappear.
Call of Remove_Device_From_Netconf returns before netconf gets
around deleting the device's connector. To ensure the device is
really gone from netconf, use this keyword to make sure all
connectors disappear. If a call to Remove_Device_From_Netconf
is not made before using this keyword, the wait will fail.
Using this keyword is more readable than putting the WUKS below
into a test case.</doc>
<status status="PASS" start="2026-08-22T23:35:55.668230" elapsed="0.147937"/>
</kw>
<kw name="Wait_Device_Fully_Removed" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Completely_Gone" owner="NetconfKeywords">
<kw name="Check_Device_Has_No_Netconf_Connector" owner="NetconfKeywords">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.829705" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:55.827421" elapsed="0.002312"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.830084" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-22T23:35:55.829930" elapsed="0.000214"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-22T23:35:55.829794" elapsed="0.000378"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.830481" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.830239" elapsed="0.000299"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.831284" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:55.830813" elapsed="0.000499"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:55.830563" elapsed="0.000786"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.831543" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.831374" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.830222" elapsed="0.001488"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:35:55.831750" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:35:55.831903" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:35:55.826948" elapsed="0.004980"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:35:55.831974" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:35:55.832114" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:35:55.826427" elapsed="0.005712"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.839420" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:55.839158" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.839883" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:55.839636" 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-08-22T23:35:55.856521" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:55.856764" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1011'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}} 
 </msg>
<msg time="2026-08-22T23:35:55.856907" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:55.842133" elapsed="0.014812"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:55.839994" elapsed="0.017013"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.857298" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.857043" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.839976" elapsed="0.017448"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.865973" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:55.859764" elapsed="0.006266"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:55.859242" elapsed="0.006823"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.859201" elapsed="0.006890"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.868824" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:55.866373" elapsed="0.002498"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:55.866149" elapsed="0.002758"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.866131" elapsed="0.002802"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.869531" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:55.869097" 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-08-22T23:35:55.869905" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.869664" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.870449" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:55.870147" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:55.869988" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.869645" elapsed="0.000921"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.871123" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:55.870754" 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-08-22T23:35:55.871453" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.871221" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.872014" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:55.871715" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:55.871535" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.871202" 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-08-22T23:35:55.872250" elapsed="0.000376"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:55.873094" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:55.872790" 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-08-22T23:35:55.873304" elapsed="0.002337"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:35:55.858216" elapsed="0.017488"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:35:55.875880" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:35:55.875774" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.875755" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:35:55.879110" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:35:55.876089" elapsed="0.003052"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:35:55.879192" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:35:55.879349" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:55.834820" elapsed="0.044555"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:55.879431" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:35:55.879605" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:35:55.832356" elapsed="0.047277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.880040" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:55.879791" elapsed="0.000306"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.880656" level="INFO">${actual_count} = 0</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:55.880246" elapsed="0.000437"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-22T23:35:55.880728" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:35:55.880879" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-22T23:35:55.818734" elapsed="0.062170"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.881408" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:35:55.881056" elapsed="0.000410"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="PASS" start="2026-08-22T23:35:55.818245" elapsed="0.063282"/>
</kw>
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.892035" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:55.889839" elapsed="0.002222"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.892736" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:55.892396" elapsed="0.000367"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:35:55.892248" elapsed="0.000551"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.893356" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:55.893027" elapsed="0.000355"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:35:55.892879" elapsed="0.000539"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:35:55.892115" elapsed="0.001332"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.894222" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:55.893763" elapsed="0.000486"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:55.893510" elapsed="0.000775"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.894475" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.894310" elapsed="0.000221"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.894728" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.894554" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.893493" elapsed="0.001311"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:35:55.894837" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:35:55.894983" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:35:55.889370" elapsed="0.005638"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:35:55.895053" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:35:55.895192" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>config</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:35:55.888793" elapsed="0.006424"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:35:55.912566" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0l590j8m1w7ug1c8ahvuygymwc1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:55.912868" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:35:55.913086" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:55.895991" elapsed="0.017153"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} == 404 or ${resp.status_code} == 409">
<return>
<status status="PASS" start="2026-08-22T23:35:55.921642" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:35:55.913355" elapsed="0.008370"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.913281" elapsed="0.008479"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.921969" elapsed="0.000031"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The request failed with code ${resp.status_code}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.922200" elapsed="0.000028"/>
</kw>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config in ClusterManagement__session_2 using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="PASS" start="2026-08-22T23:35:55.895573" elapsed="0.026736"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device has no Netconf connectors nor associated data.</doc>
<status status="PASS" start="2026-08-22T23:35:55.817738" elapsed="0.104651"/>
</kw>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Completely_Gone</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:35:55.817029" elapsed="0.105481"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${node2_session}</arg>
<doc>Wait until all netconf connectors for the device with the given name disappear.
Call of Remove_Device_From_Netconf returns before netconf gets
around deleting the device's connector. To ensure the device is
really gone from netconf, use this keyword to make sure all
connectors disappear. If a call to Remove_Device_From_Netconf
is not made before using this keyword, the wait will fail.
Using this keyword is more readable than putting the WUKS below
into a test case.</doc>
<status status="PASS" start="2026-08-22T23:35:55.816414" elapsed="0.106207"/>
</kw>
<kw name="Wait_Device_Fully_Removed" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Completely_Gone" owner="NetconfKeywords">
<kw name="Check_Device_Has_No_Netconf_Connector" owner="NetconfKeywords">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.937086" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:55.934956" elapsed="0.002157"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.937454" elapsed="0.000023"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-22T23:35:55.937283" elapsed="0.000231"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-22T23:35:55.937167" elapsed="0.000373"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.937859" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.937618" elapsed="0.000299"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.938660" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:55.938171" elapsed="0.000516"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:55.937941" elapsed="0.000783"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.938913" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.938750" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.937600" elapsed="0.001390"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:35:55.939024" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:35:55.939171" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:35:55.934484" elapsed="0.004713"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:35:55.939243" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:35:55.939387" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:35:55.933996" elapsed="0.005416"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.946904" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:55.946650" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.947346" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:55.947102" 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-08-22T23:35:55.964409" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01pvys0nqdqsq164kkcp7sslh01.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:55.964797" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1011'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}} 
 </msg>
<msg time="2026-08-22T23:35:55.965087" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:55.949626" elapsed="0.015522"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:55.947458" elapsed="0.017799"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:55.965903" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.965417" elapsed="0.000637"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.947439" elapsed="0.018665"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.973567" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:55.968533" elapsed="0.005143"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:55.968032" elapsed="0.005698"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.967990" elapsed="0.005778"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.977836" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:55.974180" elapsed="0.003723"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:55.973852" elapsed="0.004102"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.973827" elapsed="0.004163"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.978711" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:55.978241" 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-08-22T23:35:55.979045" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.978810" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.979608" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:55.979286" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:55.979126" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.978791" elapsed="0.000904"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.980214" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:55.979851" 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-08-22T23:35:55.980538" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:55.980310" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.981093" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:55.980800" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:55.980642" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.980292" 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-08-22T23:35:55.981327" elapsed="0.000400"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:35:55.982190" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:55.981891" 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-08-22T23:35:55.982368" elapsed="0.002372"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:35:55.967015" elapsed="0.017790"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:35:55.984988" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:35:55.984877" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:55.984857" elapsed="0.000201"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:35:55.988248" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:35:55.985201" elapsed="0.003077"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:35:55.988332" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:35:55.988504" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:35:55.942150" elapsed="0.046414"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:35:55.988649" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:35:55.988803" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:35:55.939644" elapsed="0.049185"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.989241" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:55.988987" elapsed="0.000312"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.989909" level="INFO">${actual_count} = 0</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:55.989451" elapsed="0.000485"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-22T23:35:55.989982" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:35:55.990135" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-22T23:35:55.925787" elapsed="0.064373"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:35:55.990575" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:35:55.990316" elapsed="0.000343"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="PASS" start="2026-08-22T23:35:55.925100" elapsed="0.065619"/>
</kw>
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:56.001298" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:55.999055" elapsed="0.002270"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:56.002066" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:56.001735" elapsed="0.000357"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:35:56.001533" elapsed="0.000597"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:56.002699" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:56.002362" elapsed="0.000364"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:35:56.002212" elapsed="0.000550"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:35:56.001385" elapsed="0.001406"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:56.003562" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:56.003095" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-08-22T23:35:56.002857" elapsed="0.000790"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:56.003842" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:56.003672" elapsed="0.000226"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:56.004078" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:56.003922" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:56.002840" elapsed="0.001313"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:35:56.004188" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:35:56.004338" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:35:55.998597" elapsed="0.005767"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:35:56.004410" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:35:56.004621" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>config</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:35:55.998013" elapsed="0.006636"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:35:56.025949" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01pvys0nqdqsq164kkcp7sslh01.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:35:56.026076" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:35:56.026176" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:35:56.005419" elapsed="0.020784"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} == 404 or ${resp.status_code} == 409">
<return>
<status status="PASS" start="2026-08-22T23:35:56.030803" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-08-22T23:35:56.026291" elapsed="0.004572"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:56.026270" elapsed="0.004618"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:56.031046" elapsed="0.000023"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The request failed with code ${resp.status_code}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:56.031215" elapsed="0.000020"/>
</kw>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config in ClusterManagement__session_3 using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="PASS" start="2026-08-22T23:35:56.005015" elapsed="0.026280"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device has no Netconf connectors nor associated data.</doc>
<status status="PASS" start="2026-08-22T23:35:55.924377" elapsed="0.106977"/>
</kw>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Completely_Gone</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:35:55.923572" elapsed="0.107837"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${node3_session}</arg>
<doc>Wait until all netconf connectors for the device with the given name disappear.
Call of Remove_Device_From_Netconf returns before netconf gets
around deleting the device's connector. To ensure the device is
really gone from netconf, use this keyword to make sure all
connectors disappear. If a call to Remove_Device_From_Netconf
is not made before using this keyword, the wait will fail.
Using this keyword is more readable than putting the WUKS below
into a test case.</doc>
<status status="PASS" start="2026-08-22T23:35:55.922908" elapsed="0.108567"/>
</kw>
<doc>Make request to deconfigure the device on Netconf connector and see if it works.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-08-22T23:35:55.276328" elapsed="0.755296"/>
</test>
<kw name="Teardown_Everything" type="TEARDOWN">
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-08-22T23:35:56.032501" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-08-22T23:35:56.032426" elapsed="0.000453"/>
</kw>
<kw name="Stop_Testtool" owner="NetconfKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:35:56.034190" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:35:56.033861" elapsed="0.000357"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-08-22T23:35:56.034766" elapsed="0.000390"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-08-22T23:35:56.033605" elapsed="0.001648"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-08-22T23:35:56.374782" level="INFO">[?2004l^C[?2004h[jenkins@releng-63244-201-1-mininet-ovs-217-0 ~]&gt;</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-08-22T23:35:56.035457" elapsed="0.339398"/>
</kw>
<kw name="Get File" owner="SSHLibrary">
<msg time="2026-08-22T23:35:56.430335" level="INFO">'testtool--netconf-clustering-txt-Entity.1787441238.58.log' -&gt; '/w/workspace/netconf-csit-3node-clustering-only-titanium/testtool--netconf-clustering-txt-Entity.1787441238.58.log'</msg>
<arg>${testtool_log}</arg>
<doc>Downloads file(s) from the remote machine to the local machine.</doc>
<status status="PASS" start="2026-08-22T23:35:56.375024" elapsed="0.055398"/>
</kw>
<doc>Stop testtool and download its log.</doc>
<status status="PASS" start="2026-08-22T23:35:56.033285" elapsed="0.397230"/>
</kw>
<doc>Teardown the test infrastructure, perform cleanup and release all resources.</doc>
<status status="PASS" start="2026-08-22T23:35:56.032200" elapsed="0.398407"/>
</kw>
<doc>Test suite for netconf device entity ownership handling during outages.

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

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


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

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

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

The suite checks the integrity of the presence of the device and the data
seen on the device only for nodes that have at least one of the roles
("CONFIGURER", "SETTER" and "CHECKER") assigned. A better design would have
a "checker list" of sorts and have only one checking test case that runs
through the check list and performs the test on each node listed. However
this currently has fairly low priority due to Beryllium delivery date so
it was left out.</doc>
<status status="FAIL" start="2026-08-22T23:27:12.332509" elapsed="524.098149"/>
</suite>
<suite id="s1-s5" name="Restart Odl With Tell Based False" source="/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/controller/dom_data_broker/restart_odl_with_tell_based_false.robot">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils" type="SETUP">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:56.541771" 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-08-22T23:35:56.537108" elapsed="0.004713"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-08-22T23:35:56.536870" elapsed="0.005015"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-08-22T23:35:56.547227" 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-08-22T23:35:56.542997" elapsed="0.004260"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-08-22T23:35:56.547458" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:35:56.547346" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:56.547320" elapsed="0.000210"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:56.548048" 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-08-22T23:35:56.547708" elapsed="0.000384"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-08-22T23:35:56.548568" 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-08-22T23:35:56.548258" elapsed="0.000360"/>
</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-08-22T23:35:56.549135" elapsed="0.000279"/>
</kw>
<msg time="2026-08-22T23:35:56.549521" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:35:56.549567" 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-08-22T23:35:56.548790" elapsed="0.000819"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:35:56.550151" 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-08-22T23:35:56.549783" elapsed="0.000394"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:35:56.551198" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:35:56.550933" elapsed="0.000323"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:35:56.551684" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:35:56.551411" elapsed="0.000299"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:35:56.552180" 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-08-22T23:35:56.551871" elapsed="0.000336"/>
</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-08-22T23:35:56.555540" elapsed="0.000239"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:56.556263" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:35:56.555938" elapsed="0.000351"/>
</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-08-22T23:35:56.556443" elapsed="0.000251"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:56.557485" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:56.557189" elapsed="0.000322"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:35:56.557558" elapsed="0.000053"/>
</return>
<msg time="2026-08-22T23:35:56.557738" 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-08-22T23:35:56.556892" elapsed="0.000870"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:35:56.558350" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.200:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396b860b810&gt;, timeout=125, 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-08-22T23:35:56.557921" elapsed="0.000572"/>
</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-08-22T23:35:56.558672" elapsed="0.000429"/>
</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-08-22T23:35:56.554967" elapsed="0.004197"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:35:56.554770" elapsed="0.004440"/>
</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-08-22T23:35:56.560093" elapsed="0.000188"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:56.560830" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:35:56.560482" elapsed="0.000375"/>
</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-08-22T23:35:56.561010" elapsed="0.000221"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:56.562038" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:35:56.561742" elapsed="0.000323"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:35:56.562111" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:35:56.562263" 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-08-22T23:35:56.561428" elapsed="0.000860"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:35:56.562863" level="INFO">Creating Session using : alias=ClusterManagement__session_2, url=http://10.30.170.12:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396b85dee90&gt;, timeout=125, 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-08-22T23:35:56.562441" elapsed="0.000526"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-08-22T23:35:56.563129" elapsed="0.000204"/>
</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-08-22T23:35:56.559519" elapsed="0.003874"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:35:56.559329" elapsed="0.004109"/>
</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-08-22T23:35:56.564270" elapsed="0.000187"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:56.564953" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:35:56.564630" elapsed="0.000349"/>
</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-08-22T23:35:56.565131" elapsed="0.000219"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:56.566150" 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-08-22T23:35:56.565855" elapsed="0.000321"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:35:56.566222" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:35:56.566374" 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-08-22T23:35:56.565543" elapsed="0.000856"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:35:56.566974" level="INFO">Creating Session using : alias=ClusterManagement__session_3, url=http://10.30.170.79:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396b86b1c50&gt;, timeout=125, 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-08-22T23:35:56.566552" elapsed="0.000528"/>
</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-08-22T23:35:56.567241" elapsed="0.000213"/>
</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-08-22T23:35:56.563718" elapsed="0.003798"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:35:56.563521" elapsed="0.004038"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-08-22T23:35:56.552263" elapsed="0.015342"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:56.568157" 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-08-22T23:35:56.567774" elapsed="0.000426"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:56.568760" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.200', 2: '10.30.170.12', 3: '10.30.170.79'}</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-08-22T23:35:56.568362" elapsed="0.000441"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:35:56.569330" 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-08-22T23:35:56.568965" elapsed="0.000407"/>
</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-08-22T23:35:56.550440" elapsed="0.018989"/>
</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-08-22T23:35:56.542648" elapsed="0.026835"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:35:56.569719" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:35:56.569603" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:56.569568" elapsed="0.000218"/>
</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-08-22T23:35:56.573195" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:35:56.572818" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:35:56.573707" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:35:56.573382" elapsed="0.000351"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:35:56.573779" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:35:56.573934" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:35:56.572470" elapsed="0.001489"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:35:56.574951" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:35:56.574686" elapsed="0.000292"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:35:56.575757" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:35:56.575858" 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-08-22T23:35:56.575578" 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-08-22T23:35:56.578535" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:56.578211" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:56.578192" elapsed="0.000561"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:35:56.579040" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:35:56.578912" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:56.580285" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.200" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:56.579359" elapsed="0.000974"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:35:56.581152" 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-08-22T23:35:56.580493" elapsed="0.000686"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:35:56.582475" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:35:56.582716" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:35:56.581937" elapsed="0.000828"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:35:56.583044" elapsed="0.000657"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:35:56.585418" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:35:57.186050" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:56 UTC 2026

  System load:  0.08               Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:27:18 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:35:56.585026" elapsed="0.601229"/>
</kw>
<msg time="2026-08-22T23:35:57.186353" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:35:56.584027" elapsed="0.602486"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:35:56.581395" elapsed="0.605372"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:35:57.187273" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-08-22T23:35:57.199823" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-08-22T23:35:57.200060" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:35:57.200134" 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-08-22T23:35:57.186979" elapsed="0.013190"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:35:57.200404" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:57.201764" 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-08-22T23:35:57.201040" elapsed="0.000792"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:35:57.202155" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:35:57.201942" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:57.201908" elapsed="0.000349"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:35:57.202507" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:35:57.202329" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:57.202308" elapsed="0.000352"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:35:57.202707" 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-08-22T23:35:57.207182" elapsed="0.001030"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:35:57.208536" elapsed="0.000587"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:35:57.209403" elapsed="0.000296"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:35:57.203153" elapsed="0.006663"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:35:56.577735" elapsed="0.632211"/>
</kw>
<msg time="2026-08-22T23:35:57.210020" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:35:56.577035" elapsed="0.633054"/>
</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-08-22T23:35:56.576541" elapsed="0.633658"/>
</kw>
<msg time="2026-08-22T23:35:57.210253" 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-08-22T23:35:56.576040" elapsed="0.634274"/>
</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-08-22T23:35:57.214294" elapsed="0.000337"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:35:57.214796" elapsed="0.000144"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:35:57.215088" 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-08-22T23:35:57.210757" elapsed="0.004476"/>
</kw>
<msg time="2026-08-22T23:35:57.215324" 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-08-22T23:35:56.575196" elapsed="0.640152"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:57.215790" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:57.215523" elapsed="0.000310"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:35:57.215876" 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-08-22T23:35:56.574314" elapsed="0.641692"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:35:56.574136" elapsed="0.641944"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:35:57.217030" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:35:57.216756" elapsed="0.000301"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:35:57.217819" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:35:57.217920" 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-08-22T23:35:57.217681" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:57.222518" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:57.222210" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:57.222191" elapsed="0.000546"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:35:57.223018" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:35:57.222888" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:57.224230" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.12" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:57.223319" elapsed="0.000959"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:35:57.225093" 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-08-22T23:35:57.224435" elapsed="0.000684"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:35:57.226441" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:35:57.226672" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:35:57.225898" elapsed="0.000824"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:35:57.227002" elapsed="0.000664"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:35:57.229174" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:35:57.800038" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:57 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:27:13 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:35:57.228787" elapsed="0.571402"/>
</kw>
<msg time="2026-08-22T23:35:57.800277" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:35:57.227986" elapsed="0.572455"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:35:57.225352" elapsed="0.575341"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:35:57.801162" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-08-22T23:35:57.813671" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-08-22T23:35:57.813832" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:35:57.813878" 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-08-22T23:35:57.800889" elapsed="0.013014"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:35:57.814070" elapsed="0.000229"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:57.815702" 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-08-22T23:35:57.814554" elapsed="0.001351"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:35:57.816405" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:35:57.816068" elapsed="0.000443"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:57.816021" elapsed="0.000540"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:35:57.817007" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-08-22T23:35:57.816726" elapsed="0.000413"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:57.816690" elapsed="0.000502"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:35:57.817266" 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-08-22T23:35:57.824004" elapsed="0.000749"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:35:57.824982" elapsed="0.000402"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:35:57.825574" elapsed="0.000221"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:35:57.817999" elapsed="0.007880"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:35:57.221731" elapsed="0.604244"/>
</kw>
<msg time="2026-08-22T23:35:57.826028" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:35:57.220957" elapsed="0.605122"/>
</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-08-22T23:35:57.220431" elapsed="0.605727"/>
</kw>
<msg time="2026-08-22T23:35:57.826198" 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-08-22T23:35:57.218101" elapsed="0.608141"/>
</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-08-22T23:35:57.829266" 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-08-22T23:35:57.829766" elapsed="0.000146"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:35:57.830060" 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-08-22T23:35:57.826537" elapsed="0.003670"/>
</kw>
<msg time="2026-08-22T23:35:57.830297" 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-08-22T23:35:57.217295" elapsed="0.613028"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:57.830767" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:57.830499" elapsed="0.000309"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:35:57.830850" 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-08-22T23:35:57.216377" elapsed="0.614624"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:35:57.216189" elapsed="0.614850"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:35:57.831968" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:35:57.831695" elapsed="0.000300"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:35:57.832733" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:35:57.832833" 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-08-22T23:35:57.832597" 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-08-22T23:35:57.835492" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:57.835185" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:57.835166" elapsed="0.000541"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:35:57.836025" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:35:57.835861" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:57.837261" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.79" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:57.836331" elapsed="0.000979"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:35:57.838119" 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-08-22T23:35:57.837468" elapsed="0.000678"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:35:57.839475" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:35:57.839718" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:35:57.838906" elapsed="0.000861"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:35:57.840043" elapsed="0.000795"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:35:57.842416" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:35:58.450653" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:58 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:27:13 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:35:57.842027" elapsed="0.608865"/>
</kw>
<msg time="2026-08-22T23:35:58.451005" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:35:57.841162" elapsed="0.610024"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:35:57.838362" elapsed="0.613081"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:35:58.452065" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-08-22T23:35:58.464570" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-08-22T23:35:58.464785" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:35:58.464833" 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-08-22T23:35:58.451730" elapsed="0.013127"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:35:58.465034" elapsed="0.000250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:58.466057" 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-08-22T23:35:58.465510" elapsed="0.000597"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:35:58.466383" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:35:58.466200" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:58.466170" elapsed="0.000295"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:35:58.466671" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-08-22T23:35:58.466519" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:58.466504" elapsed="0.000254"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:35:58.466792" 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-08-22T23:35:58.470105" elapsed="0.000781"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:35:58.471116" elapsed="0.000417"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:35:58.471744" 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-08-22T23:35:58.467145" elapsed="0.004873"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:35:57.834691" elapsed="0.637422"/>
</kw>
<msg time="2026-08-22T23:35:58.472233" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:35:57.834017" elapsed="0.638272"/>
</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-08-22T23:35:57.833514" elapsed="0.638857"/>
</kw>
<msg time="2026-08-22T23:35:58.472413" 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-08-22T23:35:57.833013" elapsed="0.639446"/>
</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-08-22T23:35:58.475473" elapsed="0.000386"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:35:58.476025" elapsed="0.000146"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:35:58.476321" 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-08-22T23:35:58.472817" elapsed="0.003657"/>
</kw>
<msg time="2026-08-22T23:35:58.476566" 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-08-22T23:35:57.832221" elapsed="0.644388"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:58.477055" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:58.476805" elapsed="0.000291"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:35:58.477139" 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-08-22T23:35:57.831320" elapsed="0.645947"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:35:57.831134" elapsed="0.646171"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:35:56.574011" elapsed="1.903331"/>
</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-08-22T23:35:56.570009" elapsed="1.907396"/>
</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-08-22T23:35:58.477560" elapsed="0.000232"/>
</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-08-22T23:35:58.492317" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:35:58.492206" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:58.492187" elapsed="0.000199"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:35:58.492713" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:35:58.492823" 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-08-22T23:35:58.492543" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:58.493269" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:58.493005" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:58.493734" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:58.493470" elapsed="0.000308"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:35:58.494528" 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-08-22T23:35:58.494303" elapsed="0.000350">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-08-22T23:35:58.494761" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:35:58.494807" 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-08-22T23:35:58.493939" 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-08-22T23:35:58.495129" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:58.494905" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:58.494886" elapsed="0.000343"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:35:58.496034" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:35:58.495766" elapsed="0.000295"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:35:58.496109" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:35:58.496260" level="INFO">${odl_ip} = 10.30.170.200</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:35:58.495430" elapsed="0.000855"/>
</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-08-22T23:35:58.496439" elapsed="0.000464"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:35:58.497179" level="INFO">index=10
host=10.30.170.200
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-08-22T23:35:58.497279" level="INFO">${karaf_connection_object} = index=10
host=10.30.170.200
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-08-22T23:35:58.497073" elapsed="0.000233"/>
</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-08-22T23:35:58.497455" elapsed="0.002413"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:35:58.500292" level="INFO">Logging into '10.30.170.200:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:35:58.678169" 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-08-22T23:35:58.500032" elapsed="0.178271"/>
</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-08-22T23:35:58.682146" elapsed="0.000316"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:35:58.682647" elapsed="0.000166"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:35:58.682963" 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-08-22T23:35:58.679363" elapsed="0.003761"/>
</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-08-22T23:35:58.678708" elapsed="0.004462"/>
</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-08-22T23:35:58.491923" elapsed="0.191300"/>
</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-08-22T23:35:58.478515" elapsed="0.204757"/>
</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-08-22T23:35:58.478144" elapsed="0.205181"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:35:58.478002" elapsed="0.205364"/>
</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-08-22T23:35:58.697523" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:35:58.697396" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:58.697367" elapsed="0.000258"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:35:58.697936" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:35:58.698044" 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-08-22T23:35:58.697791" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:58.698494" 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-08-22T23:35:58.698224" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:58.698957" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:58.698708" elapsed="0.000293"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:35:58.699857" 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-08-22T23:35:58.699611" elapsed="0.000356">Dictionary does not contain key '2'.</status>
</kw>
<msg time="2026-08-22T23:35:58.700078" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:35:58.700123" 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-08-22T23:35:58.699223" elapsed="0.000924"/>
</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-08-22T23:35:58.700451" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:58.700224" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:58.700205" elapsed="0.000345"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:35:58.701351" level="INFO">${ip_address} = 10.30.170.12</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:35:58.701054" elapsed="0.000325"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:35:58.701429" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:35:58.701598" level="INFO">${odl_ip} = 10.30.170.12</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:35:58.700770" elapsed="0.000855"/>
</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-08-22T23:35:58.701780" elapsed="0.000404"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:35:58.702458" level="INFO">index=12
host=10.30.170.12
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-08-22T23:35:58.702558" level="INFO">${karaf_connection_object} = index=12
host=10.30.170.12
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:35:58.702355" elapsed="0.000246"/>
</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-08-22T23:35:58.702750" elapsed="0.002569"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:35:58.705761" level="INFO">Logging into '10.30.170.12:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:35:58.885222" 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-08-22T23:35:58.705484" elapsed="0.179950"/>
</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-08-22T23:35:58.889457" 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-08-22T23:35:58.889977" elapsed="0.000159"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:35:58.890286" 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-08-22T23:35:58.886983" elapsed="0.003455"/>
</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-08-22T23:35:58.886185" elapsed="0.004297"/>
</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-08-22T23:35:58.696992" elapsed="0.193543"/>
</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-08-22T23:35:58.684007" elapsed="0.206590"/>
</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-08-22T23:35:58.683631" elapsed="0.207022"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:35:58.683473" elapsed="0.207219"/>
</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-08-22T23:35:58.904737" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:35:58.904618" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:58.904594" elapsed="0.000216"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:35:58.905099" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:35:58.905205" 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-08-22T23:35:58.904965" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:58.905668" 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-08-22T23:35:58.905383" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:58.906123" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:58.905877" elapsed="0.000291"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:35:58.906932" 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-08-22T23:35:58.906704" elapsed="0.000330">Dictionary does not contain key '3'.</status>
</kw>
<msg time="2026-08-22T23:35:58.907141" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:35:58.907186" 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-08-22T23:35:58.906326" elapsed="0.000884"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:58.907511" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:58.907285" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:58.907266" elapsed="0.000361"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:35:58.908641" level="INFO">${ip_address} = 10.30.170.79</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:35:58.908346" elapsed="0.000323"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:35:58.908719" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:35:58.908878" level="INFO">${odl_ip} = 10.30.170.79</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:35:58.907830" elapsed="0.001073"/>
</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-08-22T23:35:58.909060" elapsed="0.000405"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:35:58.909761" level="INFO">index=14
host=10.30.170.79
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-08-22T23:35:58.909889" level="INFO">${karaf_connection_object} = index=14
host=10.30.170.79
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:35:58.909653" elapsed="0.000264"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:35:58.910068" elapsed="0.002409"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:35:58.912923" level="INFO">Logging into '10.30.170.79:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:35:59.150348" 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-08-22T23:35:58.912660" elapsed="0.237829"/>
</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-08-22T23:35:59.153983" elapsed="0.000309"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:35:59.154492" elapsed="0.000182"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:35:59.154894" 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-08-22T23:35:59.151473" elapsed="0.003579"/>
</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-08-22T23:35:59.150850" elapsed="0.004248"/>
</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-08-22T23:35:58.904317" elapsed="0.250833"/>
</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-08-22T23:35:58.891374" elapsed="0.263823"/>
</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-08-22T23:35:58.891002" elapsed="0.264249"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:35:58.890856" elapsed="0.264435"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-08-22T23:35:58.477850" elapsed="0.677482"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-08-22T23:35:56.542189" elapsed="2.613210"/>
</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-08-22T23:35:59.158398" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:35:59.158280" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:59.158257" elapsed="0.000233"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:35:59.163536" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:35:59.163419" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:59.163401" elapsed="0.000220"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:35:59.164573" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:35:59.164180" elapsed="0.000437"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:35:59.165086" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:35:59.164780" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:35:59.165157" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:35:59.165318" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:35:59.163847" elapsed="0.001496"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:35:59.170897" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:35:59.170788" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:59.170768" 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-08-22T23:35:59.172027" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:35:59.171920" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:59.171897" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:35:59.172515" 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-08-22T23:35:59.172241" elapsed="0.000301"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:35:59.172924" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:35:59.172729" elapsed="0.000221"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:35:59.211332" 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 "/ "n "e "t "[78Cc "[A[78Co</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:35:59.173452" elapsed="0.038020"/>
</kw>
<msg time="2026-08-22T23:35:59.211599" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:35:59.211649" 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-08-22T23:35:59.173112" elapsed="0.038575"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:35:59.289149" level="INFO">"n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "c "o "n "t "r "o "l "l "e "r "/ "d "o "m "_ "d "a "t "a "_ "b "r "[78Co "[A[78Ck
 "e "r "/ "r "e "s "t "a "r "t "_ "o "d "l "_ "w "i "t "h "_ "t "e "l "l "_ "b "a "s "e "d "_ "f "a "l "s "e ". "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-08-22T23:35:59.212197" elapsed="0.077202"/>
</kw>
<msg time="2026-08-22T23:35:59.289511" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:35:59.289557" level="INFO">${message_wait} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:35:59.211858" elapsed="0.077762"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:59.289959" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:59.289709" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:59.289685" elapsed="0.000356"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:59.290480" level="INFO"> "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "c "o "n "t "r "o "l "l "e "r "/ "d "o "m "_ "d "a "t "a "_ "b "r "[78Co "[A[78Ck
 "e "r "/ "r "e "s "t "a "r "t "_ "o "d "l "_ "w "i "t "h "_ "t "e "l "l "_ "b "a "s "e "d "_ "f "a "l "s "e ". "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-08-22T23:35:59.290186" 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-08-22T23:35:59.290905" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:59.290661" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:59.290643" elapsed="0.000343"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:35:59.291022" 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-08-22T23:35:59.292309" elapsed="0.000767"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:35:59.293377" elapsed="0.000488"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:35:59.294129" elapsed="0.000192"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:35:59.291885" elapsed="0.002570"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:35:59.291317" elapsed="0.003187"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:35:59.171662" elapsed="0.122963"/>
</kw>
<msg time="2026-08-22T23:35:59.294720" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:35:59.294765" level="INFO">${message} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:35:59.171121" elapsed="0.123681"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:35:59.295000" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:35:59.294893" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:59.294873" 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-08-22T23:35:59.295495" 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-08-22T23:35:59.295861" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:35:59.295934" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:35:59.170450" elapsed="0.125592"/>
</kw>
<msg time="2026-08-22T23:35:59.296135" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:35:59.296179" level="INFO">${output} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:35:59.165735" elapsed="0.130481"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:59.296543" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:59.296291" elapsed="0.000377"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:59.296274" elapsed="0.000420"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:35:59.165574" 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-08-22T23:35:59.302217" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:35:59.302108" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:59.302089" 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-08-22T23:35:59.303400" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:35:59.303292" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:59.303274" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:35:59.303893" 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-08-22T23:35:59.303629" elapsed="0.000291"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:35:59.304274" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:35:59.304081" elapsed="0.000219"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:35:59.343551" 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 "/ "n "e "t "[78Cc "[A[78Co</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:35:59.304825" elapsed="0.039050"/>
</kw>
<msg time="2026-08-22T23:35:59.344104" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:35:59.344206" 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-08-22T23:35:59.304460" elapsed="0.039830"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:35:59.393860" level="INFO">"n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "c "o "n "t "r "o "l "l "e "r "/ "d "o "m "_ "d "a "t "a "_ "b "r "[78Co "[A[78Ck
 "e "r "/ "r "e "s "t "a "r "t "_ "o "d "l "_ "w "i "t "h "_ "t "e "l "l "_ "b "a "s "e "d "_ "f "a "l "s "e ". "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-08-22T23:35:59.345480" elapsed="0.048556"/>
</kw>
<msg time="2026-08-22T23:35:59.394140" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:35:59.394184" level="INFO">${message_wait} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:35:59.344713" elapsed="0.049508"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:59.394522" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:59.394297" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:59.394277" elapsed="0.000350"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:59.395050" level="INFO"> "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "c "o "n "t "r "o "l "l "e "r "/ "d "o "m "_ "d "a "t "a "_ "b "r "[78Co "[A[78Ck
 "e "r "/ "r "e "s "t "a "r "t "_ "o "d "l "_ "w "i "t "h "_ "t "e "l "l "_ "b "a "s "e "d "_ "f "a "l "s "e ". "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-08-22T23:35:59.394774" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:59.395455" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:59.395237" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:59.395218" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:35:59.395565" 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-08-22T23:35:59.396814" 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-08-22T23:35:59.397698" elapsed="0.000443"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:35:59.398409" elapsed="0.000216"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:35:59.396373" elapsed="0.002387"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:35:59.395846" elapsed="0.002962"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:35:59.303038" elapsed="0.095867"/>
</kw>
<msg time="2026-08-22T23:35:59.398998" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:35:59.399043" level="INFO">${message} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:35:59.302480" elapsed="0.096617"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:35:59.399281" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:35:59.399175" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:59.399155" 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-08-22T23:35:59.399825" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:59.400340" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:35:59.400415" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:35:59.301814" elapsed="0.098711"/>
</kw>
<msg time="2026-08-22T23:35:59.400645" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:35:59.400691" level="INFO">${output} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:35:59.296987" elapsed="0.103741"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:59.401057" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:59.400805" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:59.400787" elapsed="0.000347"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:35:59.296845" elapsed="0.104313"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:35:59.406732" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:35:59.406622" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:59.406602" 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-08-22T23:35:59.407850" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:35:59.407743" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:59.407725" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:35:59.408319" 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-08-22T23:35:59.408063" elapsed="0.000283"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:35:59.408720" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:35:59.408505" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:35:59.442167" 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 "/ "n "e "t "[78Cc "[A[78Co</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:35:59.409240" elapsed="0.033058"/>
</kw>
<msg time="2026-08-22T23:35:59.442398" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:35:59.442444" 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-08-22T23:35:59.408907" elapsed="0.033573"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:35:59.498800" level="INFO">"n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "c "o "n "t "r "o "l "l "e "r "/ "d "o "m "_ "d "a "t "a "_ "b "r "[78Co "[A[78Ck
 "e "r "/ "r "e "s "t "a "r "t "_ "o "d "l "_ "w "i "t "h "_ "t "e "l "l "_ "b "a "s "e "d "_ "f "a "l "s "e ". "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-08-22T23:35:59.443011" elapsed="0.055971"/>
</kw>
<msg time="2026-08-22T23:35:59.499089" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:35:59.499134" level="INFO">${message_wait} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:35:59.442670" elapsed="0.056500"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:59.499520" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:59.499251" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:59.499229" elapsed="0.000395"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:59.500056" level="INFO"> "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "c "o "n "t "r "o "l "l "e "r "/ "d "o "m "_ "d "a "t "a "_ "b "r "[78Co "[A[78Ck
 "e "r "/ "r "e "s "t "a "r "t "_ "o "d "l "_ "w "i "t "h "_ "t "e "l "l "_ "b "a "s "e "d "_ "f "a "l "s "e ". "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-08-22T23:35:59.499770" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:59.500479" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:59.500260" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:59.500241" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:35:59.500614" 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-08-22T23:35:59.501880" elapsed="0.000568"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:35:59.502775" elapsed="0.000447"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:35:59.503497" elapsed="0.000214"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:35:59.501427" elapsed="0.002418"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:35:59.500891" elapsed="0.003003"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:35:59.407475" elapsed="0.096518"/>
</kw>
<msg time="2026-08-22T23:35:59.504087" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:35:59.504133" level="INFO">${message} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:35:59.406951" elapsed="0.097219"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:35:59.504352" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:35:59.504247" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:59.504228" 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-08-22T23:35:59.504862" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:59.505199" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:35:59.505270" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:35:59.406311" elapsed="0.099067"/>
</kw>
<msg time="2026-08-22T23:35:59.505472" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:35:59.505516" level="INFO">${output} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:35:59.401419" elapsed="0.104134"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:59.505908" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:59.505654" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:59.505636" elapsed="0.000350"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:35:59.401278" elapsed="0.104731"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:35:59.165399" elapsed="0.340640"/>
</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-08-22T23:35:59.163120" elapsed="0.342978"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-08-22T23:35:59.156043" elapsed="0.350115"/>
</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-08-22T23:35:59.155563" elapsed="0.350641"/>
</kw>
<arg>http_timeout=125</arg>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-08-22T23:35:56.536489" elapsed="2.969770"/>
</kw>
<test id="s1-s5-t1" name="Stop_All_Members" line="30">
<kw name="Stop_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:35:59.512713" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:35:59.512306" elapsed="0.000434"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:35:59.513208" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:35:59.512902" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:35:59.513279" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:35:59.513436" level="INFO">${stop_index_list} = [1, 2, 3]</msg>
<var>${stop_index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:35:59.511923" elapsed="0.001572"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:35:59.514482" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:35:59.514106" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:35:59.514988" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:35:59.514685" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:35:59.515058" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:35:59.515212" 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-08-22T23:35:59.513727" elapsed="0.001510"/>
</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-08-22T23:35:59.516735" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:35:59.516344" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:35:59.517224" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:35:59.516923" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:35:59.517294" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:35:59.517447" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:35:59.515974" elapsed="0.001498"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:35:59.518525" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:35:59.518257" elapsed="0.000294"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:35:59.519338" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:35:59.519457" 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-08-22T23:35:59.519196" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:35:59.522263" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:35:59.521986" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-08-22T23:35:59.521820" elapsed="0.000525"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:35:59.522661" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:35:59.522497" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:35:59.523443" level="INFO">Attempting to execute command "/tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/stop" on remote system "10.30.170.200" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:35:59.522945" elapsed="0.000552"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:35:59.524106" level="INFO">${conn_id} = 19</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:35:59.523681" elapsed="0.000451"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:35:59.525352" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:35:59.525480" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:35:59.524812" elapsed="0.000693"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:35:59.525719" elapsed="0.000671"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:35:59.528574" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:35:59.855940" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:56 UTC 2026

  System load:  0.08               Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:35:57 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:35:59.528010" elapsed="0.328124"/>
</kw>
<msg time="2026-08-22T23:35:59.856282" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:35:59.526682" elapsed="0.329782"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:35:59.524352" elapsed="0.332309"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:35:59.857125" level="INFO">Executing command '/tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/stop'.</msg>
<msg time="2026-08-22T23:36:00.234497" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:00.234858" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:36:00.234958" 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-08-22T23:35:59.856879" elapsed="0.378132"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:00.235462" elapsed="0.000581"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:00.237245" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:00.236478" elapsed="0.000865"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:00.237865" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:00.237518" elapsed="0.000456"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:00.237466" elapsed="0.000559"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:00.238377" elapsed="0.000064"/>
</return>
<status status="PASS" start="2026-08-22T23:36:00.238144" elapsed="0.000370"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:00.238109" elapsed="0.000459"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:00.238683" 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-08-22T23:36:00.258325" elapsed="0.000760"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:00.259255" elapsed="0.000168"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:00.259573" elapsed="0.000116"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:36:00.239397" elapsed="0.020347"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:35:59.521289" elapsed="0.738552"/>
</kw>
<msg time="2026-08-22T23:36:00.259896" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:35:59.520712" elapsed="0.739239"/>
</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-08-22T23:35:59.520161" elapsed="0.739867"/>
</kw>
<msg time="2026-08-22T23:36:00.260067" 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-08-22T23:35:59.519655" elapsed="0.740456"/>
</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-08-22T23:36:00.263252" elapsed="0.000307"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:00.263749" elapsed="0.000153"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:00.264050" 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-08-22T23:36:00.260404" elapsed="0.003793"/>
</kw>
<msg time="2026-08-22T23:36:00.264286" 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-08-22T23:35:59.518785" elapsed="0.745526"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:00.264823" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:00.264556" elapsed="0.000309"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:36:00.264907" 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-08-22T23:35:59.517853" elapsed="0.747179"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:35:59.517676" elapsed="0.747392"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:00.266083" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:36:00.265807" elapsed="0.000303"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:00.266898" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:00.267006" 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-08-22T23:36:00.266755" 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-08-22T23:36:00.269675" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:00.269381" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:00.269362" elapsed="0.000395"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:00.270034" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:36:00.269906" elapsed="0.000256"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:00.270814" level="INFO">Attempting to execute command "/tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/stop" on remote system "10.30.170.12" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:00.270312" elapsed="0.000550"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:00.271449" level="INFO">${conn_id} = 22</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:00.271028" elapsed="0.000447"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:00.272747" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:00.272883" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:00.272157" elapsed="0.000751"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:36:00.273101" elapsed="0.000766"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:00.276339" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:00.634948" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:57 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:35:57 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:00.275740" elapsed="0.359429"/>
</kw>
<msg time="2026-08-22T23:36:00.635297" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:00.274105" elapsed="0.361367"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:36:00.271720" elapsed="0.363953"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:00.636215" level="INFO">Executing command '/tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/stop'.</msg>
<msg time="2026-08-22T23:36:01.003679" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:01.004060" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:36:01.004160" 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-08-22T23:36:00.635935" elapsed="0.368278"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:01.004850" elapsed="0.000569"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:01.006659" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:01.005891" elapsed="0.000869"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:01.007391" elapsed="0.000043"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:01.006938" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:01.006886" 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-08-22T23:36:01.007794" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-08-22T23:36:01.007637" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:01.007613" elapsed="0.000309"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:01.007972" 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-08-22T23:36:01.023883" elapsed="0.000524"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:01.024600" elapsed="0.000171"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:01.024922" 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-08-22T23:36:01.008435" elapsed="0.016641"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:36:00.268842" elapsed="0.756328"/>
</kw>
<msg time="2026-08-22T23:36:01.025225" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:00.268243" elapsed="0.757041"/>
</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-08-22T23:36:00.267710" elapsed="0.757657"/>
</kw>
<msg time="2026-08-22T23:36:01.025408" 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-08-22T23:36:00.267187" elapsed="0.758267"/>
</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-08-22T23:36:01.028608" 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-08-22T23:36:01.029087" elapsed="0.000146"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:01.029382" 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-08-22T23:36:01.025872" elapsed="0.003658"/>
</kw>
<msg time="2026-08-22T23:36:01.029642" 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-08-22T23:36:00.266329" elapsed="0.763340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:01.030098" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:01.029850" elapsed="0.000289"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:36:01.030182" 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-08-22T23:36:00.265379" elapsed="0.764927"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:36:00.265164" elapsed="0.765179"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:01.031366" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:36:01.031063" elapsed="0.000331"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:01.032189" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:01.032292" 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-08-22T23:36:01.032042" elapsed="0.000276"/>
</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-08-22T23:36:01.035268" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:01.034969" elapsed="0.000396"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:01.034950" elapsed="0.000441"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:01.035695" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:36:01.035547" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:01.036455" level="INFO">Attempting to execute command "/tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/stop" on remote system "10.30.170.79" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:01.035979" elapsed="0.000525"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:01.037108" level="INFO">${conn_id} = 25</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:01.036687" elapsed="0.000448"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:01.038355" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:01.038480" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:01.037819" elapsed="0.000686"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:36:01.038716" elapsed="0.000688"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:01.041555" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:01.405314" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:58 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:35:58 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:01.041001" elapsed="0.364559"/>
</kw>
<msg time="2026-08-22T23:36:01.405725" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:01.039690" elapsed="0.366233"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:36:01.037351" elapsed="0.368759"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:01.406672" level="INFO">Executing command '/tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/stop'.</msg>
<msg time="2026-08-22T23:36:01.773690" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:01.773942" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:36:01.773987" 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-08-22T23:36:01.406367" elapsed="0.367645"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:01.774293" elapsed="0.000386"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:01.775275" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:01.774896" elapsed="0.000422"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:01.775558" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:01.775404" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:01.775379" elapsed="0.000280"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:01.775822" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:36:01.775713" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:01.775698" elapsed="0.000216"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:01.775950" 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-08-22T23:36:01.790240" elapsed="0.000698"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:01.791112" elapsed="0.000171"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:01.791435" 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-08-22T23:36:01.776287" elapsed="0.015315"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:36:01.034411" elapsed="0.757288"/>
</kw>
<msg time="2026-08-22T23:36:01.791816" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:01.033813" elapsed="0.758062"/>
</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-08-22T23:36:01.033003" elapsed="0.758952"/>
</kw>
<msg time="2026-08-22T23:36:01.791997" 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-08-22T23:36:01.032472" elapsed="0.759572"/>
</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-08-22T23:36:01.795153" elapsed="0.000314"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:01.795663" elapsed="0.000148"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:01.795961" 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-08-22T23:36:01.792343" elapsed="0.003766"/>
</kw>
<msg time="2026-08-22T23:36:01.796203" 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-08-22T23:36:01.031626" elapsed="0.764603"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:01.796697" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:01.796427" elapsed="0.000313"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:36:01.796785" 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-08-22T23:36:01.030650" elapsed="0.766292"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:36:01.030445" elapsed="0.766536"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:35:59.517526" elapsed="2.279491"/>
</for>
<arg>command=${NODE_STOP_COMMAND}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-08-22T23:35:59.515471" elapsed="2.281606"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:36:01.797548" 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-08-22T23:36:01.797236" elapsed="0.000353"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${updated_index_list}</arg>
<arg>@{stop_index_list}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:36:01.797747" elapsed="0.000223"/>
</kw>
<if>
<branch type="IF" condition="not ${confirm}">
<return>
<value>${updated_index_list}</value>
<status status="NOT RUN" start="2026-08-22T23:36:01.798155" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:01.798047" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:01.798026" elapsed="0.000195"/>
</if>
<for flavor="IN">
<iter>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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-08-22T23:36:01.800153" 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-08-22T23:36:01.799861" elapsed="0.000319"/>
</kw>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:01.801088" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:36:01.800803" elapsed="0.000312"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:01.801900" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:01.802002" 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-08-22T23:36:01.801763" 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-08-22T23:36:01.806153" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:01.805488" elapsed="0.000748"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:01.805433" elapsed="0.000865"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:01.807830" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:36:01.807330" elapsed="0.000855"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:01.809961" level="INFO">Attempting to execute command "ps axf | grep org.apache.karaf | grep -v grep | wc -l" on remote system "10.30.170.200" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:01.809222" elapsed="0.000908"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:01.811920" 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-08-22T23:36:01.811140" elapsed="0.000881"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:01.814466" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:01.814545" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:01.814185" 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-08-22T23:36:01.814806" elapsed="0.000338"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:01.816185" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:02.159008" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:56 UTC 2026

  System load:  0.08               Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:35:59 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:01.815858" elapsed="0.343309"/>
</kw>
<msg time="2026-08-22T23:36:02.159254" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:01.815369" elapsed="0.343973"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:36:01.813293" elapsed="0.346374"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:02.161236" level="INFO">Executing command 'ps axf | grep org.apache.karaf | grep -v grep | wc -l'.</msg>
<msg time="2026-08-22T23:36:02.184009" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:02.184248" level="INFO">${stdout} = 1</msg>
<msg time="2026-08-22T23:36:02.184411" 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-08-22T23:36:02.160823" elapsed="0.023688"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:02.185578" elapsed="0.000467"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:02.187139" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:02.186681" elapsed="0.000566"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:02.187717" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:02.187422" elapsed="0.000379"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:02.187359" elapsed="0.000502"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:02.188222" elapsed="0.000053"/>
</return>
<status status="PASS" start="2026-08-22T23:36:02.188012" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:02.187961" elapsed="0.000427"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:02.188471" 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">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:02.193531" elapsed="0.000397"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:02.194144" elapsed="0.000164"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:02.194504" elapsed="0.000122"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:36:02.190057" elapsed="0.004682"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:36:01.803914" elapsed="0.391061"/>
</kw>
<msg time="2026-08-22T23:36:02.195299" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:01.803242" elapsed="0.392114"/>
</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-08-22T23:36:01.802706" elapsed="0.392733"/>
</kw>
<msg time="2026-08-22T23:36:02.195541" 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-08-22T23:36:01.802185" elapsed="0.393428"/>
</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-08-22T23:36:02.198699" elapsed="0.000314"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:02.199178" elapsed="0.000146"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:02.199476" elapsed="0.000105"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:36:02.195913" elapsed="0.003737"/>
</kw>
<msg time="2026-08-22T23:36:02.199744" level="INFO">${output} = 1</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-08-22T23:36:01.801333" elapsed="0.398438"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:02.200205" level="INFO">1</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:02.199952" elapsed="0.000297"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:36:02.200293" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:36:02.200448" level="INFO">${count} = 1</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-08-22T23:36:01.800379" elapsed="0.400095"/>
</kw>
<return>
<value>${count}</value>
<status status="PASS" start="2026-08-22T23:36:02.200521" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:36:02.200696" level="INFO">${count} = 1</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-08-22T23:36:01.799496" elapsed="0.401225"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-08-22T23:36:02.201277" level="FAIL">Found running Karaf count: 1: 0 != 1</msg>
<arg>0</arg>
<arg>${count}</arg>
<arg>Found running Karaf count: ${count}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-08-22T23:36:02.200879" elapsed="0.000470">Found running Karaf count: 1: 0 != 1</status>
</kw>
<arg>member_index=${index}</arg>
<doc>Fail if non-zero karaf instances are counted on member of given index.</doc>
<status status="FAIL" start="2026-08-22T23:36:01.799102" elapsed="0.402363">Found running Karaf count: 1: 0 != 1</status>
</kw>
<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-08-22T23:36:04.204922" 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-08-22T23:36:04.204155" elapsed="0.000836"/>
</kw>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:04.207088" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:36:04.206452" elapsed="0.000696"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:04.208923" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:04.209147" 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-08-22T23:36:04.208573" elapsed="0.000633"/>
</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-08-22T23:36:04.214226" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:04.213429" elapsed="0.000883"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:04.213367" elapsed="0.001012"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:04.216005" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:36:04.215465" elapsed="0.000901"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:04.218214" level="INFO">Attempting to execute command "ps axf | grep org.apache.karaf | grep -v grep | wc -l" on remote system "10.30.170.200" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:04.217486" elapsed="0.000841"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:04.220176" level="INFO">${conn_id} = 31</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:04.219368" elapsed="0.000914"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:04.223229" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:04.223387" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:04.222912" elapsed="0.000502"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:36:04.223656" elapsed="0.000339"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:04.224957" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:04.557106" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:56 UTC 2026

  System load:  0.08               Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:02 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:04.224630" elapsed="0.332658"/>
</kw>
<msg time="2026-08-22T23:36:04.557383" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:04.224223" elapsed="0.333288"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:36:04.221566" elapsed="0.336291"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:04.559479" level="INFO">Executing command 'ps axf | grep org.apache.karaf | grep -v grep | wc -l'.</msg>
<msg time="2026-08-22T23:36:04.582831" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:04.583401" level="INFO">${stdout} = 0</msg>
<msg time="2026-08-22T23:36:04.583861" 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-08-22T23:36:04.559050" elapsed="0.025058"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:04.586820" elapsed="0.001072"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:04.590556" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:04.589469" elapsed="0.001511"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:04.591865" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:04.591369" elapsed="0.000582"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:04.591231" elapsed="0.000782"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:04.592387" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-08-22T23:36:04.592170" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:04.592116" elapsed="0.000443"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:04.592686" 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">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:04.597779" 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-08-22T23:36:04.598363" elapsed="0.000180"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:04.598768" 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-08-22T23:36:04.594120" elapsed="0.004929"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:36:04.211956" elapsed="0.387334"/>
</kw>
<msg time="2026-08-22T23:36:04.599640" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:04.211232" elapsed="0.388472"/>
</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-08-22T23:36:04.210685" elapsed="0.389104"/>
</kw>
<msg time="2026-08-22T23:36:04.599837" 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-08-22T23:36:04.209555" elapsed="0.390338"/>
</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-08-22T23:36:04.603001" elapsed="0.000394"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:04.603567" elapsed="0.000213"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:04.604013" 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-08-22T23:36:04.600198" elapsed="0.003978"/>
</kw>
<msg time="2026-08-22T23:36:04.604271" 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-08-22T23:36:04.207663" elapsed="0.396635"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:04.604766" level="INFO">0</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:04.604479" elapsed="0.000334"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:36:04.604857" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:36:04.605031" 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-08-22T23:36:04.205454" elapsed="0.399603"/>
</kw>
<return>
<value>${count}</value>
<status status="PASS" start="2026-08-22T23:36:04.605106" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:04.605259" 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-08-22T23:36:04.203324" elapsed="0.401962"/>
</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-08-22T23:36:04.605450" elapsed="0.000394"/>
</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-08-22T23:36:04.202276" elapsed="0.403634"/>
</kw>
<arg>${timeout}</arg>
<arg>2s</arg>
<arg>Verify_Karaf_Is_Not_Running_On_Member</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:36:01.798554" elapsed="2.807414"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:36:01.798407" elapsed="2.807602"/>
</iter>
<iter>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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-08-22T23:36:04.607960" 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-08-22T23:36:04.607655" elapsed="0.000340"/>
</kw>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:04.608923" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:36:04.608644" elapsed="0.000306"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:04.609767" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:04.609873" 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-08-22T23:36:04.609625" elapsed="0.000276"/>
</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-08-22T23:36:04.613775" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:04.613304" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:04.613248" elapsed="0.000676"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:04.615739" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:36:04.614998" elapsed="0.001112"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:04.617845" level="INFO">Attempting to execute command "ps axf | grep org.apache.karaf | grep -v grep | wc -l" on remote system "10.30.170.12" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:04.617265" elapsed="0.000696"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:04.619811" level="INFO">${conn_id} = 34</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:04.619058" elapsed="0.000858"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:04.622450" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:04.622532" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:04.622144" elapsed="0.000413"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:04.622962" elapsed="0.000366"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:04.624279" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:04.947788" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:57 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:00 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:04.623954" elapsed="0.324013"/>
</kw>
<msg time="2026-08-22T23:36:04.948055" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:04.623560" elapsed="0.324586"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:36:04.621324" elapsed="0.327125"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:04.950016" level="INFO">Executing command 'ps axf | grep org.apache.karaf | grep -v grep | wc -l'.</msg>
<msg time="2026-08-22T23:36:04.972822" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:04.973332" level="INFO">${stdout} = 0</msg>
<msg time="2026-08-22T23:36:04.973742" 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-08-22T23:36:04.949612" elapsed="0.024356"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:04.976402" elapsed="0.000828"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:04.978915" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:04.978112" elapsed="0.000954"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:04.979677" elapsed="0.000047"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:04.979300" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:04.979215" 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-08-22T23:36:04.980374" elapsed="0.000076"/>
</return>
<status status="PASS" start="2026-08-22T23:36:04.980081" elapsed="0.000439"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:04.980011" elapsed="0.000654"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:04.980785" elapsed="0.000054"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:04.986992" 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-08-22T23:36:04.987680" elapsed="0.000185"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:04.988063" elapsed="0.000106"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:36:04.982862" elapsed="0.005421"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:36:04.611861" elapsed="0.376658"/>
</kw>
<msg time="2026-08-22T23:36:04.988873" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:04.611171" elapsed="0.377768"/>
</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-08-22T23:36:04.610600" elapsed="0.378423"/>
</kw>
<msg time="2026-08-22T23:36:04.989063" 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-08-22T23:36:04.610071" elapsed="0.379038"/>
</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-08-22T23:36:04.992175" 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-08-22T23:36:04.992726" elapsed="0.000149"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:04.993024" 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-08-22T23:36:04.989405" elapsed="0.003767"/>
</kw>
<msg time="2026-08-22T23:36:04.993266" 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-08-22T23:36:04.609183" elapsed="0.384108"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:04.993855" level="INFO">0</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:04.993597" elapsed="0.000303"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:36:04.993944" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:36:04.994099" 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-08-22T23:36:04.608209" elapsed="0.385915"/>
</kw>
<return>
<value>${count}</value>
<status status="PASS" start="2026-08-22T23:36:04.994171" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:36:04.994318" 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-08-22T23:36:04.607275" elapsed="0.387068"/>
</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-08-22T23:36:04.994502" elapsed="0.000376"/>
</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-08-22T23:36:04.606853" elapsed="0.388092"/>
</kw>
<arg>${timeout}</arg>
<arg>2s</arg>
<arg>Verify_Karaf_Is_Not_Running_On_Member</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:36:04.606269" elapsed="0.388723"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:36:04.606118" elapsed="0.388912"/>
</iter>
<iter>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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-08-22T23:36:04.996894" 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-08-22T23:36:04.996596" elapsed="0.000326"/>
</kw>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:04.997820" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:36:04.997531" elapsed="0.000315"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:04.998622" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:04.998729" 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-08-22T23:36:04.998468" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:05.002509" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:05.002063" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:05.002005" elapsed="0.000672"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:05.004368" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:36:05.003727" elapsed="0.001038"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:05.006507" level="INFO">Attempting to execute command "ps axf | grep org.apache.karaf | grep -v grep | wc -l" on remote system "10.30.170.79" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:05.005959" elapsed="0.000681"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:05.008475" level="INFO">${conn_id} = 37</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:05.007763" elapsed="0.000832"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:05.011138" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:05.011217" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:05.010846" 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-08-22T23:36:05.011463" elapsed="0.000394"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:05.012851" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:05.339184" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:58 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:01 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:05.012452" elapsed="0.326988"/>
</kw>
<msg time="2026-08-22T23:36:05.339526" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:05.012085" elapsed="0.327551"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:36:05.009847" elapsed="0.330088"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:05.341528" level="INFO">Executing command 'ps axf | grep org.apache.karaf | grep -v grep | wc -l'.</msg>
<msg time="2026-08-22T23:36:05.363693" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:05.364202" level="INFO">${stdout} = 0</msg>
<msg time="2026-08-22T23:36:05.364627" 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-08-22T23:36:05.341118" elapsed="0.023736"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:05.367164" elapsed="0.000988"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:05.370049" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:05.369235" elapsed="0.000973"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:05.370827" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:05.370451" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:05.370363" elapsed="0.000671"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:05.371558" elapsed="0.000137"/>
</return>
<status status="PASS" start="2026-08-22T23:36:05.371251" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:05.371176" elapsed="0.000682"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:05.371980" elapsed="0.000059"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:05.378519" elapsed="0.000367"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:05.379102" elapsed="0.000169"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:05.379466" 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-08-22T23:36:05.374296" elapsed="0.005402"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:36:05.000656" elapsed="0.379274"/>
</kw>
<msg time="2026-08-22T23:36:05.380255" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:04.999981" elapsed="0.380354"/>
</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-08-22T23:36:04.999410" elapsed="0.381013"/>
</kw>
<msg time="2026-08-22T23:36:05.380464" 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-08-22T23:36:04.998909" elapsed="0.381602"/>
</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-08-22T23:36:05.383537" 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-08-22T23:36:05.384073" elapsed="0.000147"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:05.384450" elapsed="0.000110"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:36:05.380834" elapsed="0.003827"/>
</kw>
<msg time="2026-08-22T23:36:05.384758" 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-08-22T23:36:04.998062" elapsed="0.386722"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:05.385217" level="INFO">0</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:05.384966" elapsed="0.000297"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:36:05.385305" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:05.385455" 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-08-22T23:36:04.997123" elapsed="0.388358"/>
</kw>
<return>
<value>${count}</value>
<status status="PASS" start="2026-08-22T23:36:05.385527" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:36:05.385691" 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-08-22T23:36:04.996222" elapsed="0.389494"/>
</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-08-22T23:36:05.385922" 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-08-22T23:36:04.995827" elapsed="0.390534"/>
</kw>
<arg>${timeout}</arg>
<arg>2s</arg>
<arg>Verify_Karaf_Is_Not_Running_On_Member</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:36:04.995275" elapsed="0.391133"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:36:04.995131" elapsed="0.391314"/>
</iter>
<var>${index}</var>
<value>@{stop_index_list}</value>
<status status="PASS" start="2026-08-22T23:36:01.798266" elapsed="3.588219"/>
</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-08-22T23:36:05.389810" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:05.389408" elapsed="0.000429"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:36:05.390306" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:36:05.390000" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:36:05.390377" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:05.390531" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:36:05.389020" 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-08-22T23:36:05.391643" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:36:05.391356" elapsed="0.000313"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:05.392450" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:05.392552" 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-08-22T23:36:05.392296" elapsed="0.000295"/>
</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-08-22T23:36:05.395205" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:05.394931" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:05.394912" elapsed="0.000373"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:05.397455" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:36:05.395435" elapsed="0.002188"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:05.398269" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.200" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:05.397783" elapsed="0.000534"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:05.398927" 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-08-22T23:36:05.398476" elapsed="0.000478"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:05.400171" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:05.400301" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:05.399628" elapsed="0.000698"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:36:05.400536" elapsed="0.000724"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:05.403462" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:05.732987" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:56 UTC 2026

  System load:  0.08               Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:04 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:05.402889" elapsed="0.330463"/>
</kw>
<msg time="2026-08-22T23:36:05.733488" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:05.401494" elapsed="0.332203"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:36:05.399171" elapsed="0.334706"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:05.734415" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-08-22T23:36:05.746835" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-08-22T23:36:05.747075" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:36:05.747171" 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-08-22T23:36:05.734136" elapsed="0.013086"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:05.747646" elapsed="0.000483"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:05.749325" 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-08-22T23:36:05.748552" 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-08-22T23:36:05.749938" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:05.749643" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:05.749547" 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-08-22T23:36:05.750443" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-08-22T23:36:05.750212" elapsed="0.000362"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:05.750178" elapsed="0.000492"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:05.750745" 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-08-22T23:36:05.769104" elapsed="0.000688"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:05.769964" elapsed="0.000169"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:05.770284" 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-08-22T23:36:05.751442" elapsed="0.018994"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:36:05.394383" elapsed="0.376146"/>
</kw>
<msg time="2026-08-22T23:36:05.770603" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:05.393800" elapsed="0.376857"/>
</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-08-22T23:36:05.393255" elapsed="0.377484"/>
</kw>
<msg time="2026-08-22T23:36:05.770780" 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-08-22T23:36:05.392749" elapsed="0.378076"/>
</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-08-22T23:36:05.773906" 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-08-22T23:36:05.774386" elapsed="0.000147"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:05.774700" 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-08-22T23:36:05.771118" elapsed="0.003734"/>
</kw>
<msg time="2026-08-22T23:36:05.774944" 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-08-22T23:36:05.391887" elapsed="0.383082"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:05.775394" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:05.775147" elapsed="0.000290"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:36:05.775479" 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-08-22T23:36:05.390951" elapsed="0.384668"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:36:05.390770" elapsed="0.384887"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:05.776645" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:36:05.776352" elapsed="0.000357"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:05.777511" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:05.777629" 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-08-22T23:36:05.777372" 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-08-22T23:36:05.780273" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:05.780001" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:05.779983" elapsed="0.000370"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:05.780650" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:36:05.780502" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:05.781417" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.12" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:05.780930" elapsed="0.000534"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:05.782064" level="INFO">${conn_id} = 43</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:05.781647" elapsed="0.000443"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:05.783301" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:05.783432" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:05.782772" elapsed="0.000686"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:36:05.783672" elapsed="0.000687"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:05.786784" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:06.114779" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:57 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:04 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:05.786182" elapsed="0.328859"/>
</kw>
<msg time="2026-08-22T23:36:06.115188" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:05.784652" elapsed="0.330731"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:36:05.782314" elapsed="0.333289"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:06.116202" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-08-22T23:36:06.129053" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-08-22T23:36:06.129242" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:36:06.129305" 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-08-22T23:36:06.115886" elapsed="0.013453"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:06.129633" elapsed="0.000380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:06.130835" 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-08-22T23:36:06.130327" elapsed="0.000574"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:06.131252" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:06.131031" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:06.130989" 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-08-22T23:36:06.131714" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-08-22T23:36:06.131442" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:06.131420" elapsed="0.000423"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:06.131891" 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-08-22T23:36:06.150561" elapsed="0.000644"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:06.151380" elapsed="0.000179"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:06.151729" 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-08-22T23:36:06.132379" elapsed="0.019507"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:36:05.779451" elapsed="0.372671"/>
</kw>
<msg time="2026-08-22T23:36:06.152187" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:05.778870" elapsed="0.373379"/>
</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-08-22T23:36:05.778321" elapsed="0.374018"/>
</kw>
<msg time="2026-08-22T23:36:06.152383" 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-08-22T23:36:05.777814" elapsed="0.374617"/>
</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-08-22T23:36:06.155670" 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-08-22T23:36:06.156153" elapsed="0.000145"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:06.156445" 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-08-22T23:36:06.152841" elapsed="0.003770"/>
</kw>
<msg time="2026-08-22T23:36:06.156709" 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-08-22T23:36:05.776932" elapsed="0.379803"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:06.157166" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:06.156917" elapsed="0.000300"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:36:06.157266" 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-08-22T23:36:05.775943" elapsed="0.381452"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:36:05.775756" elapsed="0.381678"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:06.158464" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:36:06.158188" elapsed="0.000302"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:06.159290" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:06.159393" 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-08-22T23:36:06.159146" 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-08-22T23:36:06.162414" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:06.162127" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:06.162104" elapsed="0.000394"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:06.162808" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:36:06.162668" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:06.163777" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.79" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:06.163162" elapsed="0.000678"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:06.164599" level="INFO">${conn_id} = 46</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:06.164063" elapsed="0.000566"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:06.166158" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:06.166324" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:06.165399" elapsed="0.000959"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:36:06.166648" elapsed="0.000740"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:06.169627" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:06.492314" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:58 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:05 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:06.169021" elapsed="0.323616"/>
</kw>
<msg time="2026-08-22T23:36:06.492788" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:06.167650" elapsed="0.325338"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:36:06.164860" elapsed="0.328333"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:06.493857" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-08-22T23:36:06.506215" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-08-22T23:36:06.506496" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:36:06.506632" 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-08-22T23:36:06.493498" elapsed="0.013192"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:06.507066" elapsed="0.000471"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:06.508761" 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-08-22T23:36:06.508021" elapsed="0.000844"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:06.509362" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:06.509049" elapsed="0.000427"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:06.508992" 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-08-22T23:36:06.509926" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-08-22T23:36:06.509687" elapsed="0.000371"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:06.509649" elapsed="0.000462"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:06.510186" 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-08-22T23:36:06.527713" elapsed="0.000549"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:06.528433" elapsed="0.000321"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:06.528908" 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-08-22T23:36:06.511002" elapsed="0.018058"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:36:06.161523" elapsed="0.367630"/>
</kw>
<msg time="2026-08-22T23:36:06.529209" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:06.160912" elapsed="0.368352"/>
</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-08-22T23:36:06.160101" elapsed="0.369381"/>
</kw>
<msg time="2026-08-22T23:36:06.529526" 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-08-22T23:36:06.159591" elapsed="0.370001"/>
</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-08-22T23:36:06.532722" 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-08-22T23:36:06.533214" elapsed="0.000144"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:06.533507" elapsed="0.000114"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:36:06.529897" elapsed="0.003778"/>
</kw>
<msg time="2026-08-22T23:36:06.533768" 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-08-22T23:36:06.158729" elapsed="0.375065"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:06.534230" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:06.533982" elapsed="0.000289"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:36:06.534314" 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-08-22T23:36:06.157757" elapsed="0.376736"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:36:06.157546" elapsed="0.377010"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:36:05.390629" elapsed="1.143990"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-08-22T23:36:05.386726" elapsed="1.147968"/>
</kw>
<return>
<value>${updated_index_list}</value>
<status status="PASS" start="2026-08-22T23:36:06.534738" elapsed="0.000028"/>
</return>
<doc>If the list is empty, stops all ODL instances. Otherwise stop members based on ${stop_index_list}
If ${confirm} is True, verify stopped instances are not there anymore.
The KW will return a list of available members: ${updated index_list}=${original_index_list}-${member_index_list}</doc>
<status status="PASS" start="2026-08-22T23:35:59.507171" elapsed="7.027704"/>
</kw>
<doc>Stop every odl node.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-08-22T23:35:59.506332" elapsed="7.028670"/>
</test>
<test id="s1-s5-t2" name="Unset_Tell_Based_Protocol_Usage" line="34">
<kw name="Change_Use_Tell_Based_Protocol" owner="DdbCommons">
<kw name="Check_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:06.539531" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:06.539142" elapsed="0.000416"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:36:06.540047" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:36:06.539741" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:36:06.540117" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:06.540271" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:36:06.538754" elapsed="0.001543"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:06.542677" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:06.542783" 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-08-22T23:36:06.542503" elapsed="0.000306"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:06.544624" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:06.544286" elapsed="0.000365"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:36:06.544700" elapsed="0.000228"/>
</return>
<msg time="2026-08-22T23:36:06.545060" level="INFO">${member_ip} = 10.30.170.200</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:36:06.543965" elapsed="0.001120"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:06.548806" level="INFO">${odl_connection} = 49</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:06.548063" elapsed="0.000845"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:06.551899" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:06.551980" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:06.551428" elapsed="0.000577"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:36:06.552166" elapsed="0.000323"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:06.553367" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:06.886568" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:56 UTC 2026

  System load:  0.08               Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:05 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:06.553046" elapsed="0.333644"/>
</kw>
<msg time="2026-08-22T23:36:06.886759" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:06.552685" elapsed="0.334155"/>
</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-08-22T23:36:06.550930" elapsed="0.336008"/>
</kw>
<msg time="2026-08-22T23:36:06.886990" 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-08-22T23:36:06.550500" elapsed="0.336540"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:36:06.549473" elapsed="0.337761"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:36:06.887330" elapsed="0.000056"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.200 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:36:06.546880" elapsed="0.340790"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:06.891160" level="INFO">Executing command 'sed -ie "s/^#use-tell-based-protocol=true/use-tell-based-protocol=true/g" //tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/org.opendaylight.controller.cluster.datastore.cfg'.</msg>
<msg time="2026-08-22T23:36:06.903801" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:06.904058" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:36:06.904160" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:36:06.904254" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:06.890929" elapsed="0.013378"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:36:06.906330" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:36:06.905711" elapsed="0.000722"/>
</kw>
<msg time="2026-08-22T23:36:06.906697" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:36:06.906800" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:06.904886" elapsed="0.001967"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:06.908173" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:06.907424" elapsed="0.000787"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:06.909992" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:06.909635" elapsed="0.000417"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:06.910634" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:06.910268" elapsed="0.000426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:06.911266" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:06.910907" elapsed="0.000420"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:36:06.908922" elapsed="0.002482"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:06.908408" elapsed="0.003045"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:06.908373" elapsed="0.003116"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:36:06.911820" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:06.911675" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:06.911647" elapsed="0.000268"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:06.912192" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:36:06.912062" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:06.912037" elapsed="0.000272"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:06.912621" elapsed="0.000034"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:36:06.889684" elapsed="0.023422"/>
</kw>
<msg time="2026-08-22T23:36:06.913322" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:06.913425" level="INFO">${result} = </msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:06.887937" elapsed="0.025543"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:06.913884" elapsed="0.000315"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:36:06.914663" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:36:06.914371" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:06.914344" elapsed="0.000551"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:06.915101" elapsed="0.000067"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:36:06.545809" elapsed="0.369594"/>
</kw>
<msg time="2026-08-22T23:36:06.915485" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:06.545245" elapsed="0.370311"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:36:06.543427" elapsed="0.372262"/>
</kw>
<msg time="2026-08-22T23:36:06.915732" 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-08-22T23:36:06.542965" elapsed="0.372812"/>
</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-08-22T23:36:06.918896" elapsed="0.000329"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:06.919392" elapsed="0.000161"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:06.919736" 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-08-22T23:36:06.916077" elapsed="0.003811"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:36:06.541845" elapsed="0.378102"/>
</kw>
<msg time="2026-08-22T23:36:06.920004" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:06.541376" elapsed="0.378678"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:36:06.540679" elapsed="0.379462"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:36:06.540504" elapsed="0.379683"/>
</iter>
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:06.922394" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:06.922495" 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-08-22T23:36:06.922257" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:06.924356" level="INFO">${ip_address} = 10.30.170.12</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:06.924042" elapsed="0.000341"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:36:06.924432" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:36:06.924652" level="INFO">${member_ip} = 10.30.170.12</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:36:06.923717" elapsed="0.000961"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:06.928562" level="INFO">${odl_connection} = 51</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:06.927838" elapsed="0.000863"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:06.931537" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:06.931786" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:06.931243" elapsed="0.000570"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:06.931977" elapsed="0.000321"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:06.933203" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:07.254737" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:57 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:06 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:06.932886" elapsed="0.321988"/>
</kw>
<msg time="2026-08-22T23:36:07.254951" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:06.932470" elapsed="0.322587"/>
</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-08-22T23:36:06.930658" elapsed="0.324509"/>
</kw>
<msg time="2026-08-22T23:36:07.255219" 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-08-22T23:36:06.930234" elapsed="0.325038"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:36:06.929274" elapsed="0.326182"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:36:07.255564" elapsed="0.000090"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.12 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:36:06.926611" elapsed="0.329347"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:07.259639" level="INFO">Executing command 'sed -ie "s/^#use-tell-based-protocol=true/use-tell-based-protocol=true/g" //tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/org.opendaylight.controller.cluster.datastore.cfg'.</msg>
<msg time="2026-08-22T23:36:07.272465" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:07.272658" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:36:07.272722" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:36:07.272780" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:07.259150" elapsed="0.013662"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:36:07.274062" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:36:07.273666" elapsed="0.000461"/>
</kw>
<msg time="2026-08-22T23:36:07.274260" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:36:07.274322" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:07.273146" elapsed="0.001208"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:07.275319" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:07.274698" elapsed="0.000658"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:07.277090" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:07.276736" elapsed="0.000412"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:07.277725" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:07.277361" elapsed="0.000421"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:07.278325" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:07.277992" elapsed="0.000393"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:36:07.276137" elapsed="0.002325"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:07.275560" elapsed="0.003067"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:07.275523" elapsed="0.003150"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:36:07.278984" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:07.278837" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:07.278809" elapsed="0.000267"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:07.279357" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:36:07.279227" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:07.279201" elapsed="0.000272"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:07.279808" elapsed="0.000037"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:36:07.258149" elapsed="0.022032"/>
</kw>
<msg time="2026-08-22T23:36:07.280397" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:07.280499" level="INFO">${result} = </msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:07.256266" elapsed="0.024288"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:07.280953" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:36:07.281743" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:36:07.281446" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:07.281418" elapsed="0.000556"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:07.282183" elapsed="0.000031"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:36:06.925638" elapsed="0.356808"/>
</kw>
<msg time="2026-08-22T23:36:07.282526" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:06.924840" elapsed="0.357792"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:36:06.923178" elapsed="0.359582"/>
</kw>
<msg time="2026-08-22T23:36:07.282818" 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-08-22T23:36:06.922692" elapsed="0.360192"/>
</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-08-22T23:36:07.286706" 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-08-22T23:36:07.287184" elapsed="0.000169"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:07.287501" elapsed="0.000113"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:36:07.283308" elapsed="0.004358"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:36:06.921634" elapsed="0.366092"/>
</kw>
<msg time="2026-08-22T23:36:07.287795" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:06.921169" elapsed="0.366678"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:36:06.920447" elapsed="0.367490"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:36:06.920287" elapsed="0.367699"/>
</iter>
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:07.290337" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:07.290439" 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-08-22T23:36:07.290192" elapsed="0.000308"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:07.292358" level="INFO">${ip_address} = 10.30.170.79</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:07.292036" elapsed="0.000349"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:36:07.292433" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:36:07.292607" level="INFO">${member_ip} = 10.30.170.79</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:36:07.291678" elapsed="0.000957"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:07.296521" level="INFO">${odl_connection} = 53</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:07.295754" elapsed="0.000898"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:07.299386" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:07.299464" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:07.299120" elapsed="0.000368"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:07.299803" elapsed="0.000356"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:07.301020" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:07.610925" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:58 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:06 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:07.300703" elapsed="0.310390"/>
</kw>
<msg time="2026-08-22T23:36:07.611180" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:07.300329" elapsed="0.310946"/>
</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-08-22T23:36:07.298627" elapsed="0.312770"/>
</kw>
<msg time="2026-08-22T23:36:07.611449" 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-08-22T23:36:07.298210" elapsed="0.313291"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:36:07.297249" elapsed="0.314478"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:36:07.611835" elapsed="0.000066"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.79 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:36:07.294491" elapsed="0.317681"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:07.615560" level="INFO">Executing command 'sed -ie "s/^#use-tell-based-protocol=true/use-tell-based-protocol=true/g" //tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/org.opendaylight.controller.cluster.datastore.cfg'.</msg>
<msg time="2026-08-22T23:36:07.628821" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:07.629001" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:36:07.629066" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:36:07.629126" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:07.615355" elapsed="0.013805"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:36:07.630486" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:36:07.630074" elapsed="0.000481"/>
</kw>
<msg time="2026-08-22T23:36:07.630732" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:36:07.630800" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:07.629525" elapsed="0.001309"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:07.631862" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:07.631165" elapsed="0.000736"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:07.633769" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:07.633283" elapsed="0.000547"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:07.634385" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:07.634047" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:07.635024" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:07.634691" elapsed="0.000392"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:36:07.632710" elapsed="0.002448"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:07.632111" elapsed="0.003097"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:07.632073" elapsed="0.003173"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:36:07.635554" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:07.635408" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:07.635380" elapsed="0.000298"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:07.635959" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:36:07.635828" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:07.635802" elapsed="0.000274"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:07.636353" elapsed="0.000048"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:36:07.614370" elapsed="0.022388"/>
</kw>
<msg time="2026-08-22T23:36:07.636968" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:07.637067" level="INFO">${result} = </msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:07.612504" elapsed="0.024615"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:07.637484" elapsed="0.000345"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:36:07.638266" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:36:07.638002" elapsed="0.000451"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:07.637973" elapsed="0.000520"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:07.638741" elapsed="0.000032"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:36:07.293535" elapsed="0.345467"/>
</kw>
<msg time="2026-08-22T23:36:07.639086" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:07.292794" elapsed="0.346364"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:36:07.291143" elapsed="0.348138"/>
</kw>
<msg time="2026-08-22T23:36:07.639340" 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-08-22T23:36:07.290676" elapsed="0.348731"/>
</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-08-22T23:36:07.642981" elapsed="0.000312"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:07.643461" elapsed="0.000187"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:07.643800" 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-08-22T23:36:07.639857" elapsed="0.004090"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:36:07.289555" elapsed="0.354451"/>
</kw>
<msg time="2026-08-22T23:36:07.644061" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:07.289109" elapsed="0.355002"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:36:07.288259" elapsed="0.355939"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:36:07.288098" elapsed="0.356183"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:36:06.540358" elapsed="1.103963"/>
</for>
<arg>sed -ie "s/^#use-tell-based-protocol=true/use-tell-based-protocol=true/g" ${DATASTORE_CFG}</arg>
<doc>Cycle through indices (or all), run bash command on each, using temporary SSH session and restoring the previously active one.</doc>
<status status="PASS" start="2026-08-22T23:36:06.536273" elapsed="1.108113"/>
</kw>
<kw name="Check_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:07.647861" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:07.647460" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:36:07.648359" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:36:07.648052" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:36:07.648458" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:36:07.648635" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:36:07.647083" elapsed="0.001578"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:07.650939" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:07.651043" 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-08-22T23:36:07.650794" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:07.653192" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:07.652872" elapsed="0.000348"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:36:07.653269" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:36:07.653423" level="INFO">${member_ip} = 10.30.170.200</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:36:07.652286" elapsed="0.001163"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:07.657250" level="INFO">${odl_connection} = 55</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:07.656311" elapsed="0.001042"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:07.660054" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:07.660132" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:07.659790" elapsed="0.000366"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:07.660314" elapsed="0.000527"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:07.661704" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:07.995494" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:56 UTC 2026

  System load:  0.08               Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:06 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:07.661371" elapsed="0.334288"/>
</kw>
<msg time="2026-08-22T23:36:07.995746" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:07.661013" elapsed="0.334826"/>
</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-08-22T23:36:07.659274" elapsed="0.336685"/>
</kw>
<msg time="2026-08-22T23:36:07.996013" 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-08-22T23:36:07.658881" elapsed="0.337183"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:36:07.657942" elapsed="0.338402"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:36:07.996452" elapsed="0.000064"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.200 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:36:07.655110" elapsed="0.341707"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:08.002538" level="INFO">Executing command 'sed -ie "s/^#use-tell-based-protocol=false/use-tell-based-protocol=false/g" //tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/org.opendaylight.controller.cluster.datastore.cfg'.</msg>
<msg time="2026-08-22T23:36:08.015389" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:08.015680" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:36:08.015783" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:36:08.015876" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:08.002330" elapsed="0.013597"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:36:08.018024" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:36:08.017354" elapsed="0.000774"/>
</kw>
<msg time="2026-08-22T23:36:08.018349" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:36:08.018451" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:08.016463" elapsed="0.002041"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:08.020094" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:08.019061" elapsed="0.001094"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:08.022393" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:08.022040" elapsed="0.000493"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:08.023132" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:08.022789" elapsed="0.000402"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:08.023774" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:08.023408" elapsed="0.000428"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:36:08.021329" elapsed="0.002587"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:08.020468" elapsed="0.003500"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:08.020416" elapsed="0.003588"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:36:08.024312" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:08.024167" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:08.024140" elapsed="0.000267"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:08.024749" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:36:08.024558" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:08.024533" elapsed="0.000335"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:08.025174" elapsed="0.000033"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:36:08.001300" elapsed="0.024248"/>
</kw>
<msg time="2026-08-22T23:36:08.025788" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:08.025891" level="INFO">${result} = </msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:07.997161" elapsed="0.028785"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:08.026324" elapsed="0.000353"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:36:08.027119" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:36:08.026853" elapsed="0.000458"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:08.026825" elapsed="0.000526"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:08.027558" elapsed="0.000062"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:36:07.654162" elapsed="0.373692"/>
</kw>
<msg time="2026-08-22T23:36:08.027935" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:07.653627" elapsed="0.374378"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:36:07.651767" elapsed="0.376359"/>
</kw>
<msg time="2026-08-22T23:36:08.028184" 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-08-22T23:36:07.651277" elapsed="0.377030"/>
</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-08-22T23:36:08.031884" 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-08-22T23:36:08.032375" elapsed="0.000167"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:08.032719" 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-08-22T23:36:08.028791" elapsed="0.004087"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:36:07.650163" elapsed="0.382777"/>
</kw>
<msg time="2026-08-22T23:36:08.032997" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:07.649721" elapsed="0.383327"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:36:07.649015" elapsed="0.384149"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:36:07.648859" elapsed="0.384354"/>
</iter>
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:08.035447" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:08.035551" 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-08-22T23:36:08.035303" elapsed="0.000290"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:08.037750" level="INFO">${ip_address} = 10.30.170.12</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:08.037394" elapsed="0.000384"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:36:08.037828" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:36:08.037986" level="INFO">${member_ip} = 10.30.170.12</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:36:08.036771" elapsed="0.001240"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:08.041682" level="INFO">${odl_connection} = 57</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:08.040921" elapsed="0.000869"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:08.044520" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:08.044620" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:08.044252" elapsed="0.000394"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:08.044807" elapsed="0.000364"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:08.046186" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:08.375217" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:57 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:07 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:08.045867" elapsed="0.329508"/>
</kw>
<msg time="2026-08-22T23:36:08.375459" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:08.045344" elapsed="0.330317"/>
</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-08-22T23:36:08.043756" elapsed="0.332027"/>
</kw>
<msg time="2026-08-22T23:36:08.375837" 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-08-22T23:36:08.043333" elapsed="0.332556"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:36:08.042377" elapsed="0.333693"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:36:08.376177" elapsed="0.000067"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.12 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:36:08.039690" elapsed="0.336830"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:08.380304" level="INFO">Executing command 'sed -ie "s/^#use-tell-based-protocol=false/use-tell-based-protocol=false/g" //tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/org.opendaylight.controller.cluster.datastore.cfg'.</msg>
<msg time="2026-08-22T23:36:08.393177" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:08.393347" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:36:08.393407" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:36:08.393466" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:08.380097" elapsed="0.013401"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:36:08.394929" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:36:08.394393" elapsed="0.000642"/>
</kw>
<msg time="2026-08-22T23:36:08.395249" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:36:08.395347" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:08.393906" elapsed="0.001491"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:08.396975" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:08.395957" elapsed="0.001077"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:08.399796" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:08.399185" elapsed="0.000705"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:08.400829" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:08.400240" elapsed="0.000682"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:08.401877" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:08.401263" elapsed="0.000712"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:36:08.398222" elapsed="0.003875"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:08.397350" elapsed="0.004826"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:08.397294" elapsed="0.004941"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:36:08.402733" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:08.402493" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:08.402448" elapsed="0.000360"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:08.403008" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:36:08.402915" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:08.402897" elapsed="0.000196"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:08.403295" elapsed="0.000024"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:36:08.379090" elapsed="0.024458"/>
</kw>
<msg time="2026-08-22T23:36:08.403748" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:08.403822" level="INFO">${result} = </msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:08.376867" elapsed="0.026992"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:08.404125" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:36:08.404865" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-08-22T23:36:08.404678" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:08.404656" elapsed="0.000377"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:08.405182" elapsed="0.000022"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:36:08.038728" elapsed="0.366641"/>
</kw>
<msg time="2026-08-22T23:36:08.405429" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:08.038172" elapsed="0.367345"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:36:08.036224" elapsed="0.369413"/>
</kw>
<msg time="2026-08-22T23:36:08.405703" 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-08-22T23:36:08.035754" elapsed="0.369998"/>
</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-08-22T23:36:08.409048" elapsed="0.000309"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:08.409523" elapsed="0.000213"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:08.409887" 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-08-22T23:36:08.406060" elapsed="0.003977"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:36:08.034674" elapsed="0.375422"/>
</kw>
<msg time="2026-08-22T23:36:08.410151" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:08.034203" elapsed="0.375999"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:36:08.033476" elapsed="0.376815"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:36:08.033314" elapsed="0.377025"/>
</iter>
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:08.412606" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:08.412710" 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-08-22T23:36:08.412447" elapsed="0.000289"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:08.414561" level="INFO">${ip_address} = 10.30.170.79</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:08.414245" elapsed="0.000365"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:36:08.414660" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:36:08.414812" level="INFO">${member_ip} = 10.30.170.79</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:36:08.413921" elapsed="0.000915"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:08.418729" level="INFO">${odl_connection} = 59</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:08.417980" elapsed="0.000851"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:08.421502" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:08.421760" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:08.421236" elapsed="0.000553"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:36:08.421951" elapsed="0.000324"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:08.423145" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:08.745897" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:58 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:07 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:08.422825" elapsed="0.323327"/>
</kw>
<msg time="2026-08-22T23:36:08.746269" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:08.422444" elapsed="0.323925"/>
</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-08-22T23:36:08.420744" elapsed="0.325747"/>
</kw>
<msg time="2026-08-22T23:36:08.746547" 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-08-22T23:36:08.420328" elapsed="0.326288"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:36:08.419399" elapsed="0.327421"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:36:08.746927" elapsed="0.000065"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.79 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:36:08.416756" elapsed="0.330510"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:08.751274" level="INFO">Executing command 'sed -ie "s/^#use-tell-based-protocol=false/use-tell-based-protocol=false/g" //tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/org.opendaylight.controller.cluster.datastore.cfg'.</msg>
<msg time="2026-08-22T23:36:08.763641" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:08.763904" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:36:08.764003" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:36:08.764094" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:08.750782" elapsed="0.013362"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:36:08.766227" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:36:08.765530" elapsed="0.000897"/>
</kw>
<msg time="2026-08-22T23:36:08.766688" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:36:08.766792" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:08.764728" elapsed="0.002115"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:08.768392" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:08.767356" elapsed="0.001096"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:08.770929" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:08.770663" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:08.771372" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:08.771127" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:08.771826" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:08.771567" elapsed="0.000302"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:36:08.769643" elapsed="0.002282"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:08.768802" elapsed="0.003158"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:08.768747" elapsed="0.003241"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:36:08.772212" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:08.772106" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:08.772086" elapsed="0.000193"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:08.772482" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:36:08.772387" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:08.772368" elapsed="0.000198"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:08.772785" elapsed="0.000024"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:36:08.749706" elapsed="0.023342"/>
</kw>
<msg time="2026-08-22T23:36:08.773201" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:08.773275" level="INFO">${result} = </msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:08.747573" elapsed="0.025740"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:08.773609" elapsed="0.000244"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:36:08.774171" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:36:08.773980" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:08.773961" elapsed="0.000384"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:08.774495" elapsed="0.000022"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:36:08.415805" elapsed="0.358904"/>
</kw>
<msg time="2026-08-22T23:36:08.774809" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:08.414994" elapsed="0.359868"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:36:08.413347" elapsed="0.361608"/>
</kw>
<msg time="2026-08-22T23:36:08.774998" 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-08-22T23:36:08.412890" elapsed="0.362156"/>
</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-08-22T23:36:08.778237" elapsed="0.000400"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:08.778811" elapsed="0.000175"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:08.779139" 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-08-22T23:36:08.775351" elapsed="0.003940"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:36:08.411822" elapsed="0.367529"/>
</kw>
<msg time="2026-08-22T23:36:08.779408" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:08.411358" elapsed="0.368102"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:36:08.410654" elapsed="0.368898"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:36:08.410452" elapsed="0.369164"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:36:07.648719" elapsed="1.130939"/>
</for>
<arg>sed -ie "s/^#use-tell-based-protocol=false/use-tell-based-protocol=false/g" ${DATASTORE_CFG}</arg>
<doc>Cycle through indices (or all), run bash command on each, using temporary SSH session and restoring the previously active one.</doc>
<status status="PASS" start="2026-08-22T23:36:07.644667" elapsed="1.135058"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"${status}" == "True"</arg>
<arg>ClusterManagement.Check_Bash_Command_On_List_Or_All</arg>
<arg>sed -ie "s/^use-tell-based-protocol=false/use-tell-based-protocol=true/g" ${DATASTORE_CFG}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:08.779886" elapsed="0.000315"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Check_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:08.784263" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:08.783877" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:36:08.784781" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:36:08.784455" elapsed="0.000352"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:36:08.784852" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:08.785007" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:36:08.783471" elapsed="0.001560"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:08.787395" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:08.787499" 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-08-22T23:36:08.787249" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:08.789865" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:08.789356" elapsed="0.000606"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:36:08.790219" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:36:08.790413" level="INFO">${member_ip} = 10.30.170.200</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:36:08.788942" elapsed="0.001497"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:08.794379" level="INFO">${odl_connection} = 61</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:08.793958" elapsed="0.000449"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:08.796200" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:08.796278" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:08.795932" elapsed="0.000370"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:08.796462" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:08.797690" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:09.119013" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:56 UTC 2026

  System load:  0.08               Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:07 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:08.797337" elapsed="0.321879"/>
</kw>
<msg time="2026-08-22T23:36:09.119324" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:08.796977" elapsed="0.322464"/>
</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-08-22T23:36:08.795425" elapsed="0.324179"/>
</kw>
<msg time="2026-08-22T23:36:09.119665" 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-08-22T23:36:08.795032" elapsed="0.324689"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:36:08.794647" elapsed="0.325161"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:36:09.119940" elapsed="0.000068"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.200 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:36:08.793198" elapsed="0.327099"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:09.123475" level="INFO">Executing command 'sed -ie "s/^use-tell-based-protocol=true/use-tell-based-protocol=false/g" //tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/org.opendaylight.controller.cluster.datastore.cfg'.</msg>
<msg time="2026-08-22T23:36:09.135709" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:09.136080" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:36:09.136213" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:36:09.136313" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:09.123263" elapsed="0.013105"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:36:09.138549" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:36:09.137805" elapsed="0.000897"/>
</kw>
<msg time="2026-08-22T23:36:09.138997" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:36:09.139136" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:09.136880" elapsed="0.002333"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:09.140341" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:09.139668" elapsed="0.000714"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:09.142356" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:09.141883" elapsed="0.000536"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:09.143043" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:09.142667" elapsed="0.000458"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:09.143883" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:09.143358" elapsed="0.000596"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:36:09.141118" elapsed="0.002915"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:09.140510" elapsed="0.003573"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:09.140476" elapsed="0.003647"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:36:09.144412" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:09.144224" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:09.144189" elapsed="0.000348"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:09.144825" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-08-22T23:36:09.144655" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:09.144626" elapsed="0.000353"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:09.145257" elapsed="0.000044"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:36:09.122625" elapsed="0.022861"/>
</kw>
<msg time="2026-08-22T23:36:09.145959" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:09.146109" level="INFO">${result} = </msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:09.121529" elapsed="0.024658"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:09.147938" elapsed="0.000498"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:36:09.148879" elapsed="0.000084"/>
</return>
<status status="PASS" start="2026-08-22T23:36:09.148623" elapsed="0.000398"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:09.148521" elapsed="0.000548"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:09.150331" elapsed="0.000053"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:36:08.791159" elapsed="0.359621"/>
</kw>
<msg time="2026-08-22T23:36:09.151296" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:08.790615" elapsed="0.360747"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:36:08.788391" elapsed="0.363072"/>
</kw>
<msg time="2026-08-22T23:36:09.151509" 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-08-22T23:36:08.787696" elapsed="0.363864"/>
</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-08-22T23:36:09.156104" elapsed="0.000410"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:09.156754" elapsed="0.000225"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:09.157205" elapsed="0.000131"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:36:09.151931" elapsed="0.005475"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:36:08.786602" elapsed="0.370881"/>
</kw>
<msg time="2026-08-22T23:36:09.157554" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:08.786100" elapsed="0.371528"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:36:08.785388" elapsed="0.372336"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:36:08.785231" elapsed="0.372544"/>
</iter>
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:09.160139" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:09.160301" 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-08-22T23:36:09.159987" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:09.163011" level="INFO">${ip_address} = 10.30.170.12</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:09.162407" elapsed="0.000673"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:36:09.163325" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:36:09.163489" level="INFO">${member_ip} = 10.30.170.12</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:36:09.161975" elapsed="0.001541"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:09.167707" level="INFO">${odl_connection} = 63</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:09.167243" elapsed="0.000492"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:09.169693" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:09.169775" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:09.169393" elapsed="0.000406"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:09.169958" elapsed="0.000387"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:09.171442" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:09.495052" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:57 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:08 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:09.171103" elapsed="0.324090"/>
</kw>
<msg time="2026-08-22T23:36:09.495275" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:09.170563" elapsed="0.324808"/>
</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-08-22T23:36:09.168875" elapsed="0.326633"/>
</kw>
<msg time="2026-08-22T23:36:09.495562" 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-08-22T23:36:09.168351" elapsed="0.327275"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:36:09.167943" elapsed="0.327772"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:36:09.495803" elapsed="0.000058"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.12 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:36:09.166447" elapsed="0.329672"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:09.499242" level="INFO">Executing command 'sed -ie "s/^use-tell-based-protocol=true/use-tell-based-protocol=false/g" //tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/org.opendaylight.controller.cluster.datastore.cfg'.</msg>
<msg time="2026-08-22T23:36:09.512220" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:09.512511" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:36:09.512650" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:36:09.512747" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:09.499034" elapsed="0.013764"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:36:09.514729" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:36:09.514046" elapsed="0.000788"/>
</kw>
<msg time="2026-08-22T23:36:09.515049" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:36:09.515146" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:09.513224" elapsed="0.001979"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:09.516795" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:09.515693" elapsed="0.001142"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:09.518697" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:09.518269" elapsed="0.000493"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:09.519357" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:09.518996" elapsed="0.000420"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:09.520079" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:09.519710" elapsed="0.000434"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:36:09.517642" elapsed="0.002584"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:09.517057" elapsed="0.003222"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:09.517020" elapsed="0.003300"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:36:09.520558" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:09.520406" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:09.520381" elapsed="0.000308"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:09.520929" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:36:09.520788" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:09.520758" elapsed="0.000293"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:09.521273" elapsed="0.000033"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:36:09.498426" elapsed="0.023039"/>
</kw>
<msg time="2026-08-22T23:36:09.521904" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:09.522035" level="INFO">${result} = </msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:09.497418" elapsed="0.024680"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:09.523847" elapsed="0.000624"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:36:09.524898" elapsed="0.000079"/>
</return>
<status status="PASS" start="2026-08-22T23:36:09.524697" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:09.524614" elapsed="0.000460"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:09.526209" elapsed="0.000050"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:36:09.164282" elapsed="0.362163"/>
</kw>
<msg time="2026-08-22T23:36:09.526897" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:09.163693" elapsed="0.363261"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:36:09.161016" elapsed="0.366030"/>
</kw>
<msg time="2026-08-22T23:36:09.527091" 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-08-22T23:36:09.160491" elapsed="0.366648"/>
</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-08-22T23:36:09.530785" 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-08-22T23:36:09.531301" elapsed="0.000196"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:09.531766" 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-08-22T23:36:09.527472" elapsed="0.004480"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:36:09.159312" elapsed="0.372722"/>
</kw>
<msg time="2026-08-22T23:36:09.532108" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:09.158831" elapsed="0.373332"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:36:09.158065" elapsed="0.374233"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:36:09.157895" elapsed="0.374454"/>
</iter>
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:09.534708" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:09.534812" 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-08-22T23:36:09.534541" elapsed="0.000298"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:09.537201" level="INFO">${ip_address} = 10.30.170.79</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:09.536714" elapsed="0.000551"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:36:09.537600" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:36:09.537773" level="INFO">${member_ip} = 10.30.170.79</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:36:09.536273" elapsed="0.001526"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:09.541814" level="INFO">${odl_connection} = 65</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:09.541392" elapsed="0.000458"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:09.543825" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:09.543905" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:09.543422" elapsed="0.000507"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:36:09.544089" elapsed="0.000320"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:09.545287" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:09.873253" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:58 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:08 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:09.544964" elapsed="0.328452"/>
</kw>
<msg time="2026-08-22T23:36:09.873506" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:09.544596" elapsed="0.329015"/>
</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-08-22T23:36:09.542929" elapsed="0.330803"/>
</kw>
<msg time="2026-08-22T23:36:09.873784" 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-08-22T23:36:09.542447" elapsed="0.331388"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:36:09.542064" elapsed="0.331848"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:36:09.874020" elapsed="0.000049"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.79 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:36:09.540684" elapsed="0.333641"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:09.877225" level="INFO">Executing command 'sed -ie "s/^use-tell-based-protocol=true/use-tell-based-protocol=false/g" //tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/org.opendaylight.controller.cluster.datastore.cfg'.</msg>
<msg time="2026-08-22T23:36:09.889699" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:09.889953" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:36:09.890051" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:36:09.890146" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:09.877028" elapsed="0.013170"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:36:09.892202" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:36:09.891533" elapsed="0.000774"/>
</kw>
<msg time="2026-08-22T23:36:09.892527" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:36:09.892660" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:09.890639" elapsed="0.002078"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:09.894094" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:09.893099" elapsed="0.001054"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:09.896686" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:09.896063" elapsed="0.000686"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:09.897298" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:09.896966" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:09.897930" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:09.897568" elapsed="0.000424"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:36:09.895129" elapsed="0.002941"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:09.894337" elapsed="0.003783"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:09.894291" elapsed="0.003865"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:36:09.898376" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:09.898236" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:09.898212" elapsed="0.000258"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:09.898695" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:36:09.898545" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:09.898523" elapsed="0.000291"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:09.899029" elapsed="0.000032"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:36:09.876459" elapsed="0.022738"/>
</kw>
<msg time="2026-08-22T23:36:09.899554" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:09.899705" level="INFO">${result} = </msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:09.875520" elapsed="0.024248"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:09.901279" elapsed="0.000626"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:36:09.902372" elapsed="0.000086"/>
</return>
<status status="PASS" start="2026-08-22T23:36:09.902105" elapsed="0.000423"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:09.902016" elapsed="0.000608"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:09.904134" elapsed="0.000058"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:36:09.538542" elapsed="0.365897"/>
</kw>
<msg time="2026-08-22T23:36:09.905138" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:09.537959" elapsed="0.367235"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:36:09.535466" elapsed="0.369820"/>
</kw>
<msg time="2026-08-22T23:36:09.905328" 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-08-22T23:36:09.534996" elapsed="0.370379"/>
</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-08-22T23:36:09.908624" 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-08-22T23:36:09.909110" elapsed="0.000165"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:09.909426" 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-08-22T23:36:09.905695" elapsed="0.003899"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:36:09.533912" elapsed="0.375744"/>
</kw>
<msg time="2026-08-22T23:36:09.909759" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:09.533440" elapsed="0.376372"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:36:09.532658" elapsed="0.377242"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:36:09.532468" elapsed="0.377480"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:36:08.785089" elapsed="1.124897"/>
</for>
<arg>sed -ie "s/^use-tell-based-protocol=true/use-tell-based-protocol=false/g" ${DATASTORE_CFG}</arg>
<doc>Cycle through indices (or all), run bash command on each, using temporary SSH session and restoring the previously active one.</doc>
<status status="PASS" start="2026-08-22T23:36:08.780989" elapsed="1.129059"/>
</kw>
<msg time="2026-08-22T23:36:09.910087" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>"${status}" == "False"</arg>
<arg>ClusterManagement.Check_Bash_Command_On_List_Or_All</arg>
<arg>sed -ie "s/^use-tell-based-protocol=true/use-tell-based-protocol=false/g" ${DATASTORE_CFG}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:08.780456" elapsed="1.129679"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>Failure in status. Status can be True or False.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:09.910299" elapsed="0.000022"/>
</kw>
<arg>False</arg>
<arg>${DATASTORE_CFG}</arg>
<doc>Change status use-tell-based-protocol to True or False</doc>
<status status="PASS" start="2026-08-22T23:36:06.535843" elapsed="3.374548"/>
</kw>
<kw name="Check_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:09.914082" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:09.913696" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:36:09.914592" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:36:09.914271" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:36:09.914666" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:09.914887" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:36:09.913301" elapsed="0.001615"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:09.917225" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:09.917327" 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-08-22T23:36:09.917084" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:09.919122" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:09.918850" elapsed="0.000298"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:36:09.919196" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:36:09.919348" level="INFO">${member_ip} = 10.30.170.200</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:36:09.918509" elapsed="0.000863"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:09.921996" level="INFO">${odl_connection} = 67</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:09.921237" elapsed="0.000800"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:09.927373" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:09.927452" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:09.927097" 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-08-22T23:36:09.927654" elapsed="0.000321"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:09.928880" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:10.237142" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:56 UTC 2026

  System load:  0.08               Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:09 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:09.928536" elapsed="0.308933"/>
</kw>
<msg time="2026-08-22T23:36:10.237575" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:09.928174" elapsed="0.309528"/>
</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-08-22T23:36:09.926499" elapsed="0.311345"/>
</kw>
<msg time="2026-08-22T23:36:10.237963" 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-08-22T23:36:09.923665" elapsed="0.314378"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:36:09.922305" elapsed="0.315876"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:36:10.238296" elapsed="0.000066"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.200 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:36:09.920823" elapsed="0.317697"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:10.242462" level="INFO">Executing command 'cat //tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/org.opendaylight.controller.cluster.datastore.cfg'.</msg>
<msg time="2026-08-22T23:36:10.255300" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:10.255637" level="INFO">${stdout} = # This file specifies property settings for the clustered data store to control its behavior. A
# property may be applied to every data store type ("config" and "operational") or can be customized
# d...</msg>
<msg time="2026-08-22T23:36:10.255805" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:36:10.255963" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:10.242091" elapsed="0.013973"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:36:10.258194" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:36:10.257880" elapsed="0.000366"/>
</kw>
<msg time="2026-08-22T23:36:10.258473" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:36:10.258662" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:10.257215" elapsed="0.001548"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:10.260722" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:10.259854" elapsed="0.000972"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:10.262987" level="INFO"># This file specifies property settings for the clustered data store to control its behavior. A
# property may be applied to every data store type ("config" and "operational") or can be customized
# differently for each data store type by prefixing the data store type + '.'. For example, specifying
# the "shard-election-timeout-factor" property would be applied to both data stores whereas specifying
# "operational.shard-election-timeout-factor" would only apply to the "operational" data store. Similarly,
# specifying "config.shard-election-timeout-factor" would only apply to the "config" data store.
# Overall flexibility goes even further, as these overrides can also be combined with per-shard specification,
# so that you can also use:
#   &lt;shard-name&gt;.&lt;setting&gt;
#   &lt;datastore-name&gt;.&lt;shard-name&gt;.&lt;setting&gt;
# for example:
#   topology.shard-election-timeout-factor=2             # override both config/operational for topology shard
#   config.topology.shard-election-timeout-factor=5      # override config for topology shard
#   operational.topology.shard-election-timeout-factor=7 # override operational for topology shard
#

# The multiplication factor to be used to determine shard election timeout. The shard election timeout
# is determined by multiplying shardHeartbeatIntervalInMillis with the shardElectionTimeoutFactor.
shard-election-timeout-factor=20

# The interval at which a shard will send a heart beat message to its remote shard.
#shard-heartbeat-interval-in-millis=500

# The amount by which to divide election timeout in case of a candidate. This serves as a counter-balance
# to shard-election-timeout-factor. The default value is 1, i.e. election timeout is the same in all
# situations.
#shard-candidate-election-timeout-divisor=1

# The maximum amount of time to wait for a shard to elect a leader before failing an operation (eg transaction create).
#shard-leader-election-timeout-in-seconds=30

# Enable or disable data persistence.
#persistent=true

# Disable persistence for the operational data store by default.
operational.persistent=false

# The maximum amount of time a shard transaction can be idle without receiving any messages before it self-destructs.
#shard-transaction-idle-timeout-in-minutes=10

# The maximum amount of time a shard transaction three-phase commit can be idle without receiving the
# next messages before it aborts the transaction.
#shard-transaction-commit-timeout-in-seconds=30

# The maximum allowed capacity for each shard's transaction commit queue.
#shard-transaction-commit-queue-capacity=20000

# The maximum amount of time to wait for a shard to initialize from persistence on startup before
# failing an operation (eg transaction create and change listener registration).
#shard-initialization-timeout-in-seconds=300

# The minimum number of entries to be present in the in-memory journal log before a snapshot is to be taken.
#shard-snapshot-batch-count=20000

# The percentage of Runtime.totalMemory() used by the in-memory journal log before a snapshot is to be taken.
# Disabled, if direct threshold is enabled.
#shard-snapshot-data-threshold-percentage=12

# The max size of in-memory journal(in MB), after reaching the limit, snapshot will be taken. Should be not less then 1.
# If set to 0, direct threshold is disabled and percentage is used instead.
#shard-snapshot-data-threshold=0

# The interval at which the leader of the shard will check if its majority followers are active and
# term itself as isolated.
#shard-isolated-leader-check-interval-in-millis=5000

# The number of transaction modification operations (put, merge, delete) to batch before sending to the
# shard transaction actor. Batching improves performance as less modifications messages are sent to the
# actor and thus lessens the chance that the transaction actor's mailbox queue could get full.
#shard-batched-modification-count=1000

# The maximum amount of time for akka operations (remote or local) to complete before failing.
#operation-timeout-in-seconds=5

# Obsolete: this knob will be removed in a future release.
#
# The initial number of transactions per second that are allowed before the data store should begin
# applying back pressure. This number is only used as an initial guidance, subsequently the datastore
# measures the latency for a commit and auto-adjusts the rate limit.
#transaction-creation-initial-rate-limit=100

# A fully qualified java class name. The class should implement
# org.opendaylight.controller.cluster.raft.policy.RaftPolicy. This java class should be
# accessible to the distributed data store OSGi module so that it can be dynamically loaded via
# reflection. For now let's assume that these classes to customize raft behaviors should be
# present in the distributed data store module itself. If this property is set to a class which
# cannot be found then the default raft policy will be applied
#custom-raft-policy-implementation=

# When fragmenting messages thru the akka remoting framework, this is the maximum size in bytes
# for a message slice. This needs to be below Akka's maximum-frame-size and defaults to 480KiB.
maximum-message-slice-size=491520

# Tune the maximum number of entries a follower is allowed to lag behind the leader before it is
# considered out-of-sync. This flag may require tuning in face of a large number of small transactions.
#sync-index-threshold=10

# Record new transaction allocation stack trace, useful for debugging.  This makes the log include
# the stack trace of the creator of the Tx when there is an exception when the transaction is submitted 
# (e.g. for a failed validation).  Defaults to false due to performance impact.
#transaction-debug-context-enabled=true

# Multiplicator of shard-leader-election-timeout-in-seconds for the purposes of initial datastore
# convergence. Each frontend datastore instance will wait specified amount of time before becoming
# exposed as a service. A value of 0 indicates waiting forever. Defaults to 3.
#initial-settle-timeout-multiplier=3

#Interval after which a snapshot should be taken during the recovery process.
#recovery-snapshot-interval-seconds=0

# Option to take a snapshot when the entire DataTree root or top-level container is overwritten
snapshot-on-root-overwrite=false

# Enable lz4 compression for snapshots sent from leader to followers
#use-lz4-compression=true

# Export snapshot and journal content after recovery, possible modes: off, json
#
# Journal Json structure:
#       Entries : [
#            Entry : [
#                Node: [
#                   Path : {},
#                   ModificationType : {},
#                   Data : {}
#                ]
#            ]
#        ]
#
# Snapshot Json structure:
#       RootNode : {}
#
export-on-recovery=off

# Directory name for export files
#recovery-export-base-dir=persistence-export</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:10.262721" elapsed="0.000440"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:10.263559" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:10.263318" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:10.264094" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:10.263855" elapsed="0.000284"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:36:10.262196" elapsed="0.002045"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:10.261019" elapsed="0.003270"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:10.260951" elapsed="0.003406"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:36:10.264780" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:10.264521" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:10.264468" elapsed="0.000451"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:10.265287" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-08-22T23:36:10.265076" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:10.265026" elapsed="0.000430"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:10.266521" elapsed="0.000076"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:36:10.240008" elapsed="0.026826"/>
</kw>
<msg time="2026-08-22T23:36:10.267094" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:10.267141" level="INFO">${result} = # This file specifies property settings for the clustered data store to control its behavior. A
# property may be applied to every data store type ("config" and "operational") or can be customized
# d...</msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:10.238822" elapsed="0.028344"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:10.267335" elapsed="0.000584"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:36:10.268103" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:36:10.267989" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:10.267970" elapsed="0.000217"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:10.268333" elapsed="0.000022"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:36:09.920076" elapsed="0.348380"/>
</kw>
<msg time="2026-08-22T23:36:10.268555" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:09.919530" elapsed="0.349179"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:36:09.917990" elapsed="0.350962"/>
</kw>
<msg time="2026-08-22T23:36:10.269036" 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-08-22T23:36:09.917509" elapsed="0.351574"/>
</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-08-22T23:36:10.272420" elapsed="0.000346"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:10.272939" elapsed="0.000181"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:10.273271" 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-08-22T23:36:10.269390" elapsed="0.004030"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:36:09.916449" elapsed="0.357183"/>
</kw>
<msg time="2026-08-22T23:36:10.273735" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:09.915973" elapsed="0.357812"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:36:09.915270" elapsed="0.358736"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:36:09.915114" elapsed="0.358977"/>
</iter>
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:10.276317" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:10.276421" 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-08-22T23:36:10.276174" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:10.278256" level="INFO">${ip_address} = 10.30.170.12</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:10.277982" elapsed="0.000300"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:36:10.278331" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:36:10.278483" level="INFO">${member_ip} = 10.30.170.12</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:36:10.277657" elapsed="0.000852"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:10.281158" level="INFO">${odl_connection} = 69</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:10.280361" elapsed="0.000838"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:10.284724" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:10.284807" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:10.284353" elapsed="0.000479"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:10.284992" elapsed="0.000324"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:10.286288" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:10.613782" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:57 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:09 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:10.285969" elapsed="0.327995"/>
</kw>
<msg time="2026-08-22T23:36:10.614059" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:10.285487" elapsed="0.328674"/>
</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-08-22T23:36:10.283858" elapsed="0.330440"/>
</kw>
<msg time="2026-08-22T23:36:10.614388" 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-08-22T23:36:10.282883" elapsed="0.331582"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:36:10.281505" elapsed="0.333123"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:36:10.614743" elapsed="0.000063"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.12 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:36:10.279944" elapsed="0.335016"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:10.618791" level="INFO">Executing command 'cat //tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/org.opendaylight.controller.cluster.datastore.cfg'.</msg>
<msg time="2026-08-22T23:36:10.631769" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:10.632406" level="INFO">${stdout} = # This file specifies property settings for the clustered data store to control its behavior. A
# property may be applied to every data store type ("config" and "operational") or can be customized
# d...</msg>
<msg time="2026-08-22T23:36:10.632824" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:36:10.633177" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:10.618397" elapsed="0.015059"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:36:10.638254" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:36:10.637368" elapsed="0.001114"/>
</kw>
<msg time="2026-08-22T23:36:10.639030" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:36:10.639690" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:10.636056" elapsed="0.003897"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:10.643101" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:10.642225" elapsed="0.000983"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:10.645273" level="INFO"># This file specifies property settings for the clustered data store to control its behavior. A
# property may be applied to every data store type ("config" and "operational") or can be customized
# differently for each data store type by prefixing the data store type + '.'. For example, specifying
# the "shard-election-timeout-factor" property would be applied to both data stores whereas specifying
# "operational.shard-election-timeout-factor" would only apply to the "operational" data store. Similarly,
# specifying "config.shard-election-timeout-factor" would only apply to the "config" data store.
# Overall flexibility goes even further, as these overrides can also be combined with per-shard specification,
# so that you can also use:
#   &lt;shard-name&gt;.&lt;setting&gt;
#   &lt;datastore-name&gt;.&lt;shard-name&gt;.&lt;setting&gt;
# for example:
#   topology.shard-election-timeout-factor=2             # override both config/operational for topology shard
#   config.topology.shard-election-timeout-factor=5      # override config for topology shard
#   operational.topology.shard-election-timeout-factor=7 # override operational for topology shard
#

# The multiplication factor to be used to determine shard election timeout. The shard election timeout
# is determined by multiplying shardHeartbeatIntervalInMillis with the shardElectionTimeoutFactor.
shard-election-timeout-factor=20

# The interval at which a shard will send a heart beat message to its remote shard.
#shard-heartbeat-interval-in-millis=500

# The amount by which to divide election timeout in case of a candidate. This serves as a counter-balance
# to shard-election-timeout-factor. The default value is 1, i.e. election timeout is the same in all
# situations.
#shard-candidate-election-timeout-divisor=1

# The maximum amount of time to wait for a shard to elect a leader before failing an operation (eg transaction create).
#shard-leader-election-timeout-in-seconds=30

# Enable or disable data persistence.
#persistent=true

# Disable persistence for the operational data store by default.
operational.persistent=false

# The maximum amount of time a shard transaction can be idle without receiving any messages before it self-destructs.
#shard-transaction-idle-timeout-in-minutes=10

# The maximum amount of time a shard transaction three-phase commit can be idle without receiving the
# next messages before it aborts the transaction.
#shard-transaction-commit-timeout-in-seconds=30

# The maximum allowed capacity for each shard's transaction commit queue.
#shard-transaction-commit-queue-capacity=20000

# The maximum amount of time to wait for a shard to initialize from persistence on startup before
# failing an operation (eg transaction create and change listener registration).
#shard-initialization-timeout-in-seconds=300

# The minimum number of entries to be present in the in-memory journal log before a snapshot is to be taken.
#shard-snapshot-batch-count=20000

# The percentage of Runtime.totalMemory() used by the in-memory journal log before a snapshot is to be taken.
# Disabled, if direct threshold is enabled.
#shard-snapshot-data-threshold-percentage=12

# The max size of in-memory journal(in MB), after reaching the limit, snapshot will be taken. Should be not less then 1.
# If set to 0, direct threshold is disabled and percentage is used instead.
#shard-snapshot-data-threshold=0

# The interval at which the leader of the shard will check if its majority followers are active and
# term itself as isolated.
#shard-isolated-leader-check-interval-in-millis=5000

# The number of transaction modification operations (put, merge, delete) to batch before sending to the
# shard transaction actor. Batching improves performance as less modifications messages are sent to the
# actor and thus lessens the chance that the transaction actor's mailbox queue could get full.
#shard-batched-modification-count=1000

# The maximum amount of time for akka operations (remote or local) to complete before failing.
#operation-timeout-in-seconds=5

# Obsolete: this knob will be removed in a future release.
#
# The initial number of transactions per second that are allowed before the data store should begin
# applying back pressure. This number is only used as an initial guidance, subsequently the datastore
# measures the latency for a commit and auto-adjusts the rate limit.
#transaction-creation-initial-rate-limit=100

# A fully qualified java class name. The class should implement
# org.opendaylight.controller.cluster.raft.policy.RaftPolicy. This java class should be
# accessible to the distributed data store OSGi module so that it can be dynamically loaded via
# reflection. For now let's assume that these classes to customize raft behaviors should be
# present in the distributed data store module itself. If this property is set to a class which
# cannot be found then the default raft policy will be applied
#custom-raft-policy-implementation=

# When fragmenting messages thru the akka remoting framework, this is the maximum size in bytes
# for a message slice. This needs to be below Akka's maximum-frame-size and defaults to 480KiB.
maximum-message-slice-size=491520

# Tune the maximum number of entries a follower is allowed to lag behind the leader before it is
# considered out-of-sync. This flag may require tuning in face of a large number of small transactions.
#sync-index-threshold=10

# Record new transaction allocation stack trace, useful for debugging.  This makes the log include
# the stack trace of the creator of the Tx when there is an exception when the transaction is submitted 
# (e.g. for a failed validation).  Defaults to false due to performance impact.
#transaction-debug-context-enabled=true

# Multiplicator of shard-leader-election-timeout-in-seconds for the purposes of initial datastore
# convergence. Each frontend datastore instance will wait specified amount of time before becoming
# exposed as a service. A value of 0 indicates waiting forever. Defaults to 3.
#initial-settle-timeout-multiplier=3

#Interval after which a snapshot should be taken during the recovery process.
#recovery-snapshot-interval-seconds=0

# Option to take a snapshot when the entire DataTree root or top-level container is overwritten
snapshot-on-root-overwrite=false

# Enable lz4 compression for snapshots sent from leader to followers
#use-lz4-compression=true

# Export snapshot and journal content after recovery, possible modes: off, json
#
# Journal Json structure:
#       Entries : [
#            Entry : [
#                Node: [
#                   Path : {},
#                   ModificationType : {},
#                   Data : {}
#                ]
#            ]
#        ]
#
# Snapshot Json structure:
#       RootNode : {}
#
export-on-recovery=off

# Directory name for export files
#recovery-export-base-dir=persistence-export</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:10.644995" elapsed="0.000380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:10.645956" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:10.645565" elapsed="0.000433"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:10.646626" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:10.646154" elapsed="0.000518"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:36:10.644506" elapsed="0.002269"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:10.643391" elapsed="0.003431"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:10.643330" elapsed="0.003556"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:36:10.647274" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:10.647051" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:10.646999" elapsed="0.000410"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:10.647811" elapsed="0.000052"/>
</return>
<status status="PASS" start="2026-08-22T23:36:10.647571" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:10.647519" elapsed="0.000457"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:10.649049" elapsed="0.000061"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:36:10.616235" elapsed="0.033138"/>
</kw>
<msg time="2026-08-22T23:36:10.649656" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:10.649704" level="INFO">${result} = # This file specifies property settings for the clustered data store to control its behavior. A
# property may be applied to every data store type ("config" and "operational") or can be customized
# d...</msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:10.615240" elapsed="0.034488"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:10.649893" elapsed="0.000227"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:36:10.650298" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:36:10.650186" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:10.650168" elapsed="0.000215"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:10.650530" elapsed="0.000022"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:36:10.279221" elapsed="0.371493"/>
</kw>
<msg time="2026-08-22T23:36:10.650815" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:10.278681" elapsed="0.372185"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:36:10.277115" elapsed="0.373980"/>
</kw>
<msg time="2026-08-22T23:36:10.651177" 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-08-22T23:36:10.276617" elapsed="0.374606"/>
</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-08-22T23:36:10.654533" 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-08-22T23:36:10.655037" elapsed="0.000166"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:10.655352" 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-08-22T23:36:10.651521" elapsed="0.003979"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:36:10.275532" elapsed="0.380178"/>
</kw>
<msg time="2026-08-22T23:36:10.655808" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:10.275084" elapsed="0.380774"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:36:10.274367" elapsed="0.381709"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:36:10.274204" elapsed="0.381954"/>
</iter>
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:10.658407" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:10.658511" 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-08-22T23:36:10.658264" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:10.660303" level="INFO">${ip_address} = 10.30.170.79</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:10.660031" elapsed="0.000298"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:36:10.660377" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:10.660526" level="INFO">${member_ip} = 10.30.170.79</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:36:10.659706" elapsed="0.000845"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:10.663192" level="INFO">${odl_connection} = 71</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:10.662412" elapsed="0.000822"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:10.666754" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:10.666834" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:10.666411" elapsed="0.000447"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:36:10.667021" elapsed="0.000321"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:10.668308" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:11.001948" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:58 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:09 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:10.667988" elapsed="0.334044"/>
</kw>
<msg time="2026-08-22T23:36:11.002093" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:10.667513" elapsed="0.334638"/>
</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-08-22T23:36:10.665914" elapsed="0.336323"/>
</kw>
<msg time="2026-08-22T23:36:11.002312" 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-08-22T23:36:10.664898" elapsed="0.337488"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:36:10.663509" elapsed="0.339002"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:36:11.002626" elapsed="0.000033"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.79 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:36:10.661989" elapsed="0.340777"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:11.005977" level="INFO">Executing command 'cat //tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/org.opendaylight.controller.cluster.datastore.cfg'.</msg>
<msg time="2026-08-22T23:36:11.018543" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:11.019167" level="INFO">${stdout} = # This file specifies property settings for the clustered data store to control its behavior. A
# property may be applied to every data store type ("config" and "operational") or can be customized
# d...</msg>
<msg time="2026-08-22T23:36:11.019505" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:36:11.019875" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:11.005600" elapsed="0.014491"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:36:11.023816" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:36:11.023385" elapsed="0.000499"/>
</kw>
<msg time="2026-08-22T23:36:11.024266" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:36:11.024494" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:11.022514" elapsed="0.002310"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:11.027503" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:11.026384" elapsed="0.001292"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:11.030532" level="INFO"># This file specifies property settings for the clustered data store to control its behavior. A
# property may be applied to every data store type ("config" and "operational") or can be customized
# differently for each data store type by prefixing the data store type + '.'. For example, specifying
# the "shard-election-timeout-factor" property would be applied to both data stores whereas specifying
# "operational.shard-election-timeout-factor" would only apply to the "operational" data store. Similarly,
# specifying "config.shard-election-timeout-factor" would only apply to the "config" data store.
# Overall flexibility goes even further, as these overrides can also be combined with per-shard specification,
# so that you can also use:
#   &lt;shard-name&gt;.&lt;setting&gt;
#   &lt;datastore-name&gt;.&lt;shard-name&gt;.&lt;setting&gt;
# for example:
#   topology.shard-election-timeout-factor=2             # override both config/operational for topology shard
#   config.topology.shard-election-timeout-factor=5      # override config for topology shard
#   operational.topology.shard-election-timeout-factor=7 # override operational for topology shard
#

# The multiplication factor to be used to determine shard election timeout. The shard election timeout
# is determined by multiplying shardHeartbeatIntervalInMillis with the shardElectionTimeoutFactor.
shard-election-timeout-factor=20

# The interval at which a shard will send a heart beat message to its remote shard.
#shard-heartbeat-interval-in-millis=500

# The amount by which to divide election timeout in case of a candidate. This serves as a counter-balance
# to shard-election-timeout-factor. The default value is 1, i.e. election timeout is the same in all
# situations.
#shard-candidate-election-timeout-divisor=1

# The maximum amount of time to wait for a shard to elect a leader before failing an operation (eg transaction create).
#shard-leader-election-timeout-in-seconds=30

# Enable or disable data persistence.
#persistent=true

# Disable persistence for the operational data store by default.
operational.persistent=false

# The maximum amount of time a shard transaction can be idle without receiving any messages before it self-destructs.
#shard-transaction-idle-timeout-in-minutes=10

# The maximum amount of time a shard transaction three-phase commit can be idle without receiving the
# next messages before it aborts the transaction.
#shard-transaction-commit-timeout-in-seconds=30

# The maximum allowed capacity for each shard's transaction commit queue.
#shard-transaction-commit-queue-capacity=20000

# The maximum amount of time to wait for a shard to initialize from persistence on startup before
# failing an operation (eg transaction create and change listener registration).
#shard-initialization-timeout-in-seconds=300

# The minimum number of entries to be present in the in-memory journal log before a snapshot is to be taken.
#shard-snapshot-batch-count=20000

# The percentage of Runtime.totalMemory() used by the in-memory journal log before a snapshot is to be taken.
# Disabled, if direct threshold is enabled.
#shard-snapshot-data-threshold-percentage=12

# The max size of in-memory journal(in MB), after reaching the limit, snapshot will be taken. Should be not less then 1.
# If set to 0, direct threshold is disabled and percentage is used instead.
#shard-snapshot-data-threshold=0

# The interval at which the leader of the shard will check if its majority followers are active and
# term itself as isolated.
#shard-isolated-leader-check-interval-in-millis=5000

# The number of transaction modification operations (put, merge, delete) to batch before sending to the
# shard transaction actor. Batching improves performance as less modifications messages are sent to the
# actor and thus lessens the chance that the transaction actor's mailbox queue could get full.
#shard-batched-modification-count=1000

# The maximum amount of time for akka operations (remote or local) to complete before failing.
#operation-timeout-in-seconds=5

# Obsolete: this knob will be removed in a future release.
#
# The initial number of transactions per second that are allowed before the data store should begin
# applying back pressure. This number is only used as an initial guidance, subsequently the datastore
# measures the latency for a commit and auto-adjusts the rate limit.
#transaction-creation-initial-rate-limit=100

# A fully qualified java class name. The class should implement
# org.opendaylight.controller.cluster.raft.policy.RaftPolicy. This java class should be
# accessible to the distributed data store OSGi module so that it can be dynamically loaded via
# reflection. For now let's assume that these classes to customize raft behaviors should be
# present in the distributed data store module itself. If this property is set to a class which
# cannot be found then the default raft policy will be applied
#custom-raft-policy-implementation=

# When fragmenting messages thru the akka remoting framework, this is the maximum size in bytes
# for a message slice. This needs to be below Akka's maximum-frame-size and defaults to 480KiB.
maximum-message-slice-size=491520

# Tune the maximum number of entries a follower is allowed to lag behind the leader before it is
# considered out-of-sync. This flag may require tuning in face of a large number of small transactions.
#sync-index-threshold=10

# Record new transaction allocation stack trace, useful for debugging.  This makes the log include
# the stack trace of the creator of the Tx when there is an exception when the transaction is submitted 
# (e.g. for a failed validation).  Defaults to false due to performance impact.
#transaction-debug-context-enabled=true

# Multiplicator of shard-leader-election-timeout-in-seconds for the purposes of initial datastore
# convergence. Each frontend datastore instance will wait specified amount of time before becoming
# exposed as a service. A value of 0 indicates waiting forever. Defaults to 3.
#initial-settle-timeout-multiplier=3

#Interval after which a snapshot should be taken during the recovery process.
#recovery-snapshot-interval-seconds=0

# Option to take a snapshot when the entire DataTree root or top-level container is overwritten
snapshot-on-root-overwrite=false

# Enable lz4 compression for snapshots sent from leader to followers
#use-lz4-compression=true

# Export snapshot and journal content after recovery, possible modes: off, json
#
# Journal Json structure:
#       Entries : [
#            Entry : [
#                Node: [
#                   Path : {},
#                   ModificationType : {},
#                   Data : {}
#                ]
#            ]
#        ]
#
# Snapshot Json structure:
#       RootNode : {}
#
export-on-recovery=off

# Directory name for export files
#recovery-export-base-dir=persistence-export</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:11.030159" elapsed="0.000579"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:11.031135" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:11.030895" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:11.031812" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:11.031357" elapsed="0.000501"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:36:11.029433" elapsed="0.002524"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:11.027916" elapsed="0.004086"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:11.027835" elapsed="0.004228"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:36:11.032440" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:11.032223" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:11.032172" elapsed="0.000399"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:11.032985" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-08-22T23:36:11.032777" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:11.032727" elapsed="0.000418"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:11.034163" elapsed="0.000060"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:36:11.003675" elapsed="0.030774"/>
</kw>
<msg time="2026-08-22T23:36:11.034740" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:11.034785" level="INFO">${result} = # This file specifies property settings for the clustered data store to control its behavior. A
# property may be applied to every data store type ("config" and "operational") or can be customized
# d...</msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:11.002939" elapsed="0.031870"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:11.034972" elapsed="0.000211"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:36:11.035362" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:36:11.035251" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:11.035233" elapsed="0.000213"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:11.035612" elapsed="0.000023"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:36:10.661267" elapsed="0.374468"/>
</kw>
<msg time="2026-08-22T23:36:11.035830" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:10.660725" elapsed="0.375153"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:36:10.659170" elapsed="0.376926"/>
</kw>
<msg time="2026-08-22T23:36:11.036175" 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-08-22T23:36:10.658707" elapsed="0.377512"/>
</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-08-22T23:36:11.039410" elapsed="0.000333"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:11.039909" elapsed="0.000151"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:11.040209" 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-08-22T23:36:11.036508" elapsed="0.003848"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:36:10.657643" elapsed="0.382903"/>
</kw>
<msg time="2026-08-22T23:36:11.040658" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:10.657150" elapsed="0.383557"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:36:10.656429" elapsed="0.384495"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:36:10.656270" elapsed="0.384735"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:36:09.914975" elapsed="1.126067"/>
</for>
<arg>cat ${DATASTORE_CFG}</arg>
<doc>Cycle through indices (or all), run bash command on each, using temporary SSH session and restoring the previously active one.</doc>
<status status="PASS" start="2026-08-22T23:36:09.910653" elapsed="1.130452"/>
</kw>
<kw name="Clean_Directories_On_List_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:11.050934" level="INFO">${path_list} = ['tmp/', 'data/', 'cache/', 'snapshots/', 'journal/', 'segmented-journal/', 'etc/opendaylight/current/', 'etc/host.key']</msg>
<var>${path_list}</var>
<arg>"${directory_list}" == "${EMPTY}"</arg>
<arg>${ODL_DEFAULT_DATA_PATHS}</arg>
<arg>${directory_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:11.048647" elapsed="0.002316"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${tmp_dir}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Check_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:11.052744" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:11.052346" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:36:11.053238" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:36:11.052934" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:36:11.053309" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:36:11.053464" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:36:11.051972" elapsed="0.001517"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:11.055801" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:11.055903" 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-08-22T23:36:11.055663" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:11.057871" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:11.057387" elapsed="0.000512"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:36:11.057948" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:36:11.058306" level="INFO">${member_ip} = 10.30.170.200</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:36:11.057070" elapsed="0.001262"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:11.062257" level="INFO">${odl_connection} = 73</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:11.061617" elapsed="0.000688"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:11.064912" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:11.064989" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:11.064645" elapsed="0.000368"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:11.065171" elapsed="0.000317"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:11.066379" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:11.412322" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:56 UTC 2026

  System load:  0.08               Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:10 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:11.066063" elapsed="0.346341"/>
</kw>
<msg time="2026-08-22T23:36:11.412462" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:11.065689" elapsed="0.346831"/>
</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-08-22T23:36:11.064135" elapsed="0.348527"/>
</kw>
<msg time="2026-08-22T23:36:11.412713" 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-08-22T23:36:11.063335" elapsed="0.349427"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:36:11.062827" elapsed="0.350069"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:36:11.413034" elapsed="0.000077"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.200 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:36:11.060564" elapsed="0.352718"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:11.415665" level="INFO">Executing command 'mkdir -p '/tmp' &amp;&amp; rm -vrf '/tmp/log' &amp;&amp; mv -vf '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log' '/tmp/''.</msg>
<msg time="2026-08-22T23:36:11.427891" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:11.428135" level="INFO">${stdout} = renamed '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log' -&gt; '/tmp/log'</msg>
<msg time="2026-08-22T23:36:11.428234" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:36:11.428324" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:11.415453" elapsed="0.012921"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:36:11.430162" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:36:11.429554" elapsed="0.000709"/>
</kw>
<msg time="2026-08-22T23:36:11.430496" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:36:11.430623" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:11.428800" elapsed="0.001877"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:11.431986" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:11.431047" elapsed="0.000996"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:11.434471" level="INFO">renamed '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log' -&gt; '/tmp/log'</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:11.433887" elapsed="0.000718"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:11.435275" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:11.434940" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:11.435889" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:11.435538" elapsed="0.000410"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:36:11.432977" elapsed="0.003045"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:11.432212" elapsed="0.003858"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:11.432169" elapsed="0.003935"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:36:11.436320" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:11.436182" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:11.436158" elapsed="0.000253"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:11.436624" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:36:11.436482" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:11.436461" elapsed="0.000278"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:11.436939" elapsed="0.000030"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:36:11.414900" elapsed="0.022263"/>
</kw>
<msg time="2026-08-22T23:36:11.437361" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:11.437518" level="INFO">${result} = renamed '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log' -&gt; '/tmp/log'</msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:11.413610" elapsed="0.024022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:11.437984" elapsed="0.000720"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:36:11.439210" elapsed="0.000099"/>
</return>
<status status="PASS" start="2026-08-22T23:36:11.438895" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:11.438868" elapsed="0.000605"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:11.439767" elapsed="0.000067"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:36:11.059043" elapsed="0.381072"/>
</kw>
<msg time="2026-08-22T23:36:11.440197" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:11.058492" elapsed="0.381774"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:36:11.056537" elapsed="0.383899"/>
</kw>
<msg time="2026-08-22T23:36:11.440494" 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-08-22T23:36:11.056082" elapsed="0.384475"/>
</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-08-22T23:36:11.444294" 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-08-22T23:36:11.444787" elapsed="0.000150"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:11.445085" 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-08-22T23:36:11.441000" elapsed="0.004233"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:36:11.055031" elapsed="0.390259"/>
</kw>
<msg time="2026-08-22T23:36:11.445344" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:11.054591" elapsed="0.390801"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:36:11.053881" elapsed="0.391592"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:36:11.053699" elapsed="0.391819"/>
</iter>
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:11.447712" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:11.447813" 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-08-22T23:36:11.447568" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:11.449774" level="INFO">${ip_address} = 10.30.170.12</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:11.449296" elapsed="0.000505"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:36:11.449849" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:36:11.450177" level="INFO">${member_ip} = 10.30.170.12</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:36:11.448978" elapsed="0.001225"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:11.454264" level="INFO">${odl_connection} = 75</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:11.453467" elapsed="0.000844"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:11.456625" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:11.456704" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:11.456346" elapsed="0.000382"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:11.456886" elapsed="0.000318"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:11.458081" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:11.788696" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:57 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:10 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:11.457762" elapsed="0.331055"/>
</kw>
<msg time="2026-08-22T23:36:11.788877" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:11.457370" elapsed="0.331566"/>
</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-08-22T23:36:11.455863" elapsed="0.333159"/>
</kw>
<msg time="2026-08-22T23:36:11.789071" 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-08-22T23:36:11.455347" elapsed="0.333772"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:36:11.454844" elapsed="0.334411"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:36:11.789400" elapsed="0.000079"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.12 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:36:11.452441" elapsed="0.337241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:11.792089" level="INFO">Executing command 'mkdir -p '/tmp' &amp;&amp; rm -vrf '/tmp/log' &amp;&amp; mv -vf '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log' '/tmp/''.</msg>
<msg time="2026-08-22T23:36:11.805186" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:11.805435" level="INFO">${stdout} = renamed '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log' -&gt; '/tmp/log'</msg>
<msg time="2026-08-22T23:36:11.805535" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:36:11.805663" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:11.791896" elapsed="0.013821"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:36:11.807495" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:36:11.806900" elapsed="0.000725"/>
</kw>
<msg time="2026-08-22T23:36:11.807836" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:36:11.807933" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:11.806114" elapsed="0.001869"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:11.809301" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:11.808353" elapsed="0.001005"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:11.811794" level="INFO">renamed '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log' -&gt; '/tmp/log'</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:11.811263" elapsed="0.000599"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:11.812442" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:11.812088" elapsed="0.000414"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:11.813102" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:11.812749" elapsed="0.000416"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:36:11.810302" elapsed="0.002944"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:11.809528" elapsed="0.003770"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:11.809484" elapsed="0.003852"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:36:11.813565" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:11.813419" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:11.813394" elapsed="0.000291"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:11.813895" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:36:11.813763" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:11.813740" elapsed="0.000277"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:11.814231" elapsed="0.000033"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:36:11.791319" elapsed="0.023158"/>
</kw>
<msg time="2026-08-22T23:36:11.814724" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:11.814899" level="INFO">${result} = renamed '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log' -&gt; '/tmp/log'</msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:11.789996" elapsed="0.025014"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:11.815394" elapsed="0.000777"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:36:11.816758" elapsed="0.000109"/>
</return>
<status status="PASS" start="2026-08-22T23:36:11.816379" elapsed="0.000610"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:11.816350" elapsed="0.000700"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:11.817331" elapsed="0.000072"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:36:11.450945" elapsed="0.366795"/>
</kw>
<msg time="2026-08-22T23:36:11.817892" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:11.450363" elapsed="0.367606"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:36:11.448445" elapsed="0.369651"/>
</kw>
<msg time="2026-08-22T23:36:11.818157" 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-08-22T23:36:11.447991" elapsed="0.370233"/>
</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-08-22T23:36:11.821932" 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-08-22T23:36:11.822409" elapsed="0.000152"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:11.822727" 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-08-22T23:36:11.818682" elapsed="0.004195"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:36:11.446954" elapsed="0.375980"/>
</kw>
<msg time="2026-08-22T23:36:11.823008" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:11.446486" elapsed="0.376572"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:36:11.445784" elapsed="0.377359"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:36:11.445628" elapsed="0.377560"/>
</iter>
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:11.825359" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:11.825461" 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-08-22T23:36:11.825229" elapsed="0.000258"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:11.827485" level="INFO">${ip_address} = 10.30.170.79</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:11.827023" elapsed="0.000490"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:36:11.827561" elapsed="0.000051"/>
</return>
<msg time="2026-08-22T23:36:11.827744" level="INFO">${member_ip} = 10.30.170.79</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:36:11.826674" elapsed="0.001096"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:11.831908" level="INFO">${odl_connection} = 77</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:11.831276" elapsed="0.000679"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:11.834136" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:11.834214" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:11.833872" elapsed="0.000367"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:11.834400" elapsed="0.000458"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:11.835753" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:12.176825" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:58 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:10 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:11.835415" elapsed="0.341591"/>
</kw>
<msg time="2026-08-22T23:36:12.177090" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:11.835054" elapsed="0.342139"/>
</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-08-22T23:36:11.833362" elapsed="0.343943"/>
</kw>
<msg time="2026-08-22T23:36:12.177355" 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-08-22T23:36:11.832972" elapsed="0.344433"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:36:11.832423" elapsed="0.345134"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:36:12.177731" elapsed="0.000086"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.79 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:36:11.830210" elapsed="0.347797"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:12.180515" level="INFO">Executing command 'mkdir -p '/tmp' &amp;&amp; rm -vrf '/tmp/log' &amp;&amp; mv -vf '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log' '/tmp/''.</msg>
<msg time="2026-08-22T23:36:12.192436" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:12.192722" level="INFO">${stdout} = renamed '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log' -&gt; '/tmp/log'</msg>
<msg time="2026-08-22T23:36:12.192825" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:36:12.192916" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:12.180316" elapsed="0.012650"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:36:12.194803" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:36:12.194175" elapsed="0.000732"/>
</kw>
<msg time="2026-08-22T23:36:12.195119" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:36:12.195216" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:12.193365" elapsed="0.001901"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:12.196679" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:12.195695" elapsed="0.001045"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:12.199310" level="INFO">renamed '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log' -&gt; '/tmp/log'</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:12.198628" elapsed="0.000785"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:12.200024" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:12.199783" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:12.200452" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:12.200215" elapsed="0.000280"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:36:12.197709" elapsed="0.002838"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:12.196922" elapsed="0.003675"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:12.196875" elapsed="0.003749"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:36:12.200781" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:12.200682" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:12.200665" elapsed="0.000181"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:12.200984" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:36:12.200897" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:12.200882" elapsed="0.000183"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:12.201210" elapsed="0.000022"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:36:12.179534" elapsed="0.021838"/>
</kw>
<msg time="2026-08-22T23:36:12.201517" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:12.201655" level="INFO">${result} = renamed '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log' -&gt; '/tmp/log'</msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:12.178346" elapsed="0.023371"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:12.202042" elapsed="0.000475"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:36:12.202904" elapsed="0.000072"/>
</return>
<status status="PASS" start="2026-08-22T23:36:12.202674" elapsed="0.000386"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:12.202654" elapsed="0.000445"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:12.203287" elapsed="0.000048"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:36:11.828673" elapsed="0.374881"/>
</kw>
<msg time="2026-08-22T23:36:12.203634" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:11.827927" elapsed="0.375759"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:36:11.826138" elapsed="0.377638"/>
</kw>
<msg time="2026-08-22T23:36:12.203817" 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-08-22T23:36:11.825661" elapsed="0.378201"/>
</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-08-22T23:36:12.207003" 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-08-22T23:36:12.207474" elapsed="0.000201"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:12.207824" 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-08-22T23:36:12.204156" elapsed="0.003816"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:36:11.824605" elapsed="0.383424"/>
</kw>
<msg time="2026-08-22T23:36:12.208083" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:11.824146" elapsed="0.383985"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:36:11.823434" elapsed="0.384780"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:36:11.823278" elapsed="0.384982"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:36:11.053545" elapsed="1.154752"/>
</for>
<arg>mkdir -p '${tmp_dir}' &amp;&amp; rm -vrf '${tmp_dir}/log' &amp;&amp; mv -vf '${karaf_home}/data/log' '${tmp_dir}/'</arg>
<arg>${member_index_list}</arg>
<doc>Cycle through indices (or all), run bash command on each, using temporary SSH session and restoring the previously active one.</doc>
<status status="PASS" start="2026-08-22T23:36:11.051345" elapsed="1.157013"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:11.051040" elapsed="1.157355"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:11.051021" elapsed="1.157400"/>
</if>
<kw name="Safe_With_Ssh_To_List_Or_All_Run_Keyword" owner="ClusterManagement">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:12.209745" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:12.209847" 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-08-22T23:36:12.209609" elapsed="0.000263"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="With_Ssh_To_List_Or_All_Run_Keyword" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>This keyword is experimental and there is high risk of being replaced by another approach.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:36:12.210976" elapsed="0.000210"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:12.212180" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:12.211806" elapsed="0.000401"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:36:12.212693" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:36:12.212368" elapsed="0.000385"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:36:12.212801" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:36:12.212956" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:36:12.211398" elapsed="0.001583"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:12.216028" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:12.215745" elapsed="0.000310"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:36:12.216105" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:36:12.216258" level="INFO">${member_ip} = 10.30.170.200</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:36:12.213343" elapsed="0.002940"/>
</kw>
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:12.217852" level="INFO">${odl_connection} = 79</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:12.217461" elapsed="0.000417"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:12.220358" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:12.220649" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:12.219822" elapsed="0.000931"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:36:12.221055" elapsed="0.000636"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:12.223017" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:12.562269" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:56 UTC 2026

  System load:  0.08               Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:11 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:12.222699" elapsed="0.339658"/>
</kw>
<msg time="2026-08-22T23:36:12.562460" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:12.222006" elapsed="0.340537"/>
</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-08-22T23:36:12.218840" elapsed="0.343870"/>
</kw>
<msg time="2026-08-22T23:36:12.562801" 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-08-22T23:36:12.218435" elapsed="0.344417"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:36:12.218056" elapsed="0.344871"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:36:12.562969" elapsed="0.000033"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.200 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:36:12.217108" elapsed="0.345997"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="ClusterManagement__Clean_Directories" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:12.565295" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/tmp/'.</msg>
<msg time="2026-08-22T23:36:12.578125" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:12.564872" elapsed="0.013559"/>
</kw>
<var name="${relative_path}">tmp/</var>
<status status="PASS" start="2026-08-22T23:36:12.564504" elapsed="0.014010"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:12.579996" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/data/'.</msg>
<msg time="2026-08-22T23:36:12.668121" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:12.579074" elapsed="0.089323"/>
</kw>
<var name="${relative_path}">data/</var>
<status status="PASS" start="2026-08-22T23:36:12.578758" elapsed="0.089721"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:12.669957" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/cache/'.</msg>
<msg time="2026-08-22T23:36:12.728030" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:12.669029" elapsed="0.059276"/>
</kw>
<var name="${relative_path}">cache/</var>
<status status="PASS" start="2026-08-22T23:36:12.668716" elapsed="0.059753"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:12.729969" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/snapshots/'.</msg>
<msg time="2026-08-22T23:36:12.784815" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:12.729029" elapsed="0.056031"/>
</kw>
<var name="${relative_path}">snapshots/</var>
<status status="PASS" start="2026-08-22T23:36:12.728710" elapsed="0.056432"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:12.786621" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/journal/'.</msg>
<msg time="2026-08-22T23:36:12.835628" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:12.785695" elapsed="0.050187"/>
</kw>
<var name="${relative_path}">journal/</var>
<status status="PASS" start="2026-08-22T23:36:12.785339" elapsed="0.050626"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:12.837433" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/segmented-journal/'.</msg>
<msg time="2026-08-22T23:36:12.887791" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:12.836508" elapsed="0.051530"/>
</kw>
<var name="${relative_path}">segmented-journal/</var>
<status status="PASS" start="2026-08-22T23:36:12.836163" elapsed="0.051959"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:12.889708" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/opendaylight/current/'.</msg>
<msg time="2026-08-22T23:36:12.939821" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:12.888763" elapsed="0.051309"/>
</kw>
<var name="${relative_path}">etc/opendaylight/current/</var>
<status status="PASS" start="2026-08-22T23:36:12.888317" elapsed="0.051841"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:12.941662" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/host.key'.</msg>
<msg time="2026-08-22T23:36:12.996777" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:12.940730" elapsed="0.056380"/>
</kw>
<var name="${relative_path}">etc/host.key</var>
<status status="PASS" start="2026-08-22T23:36:12.940353" elapsed="0.056863"/>
</iter>
<var>${relative_path}</var>
<value>@{relative_path_list}</value>
<status status="PASS" start="2026-08-22T23:36:12.564160" elapsed="0.433139"/>
</for>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>For each relative path, remove files with respect to /tmp/netconf-karaf-9.0.4-SNAPSHOT. Return None.</doc>
<status status="PASS" start="2026-08-22T23:36:12.563854" elapsed="0.433604"/>
</kw>
<msg time="2026-08-22T23:36:12.997761" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:12.997864" level="INFO">${result} = None</msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:12.563280" elapsed="0.434635"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:12.998357" elapsed="0.000547"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:36:12.999379" elapsed="0.000077"/>
</return>
<status status="PASS" start="2026-08-22T23:36:12.999077" elapsed="0.000455"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:12.999026" elapsed="0.000602"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:12.999969" elapsed="0.000048"/>
</kw>
<arg>${member_ip}</arg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:36:12.216541" elapsed="0.783699"/>
</kw>
<var name="${member_index}">1</var>
<status status="PASS" start="2026-08-22T23:36:12.213178" elapsed="0.787160"/>
</iter>
<iter>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:13.002262" level="INFO">${ip_address} = 10.30.170.12</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:13.001828" elapsed="0.000473"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:36:13.002373" elapsed="0.000042"/>
</return>
<msg time="2026-08-22T23:36:13.002617" level="INFO">${member_ip} = 10.30.170.12</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:36:13.001071" elapsed="0.001585"/>
</kw>
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:13.005085" level="INFO">${odl_connection} = 80</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:13.004449" elapsed="0.000675"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:13.009005" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:13.009420" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:13.008115" elapsed="0.001460"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:36:13.010024" elapsed="0.000678"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:13.012020" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:13.360678" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:57 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:11 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:13.011696" elapsed="0.349301"/>
</kw>
<msg time="2026-08-22T23:36:13.361231" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:13.011014" elapsed="0.350401"/>
</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-08-22T23:36:13.006651" elapsed="0.355116"/>
</kw>
<msg time="2026-08-22T23:36:13.361964" 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-08-22T23:36:13.005992" elapsed="0.356084"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:36:13.005391" elapsed="0.356845"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:36:13.362329" elapsed="0.000070"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.12 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:36:13.003905" elapsed="0.358757"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="ClusterManagement__Clean_Directories" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:13.366153" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/tmp/'.</msg>
<msg time="2026-08-22T23:36:13.378489" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:13.365745" elapsed="0.013025"/>
</kw>
<var name="${relative_path}">tmp/</var>
<status status="PASS" start="2026-08-22T23:36:13.365394" elapsed="0.013459"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:13.380268" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/data/'.</msg>
<msg time="2026-08-22T23:36:13.465270" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:13.379357" elapsed="0.086158"/>
</kw>
<var name="${relative_path}">data/</var>
<status status="PASS" start="2026-08-22T23:36:13.379046" elapsed="0.086592"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:13.467056" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/cache/'.</msg>
<msg time="2026-08-22T23:36:13.517168" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:13.466146" elapsed="0.051305"/>
</kw>
<var name="${relative_path}">cache/</var>
<status status="PASS" start="2026-08-22T23:36:13.465833" elapsed="0.051703"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:13.519047" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/snapshots/'.</msg>
<msg time="2026-08-22T23:36:13.564688" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:13.518110" elapsed="0.046822"/>
</kw>
<var name="${relative_path}">snapshots/</var>
<status status="PASS" start="2026-08-22T23:36:13.517787" elapsed="0.047226"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:13.566793" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/journal/'.</msg>
<msg time="2026-08-22T23:36:13.612686" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:13.565848" elapsed="0.047089"/>
</kw>
<var name="${relative_path}">journal/</var>
<status status="PASS" start="2026-08-22T23:36:13.565210" elapsed="0.047810"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:13.614489" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/segmented-journal/'.</msg>
<msg time="2026-08-22T23:36:13.661044" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:13.613565" elapsed="0.047722"/>
</kw>
<var name="${relative_path}">segmented-journal/</var>
<status status="PASS" start="2026-08-22T23:36:13.613216" elapsed="0.048152"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:13.662880" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/opendaylight/current/'.</msg>
<msg time="2026-08-22T23:36:13.709097" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:13.661952" elapsed="0.047406"/>
</kw>
<var name="${relative_path}">etc/opendaylight/current/</var>
<status status="PASS" start="2026-08-22T23:36:13.661624" elapsed="0.047823"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:13.711001" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/host.key'.</msg>
<msg time="2026-08-22T23:36:13.757439" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:13.710045" elapsed="0.047702"/>
</kw>
<var name="${relative_path}">etc/host.key</var>
<status status="PASS" start="2026-08-22T23:36:13.709717" elapsed="0.048114"/>
</iter>
<var>${relative_path}</var>
<value>@{relative_path_list}</value>
<status status="PASS" start="2026-08-22T23:36:13.365036" elapsed="0.392861"/>
</for>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>For each relative path, remove files with respect to /tmp/netconf-karaf-9.0.4-SNAPSHOT. Return None.</doc>
<status status="PASS" start="2026-08-22T23:36:13.364346" elapsed="0.393677"/>
</kw>
<msg time="2026-08-22T23:36:13.758245" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:13.758344" level="INFO">${result} = None</msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:13.363056" elapsed="0.395338"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:13.758814" elapsed="0.000435"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:36:13.759749" elapsed="0.000066"/>
</return>
<status status="PASS" start="2026-08-22T23:36:13.759409" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:13.759364" elapsed="0.000676"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:13.760390" elapsed="0.000051"/>
</kw>
<arg>${member_ip}</arg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:36:13.003056" elapsed="0.757649"/>
</kw>
<var name="${member_index}">2</var>
<status status="PASS" start="2026-08-22T23:36:13.000557" elapsed="0.760244"/>
</iter>
<iter>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:13.762865" level="INFO">${ip_address} = 10.30.170.79</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:13.762235" elapsed="0.000667"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:36:13.762971" elapsed="0.000041"/>
</return>
<msg time="2026-08-22T23:36:13.763184" level="INFO">${member_ip} = 10.30.170.79</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:36:13.761391" elapsed="0.001827"/>
</kw>
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:13.765450" level="INFO">${odl_connection} = 81</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:13.764919" elapsed="0.000568"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:13.769310" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:13.769755" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:13.768529" elapsed="0.001373"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:36:13.770324" elapsed="0.000786"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:13.772428" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:14.111094" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:58 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:12 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:13.772106" elapsed="0.339075"/>
</kw>
<msg time="2026-08-22T23:36:14.111277" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:13.771424" elapsed="0.339936"/>
</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-08-22T23:36:13.767194" elapsed="0.344304"/>
</kw>
<msg time="2026-08-22T23:36:14.111605" 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-08-22T23:36:13.766625" elapsed="0.345033"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:36:13.765774" elapsed="0.345958"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:36:14.111774" elapsed="0.000035"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.79 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:36:13.764391" elapsed="0.347522"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="ClusterManagement__Clean_Directories" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:14.113675" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/tmp/'.</msg>
<msg time="2026-08-22T23:36:14.126310" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:14.113243" elapsed="0.013181"/>
</kw>
<var name="${relative_path}">tmp/</var>
<status status="PASS" start="2026-08-22T23:36:14.113102" elapsed="0.013359"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:14.127536" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/data/'.</msg>
<msg time="2026-08-22T23:36:14.214013" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:14.126711" elapsed="0.087580"/>
</kw>
<var name="${relative_path}">data/</var>
<status status="PASS" start="2026-08-22T23:36:14.126548" elapsed="0.087824"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:14.215856" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/cache/'.</msg>
<msg time="2026-08-22T23:36:14.266348" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:14.214929" elapsed="0.051703"/>
</kw>
<var name="${relative_path}">cache/</var>
<status status="PASS" start="2026-08-22T23:36:14.214564" elapsed="0.052241"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:14.268267" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/snapshots/'.</msg>
<msg time="2026-08-22T23:36:14.317402" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:14.267317" elapsed="0.050399"/>
</kw>
<var name="${relative_path}">snapshots/</var>
<status status="PASS" start="2026-08-22T23:36:14.267002" elapsed="0.050802"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:14.319342" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/journal/'.</msg>
<msg time="2026-08-22T23:36:14.366458" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:14.318339" elapsed="0.048430"/>
</kw>
<var name="${relative_path}">journal/</var>
<status status="PASS" start="2026-08-22T23:36:14.318013" elapsed="0.048845"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:14.368343" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/segmented-journal/'.</msg>
<msg time="2026-08-22T23:36:14.414109" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:14.367389" elapsed="0.046992"/>
</kw>
<var name="${relative_path}">segmented-journal/</var>
<status status="PASS" start="2026-08-22T23:36:14.367064" elapsed="0.047408"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:14.416058" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/opendaylight/current/'.</msg>
<msg time="2026-08-22T23:36:14.461732" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:14.415087" elapsed="0.046903"/>
</kw>
<var name="${relative_path}">etc/opendaylight/current/</var>
<status status="PASS" start="2026-08-22T23:36:14.414755" elapsed="0.047321"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:14.463618" level="INFO">Executing command 'rm -rf /tmp/netconf-karaf-9.0.4-SNAPSHOT/etc/host.key'.</msg>
<msg time="2026-08-22T23:36:14.509961" level="INFO">Command exited with return code 0.</msg>
<arg>rm -rf ${karaf_home}${/}${relative_path}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:14.462666" elapsed="0.047561"/>
</kw>
<var name="${relative_path}">etc/host.key</var>
<status status="PASS" start="2026-08-22T23:36:14.462277" elapsed="0.048040"/>
</iter>
<var>${relative_path}</var>
<value>@{relative_path_list}</value>
<status status="PASS" start="2026-08-22T23:36:14.112962" elapsed="0.397427"/>
</for>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>For each relative path, remove files with respect to /tmp/netconf-karaf-9.0.4-SNAPSHOT. Return None.</doc>
<status status="PASS" start="2026-08-22T23:36:14.112670" elapsed="0.397860"/>
</kw>
<msg time="2026-08-22T23:36:14.510834" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:14.510936" level="INFO">${result} = None</msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:14.112087" elapsed="0.398901"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:14.511379" elapsed="0.000491"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:36:14.512334" elapsed="0.000070"/>
</return>
<status status="PASS" start="2026-08-22T23:36:14.512040" elapsed="0.000441"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:14.511992" elapsed="0.000545"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:14.512918" elapsed="0.000051"/>
</kw>
<arg>${member_ip}</arg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:36:13.763612" elapsed="0.749586"/>
</kw>
<var name="${member_index}">3</var>
<status status="PASS" start="2026-08-22T23:36:13.761005" elapsed="0.752290"/>
</iter>
<var>${member_index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:36:12.213036" elapsed="2.300326"/>
</for>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>For each index in given list (or all): activate SSH connection, run given Keyword, close active connection. Return None.
Beware that in order to avoid "got positional argument after named arguments", first two arguments in the call should not be named.</doc>
<status status="PASS" start="2026-08-22T23:36:12.210529" elapsed="2.302956"/>
</kw>
<msg time="2026-08-22T23:36:14.513577" 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-08-22T23:36:12.210027" elapsed="2.303707"/>
</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-08-22T23:36:14.520295" elapsed="0.000382"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:14.520845" elapsed="0.000167"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:14.521162" 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-08-22T23:36:14.514425" elapsed="0.006885"/>
</kw>
<arg>With_Ssh_To_List_Or_All_Run_Keyword</arg>
<arg>${member_index_list}</arg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-08-22T23:36:12.209121" elapsed="2.312248"/>
</kw>
<arg>${member_index_list}</arg>
<arg>ClusterManagement__Clean_Directories</arg>
<arg>${path_list}</arg>
<arg>${karaf_home}</arg>
<doc>Remember active ssh connection index, call With_Ssh_To_List_Or_All_Run_Keyword, return None. Restore the conection index on teardown.</doc>
<status status="PASS" start="2026-08-22T23:36:12.208612" elapsed="2.312824"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${tmp_dir}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Check_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:14.523305" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:14.522917" elapsed="0.000416"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:36:14.523821" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:36:14.523496" elapsed="0.000351"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:36:14.523892" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:36:14.524048" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:36:14.522503" elapsed="0.001570"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:14.526355" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:14.526459" 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-08-22T23:36:14.526216" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:14.528474" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:14.528009" elapsed="0.000492"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:36:14.528549" elapsed="0.000048"/>
</return>
<msg time="2026-08-22T23:36:14.528724" level="INFO">${member_ip} = 10.30.170.200</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:36:14.527686" elapsed="0.001063"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:14.533089" level="INFO">${odl_connection} = 83</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:14.532440" elapsed="0.000695"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:14.535527" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:14.535622" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:14.535245" 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-08-22T23:36:14.535808" elapsed="0.000322"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:14.537032" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:14.850178" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:56 UTC 2026

  System load:  0.08               Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:12 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:14.536682" elapsed="0.313675"/>
</kw>
<msg time="2026-08-22T23:36:14.850449" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:14.536298" elapsed="0.314257"/>
</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-08-22T23:36:14.534748" elapsed="0.315952"/>
</kw>
<msg time="2026-08-22T23:36:14.850755" 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-08-22T23:36:14.534195" elapsed="0.316613"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:36:14.533674" elapsed="0.317318"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:36:14.851202" elapsed="0.000108"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.200 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:36:14.531272" elapsed="0.320256"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:14.854275" level="INFO">Executing command 'mkdir -p '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data' &amp;&amp; rm -vrf '/tmp/netconf-karaf-9.0.4-SNAPSHOT/log' &amp;&amp; mv -vf '/tmp/log' '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/''.</msg>
<msg time="2026-08-22T23:36:14.866533" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:14.866829" level="INFO">${stdout} = renamed '/tmp/log' -&gt; '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log'</msg>
<msg time="2026-08-22T23:36:14.866929" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:36:14.867019" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:14.854063" elapsed="0.013072"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:36:14.869515" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:36:14.868855" elapsed="0.000808"/>
</kw>
<msg time="2026-08-22T23:36:14.869885" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:36:14.869985" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:14.867549" elapsed="0.002487"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:14.871457" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:14.870418" elapsed="0.001098"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:14.874065" level="INFO">renamed '/tmp/log' -&gt; '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log'</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:14.873471" elapsed="0.000698"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:14.875126" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:14.874511" elapsed="0.000714"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:14.876015" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:14.875569" elapsed="0.000506"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:36:14.872525" elapsed="0.003626"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:14.871753" elapsed="0.004447"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:14.871700" elapsed="0.004538"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:36:14.876460" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:14.876321" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:14.876296" elapsed="0.000255"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:14.876772" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:36:14.876647" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:14.876624" elapsed="0.000263"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:14.877093" elapsed="0.000031"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:36:14.853414" elapsed="0.023910"/>
</kw>
<msg time="2026-08-22T23:36:14.877528" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:14.877724" level="INFO">${result} = renamed '/tmp/log' -&gt; '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log'</msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:14.852054" elapsed="0.025758"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:14.878172" elapsed="0.000711"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:36:14.879446" elapsed="0.000102"/>
</return>
<status status="PASS" start="2026-08-22T23:36:14.879114" elapsed="0.000581"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:14.879064" elapsed="0.000688"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:14.880016" elapsed="0.000068"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:36:14.529439" elapsed="0.350938"/>
</kw>
<msg time="2026-08-22T23:36:14.880463" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:14.528905" elapsed="0.351629"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:36:14.527152" elapsed="0.353552"/>
</kw>
<msg time="2026-08-22T23:36:14.880764" 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-08-22T23:36:14.526687" elapsed="0.354142"/>
</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-08-22T23:36:14.884951" elapsed="0.000314"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:14.885432" elapsed="0.000188"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:14.885772" 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-08-22T23:36:14.881254" elapsed="0.004668"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:36:14.525577" elapsed="0.360404"/>
</kw>
<msg time="2026-08-22T23:36:14.886039" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:14.525130" elapsed="0.360960"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:36:14.524417" elapsed="0.361763"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:36:14.524262" elapsed="0.361965"/>
</iter>
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:14.888500" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:14.888619" 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-08-22T23:36:14.888357" elapsed="0.000289"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:14.890627" level="INFO">${ip_address} = 10.30.170.12</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:14.890141" elapsed="0.000514"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:36:14.890703" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:36:14.890855" level="INFO">${member_ip} = 10.30.170.12</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:36:14.889815" elapsed="0.001065"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:14.895104" level="INFO">${odl_connection} = 85</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:14.894450" elapsed="0.000754"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:14.897534" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:14.897628" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:14.897267" 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-08-22T23:36:14.897811" elapsed="0.000322"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:14.899018" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:15.217256" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:57 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:13 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:14.898692" elapsed="0.318744"/>
</kw>
<msg time="2026-08-22T23:36:15.217527" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:14.898302" elapsed="0.319332"/>
</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-08-22T23:36:14.896778" elapsed="0.320975"/>
</kw>
<msg time="2026-08-22T23:36:15.217890" 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-08-22T23:36:14.896251" elapsed="0.321693"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:36:14.895739" elapsed="0.322368"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:36:15.218262" elapsed="0.000095"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.12 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:36:14.893175" elapsed="0.325392"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:15.221096" level="INFO">Executing command 'mkdir -p '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data' &amp;&amp; rm -vrf '/tmp/netconf-karaf-9.0.4-SNAPSHOT/log' &amp;&amp; mv -vf '/tmp/log' '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/''.</msg>
<msg time="2026-08-22T23:36:15.233405" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:15.233705" level="INFO">${stdout} = renamed '/tmp/log' -&gt; '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log'</msg>
<msg time="2026-08-22T23:36:15.233816" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:36:15.233907" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:15.220890" elapsed="0.013067"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:36:15.236295" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:36:15.235164" elapsed="0.001235"/>
</kw>
<msg time="2026-08-22T23:36:15.236646" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:36:15.236749" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:15.234356" elapsed="0.002443"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:15.238174" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:15.237179" elapsed="0.001053"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:15.240412" level="INFO">renamed '/tmp/log' -&gt; '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log'</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:15.240064" elapsed="0.000412"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:15.241052" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:15.240715" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:15.241672" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:15.241321" elapsed="0.000412"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:36:15.239210" elapsed="0.002599"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:15.238415" elapsed="0.003443"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:15.238367" elapsed="0.003528"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:36:15.242114" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:15.241974" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:15.241950" elapsed="0.000256"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:15.242399" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:36:15.242277" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:15.242256" elapsed="0.000254"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:15.242734" elapsed="0.000032"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:36:15.220278" elapsed="0.022688"/>
</kw>
<msg time="2026-08-22T23:36:15.243166" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:15.243325" level="INFO">${result} = renamed '/tmp/log' -&gt; '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log'</msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:15.218963" elapsed="0.024447"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:15.243897" elapsed="0.000723"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:36:15.245144" elapsed="0.000101"/>
</return>
<status status="PASS" start="2026-08-22T23:36:15.244820" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:15.244791" elapsed="0.000626"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:15.245709" elapsed="0.000072"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:36:14.891622" elapsed="0.354453"/>
</kw>
<msg time="2026-08-22T23:36:15.246158" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:14.891037" elapsed="0.355192"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:36:14.889267" elapsed="0.357138"/>
</kw>
<msg time="2026-08-22T23:36:15.246463" 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-08-22T23:36:14.888800" elapsed="0.357727"/>
</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-08-22T23:36:15.250207" elapsed="0.000309"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:15.250699" elapsed="0.000169"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:15.251020" 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-08-22T23:36:15.247003" elapsed="0.004164"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:36:14.887729" elapsed="0.363498"/>
</kw>
<msg time="2026-08-22T23:36:15.251282" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:14.887264" elapsed="0.364068"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:36:14.886499" elapsed="0.364918"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:36:14.886337" elapsed="0.365126"/>
</iter>
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:15.253715" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:15.253818" 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-08-22T23:36:15.253556" elapsed="0.000288"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:15.255899" level="INFO">${ip_address} = 10.30.170.79</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:15.255325" elapsed="0.000602"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:36:15.255976" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:36:15.256127" level="INFO">${member_ip} = 10.30.170.79</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:36:15.254998" elapsed="0.001154"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:15.260517" level="INFO">${odl_connection} = 87</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:15.259790" elapsed="0.000774"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:15.262903" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:15.262982" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:15.262637" elapsed="0.000370"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:15.263165" elapsed="0.000320"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:15.264486" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:15.609295" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:58 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:14 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:15.264159" elapsed="0.345503"/>
</kw>
<msg time="2026-08-22T23:36:15.609759" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:15.263768" elapsed="0.346102"/>
</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-08-22T23:36:15.262133" elapsed="0.347872"/>
</kw>
<msg time="2026-08-22T23:36:15.610060" 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-08-22T23:36:15.261733" elapsed="0.348379"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:36:15.261108" elapsed="0.349175"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:36:15.610441" elapsed="0.000103"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.79 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:36:15.258434" elapsed="0.352345"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:15.613403" level="INFO">Executing command 'mkdir -p '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data' &amp;&amp; rm -vrf '/tmp/netconf-karaf-9.0.4-SNAPSHOT/log' &amp;&amp; mv -vf '/tmp/log' '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/''.</msg>
<msg time="2026-08-22T23:36:15.626113" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:15.626376" level="INFO">${stdout} = renamed '/tmp/log' -&gt; '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log'</msg>
<msg time="2026-08-22T23:36:15.626479" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:36:15.626569" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:15.613195" elapsed="0.013470"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:36:15.629044" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:36:15.627870" elapsed="0.001283"/>
</kw>
<msg time="2026-08-22T23:36:15.629373" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:36:15.629472" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:15.627066" elapsed="0.002458"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:15.630946" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:15.629940" elapsed="0.001065"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:15.633545" level="INFO">renamed '/tmp/log' -&gt; '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log'</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:15.632991" elapsed="0.000692"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:15.634563" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:15.634029" elapsed="0.000661"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:15.635560" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:15.635034" elapsed="0.000658"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:36:15.631989" elapsed="0.003823"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:15.631193" elapsed="0.004697"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:15.631142" elapsed="0.004808"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:36:15.636352" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:15.636125" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:15.636082" elapsed="0.000416"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:15.636846" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-08-22T23:36:15.636648" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:15.636611" elapsed="0.000322"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:15.637080" elapsed="0.000022"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:36:15.612560" elapsed="0.024687"/>
</kw>
<msg time="2026-08-22T23:36:15.637391" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:15.637505" level="INFO">${result} = renamed '/tmp/log' -&gt; '/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log'</msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:15.611179" elapsed="0.026386"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:15.637848" elapsed="0.000509"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:36:15.638753" elapsed="0.000073"/>
</return>
<status status="PASS" start="2026-08-22T23:36:15.638497" elapsed="0.000410"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:15.638477" elapsed="0.000469"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:15.639134" elapsed="0.000051"/>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="PASS" start="2026-08-22T23:36:15.256855" elapsed="0.382537"/>
</kw>
<msg time="2026-08-22T23:36:15.639492" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:15.256308" elapsed="0.383237"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="PASS" start="2026-08-22T23:36:15.254459" elapsed="0.385201"/>
</kw>
<msg time="2026-08-22T23:36:15.639703" 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-08-22T23:36:15.253997" elapsed="0.385753"/>
</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-08-22T23:36:15.643035" elapsed="0.000314"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:15.643516" elapsed="0.000188"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:15.643860" 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-08-22T23:36:15.640070" elapsed="0.003937"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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-08-22T23:36:15.252937" elapsed="0.391156"/>
</kw>
<msg time="2026-08-22T23:36:15.644149" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:15.252467" elapsed="0.391733"/>
</kw>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="PASS" start="2026-08-22T23:36:15.251771" elapsed="0.392515"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:36:15.251606" elapsed="0.392725"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:36:14.524128" elapsed="1.120243"/>
</for>
<arg>mkdir -p '${karaf_home}/data' &amp;&amp; rm -vrf '${karaf_home}/log' &amp;&amp; mv -vf '${tmp_dir}/log' '${karaf_home}/data/'</arg>
<arg>${member_index_list}</arg>
<doc>Cycle through indices (or all), run bash command on each, using temporary SSH session and restoring the previously active one.</doc>
<status status="PASS" start="2026-08-22T23:36:14.521889" elapsed="1.122547"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:14.521569" elapsed="1.122905"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:14.521549" elapsed="1.122951"/>
</if>
<arg>tmp_dir=/tmp</arg>
<doc>Clear @{directory_list} or ['tmp/', 'data/', 'cache/', 'snapshots/', 'journal/', 'segmented-journal/', 'etc/opendaylight/current/', 'etc/host.key'] for members in given list or all. Return None.
If ${tmp_dir} is nonempty, use that location to preserve data/log/.
This is intended to return Karaf (offline) to the state it was upon the first boot.</doc>
<status status="PASS" start="2026-08-22T23:36:11.044440" elapsed="4.600111"/>
</kw>
<doc>Comment out the flag usage in config file. Also clean most data except data/log/.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-08-22T23:36:06.535222" elapsed="9.109473"/>
</test>
<test id="s1-s5-t3" name="Start_All_And_Sync" line="40">
<kw name="Start_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:15.658400" level="INFO">${base_command} = /tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/start</msg>
<var>${base_command}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/bin/start</arg>
<arg>${NODE_START_COMMAND}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:15.658021" elapsed="0.000406"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:15.658974" level="INFO">${command} = /tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/start</msg>
<var>${command}</var>
<arg>"""${export_java_home}""" != ""</arg>
<arg>export JAVA_HOME="${export_java_home}"; ${base_command}</arg>
<arg>${base_command}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:15.658611" elapsed="0.000389"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-08-22T23:36:15.659431" level="INFO">${epoch} = 1787441775.65936</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-08-22T23:36:15.659168" elapsed="0.000289"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:15.660037" level="INFO">${gc_filepath} = /tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log/gc_1787441775.65936.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-08-22T23:36:15.659640" elapsed="0.000492"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:15.660718" level="INFO">${gc_options} = -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log/gc_1787441775.65936.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-08-22T23:36:15.660318" elapsed="0.000428"/>
</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-08-22T23:36:15.662292" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:15.661915" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:36:15.662808" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:36:15.662479" elapsed="0.000357"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:36:15.662882" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:36:15.663037" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:36:15.661528" elapsed="0.001534"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:15.664168" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:36:15.663860" elapsed="0.000337"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:15.664987" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:15.665086" 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-08-22T23:36:15.664845" 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-08-22T23:36:15.667997" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:15.667711" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:15.667692" elapsed="0.000457"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:15.668445" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:36:15.668307" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:15.669809" level="INFO">Attempting to execute command "/tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/start -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log/gc_1787441775.65936.log" on remote system "10.30.170.200" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:15.668746" elapsed="0.001171"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:15.671238" level="INFO">${conn_id} = 89</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:15.670268" elapsed="0.001028"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:15.673627" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:15.673762" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:15.673055" elapsed="0.000732"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:36:15.673975" elapsed="0.000723"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:15.677107" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:16.025539" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:56 UTC 2026

  System load:  0.08               Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:14 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:15.676494" elapsed="0.349245"/>
</kw>
<msg time="2026-08-22T23:36:16.025856" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:15.674937" elapsed="0.351151"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:36:15.671822" elapsed="0.354427"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:16.026688" level="INFO">Executing command '/tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/start -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log/gc_1787441775.65936.log'.</msg>
<msg time="2026-08-22T23:36:16.049717" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:16.049966" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:36:16.050065" 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-08-22T23:36:16.026443" elapsed="0.023672"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:16.050480" elapsed="0.000499"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:16.052051" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:16.051374" elapsed="0.000771"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:16.052672" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:16.052309" elapsed="0.000476"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:16.052260" elapsed="0.000576"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:16.053192" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-08-22T23:36:16.052954" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:16.052920" elapsed="0.000456"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:16.053450" 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-08-22T23:36:16.073151" elapsed="0.000611"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:16.073932" elapsed="0.000161"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:16.074243" 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-08-22T23:36:16.054162" elapsed="0.020232"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:36:15.667164" elapsed="0.407322"/>
</kw>
<msg time="2026-08-22T23:36:16.074539" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:15.666561" elapsed="0.408045"/>
</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-08-22T23:36:15.666023" elapsed="0.408664"/>
</kw>
<msg time="2026-08-22T23:36:16.074728" 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-08-22T23:36:15.665265" elapsed="0.409507"/>
</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-08-22T23:36:16.077856" elapsed="0.000312"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:16.078336" elapsed="0.000146"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:16.078648" 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-08-22T23:36:16.075062" elapsed="0.003738"/>
</kw>
<msg time="2026-08-22T23:36:16.078892" 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-08-22T23:36:15.664423" elapsed="0.414495"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:16.079348" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:16.079100" elapsed="0.000289"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:36:16.079432" 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-08-22T23:36:15.663439" elapsed="0.416117"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:36:15.663260" elapsed="0.416348"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:16.080603" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:36:16.080296" elapsed="0.000338"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:16.081444" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:16.081545" 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-08-22T23:36:16.081307" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:16.084211" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:16.083940" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:16.083920" elapsed="0.000373"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:16.084612" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:36:16.084443" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:16.085364" level="INFO">Attempting to execute command "/tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/start -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log/gc_1787441775.65936.log" on remote system "10.30.170.12" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:16.084898" elapsed="0.000515"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:16.086014" level="INFO">${conn_id} = 92</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:16.085573" elapsed="0.000467"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:16.087237" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:16.087365" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:16.086708" elapsed="0.000682"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:36:16.087602" elapsed="0.000667"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:16.090602" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:16.415526" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:57 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:15 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:16.090018" elapsed="0.325790"/>
</kw>
<msg time="2026-08-22T23:36:16.415962" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:16.088501" elapsed="0.327654"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:36:16.086257" elapsed="0.330095"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:16.417003" level="INFO">Executing command '/tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/start -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log/gc_1787441775.65936.log'.</msg>
<msg time="2026-08-22T23:36:16.439646" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:16.439898" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:36:16.439995" 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-08-22T23:36:16.416662" elapsed="0.023384"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:16.440418" elapsed="0.000489"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:16.442091" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:16.441367" elapsed="0.000819"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:16.442793" elapsed="0.000043"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:16.442367" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:16.442312" elapsed="0.000653"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:16.443325" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-08-22T23:36:16.443086" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:16.443052" elapsed="0.000623"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:16.443766" 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-08-22T23:36:16.461736" elapsed="0.000548"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:16.462455" elapsed="0.000194"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:16.462801" 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-08-22T23:36:16.444555" elapsed="0.018403"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:36:16.083389" elapsed="0.379664"/>
</kw>
<msg time="2026-08-22T23:36:16.463110" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:16.082805" elapsed="0.380361"/>
</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-08-22T23:36:16.082257" elapsed="0.380994"/>
</kw>
<msg time="2026-08-22T23:36:16.463294" 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-08-22T23:36:16.081746" elapsed="0.381596"/>
</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-08-22T23:36:16.466646" 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-08-22T23:36:16.467127" elapsed="0.000148"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:16.467426" 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-08-22T23:36:16.463670" elapsed="0.003929"/>
</kw>
<msg time="2026-08-22T23:36:16.467701" 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-08-22T23:36:16.080856" elapsed="0.386872"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:16.468168" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:16.467912" elapsed="0.000298"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:36:16.468253" 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-08-22T23:36:16.079890" elapsed="0.388489"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:36:16.079705" elapsed="0.388714"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:16.469496" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:36:16.469216" elapsed="0.000307"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:16.470405" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:16.470508" 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-08-22T23:36:16.470260" elapsed="0.000274"/>
</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-08-22T23:36:16.473486" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:16.473210" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:16.473190" elapsed="0.000378"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:16.473891" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:36:16.473740" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:16.474688" level="INFO">Attempting to execute command "/tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/start -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log/gc_1787441775.65936.log" on remote system "10.30.170.79" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:16.474194" elapsed="0.000581"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:16.475371" level="INFO">${conn_id} = 95</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:16.474936" elapsed="0.000461"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:16.476654" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:16.476787" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:16.476074" elapsed="0.000738"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:36:16.477003" elapsed="0.000724"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:16.479936" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:16.811521" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:58 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:15 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:16.479338" elapsed="0.332454"/>
</kw>
<msg time="2026-08-22T23:36:16.811927" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:16.477964" elapsed="0.334145"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:36:16.475633" elapsed="0.336657"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:16.812862" level="INFO">Executing command '/tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/start -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log/gc_1787441775.65936.log'.</msg>
<msg time="2026-08-22T23:36:16.835488" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:16.835771" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:36:16.835870" 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-08-22T23:36:16.812554" elapsed="0.023368"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:16.836288" elapsed="0.000503"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:16.837983" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:16.837235" elapsed="0.000843"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:16.838559" elapsed="0.000082"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:16.838256" elapsed="0.000460"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:16.838200" elapsed="0.000570"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:16.839133" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-08-22T23:36:16.838894" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:16.838859" elapsed="0.000457"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:16.839391" 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-08-22T23:36:16.856921" elapsed="0.000523"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:16.857664" elapsed="0.000170"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:16.857984" 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-08-22T23:36:16.840160" elapsed="0.017974"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:36:16.472658" elapsed="0.385568"/>
</kw>
<msg time="2026-08-22T23:36:16.858280" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:16.472030" elapsed="0.386303"/>
</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-08-22T23:36:16.471222" elapsed="0.387190"/>
</kw>
<msg time="2026-08-22T23:36:16.858514" 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-08-22T23:36:16.470709" elapsed="0.387855"/>
</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-08-22T23:36:16.861837" elapsed="0.000307"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:16.862308" elapsed="0.000144"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:16.862618" 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-08-22T23:36:16.858880" elapsed="0.003890"/>
</kw>
<msg time="2026-08-22T23:36:16.862863" 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-08-22T23:36:16.469840" elapsed="0.393050"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:16.863318" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:16.863073" elapsed="0.000286"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:36:16.863407" 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-08-22T23:36:16.468764" elapsed="0.394767"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:36:16.468529" elapsed="0.395040"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:36:15.663120" elapsed="1.200516"/>
</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-08-22T23:36:15.661007" elapsed="1.202696"/>
</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-08-22T23:36:16.875861" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:16.875438" elapsed="0.000452"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:36:16.876357" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:36:16.876053" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:36:16.876428" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:16.876602" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:36:16.875058" elapsed="0.001571"/>
</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-08-22T23:36:16.878179" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:16.877879" elapsed="0.000326"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:36:16.878251" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:16.878401" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-08-22T23:36:16.877495" elapsed="0.000931"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:16.886668" 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-08-22T23:36:16.886391" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:16.887119" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:16.886872" 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-08-22T23:36:16.893099" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', 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-08-22T23:36:16.889425" elapsed="0.005509">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-08-22T23:36:16.887233" elapsed="0.007796">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', 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-08-22T23:36:16.895229" elapsed="0.000090"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:16.895066" elapsed="0.000300"/>
</branch>
<status status="FAIL" start="2026-08-22T23:36:16.887214" elapsed="0.008177">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', 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-08-22T23:36:16.895985" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:36:16.896131" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:16.896090" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:36:16.896072" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:16.896348" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:36:16.896418" 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-08-22T23:36:16.881821" elapsed="0.014716">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', 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-08-22T23:36:16.896628" 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-08-22T23:36:16.878653" elapsed="0.018079">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', 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-08-22T23:36:16.896963" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-08-22T23:36:16.897091" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:16.897054" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:36:16.897037" 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-08-22T23:36:16.897350" elapsed="0.000023"/>
</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-08-22T23:36:16.897627" elapsed="0.000026"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="NOT RUN" start="2026-08-22T23:36:16.897698" 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-08-22T23:36:16.877118" elapsed="0.020686">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', 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-08-22T23:36:16.897929" elapsed="0.000022"/>
</continue>
<status status="NOT RUN" start="2026-08-22T23:36:16.897885" elapsed="0.000093"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:36:16.897868" elapsed="0.000131"/>
</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-08-22T23:36:16.898146" elapsed="0.000022"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-08-22T23:36:16.876883" elapsed="0.021335">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', 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-08-22T23:36:16.876687" elapsed="0.021595">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', 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-08-22T23:36:16.874649" elapsed="0.023733">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-08-22T23:36:16.874303" elapsed="0.024137">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<status status="FAIL" start="2026-08-22T23:36:16.874283" elapsed="0.024221">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', 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-08-22T23:36:16.898847" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:16.898634" elapsed="0.000267"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:36:16.898560" elapsed="0.000365"/>
</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-08-22T23:36:16.899194" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:16.898980" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:36:16.898964" elapsed="0.000309"/>
</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-08-22T23:36:16.873882" elapsed="0.025471">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', 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-08-22T23:36:26.917955" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:26.917452" elapsed="0.000537"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:36:26.918481" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:36:26.918167" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:36:26.918556" elapsed="0.000055"/>
</return>
<msg time="2026-08-22T23:36:26.918768" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:36:26.917039" elapsed="0.001757"/>
</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-08-22T23:36:26.920368" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:26.920060" elapsed="0.000335"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:36:26.920444" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:36:26.920615" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-08-22T23:36:26.919697" elapsed="0.000944"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:26.928481" 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-08-22T23:36:26.928207" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:26.928956" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:26.928706" 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-08-22T23:36:27.021528" level="INFO">GET Request : url=http://10.30.170.200: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:36:27.021757" level="INFO">GET Response : url=http://10.30.170.200: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-08-22T23:36:27.022258" level="FAIL">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.200: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-08-22T23:36:26.931222" elapsed="0.091928">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.200:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<status status="FAIL" start="2026-08-22T23:36:26.929069" elapsed="0.094372">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.200: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-08-22T23:36:27.023997" elapsed="0.000128"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:27.023525" elapsed="0.000705"/>
</branch>
<status status="FAIL" start="2026-08-22T23:36:26.929050" elapsed="0.095238">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.200: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-08-22T23:36:27.025565" elapsed="0.000102"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:36:27.025926" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:27.025837" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:36:27.025795" 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-08-22T23:36:27.026407" elapsed="0.000050"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:36:27.026568" elapsed="0.000074"/>
</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-08-22T23:36:26.923460" elapsed="0.103401">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.200: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-08-22T23:36:27.027024" elapsed="0.000035"/>
</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-08-22T23:36:26.920867" elapsed="0.106381">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.200: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-08-22T23:36:27.027918" elapsed="0.000067"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-08-22T23:36:27.028155" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:27.028116" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:36:27.028098" elapsed="0.000122"/>
</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-08-22T23:36:27.028428" elapsed="0.000025"/>
</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-08-22T23:36:27.028683" elapsed="0.000025"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="NOT RUN" start="2026-08-22T23:36:27.028754" 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-08-22T23:36:26.919280" elapsed="0.109577">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.200: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-08-22T23:36:27.028979" elapsed="0.000017"/>
</continue>
<status status="NOT RUN" start="2026-08-22T23:36:27.028938" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:36:27.028921" elapsed="0.000123"/>
</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-08-22T23:36:27.029189" elapsed="0.000022"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-08-22T23:36:26.919047" elapsed="0.110215">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.200: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-08-22T23:36:26.918856" elapsed="0.110466">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.200: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-08-22T23:36:26.916606" elapsed="0.112813">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.200:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<status status="FAIL" start="2026-08-22T23:36:26.916231" elapsed="0.113247">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.200:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</branch>
<status status="FAIL" start="2026-08-22T23:36:26.916203" elapsed="0.113304">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.200: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-08-22T23:36:27.029795" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:27.029575" elapsed="0.000306"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:36:27.029558" 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-08-22T23:36:27.030182" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:27.029964" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:36:27.029948" elapsed="0.000314"/>
</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-08-22T23:36:26.915483" elapsed="0.114861">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.200: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-08-22T23:36:37.047927" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:37.047449" elapsed="0.000512"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.048456" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:36:37.048136" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:36:37.048533" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:36:37.048720" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:36:37.047010" elapsed="0.001735"/>
</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-08-22T23:36:37.050552" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:37.050243" elapsed="0.000352"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:36:37.050644" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:36:37.050797" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-08-22T23:36:37.049884" elapsed="0.000940"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.058383" 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-08-22T23:36:37.058119" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.058849" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:37.058602" 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-08-22T23:36:37.363953" level="INFO">GET Request : url=http://10.30.170.200: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:36:37.364151" level="INFO">GET Response : url=http://10.30.170.200: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': 'Sat, 22 Aug 2026 23:36:37 GMT', 'Expires': 'Sat, 22 Aug 2026 22:36:37 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787441797,"status":200} 
 </msg>
<msg time="2026-08-22T23:36:37.364432" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:36:37.061103" elapsed="0.303391"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:37.058960" elapsed="0.305680"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:37.365122" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:37.364711" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:37.058941" elapsed="0.306379"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.373955" 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787441797,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:37.368233" elapsed="0.005861"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:37.367658" elapsed="0.006703"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:37.367555" elapsed="0.006851"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.378746" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:37.374870" elapsed="0.004012"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:37.374490" elapsed="0.004555"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:37.374465" elapsed="0.004619"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.380212" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:37.379347" 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-08-22T23:36:37.380718" elapsed="0.000095"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:37.380369" elapsed="0.000609"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.381827" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:37.381180" elapsed="0.000732"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:37.381006" elapsed="0.001062"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:37.380337" elapsed="0.001756"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.382825" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:37.382261" 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-08-22T23:36:37.383187" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:37.382923" elapsed="0.000455"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.384263" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:37.383647" elapsed="0.000702"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:37.383411" elapsed="0.001097"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:37.382905" elapsed="0.001628"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:37.384718" elapsed="0.000729"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:36:37.386564" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:37.385688" elapsed="0.000969"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:36:37.386819" elapsed="0.003217"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:36:37.366551" elapsed="0.023551"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:36:37.390291" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:37.390171" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:37.390152" elapsed="0.000208"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:36:37.393329" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787441797,...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:36:37.390507" elapsed="0.002852"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:36:37.393411" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:36:37.393594" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787441797,...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:36:37.053609" elapsed="0.340015"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:36:37.393681" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:36:37.393833" level="INFO">${conf_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787441797,...</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-08-22T23:36:37.051038" elapsed="0.342823"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.394734" level="INFO">{
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787441797,
 "value": {
  "LocalShards": [
   "member-1-shard-default-config",
   "member-1-shard-inventory-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-08-22T23:36:37.394437" elapsed="0.000345"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.395835" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787441797, '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-08-22T23:36:37.395379" elapsed="0.000485"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-08-22T23:36:37.395913" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:37.396074" level="INFO">${manager_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787441797, '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-08-22T23:36:37.395035" elapsed="0.001066"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:37.396483" level="INFO">${value_object} = {'LocalShards': ['member-1-shard-default-config', 'member-1-shard-inventory-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-08-22T23:36:37.396259" elapsed="0.000251"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:37.396910" 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-08-22T23:36:37.396687" elapsed="0.000249"/>
</kw>
<return>
<value>${sync_status}</value>
<status status="PASS" start="2026-08-22T23:36:37.396984" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:37.397136" 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-08-22T23:36:37.394079" elapsed="0.003082"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-08-22T23:36:37.397338" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:37.397229" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:37.397211" 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-08-22T23:36:37.405052" 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-08-22T23:36:37.404800" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.405500" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:37.405253" 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-08-22T23:36:37.414390" level="INFO">GET Request : url=http://10.30.170.200: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:36:37.414477" level="INFO">GET Response : url=http://10.30.170.200: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': 'Sat, 22 Aug 2026 23:36:37 GMT', 'Expires': 'Sat, 22 Aug 2026 22:36:37 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787441797,"status":200} 
 </msg>
<msg time="2026-08-22T23:36:37.414610" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:36:37.407764" elapsed="0.006875"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:37.405627" elapsed="0.009055"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:37.414864" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:37.414707" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:37.405608" elapsed="0.009343"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.418903" 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787441797,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:37.416216" elapsed="0.002785"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:37.415969" elapsed="0.003151"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:37.415951" elapsed="0.003197"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.422985" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:37.419451" elapsed="0.003668"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:37.419206" elapsed="0.004073"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:37.419189" elapsed="0.004129"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.424365" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:37.423550" elapsed="0.000853"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:37.424953" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:37.424548" elapsed="0.000660"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.426339" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:37.425486" elapsed="0.000973"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:37.425247" elapsed="0.001470"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:37.424521" elapsed="0.002232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.427783" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:37.426985" 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-08-22T23:36:37.428289" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:37.427922" elapsed="0.000583"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.429311" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:37.428735" elapsed="0.000660"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:37.428533" elapsed="0.001018"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:37.427896" 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-08-22T23:36:37.429750" elapsed="0.000682"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:36:37.431488" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:37.430664" elapsed="0.000852"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:36:37.431746" elapsed="0.003192"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:36:37.415471" elapsed="0.019533"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:36:37.435181" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:37.435073" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:37.435055" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:36:37.438170" 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-08-22T23:36:37.435392" elapsed="0.002807"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:36:37.438251" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:36:37.438408" 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-08-22T23:36:37.400290" elapsed="0.038144"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:36:37.438490" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:36:37.438686" 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-08-22T23:36:37.397624" elapsed="0.041089"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.439527" level="INFO">{
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787441797,
 "value": {
  "LocalShards": [
   "member-1-shard-default-operational",
   "member-1-shard-inventory-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-08-22T23:36:37.439276" elapsed="0.000297"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.440547" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787441797, ...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:37.440158" elapsed="0.000416"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-08-22T23:36:37.440645" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:36:37.440813" level="INFO">${manager_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787441797, ...</msg>
<var>${manager_object}</var>
<arg>${shard_manager_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-08-22T23:36:37.439811" elapsed="0.001060"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:37.441288" level="INFO">${value_object} = {'LocalShards': ['member-1-shard-default-operational', 'member-1-shard-inventory-operational', 'member-1-shard-topology-operational'], '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-08-22T23:36:37.441028" elapsed="0.000288"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:37.441704" 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-08-22T23:36:37.441474" elapsed="0.000255"/>
</kw>
<return>
<value>${sync_status}</value>
<status status="PASS" start="2026-08-22T23:36:37.441776" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:36:37.441948" 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-08-22T23:36:37.438923" elapsed="0.003061"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="PASS" start="2026-08-22T23:36:37.442037" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:36:37.442190" 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-08-22T23:36:37.049219" elapsed="0.392996"/>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="PASS" start="2026-08-22T23:36:37.442398" elapsed="0.000034"/>
</continue>
<status status="PASS" start="2026-08-22T23:36:37.442284" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:37.442267" elapsed="0.000221"/>
</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-08-22T23:36:37.442653" elapsed="0.000023"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:36:37.048986" elapsed="0.393725"/>
</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-08-22T23:36:37.444153" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:37.443855" elapsed="0.000324"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:36:37.444224" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:37.444371" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-08-22T23:36:37.443462" elapsed="0.000933"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.451974" 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-08-22T23:36:37.451724" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.452414" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:37.452174" 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-08-22T23:36:37.773075" level="INFO">GET Request : url=http://10.30.170.12: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:36:37.773270" level="INFO">GET Response : url=http://10.30.170.12: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': 'Sat, 22 Aug 2026 23:36:37 GMT', 'Expires': 'Sat, 22 Aug 2026 22:36:37 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787441797,"status":200} 
 </msg>
<msg time="2026-08-22T23:36:37.773556" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:36:37.454653" elapsed="0.319005"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:37.452524" elapsed="0.321247"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:37.774241" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:37.773835" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:37.452505" elapsed="0.321934"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.780990" 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787441797,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:37.777050" elapsed="0.004082"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:37.776688" elapsed="0.004612"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:37.776659" elapsed="0.004680"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.785375" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:37.781823" elapsed="0.003648"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:37.781421" elapsed="0.004320"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:37.781396" elapsed="0.004378"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.786562" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:37.785969" 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-08-22T23:36:37.786950" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:37.786679" elapsed="0.000458"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.787988" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:37.787334" elapsed="0.000740"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:37.787164" elapsed="0.001072"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:37.786660" elapsed="0.001600"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.788982" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:37.788428" 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-08-22T23:36:37.789375" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:37.789080" elapsed="0.000489"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.790393" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:37.789792" elapsed="0.000689"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:37.789621" elapsed="0.001085"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:37.789062" elapsed="0.001670"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:37.791015" elapsed="0.000770"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:36:37.792915" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:37.791996" 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-08-22T23:36:37.793134" elapsed="0.005086"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:36:37.775790" elapsed="0.022498"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:36:37.798471" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:37.798358" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:37.798339" elapsed="0.000201"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:36:37.801473" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787441797,...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:36:37.798728" elapsed="0.002775"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:36:37.801556" elapsed="0.000088"/>
</return>
<msg time="2026-08-22T23:36:37.801778" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787441797,...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:36:37.447260" elapsed="0.354544"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:36:37.801861" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:36:37.802009" level="INFO">${conf_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787441797,...</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-08-22T23:36:37.444617" elapsed="0.357418"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.802884" level="INFO">{
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787441797,
 "value": {
  "LocalShards": [
   "member-1-shard-default-config",
   "member-1-shard-inventory-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-08-22T23:36:37.802625" elapsed="0.000308"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.803931" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787441797, '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-08-22T23:36:37.803483" elapsed="0.000478"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-08-22T23:36:37.804046" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:36:37.804209" level="INFO">${manager_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787441797, '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-08-22T23:36:37.803144" elapsed="0.001091"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:37.804635" level="INFO">${value_object} = {'LocalShards': ['member-1-shard-default-config', 'member-1-shard-inventory-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-08-22T23:36:37.804391" elapsed="0.000272"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:37.805029" 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-08-22T23:36:37.804818" elapsed="0.000236"/>
</kw>
<return>
<value>${sync_status}</value>
<status status="PASS" start="2026-08-22T23:36:37.805101" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:37.805250" 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-08-22T23:36:37.802250" elapsed="0.003025"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-08-22T23:36:37.805451" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:37.805342" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:37.805325" elapsed="0.000190"/>
</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-08-22T23:36:37.813003" 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-08-22T23:36:37.812754" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.813447" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:37.813203" 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-08-22T23:36:37.823110" level="INFO">GET Request : url=http://10.30.170.12: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:36:37.823218" level="INFO">GET Response : url=http://10.30.170.12: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': 'Sat, 22 Aug 2026 23:36:37 GMT', 'Expires': 'Sat, 22 Aug 2026 22:36:37 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787441797,"status":200} 
 </msg>
<msg time="2026-08-22T23:36:37.823376" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:36:37.815840" elapsed="0.007572"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:37.813557" elapsed="0.009915"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:37.823785" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:37.823509" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:37.813539" elapsed="0.010388"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.829396" 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787441797,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:37.825623" elapsed="0.003910"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:37.825245" elapsed="0.004487"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:37.825219" elapsed="0.004552"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.834158" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:37.830198" elapsed="0.004092"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:37.829853" elapsed="0.004594"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:37.829829" elapsed="0.004657"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.835498" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:37.834749" elapsed="0.000787"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:37.836072" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:37.835670" elapsed="0.000658"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.837206" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:37.836535" elapsed="0.000755"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:37.836367" elapsed="0.001106"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:37.835643" elapsed="0.001859"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.838246" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:37.837699" 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-08-22T23:36:37.838665" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:37.838344" elapsed="0.000509"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.839677" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:37.839050" elapsed="0.000709"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:37.838881" elapsed="0.001032"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:37.838325" 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-08-22T23:36:37.840110" elapsed="0.000703"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:36:37.841883" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:37.840981" elapsed="0.000929"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:36:37.842066" elapsed="0.003183"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:36:37.824652" elapsed="0.020661"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:36:37.845492" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:37.845383" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:37.845364" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:36:37.848439" 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-08-22T23:36:37.845731" elapsed="0.002737"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:36:37.848521" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:36:37.848739" 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-08-22T23:36:37.808249" elapsed="0.040518"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:36:37.848825" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:36:37.848973" 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-08-22T23:36:37.805733" elapsed="0.043267"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.849834" level="INFO">{
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787441797,
 "value": {
  "LocalShards": [
   "member-1-shard-default-operational",
   "member-1-shard-inventory-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-08-22T23:36:37.849561" elapsed="0.000322"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.850904" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787441797, ...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:37.850483" elapsed="0.000449"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-08-22T23:36:37.850981" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:37.851139" level="INFO">${manager_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787441797, ...</msg>
<var>${manager_object}</var>
<arg>${shard_manager_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-08-22T23:36:37.850138" elapsed="0.001026"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:37.851537" level="INFO">${value_object} = {'LocalShards': ['member-1-shard-default-operational', 'member-1-shard-inventory-operational', 'member-1-shard-topology-operational'], '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-08-22T23:36:37.851318" elapsed="0.000297"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:37.852027" 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-08-22T23:36:37.851775" elapsed="0.000278"/>
</kw>
<return>
<value>${sync_status}</value>
<status status="PASS" start="2026-08-22T23:36:37.852101" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:37.852252" 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-08-22T23:36:37.849209" elapsed="0.003067"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="PASS" start="2026-08-22T23:36:37.852319" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:36:37.852464" 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-08-22T23:36:37.443088" elapsed="0.409399"/>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="PASS" start="2026-08-22T23:36:37.852684" elapsed="0.000029"/>
</continue>
<status status="PASS" start="2026-08-22T23:36:37.852556" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:37.852539" 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-08-22T23:36:37.852911" elapsed="0.000021"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:36:37.442857" elapsed="0.410110"/>
</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-08-22T23:36:37.854567" 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-08-22T23:36:37.854268" elapsed="0.000341"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:36:37.854656" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:36:37.854805" 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-08-22T23:36:37.853921" elapsed="0.000909"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.862402" 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-08-22T23:36:37.862151" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:37.862869" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:37.862619" 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-08-22T23:36:38.268733" level="INFO">GET Request : url=http://10.30.170.79: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:36:38.268947" level="INFO">GET Response : url=http://10.30.170.79: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': 'Sat, 22 Aug 2026 23:36:38 GMT', 'Expires': 'Sat, 22 Aug 2026 22:36:38 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787441798,"status":200} 
 </msg>
<msg time="2026-08-22T23:36:38.269250" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:36:37.865131" elapsed="0.404183"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:37.862982" elapsed="0.406460"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:38.270002" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:38.269514" elapsed="0.000654"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:37.862963" elapsed="0.407258"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.277724" 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787441798,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:38.273464" elapsed="0.004401"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:38.272805" elapsed="0.005222"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:38.272756" elapsed="0.005311"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.282428" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:38.278498" elapsed="0.004066"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:38.278150" elapsed="0.004632"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:38.278125" elapsed="0.004697"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.283942" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:38.283079" elapsed="0.000902"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:38.284654" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:38.284206" elapsed="0.000705"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.285867" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:38.285190" elapsed="0.000763"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:38.284951" elapsed="0.001164"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:38.284178" elapsed="0.001962"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.286869" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:38.286306" 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-08-22T23:36:38.287231" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:38.286967" elapsed="0.000449"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.288243" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:38.287635" elapsed="0.000695"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:38.287444" elapsed="0.001050"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:38.286949" elapsed="0.001570"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:38.288715" elapsed="0.000693"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:36:38.290468" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:38.289600" elapsed="0.000897"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:36:38.290723" elapsed="0.003201"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:36:38.271573" elapsed="0.022419"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:36:38.294175" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:38.294062" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:38.294043" elapsed="0.000202"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:36:38.297190" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787441798,...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:36:38.294391" elapsed="0.002828"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:36:38.297363" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:36:38.297534" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787441798,...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:36:37.857631" elapsed="0.439929"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:36:38.297641" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:36:38.297793" level="INFO">${conf_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787441798,...</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-08-22T23:36:37.855041" elapsed="0.442778"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.298689" level="INFO">{
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787441798,
 "value": {
  "LocalShards": [
   "member-1-shard-default-config",
   "member-1-shard-inventory-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-08-22T23:36:38.298403" elapsed="0.000334"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.299717" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787441798, '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-08-22T23:36:38.299295" elapsed="0.000450"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-08-22T23:36:38.299794" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:38.299954" level="INFO">${manager_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787441798, '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-08-22T23:36:38.298951" elapsed="0.001067"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:38.300436" level="INFO">${value_object} = {'LocalShards': ['member-1-shard-default-config', 'member-1-shard-inventory-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-08-22T23:36:38.300181" elapsed="0.000282"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:38.300857" 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-08-22T23:36:38.300640" elapsed="0.000243"/>
</kw>
<return>
<value>${sync_status}</value>
<status status="PASS" start="2026-08-22T23:36:38.300930" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:38.301082" 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-08-22T23:36:38.298038" elapsed="0.003068"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-08-22T23:36:38.301285" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:38.301174" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:38.301157" 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-08-22T23:36:38.309062" 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-08-22T23:36:38.308811" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.309505" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:38.309263" 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-08-22T23:36:38.318018" level="INFO">GET Request : url=http://10.30.170.79: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:36:38.318095" level="INFO">GET Response : url=http://10.30.170.79: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': 'Sat, 22 Aug 2026 23:36:38 GMT', 'Expires': 'Sat, 22 Aug 2026 22:36:38 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787441798,"status":200} 
 </msg>
<msg time="2026-08-22T23:36:38.318207" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:36:38.311780" elapsed="0.006454"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:38.309632" elapsed="0.008645"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:38.318460" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:38.318303" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:38.309612" elapsed="0.008934"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.322967" 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787441798,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:38.319788" elapsed="0.003316"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:38.319507" elapsed="0.003756"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:38.319488" elapsed="0.003814"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.327668" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:38.323781" elapsed="0.004022"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:38.323384" elapsed="0.004576"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:38.323360" elapsed="0.004639"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.329041" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:38.328231" 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-08-22T23:36:38.329595" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:38.329181" elapsed="0.000599"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.330565" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:38.329978" elapsed="0.000695"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:38.329808" elapsed="0.001020"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:38.329154" elapsed="0.001699"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.331618" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:38.331021" 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-08-22T23:36:38.331983" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:38.331719" elapsed="0.000448"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.333000" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:38.332380" elapsed="0.000704"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:38.332194" elapsed="0.001046"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:38.331700" elapsed="0.001564"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:38.333420" elapsed="0.000754"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:36:38.335231" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:38.334343" elapsed="0.000916"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:36:38.335417" elapsed="0.003379"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:36:38.319079" elapsed="0.019782"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:36:38.339042" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:38.338933" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:38.338914" elapsed="0.000197"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:36:38.341996" 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-08-22T23:36:38.339259" elapsed="0.002767"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:36:38.342078" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:36:38.342236" 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-08-22T23:36:38.304285" elapsed="0.037977"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:36:38.342319" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:36:38.342473" 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-08-22T23:36:38.301553" elapsed="0.040946"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.343338" level="INFO">{
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787441798,
 "value": {
  "LocalShards": [
   "member-1-shard-default-operational",
   "member-1-shard-inventory-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-08-22T23:36:38.343086" elapsed="0.000300"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.344395" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787441798, ...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:38.343970" elapsed="0.000453"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-08-22T23:36:38.344471" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:36:38.344657" level="INFO">${manager_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787441798, ...</msg>
<var>${manager_object}</var>
<arg>${shard_manager_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-08-22T23:36:38.343625" elapsed="0.001058"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:38.345059" level="INFO">${value_object} = {'LocalShards': ['member-1-shard-default-operational', 'member-1-shard-inventory-operational', 'member-1-shard-topology-operational'], '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-08-22T23:36:38.344838" elapsed="0.000248"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:38.345458" 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-08-22T23:36:38.345241" elapsed="0.000242"/>
</kw>
<return>
<value>${sync_status}</value>
<status status="PASS" start="2026-08-22T23:36:38.345566" elapsed="0.000048"/>
</return>
<msg time="2026-08-22T23:36:38.345742" 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-08-22T23:36:38.342732" elapsed="0.003035"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="PASS" start="2026-08-22T23:36:38.345810" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:36:38.345960" 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-08-22T23:36:37.853520" elapsed="0.492464"/>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="PASS" start="2026-08-22T23:36:38.346169" elapsed="0.000031"/>
</continue>
<status status="PASS" start="2026-08-22T23:36:38.346055" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:38.346037" 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-08-22T23:36:38.346404" elapsed="0.000022"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:36:37.853110" elapsed="0.493351"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:36:37.048801" elapsed="1.297697"/>
</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-08-22T23:36:37.046589" elapsed="1.299971"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:37.046223" elapsed="1.300385"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:37.046199" elapsed="1.300434"/>
</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-08-22T23:36:38.348124" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:38.347738" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.348648" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:36:38.348326" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:36:38.348719" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:38.348872" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:36:38.347342" elapsed="0.001555"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.349924" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:38.349624" elapsed="0.000326"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:36:38.349995" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:38.350141" 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-08-22T23:36:38.349260" elapsed="0.000906"/>
</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-08-22T23:36:38.455778" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:38.454953" elapsed="0.000933"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:36:38.457174" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:36:38.456892" elapsed="0.000360">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:36:38.457452" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:36:38.456160" elapsed="0.001393"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.458845" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:38.457845" elapsed="0.001106"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:36:38.459553" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:36:38.459865" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:36:38.459195" elapsed="0.000772"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.460846" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:38.460204" elapsed="0.000790"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.462821" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:38.462463" elapsed="0.000404"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.463307" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:36:38.463032" 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-08-22T23:36:38.463678" 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-08-22T23:36:38.463887" 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-08-22T23:36:38.464066" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-08-22T23:36:38.463527" elapsed="0.000597"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-08-22T23:36:38.463385" elapsed="0.000769"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:36:38.464201" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:36:38.464558" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:36:38.461899" elapsed="0.002740"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:38.461111" elapsed="0.003578"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:38.465081" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:38.464781" elapsed="0.000389"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:38.461074" elapsed="0.004185"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.466408" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:38.465478" elapsed="0.001035"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:36:38.466637" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:36:38.453833" elapsed="0.013074"/>
</kw>
<msg time="2026-08-22T23:36:38.466963" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:38.388972" elapsed="0.078043"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:38.480088" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:38.492875" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:38.505690" 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-08-22T23:36:38.505886" 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-08-22T23:36:38.506064" 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-08-22T23:36:38.506477" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:38.506326" elapsed="0.000377"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:36:38.506311" elapsed="0.000421"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:38.506878" 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-08-22T23:36:38.507163" 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-08-22T23:36:38.507336" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:36:38.506280" elapsed="0.001110"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:36:38.506141" elapsed="0.001274"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:38.507564" elapsed="0.000039"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:36:38.507661" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:36:38.507781" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:36:38.384519" elapsed="0.123289"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:36:38.509211" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:36:38.508848" elapsed="0.000429">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:36:38.509370" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:36:38.508480" 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-08-22T23:36:38.509736" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:38.509464" elapsed="0.000329"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.510410" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:38.509994" elapsed="0.000445"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:38.509817" elapsed="0.000658"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:38.509445" elapsed="0.001051"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.512986" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:38.510670" elapsed="0.002343"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:36:38.513064" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:38.513218" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:36:38.508136" elapsed="0.005107"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:36:38.514607" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:36:38.514235" elapsed="0.000437">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-08-22T23:36:38.514767" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:36:38.513899" elapsed="0.000892"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-08-22T23:36:38.514995" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:36:38.514861" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:38.514843" 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-08-22T23:36:38.515223" 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-08-22T23:36:38.515401" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-08-22T23:36:38.515466" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:36:38.517641" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:36:38.513547" elapsed="0.004122"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.519052" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:38.518805" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.519535" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:38.519290" 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-08-22T23:36:38.962358" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:36:38.962970" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node0gag8vhchwxfflg4htco1iqxt0.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Fri, 21-Aug-2026 23:36: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":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["hello-params","tls12","tls13"]},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-netconf-monitoring_2010-10-04","revision":"2010-10-04","schema":"/rests/modules/ietf-netconf-monitoring?revision=2010-10-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring","conformance-type":"import"},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"odl-netconf-device_2025-12-05","revision":"2025-12-05","schema":"/rests/modules/odl-netconf-device?revision=2025-12-05","namespace":"urn:opendaylight:netconf:device","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","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":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-http-server_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-server?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["tcp-supported","tls-supported"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","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-password","client-ident-publickey"]},{"name":"netconf-keystore_2024-07-08","revision":"2024-07-08","schema":"/rests/modules/netconf-keystore?revision=2024-07-08","namespace":"urn:opendaylight:netconf:keystore","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":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?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":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"ietf-netconf-client_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-netconf-client?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-client","conformance-type":"import","feature":["ssh-listen","tls-listen","central-netconf-client-supported","tls-initiate","ssh-initiate"]},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":[... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-08-22T23:36:38.963539" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:36:38.521820" elapsed="0.441829"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:38.519664" elapsed="0.444102"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:38.964253" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:38.963831" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:38.519645" elapsed="0.444811"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.971692" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["hello-params","tls12","tls13"]},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-netconf-monitoring_2010-10-04","revision":"2010-10-04","schema":"/rests/modules/ietf-netconf-monitoring?revision=2010-10-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring","conformance-type":"import"},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"odl-netconf-device_2025-12-05","revision":"2025-12-05","schema":"/rests/modules/odl-netconf-device?revision=2025-12-05","namespace":"urn:opendaylight:netconf:device","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","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":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-http-server_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-server?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["tcp-supported","tls-supported"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","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-password","client-ident-publickey"]},{"name":"netconf-keystore_2024-07-08","revision":"2024-07-08","schema":"/rests/modules/netconf-keystore?revision=2024-07-08","namespace":"urn:opendaylight:netconf:keystore","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":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?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":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"ietf-netconf-client_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-netconf-client?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-client","conformance-type":"import","feature":["ssh-listen","tls-listen","central-netconf-client-supported","tls-initiate","ssh-initiate"]},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"netconf-node-optional_2022-12-25","revision":"2022-12-25","schema":"/rests/modules/netconf-node-optional?revision=2022-12-25","namespace":"urn:opendaylight:netconf-node-optional","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"netconf-node-topology_2025-12-05","revision":"2025-12-05","schema":"/rests/modules/netconf-node-topology?revision=2025-12-05","namespace":"urn:opendaylight:netconf-node-topology","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-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-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","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":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:38.967475" elapsed="0.004468"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:38.966885" elapsed="0.005174"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:38.966839" elapsed="0.005249"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.975161" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:38.972397" elapsed="0.002860"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:38.972147" elapsed="0.003229"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:38.972129" elapsed="0.003274"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.976188" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:38.975613" 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-08-22T23:36:38.976557" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:38.976287" elapsed="0.000510"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.977619" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:38.976996" elapsed="0.000709"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:38.976825" elapsed="0.001053"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:38.976269" elapsed="0.001634"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.978627" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:38.978068" 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-08-22T23:36:38.978988" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:38.978726" elapsed="0.000448"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.980021" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:38.979368" elapsed="0.000741"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:38.979202" elapsed="0.001070"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:38.978708" 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-08-22T23:36:38.980454" elapsed="0.000787"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:36:38.982332" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:38.981411" elapsed="0.000949"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:36:38.982522" elapsed="0.003658"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:36:38.965826" elapsed="0.020431"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:36:38.986450" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:38.986335" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:38.986310" elapsed="0.000216"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:36:38.997677" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:36:38.986718" elapsed="0.010989"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:36:38.997760" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:36:38.997932" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:36:38.517981" elapsed="0.479977"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:36:38.998023" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:36:38.998176" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-08-22T23:36:38.360888" elapsed="0.637314"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:38.998546" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:38.998284" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:38.998267" elapsed="0.000539"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:36:38.998841" 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-08-22T23:36:38.354478" elapsed="0.644493"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:36:38.349092" elapsed="0.649922"/>
</iter>
<iter>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:38.999990" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:38.999679" elapsed="0.000340"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:36:39.000065" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:39.000212" 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-08-22T23:36:38.999287" elapsed="0.000950"/>
</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-08-22T23:36:39.098754" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:39.097950" elapsed="0.000910"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:36:39.100093" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:36:39.099809" elapsed="0.000365">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:36:39.100373" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:36:39.099125" elapsed="0.001351"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:39.101740" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:39.100767" elapsed="0.001079"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:36:39.102440" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:36:39.102805" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:36:39.102088" elapsed="0.000820"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:39.103760" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:39.103145" elapsed="0.000764"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:39.105712" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:39.105386" elapsed="0.000373"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:36:39.106193" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:36:39.105922" 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-08-22T23:36:39.106543" 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-08-22T23:36:39.106815" 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-08-22T23:36:39.106991" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-08-22T23:36:39.106410" elapsed="0.000638"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-08-22T23:36:39.106271" elapsed="0.000805"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:36:39.107120" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:36:39.107439" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:36:39.104876" elapsed="0.002598"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:39.104020" elapsed="0.003501"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:39.107953" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:39.107654" elapsed="0.000385"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:39.103986" elapsed="0.004141"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:39.109471" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:39.108337" elapsed="0.001268"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:36:39.109686" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:36:39.096837" elapsed="0.013117"/>
</kw>
<msg time="2026-08-22T23:36:39.110011" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:39.038664" elapsed="0.071398"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:39.122973" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:39.135921" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:39.148682" 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-08-22T23:36:39.148904" 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-08-22T23:36:39.149081" 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-08-22T23:36:39.149484" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:39.149338" elapsed="0.000366"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:36:39.149323" elapsed="0.000410"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:39.149876" 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-08-22T23:36:39.150043" 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-08-22T23:36:39.150208" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:36:39.149294" elapsed="0.000966"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:36:39.149157" elapsed="0.001127"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:39.150430" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:36:39.150504" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:36:39.150638" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:36:39.034260" elapsed="0.116405"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:36:39.152068" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:36:39.151713" elapsed="0.000420">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:36:39.152226" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:36:39.151310" elapsed="0.000941"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:39.152567" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:39.152321" elapsed="0.000330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:39.153278" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:39.152864" elapsed="0.000441"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:39.152676" elapsed="0.000666"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:39.152303" elapsed="0.001060"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:39.155841" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:39.153518" elapsed="0.002350"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:36:39.155921" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:39.156073" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:36:39.150988" elapsed="0.005110"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:36:39.157482" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:36:39.157130" elapsed="0.000416">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-08-22T23:36:39.157666" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:36:39.156767" elapsed="0.000925"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-08-22T23:36:39.157899" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:36:39.157764" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:39.157745" 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-08-22T23:36:39.158128" 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-08-22T23:36:39.158299" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-08-22T23:36:39.158364" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:36:39.161681" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:36:39.156409" elapsed="0.005300"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:39.163104" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:39.162852" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:39.163556" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:39.163306" 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-08-22T23:36:39.628481" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:36:39.629054" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node02qn8wn3qkius8g6tian7ofh10.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Fri, 21-Aug-2026 23:36: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":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-netconf-monitoring_2010-10-04","revision":"2010-10-04","schema":"/rests/modules/ietf-netconf-monitoring?revision=2010-10-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring","conformance-type":"import"},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"odl-netconf-device_2025-12-05","revision":"2025-12-05","schema":"/rests/modules/odl-netconf-device?revision=2025-12-05","namespace":"urn:opendaylight:netconf:device","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","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":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-http-server_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-server?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["tcp-supported","tls-supported"]},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"netconf-keystore_2024-07-08","revision":"2024-07-08","schema":"/rests/modules/netconf-keystore?revision=2024-07-08","namespace":"urn:opendaylight:netconf:keystore","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":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["url","xpath","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"ietf-netconf-client_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-netconf-client?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-client","conformance-type":"import","feature":["ssh-listen","tls-listen","central-netconf-client-supported","tls-initiate","ssh-initiate"]},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":[... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-08-22T23:36:39.629745" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:36:39.165858" elapsed="0.463954"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:39.163687" elapsed="0.466234"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:39.630386" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:39.629985" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:39.163669" elapsed="0.466962"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:39.638800" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-netconf-monitoring_2010-10-04","revision":"2010-10-04","schema":"/rests/modules/ietf-netconf-monitoring?revision=2010-10-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring","conformance-type":"import"},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"odl-netconf-device_2025-12-05","revision":"2025-12-05","schema":"/rests/modules/odl-netconf-device?revision=2025-12-05","namespace":"urn:opendaylight:netconf:device","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","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":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-http-server_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-server?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["tcp-supported","tls-supported"]},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"netconf-keystore_2024-07-08","revision":"2024-07-08","schema":"/rests/modules/netconf-keystore?revision=2024-07-08","namespace":"urn:opendaylight:netconf:keystore","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":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["url","xpath","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"ietf-netconf-client_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-netconf-client?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-client","conformance-type":"import","feature":["ssh-listen","tls-listen","central-netconf-client-supported","tls-initiate","ssh-initiate"]},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"netconf-node-optional_2022-12-25","revision":"2022-12-25","schema":"/rests/modules/netconf-node-optional?revision=2022-12-25","namespace":"urn:opendaylight:netconf-node-optional","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"netconf-node-topology_2025-12-05","revision":"2025-12-05","schema":"/rests/modules/netconf-node-topology?revision=2025-12-05","namespace":"urn:opendaylight:netconf-node-topology","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:39.633576" elapsed="0.005484"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:39.632981" elapsed="0.006200"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:39.632935" elapsed="0.006274"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:39.642375" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:39.639518" elapsed="0.002958"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:39.639268" elapsed="0.003353"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:39.639250" elapsed="0.003401"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:39.643410" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:39.642840" 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-08-22T23:36:39.643802" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:39.643510" elapsed="0.000487"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:39.644842" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:39.644198" elapsed="0.000731"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:39.644026" elapsed="0.001065"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:39.643491" elapsed="0.001625"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:39.645865" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:39.645295" 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-08-22T23:36:39.646234" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:39.645966" elapsed="0.000458"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:39.647263" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:39.646657" elapsed="0.000691"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:39.646452" elapsed="0.001062"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:39.645947" elapsed="0.001592"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:39.647723" elapsed="0.000708"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:36:39.649565" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:39.648675" elapsed="0.000986"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:36:39.649824" 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-08-22T23:36:39.631929" elapsed="0.021321"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:36:39.653437" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:39.653322" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:39.653303" elapsed="0.000205"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:36:39.664776" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:36:39.653692" elapsed="0.011115"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:36:39.664863" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:36:39.665034" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:36:39.162019" elapsed="0.503041"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:36:39.665125" elapsed="0.000052"/>
</return>
<msg time="2026-08-22T23:36:39.665309" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-08-22T23:36:39.010827" elapsed="0.654509"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:39.665718" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:39.665420" elapsed="0.000410"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:39.665403" elapsed="0.000453"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:36:39.665891" 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-08-22T23:36:39.004316" elapsed="0.661703"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:36:38.999114" elapsed="0.666948"/>
</iter>
<iter>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:39.667039" 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-08-22T23:36:39.666733" elapsed="0.000334"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:36:39.667114" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:39.667262" 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-08-22T23:36:39.666334" 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-08-22T23:36:39.767732" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:39.766877" elapsed="0.000961"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:36:39.769058" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:36:39.768781" elapsed="0.000356">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:36:39.769367" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:36:39.768106" elapsed="0.001363"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:39.770704" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:39.769814" elapsed="0.000994"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:36:39.771401" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:36:39.771762" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:36:39.771052" elapsed="0.000814"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:39.772679" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:39.772108" elapsed="0.000726"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:39.774615" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:39.774332" elapsed="0.000330"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:36:39.775099" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:36:39.774827" 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-08-22T23:36:39.775453" 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-08-22T23:36:39.775749" 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-08-22T23:36:39.775928" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-08-22T23:36:39.775319" elapsed="0.000667"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-08-22T23:36:39.775177" elapsed="0.000839"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:36:39.776062" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:39.776388" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:36:39.773814" elapsed="0.002608"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:39.772947" elapsed="0.003523"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:39.776880" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:39.776562" elapsed="0.000406"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:39.772913" elapsed="0.004144"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:39.778270" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:39.777301" elapsed="0.001075"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:36:39.778454" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:36:39.765748" elapsed="0.012992"/>
</kw>
<msg time="2026-08-22T23:36:39.778798" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:39.706719" elapsed="0.072131"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:39.792035" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:39.805116" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:39.818514" 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-08-22T23:36:39.818749" 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-08-22T23:36:39.818931" 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-08-22T23:36:39.819370" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:39.819220" elapsed="0.000354"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:36:39.819203" elapsed="0.000424"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:39.819775" 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-08-22T23:36:39.820003" 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-08-22T23:36:39.820175" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:36:39.819170" elapsed="0.001061"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:36:39.819012" elapsed="0.001245"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:39.820409" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:36:39.820490" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:36:39.820641" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:36:39.702177" elapsed="0.118493"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:36:39.822175" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:36:39.821796" elapsed="0.000451">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:36:39.822341" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:36:39.821363" elapsed="0.001004"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:39.822730" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:39.822443" elapsed="0.000345"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:39.823400" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:39.822988" elapsed="0.000439"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:39.822812" elapsed="0.000651"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:39.822423" elapsed="0.001061"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:39.825991" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:39.823655" elapsed="0.002364"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:36:39.826071" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:36:39.826226" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:36:39.821006" elapsed="0.005245"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:36:39.827635" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:36:39.827248" elapsed="0.000453">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-08-22T23:36:39.827797" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:36:39.826906" elapsed="0.000916"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-08-22T23:36:39.828030" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:36:39.827894" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:39.827876" 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-08-22T23:36:39.828259" 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-08-22T23:36:39.828431" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-08-22T23:36:39.828498" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:36:39.830675" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:36:39.826554" elapsed="0.004149"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:39.832101" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:39.831849" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:39.832543" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:39.832301" 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-08-22T23:36:40.258211" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:36:40.258804" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node04j964nea0kfe1509jmhnj06kx0.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Fri, 21-Aug-2026 23:36:40 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":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","cms-enveloped-data-format","csr-generation","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cms-encrypted-data-format","cleartext-private-keys","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["hello-params","tls12","tls13"]},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-netconf-monitoring_2010-10-04","revision":"2010-10-04","schema":"/rests/modules/ietf-netconf-monitoring?revision=2010-10-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring","conformance-type":"import"},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["https-listen","http-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"odl-netconf-device_2025-12-05","revision":"2025-12-05","schema":"/rests/modules/odl-netconf-device?revision=2025-12-05","namespace":"urn:opendaylight:netconf:device","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","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":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-http-server_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-server?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["tcp-supported","tls-supported"]},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"netconf-keystore_2024-07-08","revision":"2024-07-08","schema":"/rests/modules/netconf-keystore?revision=2024-07-08","namespace":"urn:opendaylight:netconf:keystore","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":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["url","xpath","rollback-on-error","validate","candidate","startup","confirmed-commit","writable-running"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-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_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["tcp-client-keepalives","local-binding-supported"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"ietf-netconf-client_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-netconf-client?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-client","conformance-type":"import","feature":["ssh-listen","tls-listen","tls-initiate","central-netconf-client-supported","ssh-initiate"]},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":[... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-08-22T23:36:40.259401" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:36:39.834990" elapsed="0.424477"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:39.832769" elapsed="0.426856"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:40.260140" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:40.259701" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:39.832746" elapsed="0.427597"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:40.268452" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","cms-enveloped-data-format","csr-generation","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cms-encrypted-data-format","cleartext-private-keys","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["hello-params","tls12","tls13"]},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-netconf-monitoring_2010-10-04","revision":"2010-10-04","schema":"/rests/modules/ietf-netconf-monitoring?revision=2010-10-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring","conformance-type":"import"},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["https-listen","http-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"odl-netconf-device_2025-12-05","revision":"2025-12-05","schema":"/rests/modules/odl-netconf-device?revision=2025-12-05","namespace":"urn:opendaylight:netconf:device","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","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":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-http-server_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-server?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["tcp-supported","tls-supported"]},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"netconf-keystore_2024-07-08","revision":"2024-07-08","schema":"/rests/modules/netconf-keystore?revision=2024-07-08","namespace":"urn:opendaylight:netconf:keystore","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":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["url","xpath","rollback-on-error","validate","candidate","startup","confirmed-commit","writable-running"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-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_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["tcp-client-keepalives","local-binding-supported"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"ietf-netconf-client_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-netconf-client?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-client","conformance-type":"import","feature":["ssh-listen","tls-listen","tls-initiate","central-netconf-client-supported","ssh-initiate"]},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"netconf-node-optional_2022-12-25","revision":"2022-12-25","schema":"/rests/modules/netconf-node-optional?revision=2022-12-25","namespace":"urn:opendaylight:netconf-node-optional","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","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","arbitrary-names","if-mib"]},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert: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":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"netconf-node-topology_2025-12-05","revision":"2025-12-05","schema":"/rests/modules/netconf-node-topology?revision=2025-12-05","namespace":"urn:opendaylight:netconf-node-topology","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-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-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","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":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:40.263433" elapsed="0.005395"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:40.262862" elapsed="0.006114"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:40.262817" elapsed="0.006195"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:40.272207" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:40.269360" elapsed="0.002954"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:40.269085" elapsed="0.003353"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:40.269064" elapsed="0.003403"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:40.273287" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:40.272703" 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-08-22T23:36:40.273712" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:40.273388" elapsed="0.000519"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:40.274755" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:40.274113" elapsed="0.000728"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:40.273936" elapsed="0.001069"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:40.273369" elapsed="0.001660"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:40.275765" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:40.275197" 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-08-22T23:36:40.276137" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:40.275866" elapsed="0.000459"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:40.277159" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:40.276522" elapsed="0.000725"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:40.276354" elapsed="0.001054"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:40.275847" elapsed="0.001586"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:40.277636" elapsed="0.000714"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:36:40.279465" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:40.278528" elapsed="0.000966"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:36:40.279671" elapsed="0.003361"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:36:40.261805" elapsed="0.021299"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:36:40.283295" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:40.283177" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:40.283157" elapsed="0.000211"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:36:40.294879" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:36:40.283518" elapsed="0.011395"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:36:40.294967" elapsed="0.000049"/>
</return>
<msg time="2026-08-22T23:36:40.295158" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:36:39.831015" elapsed="0.464170"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:36:40.295251" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:36:40.295410" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-08-22T23:36:39.678017" elapsed="0.617420"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:40.295822" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:40.295530" elapsed="0.000406"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:40.295511" elapsed="0.000451"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:36:40.295998" 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-08-22T23:36:39.671524" elapsed="0.624605"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:36:39.666162" elapsed="0.630011"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:36:38.348952" elapsed="1.947256"/>
</for>
<arg>${member_index_list}</arg>
<status status="PASS" start="2026-08-22T23:36:38.346960" elapsed="1.949310"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:38.346690" elapsed="1.949610"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:38.346674" elapsed="1.949652"/>
</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-08-22T23:36:40.296857" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:40.296387" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:40.296370" elapsed="0.000575"/>
</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-08-22T23:36:37.045706" elapsed="3.251291"/>
</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-08-22T23:36:16.863872" elapsed="23.433192"/>
</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-08-22T23:36:40.300592" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:40.300182" elapsed="0.000440"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:36:40.301103" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:36:40.300788" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:36:40.301177" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:36:40.301338" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:36:40.299759" elapsed="0.001606"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:40.302519" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:36:40.302244" elapsed="0.000302"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:40.303412" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:40.303518" 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-08-22T23:36:40.303233" elapsed="0.000311"/>
</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-08-22T23:36:40.306320" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:40.306040" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:40.306020" elapsed="0.000384"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:40.306872" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:36:40.306554" elapsed="0.000455"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:40.307676" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.200" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:40.307165" elapsed="0.000561"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:40.308366" level="INFO">${conn_id} = 98</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:40.307891" elapsed="0.000502"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:40.309528" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:40.309669" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:40.309121" elapsed="0.000576"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:36:40.309876" elapsed="0.000556"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:40.311896" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:40.649554" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:56 UTC 2026

  System load:  0.08               Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:15 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:40.311209" elapsed="0.338580"/>
</kw>
<msg time="2026-08-22T23:36:40.649935" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:40.310630" elapsed="0.339458"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:36:40.308636" elapsed="0.341579"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:40.650783" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-08-22T23:36:40.663485" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-08-22T23:36:40.663785" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:36:40.663886" 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-08-22T23:36:40.650472" elapsed="0.013466"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:40.664325" elapsed="0.000494"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:40.666027" 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-08-22T23:36:40.665252" elapsed="0.000879"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:40.666635" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:40.666302" elapsed="0.000445"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:40.666252" elapsed="0.000546"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:40.667150" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-08-22T23:36:40.666916" elapsed="0.000365"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:40.666882" elapsed="0.000451"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:40.667408" 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-08-22T23:36:40.674568" elapsed="0.000601"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:40.675338" elapsed="0.000163"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:40.675669" 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-08-22T23:36:40.668132" elapsed="0.007688"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:36:40.305408" elapsed="0.370506"/>
</kw>
<msg time="2026-08-22T23:36:40.675968" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:40.304833" elapsed="0.371199"/>
</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-08-22T23:36:40.304246" elapsed="0.371866"/>
</kw>
<msg time="2026-08-22T23:36:40.676152" 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-08-22T23:36:40.303727" elapsed="0.372482"/>
</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-08-22T23:36:40.679460" elapsed="0.000416"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:40.680089" elapsed="0.000146"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:40.680385" 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-08-22T23:36:40.676500" elapsed="0.004034"/>
</kw>
<msg time="2026-08-22T23:36:40.680642" 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-08-22T23:36:40.302786" elapsed="0.377882"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:40.681093" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:40.680846" elapsed="0.000288"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:36:40.681177" 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-08-22T23:36:40.301793" elapsed="0.379510"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:36:40.301560" elapsed="0.379780"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:40.682378" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:36:40.682107" elapsed="0.000298"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:40.683212" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:40.683312" 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-08-22T23:36:40.683075" 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-08-22T23:36:40.686046" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:40.685753" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:40.685733" elapsed="0.000395"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:40.686407" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:36:40.686278" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:40.687184" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.12" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:40.686702" elapsed="0.000529"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:40.687826" level="INFO">${conn_id} = 101</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:40.687386" elapsed="0.000467"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:40.688936" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:40.689032" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:40.688525" elapsed="0.000532"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:36:40.689213" elapsed="0.000794"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:40.691424" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:41.018131" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:57 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:16 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:40.690776" elapsed="0.327550"/>
</kw>
<msg time="2026-08-22T23:36:41.018521" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:40.690183" elapsed="0.328490"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:36:40.688067" elapsed="0.330709"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:41.019211" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-08-22T23:36:41.031914" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-08-22T23:36:41.032153" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:36:41.032252" 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-08-22T23:36:41.018980" elapsed="0.013324"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:41.032722" elapsed="0.000451"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:41.034297" 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-08-22T23:36:41.033576" elapsed="0.000824"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:41.034881" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:41.034561" elapsed="0.000425"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:41.034513" elapsed="0.000522"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:41.035384" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-08-22T23:36:41.035152" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:41.035118" elapsed="0.000450"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:41.035682" 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-08-22T23:36:41.042465" 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-08-22T23:36:41.043228" elapsed="0.000156"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:41.043530" 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-08-22T23:36:41.036367" elapsed="0.007334"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:36:40.685180" elapsed="0.358613"/>
</kw>
<msg time="2026-08-22T23:36:41.043848" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:40.684570" elapsed="0.359341"/>
</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-08-22T23:36:40.684009" elapsed="0.359982"/>
</kw>
<msg time="2026-08-22T23:36:41.044031" 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-08-22T23:36:40.683490" elapsed="0.360598"/>
</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-08-22T23:36:41.047120" 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-08-22T23:36:41.047628" elapsed="0.000151"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:41.047927" 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-08-22T23:36:41.044373" elapsed="0.003699"/>
</kw>
<msg time="2026-08-22T23:36:41.048162" 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-08-22T23:36:40.682636" elapsed="0.365551"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:41.048621" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:41.048359" elapsed="0.000303"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:36:41.048704" 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-08-22T23:36:40.681643" elapsed="0.367185"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:36:40.681440" elapsed="0.367424"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:41.049984" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:36:41.049712" elapsed="0.000298"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:41.050888" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:41.050989" 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-08-22T23:36:41.050755" elapsed="0.000260"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:41.053874" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:41.053602" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:41.053568" elapsed="0.000386"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:41.054244" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:36:41.054116" elapsed="0.000254"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:41.055007" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.79" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:41.054519" elapsed="0.000536"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:41.055652" level="INFO">${conn_id} = 104</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:41.055211" elapsed="0.000468"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:41.056767" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:41.056863" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:41.056352" elapsed="0.000536"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:36:41.057048" elapsed="0.000557"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:41.059039" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:41.385239" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:58 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:16 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:41.058376" elapsed="0.327082"/>
</kw>
<msg time="2026-08-22T23:36:41.385601" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:41.057778" elapsed="0.327965"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:36:41.055893" elapsed="0.329974"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:41.386446" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-08-22T23:36:41.398653" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-08-22T23:36:41.398891" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:36:41.398988" 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-08-22T23:36:41.386132" elapsed="0.012908"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:41.399402" elapsed="0.000463"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:41.400981" 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-08-22T23:36:41.400288" elapsed="0.000793"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:41.401538" elapsed="0.000074"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:41.401247" elapsed="0.000441"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:41.401197" 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-08-22T23:36:41.402088" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-08-22T23:36:41.401855" elapsed="0.000362"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:41.401821" elapsed="0.001018"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:41.403062" 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-08-22T23:36:41.408226" elapsed="0.000880"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:41.409351" elapsed="0.000276"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:41.409849" 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-08-22T23:36:41.403789" elapsed="0.006317"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:36:41.053037" elapsed="0.357205"/>
</kw>
<msg time="2026-08-22T23:36:41.410408" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:41.052464" elapsed="0.358071"/>
</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-08-22T23:36:41.051905" elapsed="0.358785"/>
</kw>
<msg time="2026-08-22T23:36:41.410752" 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-08-22T23:36:41.051169" elapsed="0.359670"/>
</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-08-22T23:36:41.414020" 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-08-22T23:36:41.414541" elapsed="0.000168"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:41.414859" 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-08-22T23:36:41.411276" elapsed="0.003730"/>
</kw>
<msg time="2026-08-22T23:36:41.415194" 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-08-22T23:36:41.050299" elapsed="0.364923"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:41.415673" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:41.415408" elapsed="0.000306"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:36:41.415756" 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-08-22T23:36:41.049261" elapsed="0.366620"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:36:41.049074" elapsed="0.366846"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:36:40.301422" elapsed="1.114539"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-08-22T23:36:40.297343" elapsed="1.118684"/>
</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-08-22T23:36:15.649901" elapsed="25.766179"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:41.419900" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:41.419500" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:36:41.420394" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:36:41.420090" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:36:41.420465" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:41.420638" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:36:41.419116" elapsed="0.001547"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:41.421744" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:36:41.421451" elapsed="0.000319"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:41.422761" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:41.422865" 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-08-22T23:36:41.422472" elapsed="0.000419"/>
</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-08-22T23:36:41.425600" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:41.425308" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:41.425289" elapsed="0.000393"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:41.426141" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:36:41.425833" elapsed="0.000438"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:41.427266" level="INFO">Attempting to execute command "netstat -punta" on remote system "10.30.170.200" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:41.426444" elapsed="0.000870"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:41.428014" level="INFO">${conn_id} = 107</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:41.427475" elapsed="0.000565"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:41.429687" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:41.429829" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:41.428832" elapsed="0.001058"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:36:41.430208" elapsed="0.000763"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:41.433992" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:41.749743" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:56 UTC 2026

  System load:  0.08               Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:40 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:41.433476" elapsed="0.316432"/>
</kw>
<msg time="2026-08-22T23:36:41.749995" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:41.431426" elapsed="0.318654"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:36:41.428259" elapsed="0.322197"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:41.750955" level="INFO">Executing command 'netstat -punta'.</msg>
<msg time="2026-08-22T23:36:41.763741" level="INFO">Command exited with return code 127.</msg>
<msg time="2026-08-22T23:36:41.763982" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:36:41.764077" 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-08-22T23:36:41.750679" elapsed="0.013449"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:41.764496" elapsed="0.000488"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:41.766150" 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-08-22T23:36:41.765371" elapsed="0.000879"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:41.766883" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:41.766408" elapsed="0.000582"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:41.766362" elapsed="0.000678"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:41.767391" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-08-22T23:36:41.767156" elapsed="0.000364"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:41.767123" elapsed="0.000449"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:41.767682" 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-08-22T23:36:41.791238" elapsed="0.000831"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:41.792278" elapsed="0.000164"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:41.792634" 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-08-22T23:36:41.768480" elapsed="0.024307"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:36:41.424784" elapsed="0.368095"/>
</kw>
<msg time="2026-08-22T23:36:41.792932" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:41.424108" elapsed="0.368874"/>
</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-08-22T23:36:41.423558" elapsed="0.369501"/>
</kw>
<msg time="2026-08-22T23:36:41.793099" 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-08-22T23:36:41.423049" elapsed="0.370092"/>
</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-08-22T23:36:41.796221" elapsed="0.000310"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:41.796714" elapsed="0.000147"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:41.797009" 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-08-22T23:36:41.793436" elapsed="0.003722"/>
</kw>
<msg time="2026-08-22T23:36:41.797247" 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-08-22T23:36:41.421987" elapsed="0.375285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:41.797720" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:41.797450" elapsed="0.000311"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:36:41.797805" 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-08-22T23:36:41.421045" elapsed="0.376883"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:36:41.420861" elapsed="0.377102"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:41.798963" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:36:41.798689" elapsed="0.000301"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:41.799767" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:41.799867" 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-08-22T23:36:41.799631" 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-08-22T23:36:41.802549" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:41.802275" elapsed="0.000370"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:41.802256" elapsed="0.000413"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:41.802949" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:36:41.802821" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:41.804050" level="INFO">Attempting to execute command "netstat -punta" on remote system "10.30.170.12" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:41.803230" elapsed="0.000867"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:41.804846" level="INFO">${conn_id} = 110</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:41.804299" elapsed="0.000574"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:41.806457" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:41.806665" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:41.805652" elapsed="0.001079"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:36:41.807047" elapsed="0.000779"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:41.811329" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:42.129378" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:57 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:40 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:41.810814" elapsed="0.318842"/>
</kw>
<msg time="2026-08-22T23:36:42.129758" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:41.808293" elapsed="0.321572"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:36:41.805087" elapsed="0.325174"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:42.130929" level="INFO">Executing command 'netstat -punta'.</msg>
<msg time="2026-08-22T23:36:42.143112" level="INFO">Command exited with return code 127.</msg>
<msg time="2026-08-22T23:36:42.143234" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:36:42.143278" 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-08-22T23:36:42.130525" elapsed="0.012777"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:42.143539" elapsed="0.000504"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:42.145282" 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-08-22T23:36:42.144472" elapsed="0.000912"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:42.145893" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:42.145558" elapsed="0.000443"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:42.145507" elapsed="0.000545"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:42.146400" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-08-22T23:36:42.146169" elapsed="0.000361"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:42.146135" elapsed="0.000481"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:42.146696" 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-08-22T23:36:42.169883" elapsed="0.000723"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:42.170841" elapsed="0.000179"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:42.171191" elapsed="0.000103"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:36:42.147421" elapsed="0.023927"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:36:41.801752" elapsed="0.369694"/>
</kw>
<msg time="2026-08-22T23:36:42.171503" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:41.801095" elapsed="0.370469"/>
</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-08-22T23:36:41.800549" elapsed="0.371223"/>
</kw>
<msg time="2026-08-22T23:36:42.171814" 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-08-22T23:36:41.800049" elapsed="0.371813"/>
</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-08-22T23:36:42.174993" elapsed="0.000312"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:42.175469" elapsed="0.000163"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:42.175782" 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-08-22T23:36:42.172239" elapsed="0.003692"/>
</kw>
<msg time="2026-08-22T23:36:42.176027" 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-08-22T23:36:41.799209" elapsed="0.376843"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:42.176502" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:42.176252" elapsed="0.000292"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:36:42.176609" 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-08-22T23:36:41.798238" elapsed="0.378503"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:36:41.798054" elapsed="0.378725"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:42.177788" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:36:42.177494" elapsed="0.000320"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:42.178599" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:42.178703" 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-08-22T23:36:42.178440" 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-08-22T23:36:42.181710" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:42.181407" elapsed="0.000362"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:42.181386" elapsed="0.000408"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:42.182076" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:36:42.181946" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:42.183204" level="INFO">Attempting to execute command "netstat -punta" on remote system "10.30.170.79" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:42.182354" elapsed="0.000897"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:42.183947" level="INFO">${conn_id} = 113</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:42.183411" elapsed="0.000562"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:42.185551" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:42.185718" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:42.184757" elapsed="0.001020"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:36:42.186082" elapsed="0.001027"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:42.190093" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:42.511826" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:58 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:41 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:42.189529" elapsed="0.322516"/>
</kw>
<msg time="2026-08-22T23:36:42.512128" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:42.187563" elapsed="0.324645"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:36:42.184190" elapsed="0.328379"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:42.513069" level="INFO">Executing command 'netstat -punta'.</msg>
<msg time="2026-08-22T23:36:42.525191" level="INFO">Command exited with return code 127.</msg>
<msg time="2026-08-22T23:36:42.525306" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:36:42.525351" 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-08-22T23:36:42.512789" elapsed="0.012585"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:42.525721" elapsed="0.000447"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:42.527364" 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-08-22T23:36:42.526558" elapsed="0.000906"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:42.527941" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:42.527665" elapsed="0.000379"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:42.527615" elapsed="0.000479"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:42.528441" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-08-22T23:36:42.528211" elapsed="0.000359"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:42.528177" elapsed="0.000481"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:42.528734" 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-08-22T23:36:42.549625" elapsed="0.000734"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:42.550568" elapsed="0.000306"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:42.551073" elapsed="0.000112"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:36:42.529412" elapsed="0.021826"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:36:42.180868" elapsed="0.370462"/>
</kw>
<msg time="2026-08-22T23:36:42.551383" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:42.180196" elapsed="0.371238"/>
</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-08-22T23:36:42.179402" elapsed="0.372111"/>
</kw>
<msg time="2026-08-22T23:36:42.551553" 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-08-22T23:36:42.178899" elapsed="0.372717"/>
</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-08-22T23:36:42.554680" 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-08-22T23:36:42.555181" elapsed="0.000146"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:42.555478" 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-08-22T23:36:42.551913" elapsed="0.003732"/>
</kw>
<msg time="2026-08-22T23:36:42.555738" 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-08-22T23:36:42.178032" elapsed="0.377732"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:42.556192" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:42.555943" elapsed="0.000290"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:36:42.556276" 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-08-22T23:36:42.177074" elapsed="0.379327"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:36:42.176884" elapsed="0.379554"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:36:41.420721" elapsed="1.135757"/>
</for>
<arg>netstat -punta</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-08-22T23:36:41.416837" elapsed="1.139702"/>
</kw>
<arg>60s</arg>
<arg>10s</arg>
<arg>ClusterManagement.Run_Bash_Command_On_List_Or_All</arg>
<arg>netstat -punta</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:36:41.416248" elapsed="1.140428"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:42.559535" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:42.559139" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:36:42.560054" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:36:42.559745" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:36:42.560125" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:42.560282" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:36:42.556910" elapsed="0.003397"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:42.562439" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:42.562543" 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-08-22T23:36:42.562302" elapsed="0.000267"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Check_Unsafely_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:42.564356" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:42.564089" elapsed="0.000293"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:36:42.564430" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:36:42.564597" level="INFO">${member_ip} = 10.30.170.200</msg>
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:36:42.563769" elapsed="0.000854"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:42.567659" level="INFO">${odl_connection} = 116</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:42.567123" elapsed="0.000563"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:42.570563" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:42.570670" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:42.570282" elapsed="0.000413"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:42.570914" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:42.572216" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:42.888370" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:56 UTC 2026

  System load:  0.08               Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:41 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:42.571896" elapsed="0.316622"/>
</kw>
<msg time="2026-08-22T23:36:42.888615" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:42.571490" elapsed="0.317212"/>
</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-08-22T23:36:42.569392" elapsed="0.319600"/>
</kw>
<msg time="2026-08-22T23:36:42.889084" 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-08-22T23:36:42.568252" elapsed="0.320935"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:36:42.567870" elapsed="0.321496"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:36:42.889421" elapsed="0.000048"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at 10.30.170.200 and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:36:42.566496" elapsed="0.323207"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:42.892048" level="INFO">Executing command 'sudo netstat -punta | grep 2550 | grep LISTEN'.</msg>
<msg time="2026-08-22T23:36:42.915389" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-08-22T23:36:42.915816" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:36:42.915979" level="INFO">${stderr} = sudo: netstat: command not found</msg>
<msg time="2026-08-22T23:36:42.916133" level="INFO">${rc} = 1</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:42.891538" elapsed="0.024679"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:36:42.921693" level="INFO">Length is 32.</msg>
<msg time="2026-08-22T23:36:42.922501" level="FAIL">'sudo: netstat: command not found' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-08-22T23:36:42.920534" elapsed="0.002550">'sudo: netstat: command not found' should be empty.</status>
</kw>
<msg time="2026-08-22T23:36:42.923430" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-08-22T23:36:42.923625" level="INFO">${result} = 'sudo: netstat: command not found' should be empty.</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:42.917309" elapsed="0.006409"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:42.926391" level="INFO">${success} = False</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:42.924637" elapsed="0.001848"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:42.929715" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:42.929397" elapsed="0.000400"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:42.930318" level="INFO">sudo: netstat: command not found</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:42.930046" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:42.931017" level="INFO">1</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:42.930745" elapsed="0.000356"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:36:42.928480" elapsed="0.002701"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:42.927207" elapsed="0.004123"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:42.927152" elapsed="0.004209"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:36:42.931729" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:42.931423" elapsed="0.000421"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:42.931405" elapsed="0.000465"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-08-22T23:36:42.932095" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:42.931924" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:42.931908" elapsed="0.000324"/>
</if>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-08-22T23:36:42.933100" level="FAIL">Got rc: 1 or stderr was not empty: sudo: netstat: command not found</msg>
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-08-22T23:36:42.932380" elapsed="0.000869">Got rc: 1 or stderr was not empty: sudo: netstat: command not found</status>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="FAIL" start="2026-08-22T23:36:42.890842" elapsed="0.042670">Got rc: 1 or stderr was not empty: sudo: netstat: command not found</status>
</kw>
<msg time="2026-08-22T23:36:42.933663" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:36:42.933709" level="INFO">${result} = Got rc: 1 or stderr was not empty: sudo: netstat: command not found</msg>
<var>${status}</var>
<var>${result}</var>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:42.889933" elapsed="0.043799"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:42.933897" elapsed="0.000237"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<value>${result}</value>
<status status="NOT RUN" start="2026-08-22T23:36:42.934315" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:42.934201" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:42.934183" elapsed="0.000199"/>
</if>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-08-22T23:36:42.934856" level="FAIL">Got rc: 1 or stderr was not empty: sudo: netstat: command not found</msg>
<arg>${result}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-08-22T23:36:42.934526" elapsed="0.000390">Got rc: 1 or stderr was not empty: sudo: netstat: command not found</status>
</kw>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="FAIL" start="2026-08-22T23:36:42.565273" elapsed="0.369748">Got rc: 1 or stderr was not empty: sudo: netstat: command not found</status>
</kw>
<msg time="2026-08-22T23:36:42.935084" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Unsafely_Keyword_Over_Temporary_Odl_Session</arg>
<arg>${member_ip}</arg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-08-22T23:36:42.564781" elapsed="0.370352"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Obtain Ip address, open session, call SSHKeywords.Execute_Command_Passes, close session and return output. This affects which SSH session is active.</doc>
<status status="FAIL" start="2026-08-22T23:36:42.563227" elapsed="0.372070">Got rc: 1 or stderr was not empty: sudo: netstat: command not found</status>
</kw>
<msg time="2026-08-22T23:36:42.935352" 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="FAIL" start="2026-08-22T23:36:42.562750" elapsed="0.372650"/>
</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-08-22T23:36:42.938657" 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-08-22T23:36:42.939138" elapsed="0.000242"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:42.939546" elapsed="0.000138"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:36:42.935749" elapsed="0.003989"/>
</kw>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>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="FAIL" start="2026-08-22T23:36:42.561687" elapsed="0.378126">Got rc: 1 or stderr was not empty: sudo: netstat: command not found</status>
</kw>
<msg time="2026-08-22T23:36:42.939875" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHKeywords.Run_Keyword_Preserve_Connection</arg>
<arg>Check_Unsafely_Bash_Command_On_Member</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-08-22T23:36:42.561218" elapsed="0.378706"/>
</kw>
<var>${output}</var>
<arg>command=sudo netstat -punta | grep 2550 | grep LISTEN</arg>
<arg>member_index=${index}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="FAIL" start="2026-08-22T23:36:42.560764" elapsed="0.379267">Got rc: 1 or stderr was not empty: sudo: netstat: command not found</status>
</kw>
<kw name="Get Match">
<var>${listening}</var>
<arg>${output}</arg>
<arg>LISTEN</arg>
<doc>Wrapper around String.Get Regexp Matches to return None if not found or the first match if found.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:42.940257" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${listening}' == 'None'">
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<arg>command=pid=$(grep org.apache.karaf.main.Main | grep -v grep | tr -s ' ' | cut -f2 -d' '); sudo /usr/lib/jvm/java-1.8.0/bin/jstack -l ${pid}</arg>
<arg>member_index=${index}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:42.940543" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:42.940351" elapsed="0.000267"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:36:42.940333" elapsed="0.000310"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-08-22T23:36:42.560559" elapsed="0.380281">Got rc: 1 or stderr was not empty: sudo: netstat: command not found</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-08-22T23:36:42.560362" elapsed="0.380543">Got rc: 1 or stderr was not empty: sudo: netstat: command not found</status>
</for>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>60s</arg>
<arg>10s</arg>
<arg>ShardStability.Shards_Stability_Get_Details</arg>
<arg>${DEFAULT_SHARD_LIST}</arg>
<arg>verify_restconf=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:42.941087" elapsed="0.000023"/>
</kw>
<doc>Start each member and wait for sync.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-08-22T23:36:15.644914" elapsed="27.296354">Got rc: 1 or stderr was not empty: sudo: netstat: command not found</status>
</test>
<kw name="Close All Connections" owner="SSHLibrary" type="TEARDOWN">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-08-22T23:36:42.942011" elapsed="0.000231"/>
</kw>
<doc>Unset tell-based protocol usage

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

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

Suite stops all odl nodes, outcomment usage of tell-based protocol in
config file (means make it false by default) and starts all nodes again.</doc>
<status status="FAIL" start="2026-08-22T23:35:56.432366" elapsed="46.509913"/>
</suite>
<suite id="s1-s6" name="Outages" source="/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/outages.robot">
<kw name="Setup_Everything" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:43.025478" 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-08-22T23:36:43.021374" elapsed="0.004153"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-08-22T23:36:43.021155" elapsed="0.004446"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-08-22T23:36:43.030270" 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-08-22T23:36:43.026665" elapsed="0.003633"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-08-22T23:36:43.030477" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:43.030375" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:43.030355" elapsed="0.000185"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:43.031081" 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-08-22T23:36:43.030726" elapsed="0.000399"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-08-22T23:36:43.031714" 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-08-22T23:36:43.031379" elapsed="0.000363"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-08-22T23:36:43.032237" elapsed="0.000281"/>
</kw>
<msg time="2026-08-22T23:36:43.032632" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:43.032681" 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-08-22T23:36:43.031905" elapsed="0.000799"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:43.033237" 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-08-22T23:36:43.032870" elapsed="0.000393"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:36:43.034233" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:36:43.033969" elapsed="0.000290"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:36:43.034685" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:36:43.034405" elapsed="0.000307"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:36:43.035156" 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-08-22T23:36:43.034870" elapsed="0.000313"/>
</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-08-22T23:36:43.038249" elapsed="0.000206"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:43.038953" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:36:43.038626" elapsed="0.000353"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:36:43.039128" elapsed="0.000240"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:43.040164" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:43.039871" elapsed="0.000320"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:36:43.040236" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:36:43.040389" 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-08-22T23:36:43.039566" elapsed="0.000848"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:36:43.041323" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.200:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396b8441710&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-08-22T23:36:43.040569" elapsed="0.000915"/>
</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-08-22T23:36:43.041663" 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-08-22T23:36:43.037691" elapsed="0.004228"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:36:43.037483" elapsed="0.004480"/>
</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-08-22T23:36:43.042796" elapsed="0.000197"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:43.043502" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:36:43.043147" elapsed="0.000382"/>
</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-08-22T23:36:43.043703" elapsed="0.000223"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:43.044707" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:43.044397" elapsed="0.000337"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:36:43.044779" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:36:43.044930" 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-08-22T23:36:43.044112" elapsed="0.000842"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:36:43.045508" level="INFO">Creating Session using : alias=ClusterManagement__session_2, url=http://10.30.170.12:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396b86fc550&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-08-22T23:36:43.045101" 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-08-22T23:36:43.045825" elapsed="0.000193"/>
</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-08-22T23:36:43.042227" elapsed="0.003851"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:36:43.042048" elapsed="0.004073"/>
</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-08-22T23:36:43.046945" elapsed="0.000188"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:43.047645" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:36:43.047285" elapsed="0.000387"/>
</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-08-22T23:36:43.047820" elapsed="0.000223"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:43.048833" 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-08-22T23:36:43.048521" elapsed="0.000338"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:36:43.048904" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:36:43.049055" 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-08-22T23:36:43.048230" elapsed="0.000849"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:36:43.049656" level="INFO">Creating Session using : alias=ClusterManagement__session_3, url=http://10.30.170.79:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396b86fea10&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-08-22T23:36:43.049235" elapsed="0.000525"/>
</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-08-22T23:36:43.049917" 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-08-22T23:36:43.046380" elapsed="0.003783"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:36:43.046203" elapsed="0.004004"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-08-22T23:36:43.035239" elapsed="0.014997"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:43.050807" 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-08-22T23:36:43.050395" elapsed="0.000455"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:43.051445" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.200', 2: '10.30.170.12', 3: '10.30.170.79'}</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-08-22T23:36:43.051014" elapsed="0.000475"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:43.052050" 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-08-22T23:36:43.051662" elapsed="0.000430"/>
</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-08-22T23:36:43.033505" elapsed="0.018645"/>
</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-08-22T23:36:43.026310" elapsed="0.025894"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:36:43.052389" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:43.052269" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:43.052251" elapsed="0.000204"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:43.055862" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:43.055466" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:36:43.056343" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:36:43.056045" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:36:43.056412" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:43.056565" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:36:43.055122" elapsed="0.001484"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:43.057642" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:36:43.057356" elapsed="0.000312"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:43.058353" level="INFO">index=29
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:43.058454" level="INFO">${current_connection} = index=29
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:36:43.058228" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:43.061836" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:43.061235" elapsed="0.000690"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:43.061216" elapsed="0.000749"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:43.062453" level="INFO">index=29
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:43.062723" level="INFO">${current_ssh_connection} = index=29
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:36:43.062171" elapsed="0.000607"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:43.063780" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.200" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:43.063050" elapsed="0.000837"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:43.065099" level="INFO">${conn_id} = 31</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:43.064158" elapsed="0.000994"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:43.067006" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:43.067191" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:43.066651" elapsed="0.000584"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:36:43.067669" elapsed="0.000468"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:43.069405" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:43.389170" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:56 UTC 2026

  System load:  0.08               Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:42 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:43.068952" elapsed="0.320318"/>
</kw>
<msg time="2026-08-22T23:36:43.389338" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:43.068491" elapsed="0.320971"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:36:43.065730" elapsed="0.323887"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:43.390385" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-08-22T23:36:43.403094" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-08-22T23:36:43.403327" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:36:43.403475" 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-08-22T23:36:43.389934" elapsed="0.013616"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:43.404242" elapsed="0.000748"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:43.407516" 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-08-22T23:36:43.406230" elapsed="0.001730"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:43.408938" elapsed="0.000111"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:43.408333" elapsed="0.000889"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:43.408279" elapsed="0.001028"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:43.410245" elapsed="0.000138"/>
</return>
<status status="PASS" start="2026-08-22T23:36:43.409491" elapsed="0.001072"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:43.409453" elapsed="0.001238"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:43.410826" 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">
<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-08-22T23:36:43.418195" elapsed="0.000152"/>
</kw>
<msg time="2026-08-22T23:36:43.418390" 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-08-22T23:36:43.417506" elapsed="0.001316"/>
</kw>
<kw name="Open 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-08-22T23:36:43.419097" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:43.419386" 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-08-22T23:36:43.411969" elapsed="0.007535"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:36:43.060269" elapsed="0.359450"/>
</kw>
<msg time="2026-08-22T23:36:43.419775" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:43.059665" elapsed="0.360160"/>
</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-08-22T23:36:43.059146" elapsed="0.360757"/>
</kw>
<msg time="2026-08-22T23:36:43.419944" 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-08-22T23:36:43.058646" elapsed="0.361344"/>
</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-08-22T23:36:43.423171" elapsed="0.000143"/>
</kw>
<msg time="2026-08-22T23:36:43.423356" 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-08-22T23:36:43.422684" elapsed="0.000732"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:43.423573" elapsed="0.000066"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:43.423779" 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-08-22T23:36:43.420277" elapsed="0.003582"/>
</kw>
<msg time="2026-08-22T23:36:43.423950" 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-08-22T23:36:43.057880" elapsed="0.366095"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:43.424431" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:43.424169" elapsed="0.000303"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:36:43.424514" 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-08-22T23:36:43.056998" elapsed="0.367658"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:36:43.056824" elapsed="0.367870"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:43.425614" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:36:43.425319" elapsed="0.000323"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:43.428301" level="INFO">index=29
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:43.428415" level="INFO">${current_connection} = index=29
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:36:43.426213" elapsed="0.002230"/>
</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-08-22T23:36:43.431957" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:43.431325" elapsed="0.000722"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:43.431305" elapsed="0.000781"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:43.432562" level="INFO">index=29
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:43.432828" level="INFO">${current_ssh_connection} = index=29
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:36:43.432288" elapsed="0.000593"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:43.433846" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.12" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:43.433147" elapsed="0.000804"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:43.435174" level="INFO">${conn_id} = 32</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:43.434220" elapsed="0.001008"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:43.437095" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:43.437278" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:43.436730" elapsed="0.000593"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:36:43.437730" elapsed="0.000467"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:43.439345" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:43.764476" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:57 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:42 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:43.439024" elapsed="0.325548"/>
</kw>
<msg time="2026-08-22T23:36:43.764653" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:43.438555" elapsed="0.326212"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:36:43.435819" elapsed="0.329073"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:43.765666" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-08-22T23:36:43.778515" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-08-22T23:36:43.778781" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:36:43.778931" 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-08-22T23:36:43.765203" elapsed="0.013798"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:43.779436" elapsed="0.000771"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:43.781839" 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-08-22T23:36:43.781037" elapsed="0.000955"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:43.782614" elapsed="0.000080"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:43.782223" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:43.782192" elapsed="0.000665"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:43.783307" elapsed="0.000087"/>
</return>
<status status="PASS" start="2026-08-22T23:36:43.782980" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:43.782956" elapsed="0.000609"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:43.783836" 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">
<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-08-22T23:36:43.840508" elapsed="0.000192"/>
</kw>
<msg time="2026-08-22T23:36:43.840829" 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-08-22T23:36:43.839656" 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-08-22T23:36:43.841605" elapsed="0.000040"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:43.841908" elapsed="0.000037"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:36:43.836706" elapsed="0.005321"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:36:43.430363" elapsed="0.411850"/>
</kw>
<msg time="2026-08-22T23:36:43.842269" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:43.429631" elapsed="0.412688"/>
</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-08-22T23:36:43.429119" elapsed="0.413278"/>
</kw>
<msg time="2026-08-22T23:36:43.842437" 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-08-22T23:36:43.428619" elapsed="0.413862"/>
</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-08-22T23:36:43.845751" elapsed="0.000145"/>
</kw>
<msg time="2026-08-22T23:36:43.845939" 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-08-22T23:36:43.845222" elapsed="0.000778"/>
</kw>
<kw name="Open 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-08-22T23:36:43.846157" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:43.846317" 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-08-22T23:36:43.842814" elapsed="0.003583"/>
</kw>
<msg time="2026-08-22T23:36:43.846494" 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-08-22T23:36:43.425853" elapsed="0.420666"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:43.847031" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:43.846768" elapsed="0.000305"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:36:43.847122" 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-08-22T23:36:43.424966" elapsed="0.422295"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:36:43.424788" elapsed="0.422509"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:43.848254" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:36:43.847978" elapsed="0.000302"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:43.848994" level="INFO">index=29
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:43.849095" level="INFO">${current_connection} = index=29
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:36:43.848867" 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-08-22T23:36:43.852710" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:43.852099" elapsed="0.000701"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:43.852073" elapsed="0.000769"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:43.853337" level="INFO">index=29
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:43.853598" level="INFO">${current_ssh_connection} = index=29
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:36:43.853051" elapsed="0.000605"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:43.854690" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.79" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:43.853926" elapsed="0.000875"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:43.856246" 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-08-22T23:36:43.855071" elapsed="0.001229"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:43.858174" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:43.858358" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:43.857805" 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-08-22T23:36:43.858802" elapsed="0.000460"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:43.860533" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:44.184595" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:58 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:42 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:43.860206" elapsed="0.324482"/>
</kw>
<msg time="2026-08-22T23:36:44.184754" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:43.859634" elapsed="0.325891"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:36:43.856876" elapsed="0.329032"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:44.186796" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-08-22T23:36:44.199615" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-08-22T23:36:44.199857" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:36:44.200005" 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-08-22T23:36:44.186288" elapsed="0.013789"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:44.200641" elapsed="0.001260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:44.204714" 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-08-22T23:36:44.203291" elapsed="0.001685"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:44.206116" elapsed="0.000122"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:44.205376" elapsed="0.001048"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:44.205311" elapsed="0.001206"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:44.207456" elapsed="0.000193"/>
</return>
<status status="PASS" start="2026-08-22T23:36:44.206914" elapsed="0.000937"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:44.206870" elapsed="0.001076"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:36:44.208208" elapsed="0.000063"/>
</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-08-22T23:36:44.212644" elapsed="0.000155"/>
</kw>
<msg time="2026-08-22T23:36:44.212844" 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-08-22T23:36:44.211855" elapsed="0.001408"/>
</kw>
<kw name="Open 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-08-22T23:36:44.213544" elapsed="0.000066"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:44.213872" 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-08-22T23:36:44.208935" elapsed="0.005053"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:36:43.851073" elapsed="0.363093"/>
</kw>
<msg time="2026-08-22T23:36:44.214321" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:43.850278" elapsed="0.364097"/>
</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-08-22T23:36:43.849794" elapsed="0.364662"/>
</kw>
<msg time="2026-08-22T23:36:44.214497" 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-08-22T23:36:43.849272" elapsed="0.365271"/>
</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-08-22T23:36:44.217821" elapsed="0.000146"/>
</kw>
<msg time="2026-08-22T23:36:44.218009" 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-08-22T23:36:44.217250" 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="NOT RUN" start="2026-08-22T23:36:44.218225" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:44.218385" 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-08-22T23:36:44.214852" elapsed="0.003613"/>
</kw>
<msg time="2026-08-22T23:36:44.218555" 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-08-22T23:36:43.848491" elapsed="0.370105"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:44.219016" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:44.218770" elapsed="0.000288"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:36:44.219101" 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-08-22T23:36:43.847604" elapsed="0.371620"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:36:43.847400" elapsed="0.371859"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:36:43.056693" elapsed="1.162603"/>
</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-08-22T23:36:43.052690" elapsed="1.166667"/>
</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-08-22T23:36:44.219515" elapsed="0.000237"/>
</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-08-22T23:36:44.232862" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:44.232751" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:44.232732" elapsed="0.000199"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:44.233210" level="INFO">index=29
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:44.233316" level="INFO">${current_ssh_connection_object} = index=29
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:36:44.233081" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:44.233768" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:44.233491" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:44.234199" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:44.233959" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:44.234990" 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-08-22T23:36:44.234766" elapsed="0.000339">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-08-22T23:36:44.235209" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:36:44.235255" 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-08-22T23:36:44.234396" elapsed="0.000882"/>
</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-08-22T23:36:44.235592" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:44.235352" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:44.235334" elapsed="0.000359"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:44.236464" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:44.236196" elapsed="0.000294"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:36:44.236590" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:36:44.236749" level="INFO">${odl_ip} = 10.30.170.200</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:36:44.235891" elapsed="0.000883"/>
</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-08-22T23:36:44.236926" elapsed="0.000609"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:44.237833" level="INFO">index=34
host=10.30.170.200
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-08-22T23:36:44.237935" level="INFO">${karaf_connection_object} = index=34
host=10.30.170.200
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-08-22T23:36:44.237723" elapsed="0.000239"/>
</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-08-22T23:36:44.238108" elapsed="0.002157"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:36:44.240709" level="INFO">Logging into '10.30.170.200:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:36:44.996211" 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-08-22T23:36:44.240429" elapsed="0.755950"/>
</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-08-22T23:36:45.000546" elapsed="0.000293"/>
</kw>
<msg time="2026-08-22T23:36:45.000901" 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-08-22T23:36:44.999904" elapsed="0.001077"/>
</kw>
<kw name="Open 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-08-22T23:36:45.001139" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:45.001300" 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-08-22T23:36:44.997554" elapsed="0.003832"/>
</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-08-22T23:36:44.996822" elapsed="0.004611"/>
</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-08-22T23:36:44.232459" elapsed="0.769028"/>
</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-08-22T23:36:44.220497" elapsed="0.781036"/>
</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-08-22T23:36:44.220126" elapsed="0.781478"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:36:44.219961" elapsed="0.781685"/>
</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-08-22T23:36:45.015013" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:45.014889" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:45.014863" elapsed="0.000228"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:45.015366" level="INFO">index=29
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:45.015475" level="INFO">${current_ssh_connection_object} = index=29
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:36:45.015245" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:45.015937" level="INFO">{1: 34}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:45.015670" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:45.016488" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:45.016131" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:45.017340" 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-08-22T23:36:45.017095" elapsed="0.000359">Dictionary does not contain key '2'.</status>
</kw>
<msg time="2026-08-22T23:36:45.017564" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:36:45.017631" 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-08-22T23:36:45.016733" elapsed="0.000922"/>
</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-08-22T23:36:45.017953" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:45.017732" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:45.017713" elapsed="0.000338"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:45.018817" level="INFO">${ip_address} = 10.30.170.12</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:45.018516" elapsed="0.000326"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:36:45.018890" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:36:45.019040" level="INFO">${odl_ip} = 10.30.170.12</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:36:45.018249" elapsed="0.000815"/>
</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-08-22T23:36:45.019212" elapsed="0.000438"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:45.019922" level="INFO">index=35
host=10.30.170.12
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-08-22T23:36:45.020021" level="INFO">${karaf_connection_object} = index=35
host=10.30.170.12
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:36:45.019817" elapsed="0.000231"/>
</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-08-22T23:36:45.020191" elapsed="0.002145"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:36:45.022773" level="INFO">Logging into '10.30.170.12:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:36:45.599725" 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-08-22T23:36:45.022495" elapsed="0.577393"/>
</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-08-22T23:36:45.604185" elapsed="0.000236"/>
</kw>
<msg time="2026-08-22T23:36:45.604483" 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-08-22T23:36:45.603522" elapsed="0.001042"/>
</kw>
<kw name="Open 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-08-22T23:36:45.604744" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:45.604905" 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-08-22T23:36:45.600952" elapsed="0.004052"/>
</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-08-22T23:36:45.600264" elapsed="0.004788"/>
</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-08-22T23:36:45.014574" elapsed="0.590529"/>
</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-08-22T23:36:45.002267" elapsed="0.602884"/>
</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-08-22T23:36:45.001899" elapsed="0.603369"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:36:45.001758" elapsed="0.603551"/>
</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-08-22T23:36:45.618400" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:45.618281" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:45.618254" elapsed="0.000220"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:45.618762" level="INFO">index=29
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:45.618888" level="INFO">${current_ssh_connection_object} = index=29
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:36:45.618642" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:45.619433" level="INFO">{1: 34, 2: 35}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:45.619121" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:45.620101" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:45.619678" elapsed="0.000472"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:45.620992" 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-08-22T23:36:45.620722" elapsed="0.000389">Dictionary does not contain key '3'.</status>
</kw>
<msg time="2026-08-22T23:36:45.621223" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:36:45.621268" 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-08-22T23:36:45.620328" elapsed="0.000963"/>
</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-08-22T23:36:45.621604" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:45.621367" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:45.621348" elapsed="0.000356"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:45.622435" level="INFO">${ip_address} = 10.30.170.79</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:45.622171" elapsed="0.000290"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:36:45.622508" elapsed="0.000129"/>
</return>
<msg time="2026-08-22T23:36:45.622765" level="INFO">${odl_ip} = 10.30.170.79</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:36:45.621903" elapsed="0.000887"/>
</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-08-22T23:36:45.622941" elapsed="0.000419"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:45.623653" level="INFO">index=36
host=10.30.170.79
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-08-22T23:36:45.623754" level="INFO">${karaf_connection_object} = index=36
host=10.30.170.79
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:36:45.623528" 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-08-22T23:36:45.623924" elapsed="0.002351"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:36:45.626711" level="INFO">Logging into '10.30.170.79:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:36:46.605084" 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-08-22T23:36:45.626436" elapsed="0.978833"/>
</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-08-22T23:36:46.609704" elapsed="0.000245"/>
</kw>
<msg time="2026-08-22T23:36:46.610012" 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-08-22T23:36:46.608875" elapsed="0.001216"/>
</kw>
<kw name="Open 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-08-22T23:36:46.610251" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:46.610412" 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-08-22T23:36:46.606466" elapsed="0.004030"/>
</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-08-22T23:36:46.605740" elapsed="0.004803"/>
</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-08-22T23:36:45.617986" elapsed="0.992629"/>
</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-08-22T23:36:45.605945" elapsed="1.004719"/>
</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-08-22T23:36:45.605556" elapsed="1.005162"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:36:45.605417" elapsed="1.005342"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-08-22T23:36:44.219810" elapsed="2.390989"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-08-22T23:36:43.025880" elapsed="3.584983"/>
</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-08-22T23:36:46.613569" elapsed="0.000112"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:46.613446" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:46.613422" elapsed="0.000325"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:36:46.618653" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:46.618530" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:46.618512" elapsed="0.000209"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:46.619684" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:46.619279" elapsed="0.000432"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:36:46.620175" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:36:46.619870" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:36:46.620245" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:46.620399" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:36:46.618944" elapsed="0.001480"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:36:46.625728" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:46.625569" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:46.625551" 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-08-22T23:36:46.626978" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:46.626851" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:46.626833" elapsed="0.000213"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:46.627511" level="INFO">${karaf_connection_index} = 34</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:46.627188" elapsed="0.000349"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:46.627945" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:36:46.627717" elapsed="0.000254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:36:46.706459" 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 "/ "n "e "t "[78Cc "[A[78Co</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:36:46.628639" elapsed="0.078007"/>
</kw>
<msg time="2026-08-22T23:36:46.706795" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:36:46.706843" 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-08-22T23:36:46.628126" elapsed="0.078754"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:36:46.804172" level="INFO">"n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "o "u "t "[78Ca "[A[78Cg
 "e "s ". "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-08-22T23:36:46.707663" elapsed="0.096673"/>
</kw>
<msg time="2026-08-22T23:36:46.804467" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:36:46.804513" level="INFO">${message_wait} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:36:46.707109" elapsed="0.097441"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:46.804891" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:46.804646" elapsed="0.000391"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:46.804625" elapsed="0.000439"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:46.805791" level="INFO"> "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "o "u "t "[78Ca "[A[78Cg
 "e "s ". "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-08-22T23:36:46.805211" 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-08-22T23:36:46.806227" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:46.805970" elapsed="0.000408"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:46.805950" elapsed="0.000456"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:36:46.806441" 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-08-22T23:36:46.809135" elapsed="0.000157"/>
</kw>
<msg time="2026-08-22T23:36:46.809337" 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-08-22T23:36:46.808462" elapsed="0.000998"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:46.810024" elapsed="0.000067"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:46.810419" elapsed="0.000065"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:36:46.807688" elapsed="0.002917"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:36:46.806740" elapsed="0.004094"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:36:46.626546" elapsed="0.184394"/>
</kw>
<msg time="2026-08-22T23:36:46.811034" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:46.811079" level="INFO">${message} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:36:46.625943" elapsed="0.185173"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:36:46.811304" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:36:46.811193" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:46.811174" 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-08-22T23:36:46.811860" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:46.812194" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:36:46.812267" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:36:46.625277" elapsed="0.187100"/>
</kw>
<msg time="2026-08-22T23:36:46.812471" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:46.812515" level="INFO">${output} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:36:46.620809" elapsed="0.191743"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:46.812941" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:46.812681" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:46.812662" elapsed="0.000359"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:36:46.620669" elapsed="0.192377"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:36:46.818252" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:46.818142" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:46.818123" 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-08-22T23:36:46.819502" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:46.819373" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:46.819354" elapsed="0.000216"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:46.820055" level="INFO">${karaf_connection_index} = 35</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:46.819738" elapsed="0.000344"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:46.820463" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:36:46.820238" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:36:46.898151" 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 "/ "n "e "t "[78Cc "[A[78Co</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:36:46.821154" elapsed="0.077127"/>
</kw>
<msg time="2026-08-22T23:36:46.898410" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:36:46.898456" 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-08-22T23:36:46.820664" elapsed="0.077829"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:36:46.987738" level="INFO">"n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "o "u "t "[78Ca "[A[78Cg
 "e "s ". "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-08-22T23:36:46.899217" elapsed="0.088670"/>
</kw>
<msg time="2026-08-22T23:36:46.988015" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:36:46.988061" level="INFO">${message_wait} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:36:46.898717" elapsed="0.089381"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:46.988421" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:46.988175" elapsed="0.000394"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:46.988155" elapsed="0.000696"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:46.989357" level="INFO"> "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "o "u "t "[78Ca "[A[78Cg
 "e "s ". "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-08-22T23:36:46.989001" elapsed="0.000438"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:46.989761" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:46.989506" elapsed="0.000418"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:46.989488" elapsed="0.000464"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:36:46.989986" 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-08-22T23:36:46.992616" elapsed="0.000155"/>
</kw>
<msg time="2026-08-22T23:36:46.992814" 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-08-22T23:36:46.991958" elapsed="0.000979"/>
</kw>
<kw name="Open 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-08-22T23:36:46.993274" elapsed="0.000207"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:46.993982" elapsed="0.000068"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:36:46.991184" 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-08-22T23:36:46.990242" elapsed="0.004044"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:36:46.819085" elapsed="0.175350"/>
</kw>
<msg time="2026-08-22T23:36:46.994528" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:46.994573" level="INFO">${message} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:36:46.818469" elapsed="0.176162"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:36:46.994817" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:36:46.994708" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:46.994689" 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-08-22T23:36:46.995291" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:46.995699" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:36:46.995773" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:36:46.817832" elapsed="0.178051"/>
</kw>
<msg time="2026-08-22T23:36:46.995986" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:46.996032" level="INFO">${output} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:36:46.813308" elapsed="0.182760"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:46.996408" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:46.996144" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:46.996127" elapsed="0.000360"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:36:46.813170" elapsed="0.183340"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:36:47.001698" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:47.001571" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:47.001553" 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-08-22T23:36:47.002977" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:47.002850" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:47.002831" elapsed="0.000215"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:47.003504" level="INFO">${karaf_connection_index} = 36</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:47.003187" elapsed="0.000343"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:47.003930" level="INFO">${current_connection_index} = 29</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:36:47.003702" elapsed="0.000254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:36:47.096811" 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 "/ "n "e "t "[78Cc "[A[78Co</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:36:47.004622" elapsed="0.092323"/>
</kw>
<msg time="2026-08-22T23:36:47.097074" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:36:47.097120" 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-08-22T23:36:47.004111" elapsed="0.093046"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:36:47.189135" level="INFO">"n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "o "u "t "[78Ca "[A[78Cg
 "e "s ". "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-08-22T23:36:47.097919" elapsed="0.091365"/>
</kw>
<msg time="2026-08-22T23:36:47.189411" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:36:47.189457" level="INFO">${message_wait} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:36:47.097335" elapsed="0.092159"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:47.189878" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:47.189570" elapsed="0.000485"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:47.189550" elapsed="0.000533"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:47.190658" level="INFO"> "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "o "u "t "[78Ca "[A[78Cg
 "e "s ". "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-08-22T23:36:47.190228" elapsed="0.000515"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:47.191051" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:47.190812" elapsed="0.000386"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:47.190793" elapsed="0.000433"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:36:47.191260" 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-08-22T23:36:47.193847" elapsed="0.000173"/>
</kw>
<msg time="2026-08-22T23:36:47.194063" 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-08-22T23:36:47.193203" 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="NOT RUN" start="2026-08-22T23:36:47.194519" elapsed="0.000269"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:47.195210" elapsed="0.000067"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:36:47.192389" 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-08-22T23:36:47.191515" elapsed="0.003998"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:36:47.002538" elapsed="0.193094"/>
</kw>
<msg time="2026-08-22T23:36:47.195726" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:47.195770" level="INFO">${message} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:36:47.001945" elapsed="0.193862"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:36:47.195992" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:36:47.195884" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:47.195865" 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-08-22T23:36:47.196464" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:47.196866" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:36:47.196939" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:36:47.001280" elapsed="0.195767"/>
</kw>
<msg time="2026-08-22T23:36:47.197140" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:47.197183" level="INFO">${output} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:36:46.996841" elapsed="0.200379"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:47.197542" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:47.197294" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:47.197277" elapsed="0.000361"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:36:46.996702" elapsed="0.200960"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:36:46.620479" elapsed="0.577212"/>
</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-08-22T23:36:46.618235" elapsed="0.579511"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-08-22T23:36:46.611563" elapsed="0.586239"/>
</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-08-22T23:36:46.611017" elapsed="0.586827"/>
</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-08-22T23:36:43.020845" elapsed="4.177050"/>
</kw>
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-08-22T23:36:47.198931" level="INFO">${already_done} = True</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-08-22T23:36:47.198533" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="PASS" start="2026-08-22T23:36:47.199128" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:36:47.199032" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:47.199014" elapsed="0.000193"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:47.199363" elapsed="0.000022"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:47.199536" elapsed="0.000020"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:47.199739" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:47.200059" elapsed="0.000020"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:47.200311" elapsed="0.000024"/>
</kw>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-08-22T23:36:47.198228" elapsed="0.002169"/>
</kw>
<kw name="Setup_NetconfKeywords" owner="NetconfKeywords">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:36:47.201210" level="INFO">${tmp} = {}</msg>
<var>${tmp}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:36:47.200934" elapsed="0.000302"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:47.205086" level="INFO">${NetconfKeywords__mounted_device_types} = {}</msg>
<arg>${NetconfKeywords__mounted_device_types}</arg>
<arg>${tmp}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:36:47.201389" elapsed="0.003743"/>
</kw>
<if>
<branch type="IF" condition="${create_session_for_templated_requests}">
<kw name="Create_Default_Session" owner="TemplatedRequests">
<arg>timeout=2</arg>
<doc>Create "default" session to ${url} with authentication and connection parameters.
This Keyword is in this Resource only so that user do not need to call RequestsLibrary directly.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:47.208491" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:47.205204" elapsed="0.003349"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:47.205186" elapsed="0.003405"/>
</if>
<kw name="Initialize_Artifact_Deployment_And_Usage" owner="NexusKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:47.213632" level="INFO">${odl_connection} = 37</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:47.213219" elapsed="0.000440"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:47.215338" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:47.215416" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:47.215047" elapsed="0.000393"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:36:47.215617" elapsed="0.000484"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:47.216967" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:47.543681" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:56 UTC 2026

  System load:  0.08               Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:43 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:47.216645" elapsed="0.327215"/>
</kw>
<msg time="2026-08-22T23:36:47.543993" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:47.216270" elapsed="0.327843"/>
</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-08-22T23:36:47.214609" elapsed="0.329688"/>
</kw>
<msg time="2026-08-22T23:36:47.544403" 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-08-22T23:36:47.214205" elapsed="0.330298"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:36:47.213838" elapsed="0.330860"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:36:47.544870" elapsed="0.000067"/>
</return>
<msg time="2026-08-22T23:36:47.545228" level="INFO">${odl} = 37</msg>
<var>${odl}</var>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:36:47.212923" elapsed="0.332361"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-08-22T23:36:47.556290" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-08-22T23:36:47.563574" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../../tools/deployment/search.sh' -&gt; '/home/jenkins//search.sh'</msg>
<arg>/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../../tools/deployment/search.sh</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-08-22T23:36:47.545675" elapsed="0.018009"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:47.563924" elapsed="0.000343"/>
</kw>
<if>
<branch type="IF" condition="not (${tools_system_connect})">
<return>
<status status="NOT RUN" start="2026-08-22T23:36:47.564566" elapsed="0.000044"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:47.564373" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:47.564345" elapsed="0.000340"/>
</if>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:47.571777" level="INFO">${tools_connection} = 38</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-08-22T23:36:47.571171" elapsed="0.000646"/>
</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-08-22T23:36:47.574267" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:47.574383" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:47.573838" elapsed="0.000581"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:36:47.574642" elapsed="0.000321"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:47.576003" level="INFO">Logging into '10.30.171.196:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:48.173722" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:36:47 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:27:17 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:47.575479" elapsed="0.598330"/>
</kw>
<msg time="2026-08-22T23:36:48.173872" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:47.575129" elapsed="0.598803"/>
</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-08-22T23:36:47.573177" elapsed="0.600844"/>
</kw>
<msg time="2026-08-22T23:36:48.174071" 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-08-22T23:36:47.572595" elapsed="0.601524"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-08-22T23:36:47.572087" elapsed="0.602107"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-08-22T23:36:48.174236" elapsed="0.000030"/>
</return>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:36:47.570637" elapsed="0.603739"/>
</kw>
<doc>Places search utility to ODL system, which will be needed for version detection.
By default also initialize a SSH connection to Tools system,
as following Keywords assume a working connection towards target system.</doc>
<status status="PASS" start="2026-08-22T23:36:47.208837" elapsed="0.965592"/>
</kw>
<arg>create_session_for_templated_requests=False</arg>
<doc>Setup the environment for the other keywords of this Resource to work properly.</doc>
<status status="PASS" start="2026-08-22T23:36:47.200650" elapsed="0.973828"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:36:48.175026" level="INFO">Creating Session using : alias=node1, url=http://10.30.170.200:8181, headers={'Content-Type': 'application/xml'},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396bbaa2450&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>node1</arg>
<arg>http://${ODL_SYSTEM_1_IP}:${RESTCONFPORT}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-08-22T23:36:48.174686" elapsed="0.000528"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:36:48.175705" level="INFO">Creating Session using : alias=node2, url=http://10.30.170.12:8181, headers={'Content-Type': 'application/xml'},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396b85b7b90&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>node2</arg>
<arg>http://${ODL_SYSTEM_2_IP}:${RESTCONFPORT}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-08-22T23:36:48.175380" elapsed="0.000462"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:36:48.176310" level="INFO">Creating Session using : alias=node3, url=http://10.30.170.79:8181, headers={'Content-Type': 'application/xml'},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396bbbb0850&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>node3</arg>
<arg>http://${ODL_SYSTEM_3_IP}:${RESTCONFPORT}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-08-22T23:36:48.176005" elapsed="0.000484"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:48.180694" level="INFO">${directory_with_template_folders} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD</msg>
<arg>${directory_with_template_folders}</arg>
<arg>/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:36:48.176683" elapsed="0.004059"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:48.184931" level="INFO">${empty_data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${empty_data}</arg>
<arg>&lt;data xmlns="${ODL_NETCONF_NAMESPACE}"&gt;&lt;/data&gt;</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:36:48.180905" elapsed="0.004073"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:48.189348" level="INFO">${original_data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${original_data}</arg>
<arg>&lt;data xmlns="${ODL_NETCONF_NAMESPACE}"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:36:48.185141" elapsed="0.004255"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:48.193810" level="INFO">${modified_data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${modified_data}</arg>
<arg>&lt;data xmlns="${ODL_NETCONF_NAMESPACE}"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:36:48.189559" elapsed="0.004299"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:48.194285" level="INFO">${url} = /network-topology:network-topology/topology=topology-netconf</msg>
<var>${url}</var>
<arg>/network-topology:network-topology/topology=topology-netconf</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:48.194019" elapsed="0.000292"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:48.198852" level="INFO">${config_topology_url} = /rests/data/network-topology:network-topology/topology=topology-netconf</msg>
<arg>${config_topology_url}</arg>
<arg>${REST_API}${url}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:36:48.194471" elapsed="0.004427"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:48.203163" level="INFO">${operational_topology_url} = /rests/data/network-topology:network-topology/topology=topology-netconf</msg>
<arg>${operational_topology_url}</arg>
<arg>${REST_API}${url}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:36:48.199060" elapsed="0.004150"/>
</kw>
<doc>Setup everything needed for the test cases.</doc>
<status status="PASS" start="2026-08-22T23:36:43.020551" elapsed="5.182720"/>
</kw>
<test id="s1-s6-t1" name="Start_Testtool" line="52">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:36:48.206482" elapsed="0.000262"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:36:48.206219" 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-08-22T23:36:48.207954" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:48.207693" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:48.207673" elapsed="0.000350"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:36:48.213213" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:48.213102" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:48.213083" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:48.214308" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:48.213922" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:36:48.214847" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:36:48.214495" elapsed="0.000378"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:36:48.214919" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:36:48.215075" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:36:48.213505" 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-08-22T23:36:48.221084" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:48.220974" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:48.220954" 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-08-22T23:36:48.222319" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:48.222212" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:48.222194" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:48.222916" level="INFO">${karaf_connection_index} = 34</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:48.222530" elapsed="0.000413"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:48.223325" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:36:48.223103" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:36:48.278777" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:36:48.223868" elapsed="0.055010"/>
</kw>
<msg time="2026-08-22T23:36:48.279041" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:36:48.279108" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:48.223511" elapsed="0.055636"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:36:48.301641" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:36:48.279688" elapsed="0.022049"/>
</kw>
<msg time="2026-08-22T23:36:48.301896" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:36:48.301942" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                            ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:48.279318" elapsed="0.022660"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:48.302280" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:48.302055" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:48.302036" elapsed="0.000324"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:48.302860" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:48.302504" 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-08-22T23:36:48.303202" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:48.302987" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:48.302969" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:36:48.303315" 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-08-22T23:36:48.305780" elapsed="0.000146"/>
</kw>
<msg time="2026-08-22T23:36:48.305986" 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-08-22T23:36:48.304767" elapsed="0.001347"/>
</kw>
<kw name="Open 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-08-22T23:36:48.306390" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:48.306878" 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-08-22T23:36:48.304134" elapsed="0.002935"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:36:48.303607" 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="PASS" start="2026-08-22T23:36:48.221910" elapsed="0.085322"/>
</kw>
<msg time="2026-08-22T23:36:48.307324" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:48.307368" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                            ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:48.221306" elapsed="0.086098"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:36:48.307794" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:36:48.307677" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:48.307461" elapsed="0.000419"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:48.308379" 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-08-22T23:36:48.308740" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:36:48.308851" 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-08-22T23:36:48.220632" elapsed="0.088331"/>
</kw>
<msg time="2026-08-22T23:36:48.309057" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:48.309100" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                            ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:48.215474" elapsed="0.093662"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:48.309464" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:48.309212" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:48.309194" elapsed="0.000349"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:36:48.215334" elapsed="0.094233"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:36:48.314991" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:48.314883" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:48.314864" 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-08-22T23:36:48.316195" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:48.316088" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:48.316070" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:48.316717" level="INFO">${karaf_connection_index} = 35</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:48.316403" elapsed="0.000340"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:48.317110" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:36:48.316897" elapsed="0.000239"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:36:48.380345" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:36:48.317638" elapsed="0.062824"/>
</kw>
<msg time="2026-08-22T23:36:48.380656" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:36:48.380704" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:48.317292" elapsed="0.063448"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:36:48.403202" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:36:48.381307" elapsed="0.021988"/>
</kw>
<msg time="2026-08-22T23:36:48.403451" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:36:48.403497" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                            ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:48.380941" elapsed="0.022592"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:48.403869" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:48.403641" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:48.403613" elapsed="0.000336"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:48.404389" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:48.404091" elapsed="0.000358"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:48.404753" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:48.404517" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:48.404498" elapsed="0.000334"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:36:48.404867" 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">
<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-08-22T23:36:48.407461" elapsed="0.000174"/>
</kw>
<msg time="2026-08-22T23:36:48.407697" 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-08-22T23:36:48.406317" 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-08-22T23:36:48.408144" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:48.408597" 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-08-22T23:36:48.405701" 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-08-22T23:36:48.405140" 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-08-22T23:36:48.315788" elapsed="0.093168"/>
</kw>
<msg time="2026-08-22T23:36:48.409049" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:48.409094" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                            ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:48.315209" elapsed="0.093921"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:36:48.409315" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:36:48.409207" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:48.409189" 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-08-22T23:36:48.410018" 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-08-22T23:36:48.410356" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:36:48.410430" 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-08-22T23:36:48.314521" elapsed="0.096022"/>
</kw>
<msg time="2026-08-22T23:36:48.410772" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:48.410817" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                            ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:48.309934" elapsed="0.100920"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:48.411182" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:48.410931" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:48.410913" elapsed="0.000347"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:36:48.309795" elapsed="0.101489"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:36:48.416559" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:48.416452" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:48.416433" 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-08-22T23:36:48.417775" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:48.417667" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:48.417649" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:48.418277" level="INFO">${karaf_connection_index} = 36</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:48.417984" elapsed="0.000319"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:48.418707" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:36:48.418457" elapsed="0.000278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:36:48.478645" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:36:48.419220" elapsed="0.059556"/>
</kw>
<msg time="2026-08-22T23:36:48.478944" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:36:48.478992" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:48.418892" elapsed="0.060136"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:36:48.502338" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:36:48.479547" elapsed="0.022887"/>
</kw>
<msg time="2026-08-22T23:36:48.502612" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:36:48.502699" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                            ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:48.479201" elapsed="0.023583"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:48.503111" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:48.502874" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:48.502848" elapsed="0.000343"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:48.503669" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:48.503332" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:48.504016" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:48.503798" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:48.503779" elapsed="0.000316"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:36:48.504129" 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-08-22T23:36:48.506688" elapsed="0.000173"/>
</kw>
<msg time="2026-08-22T23:36:48.506924" 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-08-22T23:36:48.505542" elapsed="0.001510"/>
</kw>
<kw name="Open 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-08-22T23:36:48.507324" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:48.507773" 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-08-22T23:36:48.504937" 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-08-22T23:36:48.504385" elapsed="0.003646"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:36:48.417344" elapsed="0.090784"/>
</kw>
<msg time="2026-08-22T23:36:48.508219" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:48.508263" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                            ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:48.416793" elapsed="0.091506"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:36:48.508481" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:36:48.508374" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:48.508356" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:48.508990" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:48.509497" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:36:48.509573" elapsed="0.000095"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:36:48.416111" elapsed="0.093655"/>
</kw>
<msg time="2026-08-22T23:36:48.509859" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:48.509903" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                            ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:48.411548" elapsed="0.098392"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:48.510264" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:48.510015" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:48.509997" elapsed="0.000345"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:36:48.411409" elapsed="0.098957"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:36:48.215156" elapsed="0.295239"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:36:48.212737" elapsed="0.297716"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:36:48.207382" elapsed="0.303128"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:48.206950" elapsed="0.303699"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:36:48.204020" elapsed="0.306687"/>
</kw>
<kw name="Install_And_Start_Testtool" owner="NetconfKeywords">
<kw name="Deploy_Test_Tool" owner="NexusKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:48.531193" level="INFO">${name_prefix} = netconf-testtool-</msg>
<var>${name_prefix}</var>
<arg>${artifact}-</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:48.530883" elapsed="0.000337"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:48.531738" level="INFO">${extension} = jar</msg>
<var>${extension}</var>
<arg>'${component}'=='odl-micro'</arg>
<arg>tar</arg>
<arg>jar</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:48.531384" elapsed="0.000381"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:48.532326" level="INFO">${name_suffix} = -executable.jar</msg>
<var>${name_suffix}</var>
<arg>"${suffix}" != ""</arg>
<arg>-${suffix}.${extension}</arg>
<arg>.${extension}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:48.531933" elapsed="0.000420"/>
</kw>
<kw name="Deploy_Artifact" owner="NexusKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_url}""" != ""</arg>
<arg>Deploy_From_Url</arg>
<arg>${explicit_url}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:48.533634" elapsed="0.000308"/>
</kw>
<kw name="Fetch From Left" owner="String">
<msg time="2026-08-22T23:36:48.534317" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot</msg>
<var>${urlbase}</var>
<arg>${BUNDLE_URL}</arg>
<arg>/org/opendaylight</arg>
<doc>Returns contents of the ``string`` before the first occurrence of ``marker``.</doc>
<status status="PASS" start="2026-08-22T23:36:48.534102" elapsed="0.000241"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:48.534918" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot</msg>
<var>${urlbase}</var>
<arg>'${urlbase}' != '${BUNDLE_URL}'</arg>
<arg>${urlbase}</arg>
<arg>${fallback_url}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:48.534503" elapsed="0.000442"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Magnesium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_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-08-22T23:36:48.553468" elapsed="0.000422"/>
</kw>
<arg>magnesium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to titanium and in case titanium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'carpeople'] {} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:36:48.552988" elapsed="0.000972"/>
</kw>
<msg time="2026-08-22T23:36:48.554006" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>magnesium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:48.544485" elapsed="0.009570"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>carpeople</arg>
<doc>Compare magnesium to titanium and in case titanium is at most magnesium,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:36:48.544091" elapsed="0.010038"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Aluminium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_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-08-22T23:36:48.572690" elapsed="0.000403"/>
</kw>
<arg>aluminium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to titanium and in case titanium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'netconf'] {} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:36:48.572220" elapsed="0.000942"/>
</kw>
<msg time="2026-08-22T23:36:48.573208" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>aluminium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:48.563623" elapsed="0.009634"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>netconf</arg>
<doc>Compare aluminium to titanium and in case titanium is at most aluminium,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:36:48.563219" elapsed="0.010111"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Silicon" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_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-08-22T23:36:48.591932" elapsed="0.000402"/>
</kw>
<arg>silicon</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to titanium and in case titanium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'bgpcep'] {} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:36:48.591456" elapsed="0.000946"/>
</kw>
<msg time="2026-08-22T23:36:48.592447" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>silicon</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:48.582965" elapsed="0.009530"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>bgpcep</arg>
<doc>Compare silicon to titanium and in case titanium is at most silicon,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:36:48.582533" elapsed="0.010036"/>
</kw>
<if>
<branch type="IF" condition="'${build_version}'=='${EMPTY}'">
<kw name="NexusKeywords__Detect_Version_To_Pull" owner="NexusKeywords">
<kw name="NexusKeywords__Get_Items_To_Look_At" owner="NexusKeywords">
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<arg>Component not supported by NexusKeywords version detection: ${component}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:36:48.595660" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:48.596402" elapsed="0.000192"/>
</kw>
<msg time="2026-08-22T23:36:48.596642" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Collections.Get_From_Dictionary</arg>
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:48.596065" elapsed="0.000626"/>
</kw>
<msg time="2026-08-22T23:36:48.596791" level="INFO">${itemlist} = netconf-api</msg>
<var>${itemlist}</var>
<arg>${component}</arg>
<doc>Get a list of items that might contain the version number that we are looking for.</doc>
<status status="PASS" start="2026-08-22T23:36:48.595329" elapsed="0.001486"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:48.597097" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:36:48.597197" level="INFO">${current_ssh_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:36:48.596976" elapsed="0.000248"/>
</kw>
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:48.602094" level="INFO">${odl_connection} = 39</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:36:48.601697" elapsed="0.000423"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:48.603863" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:36:48.603942" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:48.603568" 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-08-22T23:36:48.604121" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:36:48.605907" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:36:48.922715" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:35:56 UTC 2026

  System load:  0.08               Processes:             118
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:47 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:36:48.605017" elapsed="0.317834"/>
</kw>
<msg time="2026-08-22T23:36:48.922911" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:48.604658" elapsed="0.318309"/>
</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-08-22T23:36:48.603090" elapsed="0.319980"/>
</kw>
<msg time="2026-08-22T23:36:48.923117" 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-08-22T23:36:48.602690" elapsed="0.320472"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:36:48.602297" elapsed="0.320937"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:36:48.923274" elapsed="0.000029"/>
</return>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:36:48.601328" elapsed="0.322078"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:48.923835" level="INFO">Executing command 'sh search.sh /tmp/netconf-karaf-9.0.4-SNAPSHOT/system netconf-api'.</msg>
<msg time="2026-08-22T23:36:48.956806" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:48.957215" level="INFO">${version} = 9.0.4-SNAPSHOT
org/opendaylight/netconf</msg>
<msg time="2026-08-22T23:36:48.957322" level="INFO">${result} = 0</msg>
<var>${version}</var>
<var>${result}</var>
<arg>sh search.sh ${WORKSPACE}/${BUNDLEFOLDER}/system ${itemlist}</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:48.923568" elapsed="0.033811"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:36:48.957943" elapsed="0.000558"/>
</kw>
<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-08-22T23:36:48.965470" elapsed="0.000246"/>
</kw>
<msg time="2026-08-22T23:36:48.965790" 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-08-22T23:36:48.964515" elapsed="0.001372"/>
</kw>
<kw name="Open 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-08-22T23:36:48.966245" elapsed="0.000034"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:48.966479" elapsed="0.000030"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:36:48.959216" elapsed="0.007410"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:48.967270" level="INFO">9.0.4-SNAPSHOT
org/opendaylight/netconf</msg>
<arg>${version}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:48.966866" elapsed="0.000471"/>
</kw>
<if>
<branch type="IF" condition="${result}!=0">
<kw name="Fail" owner="BuiltIn">
<arg>Component "${component}": searching for "${itemlist}" found no version, cannot locate test tool.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:48.967824" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:48.967462" elapsed="0.000443"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:48.967422" elapsed="0.000525"/>
</if>
<kw name="Split String" owner="String">
<msg time="2026-08-22T23:36:48.968508" level="INFO">${version} = 9.0.4-SNAPSHOT</msg>
<msg time="2026-08-22T23:36:48.968571" level="INFO">${location} = org/opendaylight/netconf</msg>
<var>${version}</var>
<var>${location}</var>
<arg>${version}</arg>
<arg>max_split=1</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-08-22T23:36:48.968158" elapsed="0.000476"/>
</kw>
<return>
<value>${version}</value>
<value>${location}</value>
<status status="PASS" start="2026-08-22T23:36:48.968717" elapsed="0.000049"/>
</return>
<msg time="2026-08-22T23:36:48.969018" level="INFO">${version} = 9.0.4-SNAPSHOT</msg>
<msg time="2026-08-22T23:36:48.969081" level="INFO">${location} = org/opendaylight/netconf</msg>
<var>${version}</var>
<var>${location}</var>
<arg>${component}</arg>
<doc>Determine the exact Nexus directory to be used as a source for a particular test tool
Figure out what version of the tool needs to be pulled out of the
Nexus by looking at the version directory of the subsystem from
which the tool is being pulled. This code is REALLY UGLY but there
is no way around it until the bug
https://bugs.opendaylight.org/show_bug.cgi?id=5206 gets fixed.
I also don't want to depend on maven-metadata-local.xml and other
bits and pieces of ODL distribution which are not required for ODL
to function properly.</doc>
<status status="PASS" start="2026-08-22T23:36:48.594914" elapsed="0.374200"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:48.592663" elapsed="0.376511"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${version}</var>
<var>${location}</var>
<arg>${build_version}</arg>
<arg>${build_location}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:48.969436" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:48.969217" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:48.592643" elapsed="0.376909"/>
</if>
<if>
<branch type="IF" condition="'SNAPSHOT' in '${version}'">
<kw name="Remove Values From List" owner="Collections">
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>netconf</arg>
<arg>bgpcep</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:36:48.970000" elapsed="0.000292"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:48.969668" elapsed="0.000684"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:48.969642" elapsed="0.000745"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:48.971248" level="INFO">${is_staged} = "FALSE"</msg>
<var>${is_staged}</var>
<arg>"opendaylight.release" not in '${urlbase}' and "opendaylight.snapshot" not in '${urlbase}'</arg>
<arg>"TRUE"</arg>
<arg>"FALSE"</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:48.970635" elapsed="0.000652"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:48.972067" level="INFO">${is_mri_component} = "FALSE"</msg>
<var>${is_mri_component}</var>
<arg>'${component}' in ${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>"TRUE"</arg>
<arg>"FALSE"</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:48.971529" elapsed="0.000565"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:48.972683" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot</msg>
<var>${urlbase}</var>
<arg>${is_mri_component} == "TRUE" and ${is_staged} == "FALSE"</arg>
<arg>${NEXUS_RELEASE_BASE_URL}</arg>
<arg>${urlbase}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:48.972263" elapsed="0.000449"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:48.973257" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.4-SNAPSHOT</msg>
<var>${url}</var>
<arg>${urlbase}/${location}/${artifact}/${version}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:48.972875" elapsed="0.000409"/>
</kw>
<kw name="Execute_Command_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:48.975390" level="INFO">Executing command 'curl -L https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.4-SNAPSHOT/maven-metadata.xml'.</msg>
<msg time="2026-08-22T23:36:49.060004" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:49.060424" level="INFO">${stdout} = &lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;metadata modelVersion="1.1.0"&gt;
  &lt;groupId&gt;org.opendaylight.netconf&lt;/groupId&gt;
  &lt;artifactId&gt;netconf-testtool&lt;/artifactId&gt;
  &lt;versioning&gt;
    &lt;lastUpdated&gt;2026082...</msg>
<msg time="2026-08-22T23:36:49.060540" level="INFO">${stderr} =   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0   ...</msg>
<msg time="2026-08-22T23:36:49.060685" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:48.975189" elapsed="0.085554"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:36:49.062946" level="INFO">Length is 316.</msg>
<msg time="2026-08-22T23:36:49.063208" level="FAIL">'  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  2763  100  2763    0     0  46821      0 --:--:-- --:--:-- --:--:-- 47637' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-08-22T23:36:49.062275" elapsed="0.001095">'  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  2763  100  2763    0     0  46821      0 --:--:-- --:--:-- --:--:-- 47637' should be empty.</status>
</kw>
<msg time="2026-08-22T23:36:49.063786" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-08-22T23:36:49.063889" level="INFO">${result} = '  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0  ...</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:49.061315" elapsed="0.002629"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:49.065325" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:49.064318" elapsed="0.001066"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:49.067991" level="INFO">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;metadata modelVersion="1.1.0"&gt;
  &lt;groupId&gt;org.opendaylight.netconf&lt;/groupId&gt;
  &lt;artifactId&gt;netconf-testtool&lt;/artifactId&gt;
  &lt;versioning&gt;
    &lt;lastUpdated&gt;20260822052751&lt;/lastUpdated&gt;
    &lt;snapshot&gt;
      &lt;timestamp&gt;20260822.052751&lt;/timestamp&gt;
      &lt;buildNumber&gt;14&lt;/buildNumber&gt;
    &lt;/snapshot&gt;
    &lt;snapshotVersions&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;pom&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;javadoc&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;executable&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;stress-client&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;rest-perf-client&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;scale-util&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;stress-client&lt;/classifier&gt;
        &lt;extension&gt;tar.gz&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;cyclonedx&lt;/classifier&gt;
        &lt;extension&gt;xml&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;cyclonedx&lt;/classifier&gt;
        &lt;extension&gt;json&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;sources&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
    &lt;/snapshotVersions&gt;
  &lt;/versioning&gt;
  &lt;version&gt;9.0.4-SNAPSHOT&lt;/version&gt;
&lt;/metadata&gt;</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:49.067394" elapsed="0.000780"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:49.069190" level="INFO">  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  2763  100  2763    0     0  46821      0 --:--:-- --:--:-- --:--:-- 47637</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:49.068517" elapsed="0.000780"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:49.070198" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:49.069666" elapsed="0.000627"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:36:49.066412" elapsed="0.004001"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:49.065576" elapsed="0.004916"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:49.065523" elapsed="0.005083"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:36:49.070976" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:49.070742" elapsed="0.000395"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:49.070704" elapsed="0.000490"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:49.071520" elapsed="0.000095"/>
</return>
<status status="PASS" start="2026-08-22T23:36:49.071318" elapsed="0.000386"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:49.071283" elapsed="0.000484"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:49.071944" elapsed="0.000023"/>
</kw>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:36:48.974527" elapsed="0.097542"/>
</kw>
<msg time="2026-08-22T23:36:49.072142" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:48.973949" elapsed="0.098274"/>
</kw>
<msg time="2026-08-22T23:36:49.072392" level="INFO">${metadata} = &lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;metadata modelVersion="1.1.0"&gt;
  &lt;groupId&gt;org.opendaylight.netconf&lt;/groupId&gt;
  &lt;artifactId&gt;netconf-testtool&lt;/artifactId&gt;
  &lt;versioning&gt;
    &lt;lastUpdated&gt;2026082...</msg>
<var>${metadata}</var>
<arg>curl -L ${url}/maven-metadata.xml</arg>
<doc>A wrapper for Execute_Command_Passes with return_success_only=False
Also, log_on_success defaults to True (but is customizable, unlike return_success_only)..</doc>
<status status="PASS" start="2026-08-22T23:36:48.973508" elapsed="0.098914"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:49.074831" level="INFO">Executing command 'echo "&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;metadata modelVersion="1.1.0"&gt;
  &lt;groupId&gt;org.opendaylight.netconf&lt;/groupId&gt;
  &lt;artifactId&gt;netconf-testtool&lt;/artifactId&gt;
  &lt;versioning&gt;
    &lt;lastUpdated&gt;20260822052751&lt;/lastUpdated&gt;
    &lt;snapshot&gt;
      &lt;timestamp&gt;20260822.052751&lt;/timestamp&gt;
      &lt;buildNumber&gt;14&lt;/buildNumber&gt;
    &lt;/snapshot&gt;
    &lt;snapshotVersions&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;pom&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;javadoc&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;executable&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;stress-client&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;rest-perf-client&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;scale-util&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;stress-client&lt;/classifier&gt;
        &lt;extension&gt;tar.gz&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;cyclonedx&lt;/classifier&gt;
        &lt;extension&gt;xml&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;cyclonedx&lt;/classifier&gt;
        &lt;extension&gt;json&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;sources&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
    &lt;/snapshotVersions&gt;
  &lt;/versioning&gt;
  &lt;version&gt;9.0.4-SNAPSHOT&lt;/version&gt;
&lt;/metadata&gt;" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1'.</msg>
<msg time="2026-08-22T23:36:49.105105" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:49.105412" level="INFO">${stdout} = 9.0.4-20260822.052751-14</msg>
<msg time="2026-08-22T23:36:49.105514" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:36:49.105654" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:49.074623" elapsed="0.031086"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:36:49.107644" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:36:49.106903" elapsed="0.000847"/>
</kw>
<msg time="2026-08-22T23:36:49.107963" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:36:49.108060" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:49.106112" elapsed="0.001997"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:49.109498" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:49.108477" elapsed="0.001081"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:49.111952" level="INFO">9.0.4-20260822.052751-14</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:49.111549" elapsed="0.000464"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:49.112547" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:49.112218" elapsed="0.000412"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:49.113188" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:49.112835" elapsed="0.000443"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:36:49.110511" elapsed="0.002846"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:49.109771" elapsed="0.003636"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:49.109726" elapsed="0.003715"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:36:49.113692" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:49.113519" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:49.113496" elapsed="0.000337"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:36:49.114033" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:36:49.113907" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:49.113885" elapsed="0.000263"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:49.114345" elapsed="0.000030"/>
</kw>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:36:49.074013" elapsed="0.040496"/>
</kw>
<msg time="2026-08-22T23:36:49.114621" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:49.073462" elapsed="0.041229"/>
</kw>
<arg>echo "${metadata}" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1</arg>
<arg>stderr_must_be_empty=${True}</arg>
<doc>A wrapper for Execute_Command_Passes with return_success_only=False
Also, log_on_success defaults to True (but is customizable, unlike return_success_only)..</doc>
<status status="PASS" start="2026-08-22T23:36:49.072999" elapsed="0.041801"/>
</kw>
<msg time="2026-08-22T23:36:49.114963" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:49.115033" level="INFO">${namepart} = 9.0.4-20260822.052751-14</msg>
<var>${status}</var>
<var>${namepart}</var>
<arg>SSHKeywords.Execute_Command_Should_Pass</arg>
<arg>echo "${metadata}" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1</arg>
<arg>stderr_must_be_empty=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:49.072597" elapsed="0.042468"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:36:49.115956" level="INFO">Length is 24.</msg>
<msg time="2026-08-22T23:36:49.116064" level="INFO">${length} = 24</msg>
<var>${length}</var>
<arg>${namepart}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:36:49.115476" elapsed="0.000621"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:49.117192" level="INFO">${namepart} = 9.0.4-20260822.052751-14</msg>
<var>${namepart}</var>
<arg>"${status}" != "PASS" or ${length} == 0</arg>
<arg>${version}</arg>
<arg>${namepart}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:49.116317" elapsed="0.000913"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:49.117974" level="INFO">${filename} = netconf-testtool-9.0.4-20260822.052751-14-executable.jar</msg>
<var>${filename}</var>
<arg>${name_prefix}${namepart}${name_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:49.117457" elapsed="0.000554"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:49.118558" level="INFO">netconf-testtool-9.0.4-20260822.052751-14-executable.jar</msg>
<arg>${filename}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:49.118223" elapsed="0.000418"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:49.119357" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.4-SNAPSHOT/netconf-testtool-9.0.4-20260822.052751-14-executable.jar</msg>
<var>${url}</var>
<arg>${url}/${filename}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:49.118851" elapsed="0.000544"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:49.119816" level="INFO">Executing command 'wget -q -N 'https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.4-SNAPSHOT/netconf-testtool-9.0.4-20260822.052751-14-executable.jar' 2&gt;&amp;1'.</msg>
<msg time="2026-08-22T23:36:49.180519" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:49.180802" level="INFO">${response} = </msg>
<msg time="2026-08-22T23:36:49.180903" level="INFO">${result} = 0</msg>
<var>${response}</var>
<var>${result}</var>
<arg>wget -q -N '${url}' 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:49.119640" elapsed="0.061315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:49.181930" level="INFO"/>
<arg>${response}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:49.181330" elapsed="0.000691"/>
</kw>
<if>
<branch type="IF" condition="${result} == 0">
<return>
<value>${filename}</value>
<status status="PASS" start="2026-08-22T23:36:49.182412" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-08-22T23:36:49.182172" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:49.182130" elapsed="0.000502"/>
</if>
<kw name="Replace String Using Regexp" owner="String">
<var>${release_url}</var>
<arg>${url}</arg>
<arg>autorelease-[0-9]{4}</arg>
<arg>opendaylight.release</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:49.182963" elapsed="0.000049"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${response}</var>
<var>${result}</var>
<arg>wget -q -N '${release_url}' 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:49.183387" elapsed="0.000046"/>
</kw>
<if>
<branch type="IF" condition="${result} != 0">
<kw name="Fail" owner="BuiltIn">
<arg>Artifact "${artifact}" in component "${component}" could not be downloaded from ${release_url} nor ${url}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:49.183944" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:49.183624" elapsed="0.000434"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:36:49.183557" elapsed="0.000552"/>
</if>
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-08-22T23:36:49.184181" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:36:49.184485" level="INFO">${filename} = netconf-testtool-9.0.4-20260822.052751-14-executable.jar</msg>
<var>${filename}</var>
<arg>${component}</arg>
<arg>${artifact}</arg>
<arg>${name_prefix}</arg>
<arg>${name_suffix}</arg>
<arg>${fallback_url}</arg>
<arg>${explicit_url}</arg>
<arg>${build_version}</arg>
<arg>${build_location}</arg>
<doc>Deploy the specified artifact from Nexus to the cwd of the machine to which the active SSHLibrary connection points.
netconf is a name part of an artifact present in system/ of ODl installation with the same version as netconf-testtool should have.
Must have https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-karaf/9.0.4-SNAPSHOT/netconf-karaf-9.0.4-20260822.052751-14.zip variable set to the URL from which the
tested ODL distribution was downloaded and this place must be
inside a repository created by a standard distribution
construction job. If this is detected to ne be the case, fallback URL is used.
If  is non-empty, Deploy_From_Utrl is called instead.
TODO: Allow deploying to a specific directory, we have SSHKeywords.Execute_Command_At_Cwd_Should_Pass now.</doc>
<status status="PASS" start="2026-08-22T23:36:48.532960" elapsed="0.651582"/>
</kw>
<return>
<value>${filename}</value>
<status status="PASS" start="2026-08-22T23:36:49.184818" elapsed="0.000064"/>
</return>
<msg time="2026-08-22T23:36:49.185162" level="INFO">${filename} = netconf-testtool-9.0.4-20260822.052751-14-executable.jar</msg>
<var>${filename}</var>
<arg>netconf</arg>
<arg>netconf-testtool</arg>
<doc>Deploy a test tool.
The test tools have naming convention of the form
"&lt;repository_url&gt;/some/dir/somewhere/&lt;tool-name&gt;/&lt;tool-name&gt;-&lt;version-tag&gt;-${suffix}.jar"
where "&lt;tool-name&gt;" is the name of the tool and "&lt;version-tag&gt;" is
the version tag that is digged out of the maven metadata. This
keyword calculates ${name_prefix} and ${name_suffix} for
"Deploy_Artifact" and then calls "Deploy_Artifact" to do the real
work of deploying the artifact.</doc>
<status status="PASS" start="2026-08-22T23:36:48.525036" elapsed="0.660182"/>
</kw>
<kw name="Start_Testtool" owner="NetconfKeywords">
<kw name="NetconfKeywords__Deploy_Additional_Schemas" owner="NetconfKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:49.188695" level="INFO">Executing command 'rm -rf schemas 2&gt;&amp;1'.</msg>
<msg time="2026-08-22T23:36:49.228229" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:49.228458" level="INFO">${response} = </msg>
<var>${response}</var>
<arg>rm -rf schemas 2&gt;&amp;1</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:49.188449" elapsed="0.040066"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:49.229493" level="INFO"/>
<arg>${response}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:49.228917" elapsed="0.000700"/>
</kw>
<if>
<branch type="IF" condition="'${schemas}' == 'none'">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-08-22T23:36:49.230049" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:49.229771" elapsed="0.000376"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:49.229730" elapsed="0.000466"/>
</if>
<kw name="Put Directory" owner="SSHLibrary">
<msg time="2026-08-22T23:36:49.273865" level="INFO">[chan 5] Opened sftp connection (server version 3)</msg>
<msg time="2026-08-22T23:36:49.360786" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/yang-ext@2013-07-09.yang' -&gt; '/home/jenkins/./schemas/yang-ext@2013-07-09.yang'</msg>
<msg time="2026-08-22T23:36:49.360850" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/example-action@2016-07-07.yang' -&gt; '/home/jenkins/./schemas/example-action@2016-07-07.yang'</msg>
<msg time="2026-08-22T23:36:49.360889" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/car@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/car@2014-08-18.yang'</msg>
<msg time="2026-08-22T23:36:49.360925" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/car-purchase@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/car-purchase@2014-08-18.yang'</msg>
<msg time="2026-08-22T23:36:49.360960" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/ncmount-l2fib@2016-03-07.yang' -&gt; '/home/jenkins/./schemas/ncmount-l2fib@2016-03-07.yang'</msg>
<msg time="2026-08-22T23:36:49.360994" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/augment-main-a@2014-01-21.yang' -&gt; '/home/jenkins/./schemas/augment-main-a@2014-01-21.yang'</msg>
<msg time="2026-08-22T23:36:49.361028" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/ietf-netconf-monitoring@2010-10-04.yang' -&gt; '/home/jenkins/./schemas/ietf-netconf-monitoring@2010-10-04.yang'</msg>
<msg time="2026-08-22T23:36:49.361061" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/ietf-netconf-monitoring-extension@2013-12-10.yang' -&gt; '/home/jenkins/./schemas/ietf-netconf-monitoring-extension@2013-12-10.yang'</msg>
<msg time="2026-08-22T23:36:49.361096" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/people@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/people@2014-08-18.yang'</msg>
<msg time="2026-08-22T23:36:49.361129" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/test@2014-10-18.yang' -&gt; '/home/jenkins/./schemas/test@2014-10-18.yang'</msg>
<msg time="2026-08-22T23:36:49.361163" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/car-people@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/car-people@2014-08-18.yang'</msg>
<msg time="2026-08-22T23:36:49.361196" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/ietf-inet-types@2010-09-24.yang' -&gt; '/home/jenkins/./schemas/ietf-inet-types@2010-09-24.yang'</msg>
<msg time="2026-08-22T23:36:49.361228" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/main@2014-01-21.yang' -&gt; '/home/jenkins/./schemas/main@2014-01-21.yang'</msg>
<arg>${schemas}</arg>
<arg>destination=./schemas</arg>
<doc>Uploads a directory, including its content, from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-08-22T23:36:49.230517" elapsed="0.130780"/>
</kw>
<kw name="List Directory" owner="SSHLibrary">
<msg time="2026-08-22T23:36:49.364718" level="INFO">13 items:
augment-main-a@2014-01-21.yang
car-people@2014-08-18.yang
car-purchase@2014-08-18.yang
car@2014-08-18.yang
example-action@2016-07-07.yang
ietf-inet-types@2010-09-24.yang
ietf-netconf-monitoring-extension@2013-12-10.yang
ietf-netconf-monitoring@2010-10-04.yang
main@2014-01-21.yang
ncmount-l2fib@2016-03-07.yang
people@2014-08-18.yang
test@2014-10-18.yang
yang-ext@2013-07-09.yang</msg>
<arg>./schemas</arg>
<doc>Returns and logs items in the remote ``path``, optionally filtered with ``pattern``.</doc>
<status status="PASS" start="2026-08-22T23:36:49.361543" elapsed="0.003254"/>
</kw>
<return>
<value>--schemas-dir ./schemas</value>
<status status="PASS" start="2026-08-22T23:36:49.364863" elapsed="0.000050"/>
</return>
<msg time="2026-08-22T23:36:49.365069" level="INFO">${schemas_option} = --schemas-dir ./schemas</msg>
<var>${schemas_option}</var>
<arg>${schemas}</arg>
<doc>Internal keyword for Install_And_Start_TestTool
This deploys the additional schemas if any and returns a
command line argument to be added to the testtool commandline
to tell it to load them. While this code could be integrated
into its only user, I considered the resulting code to be too
unreadable as the actions are quite different in the two
possibilities (additional schemas present versus no additional
schemas present), therefore a separate keyword is used.</doc>
<status status="PASS" start="2026-08-22T23:36:49.187738" elapsed="0.177367"/>
</kw>
<kw name="NetconfKeywords__Deploy_Custom_RPC" owner="NetconfKeywords">
<if>
<branch type="IF" condition="'${rpc_config}' == 'none'">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-08-22T23:36:49.366009" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:36:49.365853" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:49.365825" elapsed="0.000355"/>
</if>
<kw name="Copy_File_To_Tools_System" owner="SSHKeywords">
<arg>${TOOLS_SYSTEM_1_IP}</arg>
<arg>${rpc_config}</arg>
<arg>/tmp</arg>
<doc>Wrapper keyword to make it easier to copy a file to an Tools specific system</doc>
<status status="NOT RUN" start="2026-08-22T23:36:49.366454" elapsed="0.000034"/>
</kw>
<return>
<value>--rpc-config /tmp/customaction.xml</value>
<status status="NOT RUN" start="2026-08-22T23:36:49.366554" elapsed="0.000021"/>
</return>
<msg time="2026-08-22T23:36:49.369663" level="INFO">${rpc_config_option} = </msg>
<var>${rpc_config_option}</var>
<arg>${rpc_config}</arg>
<doc>Internal keyword for Install_And_Start_TestTool
This deploys the optional custom rpc file.
Drop out of the keyword, returning no command line argument when there
is no rpc file to deploy.</doc>
<status status="PASS" start="2026-08-22T23:36:49.365468" elapsed="0.004234"/>
</kw>
<kw name="Compose_Full_Java_Command" owner="NexusKeywords">
<kw name="Compose_Base_Java_Command" owner="NexusKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${openjdk}""" == "openjdk8"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_8_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_8_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:49.371632" elapsed="0.000473"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${openjdk}""" == "openjdk11"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_11_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_11_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:49.372336" elapsed="0.000448"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${openjdk}""" == "openjdk17"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_17_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_17_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:49.373011" elapsed="0.000419"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Compose_Dilemma_Filepath" owner="NexusKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:49.375154" level="INFO">Executing command 'ls -lA /usr/lib/jvm/java-21-openjdk-amd64/bin/java 2&gt;&amp;1'.</msg>
<msg time="2026-08-22T23:36:49.387224" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:49.387480" level="INFO">${out} = -rwxr-xr-x 1 root root 14456 Apr 26 09:33 /usr/lib/jvm/java-21-openjdk-amd64/bin/java</msg>
<msg time="2026-08-22T23:36:49.387613" level="INFO">${rc} = 0</msg>
<var>${out}</var>
<var>${rc}</var>
<arg>ls -lA ${specific_path} 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:49.374911" elapsed="0.012760"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${specific_path}</value>
<status status="PASS" start="2026-08-22T23:36:49.388089" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-08-22T23:36:49.387851" elapsed="0.000371"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:49.387808" elapsed="0.000467"/>
</if>
<return>
<value>${default_path}</value>
<status status="NOT RUN" start="2026-08-22T23:36:49.388348" elapsed="0.000032"/>
</return>
<arg>${JAVA_21_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_21_HOME_UBUNTU}/bin/java</arg>
<doc>Query active SSH connection, return specific path if it exists else default path.</doc>
<status status="PASS" start="2026-08-22T23:36:49.374347" elapsed="0.014273"/>
</kw>
<msg time="2026-08-22T23:36:49.388722" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>"""${openjdk}""" == "openjdk21"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_21_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_21_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:49.373676" elapsed="0.015153"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${out}</var>
<var>${rc}</var>
<arg>java -version 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:49.389198" elapsed="0.000050"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>java</value>
<status status="NOT RUN" start="2026-08-22T23:36:49.389492" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:49.389410" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:36:49.389373" elapsed="0.000299"/>
</if>
<kw name="Execute Command" owner="SSHLibrary">
<var>${java}</var>
<arg>echo $JAVA_HOME/bin/java 2&gt;&amp;1</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:49.389995" elapsed="0.000046"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${out}</var>
<var>${rc}</var>
<arg>${java} -version 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:49.390372" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${java}</value>
<status status="NOT RUN" start="2026-08-22T23:36:49.390687" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:49.390572" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:36:49.390536" elapsed="0.000288"/>
</if>
<kw name="Get Environment Variable" owner="OperatingSystem">
<var>${JAVA_HOME}</var>
<arg>JAVA_HOME</arg>
<arg>${EMPTY}</arg>
<doc>Returns the value of an environment variable with the given name.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:49.391131" elapsed="0.000046"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${java}</var>
<arg>"""${JAVA_HOME}"""!=""</arg>
<arg>${JAVA_HOME}/bin/java</arg>
<arg>false</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:49.391544" elapsed="0.000074"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${out}</var>
<var>${rc}</var>
<arg>${java} -version 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:49.391965" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${java}</value>
<status status="NOT RUN" start="2026-08-22T23:36:49.392249" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:49.392167" elapsed="0.000173"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:36:49.392131" elapsed="0.000257"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unable to find Java; specify \${JDKVERSION}, put it to your PATH or set JAVA_HOME environment variable.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:49.392718" elapsed="0.000047"/>
</kw>
<msg time="2026-08-22T23:36:49.392993" level="INFO">${base_command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java</msg>
<var>${base_command}</var>
<arg>openjdk=${openjdk}</arg>
<doc>Return string suitable for launching Java programs over SSHLibrary, depending on JRE version needed.
This requires that the SSH connection on which the command is going to be used is active as it is needed for querying files.
Commands composed for one SSH connection shall not be reused on other SSH connections as the two connections may have different Java setups.
Not directly related to Nexus, but versioned Java tools may need this.</doc>
<status status="PASS" start="2026-08-22T23:36:49.371078" elapsed="0.021974"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:49.394238" level="INFO">${full_command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.4-20260822.052751-14-executable.jar  --device-count 1 --debug true --schemas-dir ./...</msg>
<var>${full_command}</var>
<arg>${base_command} ${options}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:49.393383" elapsed="0.000917"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:49.395217" level="INFO">/usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.4-20260822.052751-14-executable.jar  --device-count 1 --debug true --schemas-dir ./schemas  --md-sal true</msg>
<arg>${full_command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:49.394671" elapsed="0.000700"/>
</kw>
<return>
<value>${full_command}</value>
<status status="PASS" start="2026-08-22T23:36:49.395469" elapsed="0.000060"/>
</return>
<msg time="2026-08-22T23:36:49.395780" level="INFO">${command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.4-20260822.052751-14-executable.jar  --device-count 1 --debug true --schemas-dir ./...</msg>
<var>${command}</var>
<arg>${java_options} -jar ${filename} ${tool_options} --device-count ${device-count} --debug ${debug} ${schemas_option} ${rpc_config_option} --md-sal ${mdsal}</arg>
<doc>Return full Bash command to run Java with given options.
This requires that the SSH connection on which the command is going to be used is active as it is needed for querying files.
The options may include JVM options, application command line arguments, Bash redirects and other constructs.</doc>
<status status="PASS" start="2026-08-22T23:36:49.370021" elapsed="0.025795"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:49.396374" level="INFO">Running testtool: /usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.4-20260822.052751-14-executable.jar  --device-count 1 --debug true --schemas-dir ./schemas  --md-sal true</msg>
<arg>Running testtool: ${command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:49.396028" elapsed="0.000409"/>
</kw>
<kw name="Get Log File Name" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:49.400435" level="INFO">${name} = netconf-clustering-txt-Outages</msg>
<var>${name}</var>
<arg>"""${SUITE_NAME}""".replace(" ","-").replace("/","-").replace(".","-")</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:49.399933" elapsed="0.000540"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:49.403715" level="INFO">${suffix} = </msg>
<var>${suffix}</var>
<arg>'${testcase}' != ''</arg>
<arg>--${testcase}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:49.400720" elapsed="0.003033"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-08-22T23:36:49.404213" level="INFO">${date} = 2026-08-22 23:36:49.404</msg>
<var>${date}</var>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-08-22T23:36:49.403979" elapsed="0.000270"/>
</kw>
<kw name="Convert Date" owner="DateTime">
<msg time="2026-08-22T23:36:49.404914" level="INFO">${timestamp} = 1787441809.404</msg>
<var>${timestamp}</var>
<arg>${date}</arg>
<arg>epoch</arg>
<doc>Converts between supported `date formats`.</doc>
<status status="PASS" start="2026-08-22T23:36:49.404455" elapsed="0.000496"/>
</kw>
<return>
<value>${testtool}--${name}${suffix}.${timestamp}.log</value>
<status status="PASS" start="2026-08-22T23:36:49.405017" elapsed="0.000039"/>
</return>
<msg time="2026-08-22T23:36:49.405344" level="INFO">${logfile} = testtool--netconf-clustering-txt-Outages.1787441809.404.log</msg>
<var>${logfile}</var>
<arg>testtool</arg>
<doc>Get the name of the suite sanitized to be usable as a part of filename.
These names are used to constructs names of the log files produced
by the testing tools so two suites using a tool wont overwrite the
log files if they happen to run in one job.</doc>
<status status="PASS" start="2026-08-22T23:36:49.396774" elapsed="0.008605"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:49.410788" level="INFO">${testtool_log} = testtool--netconf-clustering-txt-Outages.1787441809.404.log</msg>
<arg>${testtool_log}</arg>
<arg>${logfile}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:36:49.405625" elapsed="0.005210"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:36:49.427927" level="INFO">/usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.4-20260822.052751-14-executable.jar  --device-count 1 --debug true --schemas-dir ./schemas  --md-sal true &gt;testtool--netconf-clustering-txt-Outages.1787441809.404.log 2&gt;&amp;1</msg>
<arg>${command} &gt;${logfile} 2&gt;&amp;1</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:36:49.410990" elapsed="0.016997"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:49.431969" level="INFO">${NetconfKeywords__testtool_device_count} = 1</msg>
<arg>${NetconfKeywords__testtool_device_count}</arg>
<arg>${device-count}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:36:49.428151" elapsed="0.003865"/>
</kw>
<kw name="Perform_Operation_On_Each_Device" owner="NetconfKeywords">
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-08-22T23:36:49.432861" level="INFO">${current_Date} = 2026-08-22 23:36:49.433</msg>
<var>${current_Date}</var>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-08-22T23:36:49.432697" elapsed="0.000190"/>
</kw>
<kw name="Add Time To Date" owner="DateTime">
<msg time="2026-08-22T23:36:49.433366" level="INFO">${deadline_Date} = 2026-08-23 00:21:49.433</msg>
<var>${deadline_Date}</var>
<arg>${current_Date}</arg>
<arg>${timeout}</arg>
<doc>Adds time to date and returns the resulting date.</doc>
<status status="PASS" start="2026-08-22T23:36:49.433035" elapsed="0.000357"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:49.437939" level="INFO">${current_port} = 17830</msg>
<arg>${current_port}</arg>
<arg>${BASE_NETCONF_DEVICE_PORT}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:36:49.433553" elapsed="0.004432"/>
</kw>
<kw name="Repeat Keyword" owner="BuiltIn">
<msg time="2026-08-22T23:36:49.438462" level="INFO">Repeating keyword, round 1/1.</msg>
<kw name="NetconfKeywords__Perform_Operation_With_Checking_On_Next_Device" owner="NetconfKeywords">
<kw name="NetconfKeywords__Check_Netconf_Test_Timeout_Not_Expired" owner="NetconfKeywords">
<if>
<branch type="IF" condition="not ${ENABLE_NETCONF_TEST_TIMEOUT}">
<return>
<status status="NOT RUN" start="2026-08-22T23:36:49.439601" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:49.439476" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:49.439457" elapsed="0.000209"/>
</if>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-08-22T23:36:49.439961" level="INFO">${current_Date} = 2026-08-22 23:36:49.440</msg>
<var>${current_Date}</var>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-08-22T23:36:49.439809" elapsed="0.000178"/>
</kw>
<kw name="Subtract Date From Date" owner="DateTime">
<msg time="2026-08-22T23:36:49.440441" level="INFO">${ellapsed_seconds} = 2699.993</msg>
<var>${ellapsed_seconds}</var>
<arg>${deadline_Date}</arg>
<arg>${current_Date}</arg>
<doc>Subtracts date from another date and returns time between.</doc>
<status status="PASS" start="2026-08-22T23:36:49.440134" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="${ellapsed_seconds}&lt;0">
<kw name="Fail" owner="BuiltIn">
<arg>The global time out period expired</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:49.440842" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:49.440589" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:49.440557" elapsed="0.000364"/>
</if>
<arg>${deadline_Date}</arg>
<status status="PASS" start="2026-08-22T23:36:49.439227" elapsed="0.001745"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:49.441483" level="INFO">${number} = 1</msg>
<var>${number}</var>
<arg>${current_port}-${BASE_NETCONF_DEVICE_PORT}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:49.441117" elapsed="0.000392"/>
</kw>
<kw name="Run Keyword" owner="BuiltIn">
<kw name="NetconfKeywords__Wait_Device_Is_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:49.442936" level="INFO">${number} = 1</msg>
<var>${number}</var>
<arg>'${device_name}'.split('-').pop()</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:49.442592" elapsed="0.000370"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:49.444553" level="INFO">${device-port} = 17830</msg>
<var>${device-port}</var>
<arg>${FIRST_TESTTOOL_PORT}+${device-number}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:49.443997" elapsed="0.000600"/>
</kw>
<kw name="NetconfKeywords__Check_Device_Is_Up" owner="NetconfKeywords">
<kw name="Count_Port_Occurences" owner="SSHKeywords">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_And_Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:49.447846" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-08-22T23:36:49.459868" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:49.460005" level="INFO">${netstat_installed} = net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET...</msg>
<var>${netstat_installed}</var>
<arg>netstat --version</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:49.447747" elapsed="0.012295"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<doc>Install netstat if it is not already installed.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:49.460623" elapsed="0.000051"/>
</kw>
<msg time="2026-08-22T23:36:49.460756" level="FAIL">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</msg>
<status status="FAIL" start="2026-08-22T23:36:49.460144" elapsed="0.000723">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</branch>
<status status="FAIL" start="2026-08-22T23:36:49.460116" elapsed="0.000842">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="FAIL" start="2026-08-22T23:36:49.447438" elapsed="0.013807">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</kw>
<arg>Check_And_Install_Netstat</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:49.446870" elapsed="0.014755"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:49.464701" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-08-22T23:36:49.521845" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:49.522252" level="INFO">${output} = 0</msg>
<var>${output}</var>
<arg>${NETSTAT_COMMAND} 2&gt; /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:49.463865" elapsed="0.058485"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:36:49.522490" elapsed="0.000170"/>
</return>
<msg time="2026-08-22T23:36:49.523231" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${last-port}</arg>
<arg>LISTEN</arg>
<arg>java</arg>
<doc>Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.</doc>
<status status="PASS" start="2026-08-22T23:36:49.445219" elapsed="0.078210"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-08-22T23:36:49.525772" level="FAIL">0 != 1</msg>
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-08-22T23:36:49.524288" elapsed="0.001746">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-08-22T23:36:49.444776" elapsed="0.081860">0 != 1</status>
</kw>
<arg>${number}</arg>
<doc>Query netstat on remote machine whether testtool device with the specified number has its port open and fail if not.</doc>
<status status="FAIL" start="2026-08-22T23:36:49.443676" elapsed="0.083186">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:50.530259" level="INFO">${device-port} = 17830</msg>
<var>${device-port}</var>
<arg>${FIRST_TESTTOOL_PORT}+${device-number}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:50.528824" elapsed="0.001506"/>
</kw>
<kw name="NetconfKeywords__Check_Device_Is_Up" owner="NetconfKeywords">
<kw name="Count_Port_Occurences" owner="SSHKeywords">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_And_Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:50.535697" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-08-22T23:36:50.589037" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:50.589280" level="INFO">${netstat_installed} = net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET...</msg>
<var>${netstat_installed}</var>
<arg>netstat --version</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:50.535507" elapsed="0.053836"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<doc>Install netstat if it is not already installed.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:50.590376" elapsed="0.000062"/>
</kw>
<msg time="2026-08-22T23:36:50.590522" level="FAIL">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</msg>
<status status="FAIL" start="2026-08-22T23:36:50.589533" elapsed="0.001143">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</branch>
<status status="FAIL" start="2026-08-22T23:36:50.589476" elapsed="0.001302">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="FAIL" start="2026-08-22T23:36:50.535118" elapsed="0.055954">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</kw>
<arg>Check_And_Install_Netstat</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:50.534296" elapsed="0.057179"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:50.594695" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-08-22T23:36:50.651039" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:50.651461" level="INFO">${output} = 0</msg>
<var>${output}</var>
<arg>${NETSTAT_COMMAND} 2&gt; /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:50.593825" elapsed="0.057738"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:36:50.651770" elapsed="0.000133"/>
</return>
<msg time="2026-08-22T23:36:50.652513" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${last-port}</arg>
<arg>LISTEN</arg>
<arg>java</arg>
<doc>Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.</doc>
<status status="PASS" start="2026-08-22T23:36:50.531836" elapsed="0.120893"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-08-22T23:36:50.655069" level="FAIL">0 != 1</msg>
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-08-22T23:36:50.653556" elapsed="0.001777">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-08-22T23:36:50.530788" elapsed="0.128743">0 != 1</status>
</kw>
<arg>${number}</arg>
<doc>Query netstat on remote machine whether testtool device with the specified number has its port open and fail if not.</doc>
<status status="FAIL" start="2026-08-22T23:36:50.527783" elapsed="0.132012">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:51.662250" level="INFO">${device-port} = 17830</msg>
<var>${device-port}</var>
<arg>${FIRST_TESTTOOL_PORT}+${device-number}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:51.661300" elapsed="0.001005"/>
</kw>
<kw name="NetconfKeywords__Check_Device_Is_Up" owner="NetconfKeywords">
<kw name="Count_Port_Occurences" owner="SSHKeywords">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_And_Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:51.666495" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-08-22T23:36:51.679876" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:51.680156" level="INFO">${netstat_installed} = net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET...</msg>
<var>${netstat_installed}</var>
<arg>netstat --version</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:51.666372" elapsed="0.013826"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<doc>Install netstat if it is not already installed.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:51.681077" elapsed="0.000057"/>
</kw>
<msg time="2026-08-22T23:36:51.681203" level="FAIL">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</msg>
<status status="FAIL" start="2026-08-22T23:36:51.680373" elapsed="0.000926">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</branch>
<status status="FAIL" start="2026-08-22T23:36:51.680323" elapsed="0.001053">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="FAIL" start="2026-08-22T23:36:51.666029" elapsed="0.015636">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</kw>
<arg>Check_And_Install_Netstat</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:51.665241" elapsed="0.016816"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:51.684671" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-08-22T23:36:51.728490" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:51.729145" level="INFO">${output} = 0</msg>
<var>${output}</var>
<arg>${NETSTAT_COMMAND} 2&gt; /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:51.683948" elapsed="0.045311"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:36:51.729470" elapsed="0.000249"/>
</return>
<msg time="2026-08-22T23:36:51.730517" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${last-port}</arg>
<arg>LISTEN</arg>
<arg>java</arg>
<doc>Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.</doc>
<status status="PASS" start="2026-08-22T23:36:51.663208" elapsed="0.067583"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-08-22T23:36:51.734211" level="FAIL">0 != 1</msg>
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-08-22T23:36:51.731962" elapsed="0.002755">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-08-22T23:36:51.662572" elapsed="0.072785">0 != 1</status>
</kw>
<arg>${number}</arg>
<doc>Query netstat on remote machine whether testtool device with the specified number has its port open and fail if not.</doc>
<status status="FAIL" start="2026-08-22T23:36:51.660557" elapsed="0.075101">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:52.739048" level="INFO">${device-port} = 17830</msg>
<var>${device-port}</var>
<arg>${FIRST_TESTTOOL_PORT}+${device-number}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:52.737624" elapsed="0.001495"/>
</kw>
<kw name="NetconfKeywords__Check_Device_Is_Up" owner="NetconfKeywords">
<kw name="Count_Port_Occurences" owner="SSHKeywords">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_And_Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:52.745163" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-08-22T23:36:52.770509" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:52.770787" level="INFO">${netstat_installed} = net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET...</msg>
<var>${netstat_installed}</var>
<arg>netstat --version</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:52.744620" elapsed="0.026228"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<doc>Install netstat if it is not already installed.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:52.771809" elapsed="0.000057"/>
</kw>
<msg time="2026-08-22T23:36:52.771947" level="FAIL">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</msg>
<status status="FAIL" start="2026-08-22T23:36:52.771034" elapsed="0.001025">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</branch>
<status status="FAIL" start="2026-08-22T23:36:52.770981" elapsed="0.001174">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="FAIL" start="2026-08-22T23:36:52.744179" elapsed="0.028263">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</kw>
<arg>Check_And_Install_Netstat</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:52.743297" elapsed="0.029562"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:52.776043" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-08-22T23:36:52.840309" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:52.840773" level="INFO">${output} = 0</msg>
<var>${output}</var>
<arg>${NETSTAT_COMMAND} 2&gt; /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:52.775209" elapsed="0.065667"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:36:52.841027" elapsed="0.000128"/>
</return>
<msg time="2026-08-22T23:36:52.841825" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${last-port}</arg>
<arg>LISTEN</arg>
<arg>java</arg>
<doc>Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.</doc>
<status status="PASS" start="2026-08-22T23:36:52.740663" elapsed="0.101336"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-08-22T23:36:52.844299" level="FAIL">0 != 1</msg>
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-08-22T23:36:52.842860" elapsed="0.001699">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-08-22T23:36:52.739539" elapsed="0.105630">0 != 1</status>
</kw>
<arg>${number}</arg>
<doc>Query netstat on remote machine whether testtool device with the specified number has its port open and fail if not.</doc>
<status status="FAIL" start="2026-08-22T23:36:52.736525" elapsed="0.108920">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:53.847992" level="INFO">${device-port} = 17830</msg>
<var>${device-port}</var>
<arg>${FIRST_TESTTOOL_PORT}+${device-number}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:53.846897" elapsed="0.001152"/>
</kw>
<kw name="NetconfKeywords__Check_Device_Is_Up" owner="NetconfKeywords">
<kw name="Count_Port_Occurences" owner="SSHKeywords">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_And_Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:53.854504" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-08-22T23:36:53.867658" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:53.867896" level="INFO">${netstat_installed} = net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET...</msg>
<var>${netstat_installed}</var>
<arg>netstat --version</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:53.854271" elapsed="0.013667"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<doc>Install netstat if it is not already installed.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:53.868672" elapsed="0.000039"/>
</kw>
<msg time="2026-08-22T23:36:53.868762" level="FAIL">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</msg>
<status status="FAIL" start="2026-08-22T23:36:53.868099" elapsed="0.000739">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</branch>
<status status="FAIL" start="2026-08-22T23:36:53.868053" elapsed="0.000848">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="FAIL" start="2026-08-22T23:36:53.853571" elapsed="0.015521">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</kw>
<arg>Check_And_Install_Netstat</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:53.852348" elapsed="0.017011"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:36:53.871284" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-08-22T23:36:53.917033" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:36:53.917642" level="INFO">${output} = 1</msg>
<var>${output}</var>
<arg>${NETSTAT_COMMAND} 2&gt; /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:36:53.870735" elapsed="0.047022"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:36:53.917992" elapsed="0.000169"/>
</return>
<msg time="2026-08-22T23:36:53.918853" level="INFO">${count} = 1</msg>
<var>${count}</var>
<arg>${last-port}</arg>
<arg>LISTEN</arg>
<arg>java</arg>
<doc>Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.</doc>
<status status="PASS" start="2026-08-22T23:36:53.849304" elapsed="0.069736"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-08-22T23:36:53.920029" elapsed="0.001544"/>
</kw>
<arg>${device-port}</arg>
<status status="PASS" start="2026-08-22T23:36:53.848399" elapsed="0.073719"/>
</kw>
<arg>${number}</arg>
<doc>Query netstat on remote machine whether testtool device with the specified number has its port open and fail if not.</doc>
<status status="PASS" start="2026-08-22T23:36:53.846147" elapsed="0.076100"/>
</kw>
<arg>${TESTTOOL_BOOT_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Device_Up_And_Running</arg>
<arg>${number}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:36:49.443124" elapsed="4.479236"/>
</kw>
<arg>${DEVICE_NAME_BASE}-${number}</arg>
<arg>log_response=${log_response}</arg>
<status status="PASS" start="2026-08-22T23:36:49.442137" elapsed="4.480363"/>
</kw>
<arg>${operation}</arg>
<arg>${DEVICE_NAME_BASE}-${number}</arg>
<arg>log_response=${log_response}</arg>
<doc>Executes the given keyword with the given arguments.</doc>
<status status="PASS" start="2026-08-22T23:36:49.441681" elapsed="4.481019"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:53.924000" level="INFO">${next} = 17831</msg>
<var>${next}</var>
<arg>${current_port}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:53.923090" elapsed="0.000974"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:53.925542" level="INFO">${current_port} = 17831</msg>
<arg>${current_port}</arg>
<arg>${next}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:36:53.924465" elapsed="0.001213"/>
</kw>
<arg>${operation}</arg>
<arg>${deadline_Date}</arg>
<arg>log_response=${log_response}</arg>
<status status="PASS" start="2026-08-22T23:36:49.438673" elapsed="4.487151"/>
</kw>
<arg>${count} times</arg>
<arg>NetconfKeywords__Perform_Operation_With_Checking_On_Next_Device</arg>
<arg>${operation}</arg>
<arg>${deadline_Date}</arg>
<arg>log_response=${log_response}</arg>
<doc>Executes the specified keyword multiple times.</doc>
<status status="PASS" start="2026-08-22T23:36:49.438147" elapsed="4.487877"/>
</kw>
<arg>NetconfKeywords__Wait_Device_Is_Up_And_Running</arg>
<arg>log_response=${log_response}</arg>
<status status="PASS" start="2026-08-22T23:36:49.432214" elapsed="4.493966"/>
</kw>
<arg>${filename}</arg>
<arg>${device-count}</arg>
<arg>${debug}</arg>
<arg>${schemas}</arg>
<arg>${rpc_config}</arg>
<arg>${tool_options}</arg>
<arg>${java_options}</arg>
<arg>${mdsal}</arg>
<arg>log_response=${log_response}</arg>
<doc>Arrange to collect tool's output into a log file.
Will use specific /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas unless argument resolves to 'none',
which signifies that there are no additional schemas to be deployed.
If so the directory for the additional schemas is deleted on the
remote machine and the additional schemas argument is left out.</doc>
<status status="PASS" start="2026-08-22T23:36:49.185845" elapsed="4.740459"/>
</kw>
<arg>device-count=1</arg>
<arg>schemas=/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas</arg>
<doc>Install and run testtool.</doc>
<status status="PASS" start="2026-08-22T23:36:48.510971" elapsed="5.415512"/>
</kw>
<doc>Deploy and start test tool, then wait for all its devices to become online.</doc>
<status status="PASS" start="2026-08-22T23:36:48.203334" elapsed="5.723429"/>
</test>
<test id="s1-s6-t2" name="Check_Device_Is_Not_Mounted_At_Beginning" line="58">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:36:53.932115" elapsed="0.000336"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:36:53.931708" elapsed="0.000833"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:36:53.934149" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:53.933914" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:53.933881" elapsed="0.000376"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:36:53.939442" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:53.939330" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:53.939311" elapsed="0.000200"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:53.940554" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:53.940152" elapsed="0.000446"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:36:53.941074" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:36:53.940762" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:36:53.941147" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:36:53.941309" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:36:53.939763" elapsed="0.001571"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:36:53.946957" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:53.946845" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:53.946824" 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-08-22T23:36:53.948210" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:53.948100" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:53.948081" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:53.948760" level="INFO">${karaf_connection_index} = 34</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:53.948424" elapsed="0.000363"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:53.949174" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:36:53.948948" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:36:54.000397" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:36:53.949713" elapsed="0.051076"/>
</kw>
<msg time="2026-08-22T23:36:54.001230" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:36:54.001339" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:53.949358" elapsed="0.052065"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:36:54.042553" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:36:54.002895" elapsed="0.039799"/>
</kw>
<msg time="2026-08-22T23:36:54.042871" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:36:54.042918" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:54.001934" elapsed="0.041023"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.043346" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.043064" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.043030" elapsed="0.000406"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.043952" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:54.043607" 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-08-22T23:36:54.044313" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.044095" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.044076" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:36:54.044432" 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-08-22T23:36:54.047222" elapsed="0.000159"/>
</kw>
<msg time="2026-08-22T23:36:54.047444" 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-08-22T23:36:54.046083" elapsed="0.001516"/>
</kw>
<kw name="Open 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-08-22T23:36:54.047881" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.048213" 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-08-22T23:36:54.045371" 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-08-22T23:36:54.044785" elapsed="0.003683"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:36:53.947795" elapsed="0.100773"/>
</kw>
<msg time="2026-08-22T23:36:54.048693" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:54.048739" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:53.947179" elapsed="0.101601"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:36:54.049030" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:36:54.048919" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.048899" 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-08-22T23:36:54.049543" 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-08-22T23:36:54.049916" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:36:54.049999" 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-08-22T23:36:53.946473" elapsed="0.103642"/>
</kw>
<msg time="2026-08-22T23:36:54.050213" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:54.050259" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:53.941826" elapsed="0.108470"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.050731" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.050373" elapsed="0.000414"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.050356" elapsed="0.000456"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:36:53.941682" elapsed="0.109156"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:36:54.056668" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:54.056541" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.056521" 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-08-22T23:36:54.057893" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:54.057784" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.057766" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:54.058441" level="INFO">${karaf_connection_index} = 35</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:54.058131" elapsed="0.000337"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:54.058860" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:36:54.058641" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:36:54.121634" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:36:54.059376" elapsed="0.062557"/>
</kw>
<msg time="2026-08-22T23:36:54.122360" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:36:54.122460" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:54.059042" elapsed="0.063497"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:36:54.152860" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:36:54.123736" elapsed="0.029268"/>
</kw>
<msg time="2026-08-22T23:36:54.153228" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:36:54.153292" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:54.122984" elapsed="0.030363"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.153829" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.153483" elapsed="0.000408"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.153443" elapsed="0.000477"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.154465" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:54.154097" elapsed="0.000447"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.154935" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.154708" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.154687" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:36:54.155059" 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-08-22T23:36:54.157961" elapsed="0.000241"/>
</kw>
<msg time="2026-08-22T23:36:54.158287" 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-08-22T23:36:54.156743" elapsed="0.001733"/>
</kw>
<kw name="Open 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-08-22T23:36:54.158882" elapsed="0.000103"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.159331" 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-08-22T23:36:54.156041" elapsed="0.003582"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:36:54.155409" elapsed="0.004307"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:36:54.057460" elapsed="0.102387"/>
</kw>
<msg time="2026-08-22T23:36:54.159979" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:54.160043" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:54.056888" elapsed="0.103209"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:36:54.160352" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:36:54.160206" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.160179" elapsed="0.000288"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.161044" 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-08-22T23:36:54.161425" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:36:54.161504" 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-08-22T23:36:54.056178" elapsed="0.105465"/>
</kw>
<msg time="2026-08-22T23:36:54.161746" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:54.161791" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:54.051116" elapsed="0.110714"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.162477" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.161908" elapsed="0.000633"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.161890" elapsed="0.000676"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:36:54.050976" elapsed="0.111641"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:36:54.169228" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:54.169068" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.169024" elapsed="0.000314"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:36:54.171213" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:54.171058" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.171032" elapsed="0.000285"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:54.172007" level="INFO">${karaf_connection_index} = 36</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:54.171541" elapsed="0.000505"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:54.172655" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:36:54.172302" elapsed="0.000392"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:36:54.229572" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:36:54.173417" elapsed="0.056474"/>
</kw>
<msg time="2026-08-22T23:36:54.230357" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:36:54.230426" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:54.172920" elapsed="0.057562"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:36:54.261192" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:36:54.231541" elapsed="0.030087"/>
</kw>
<msg time="2026-08-22T23:36:54.262077" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:36:54.262274" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:54.230880" elapsed="0.031508"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.263146" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.262666" elapsed="0.000572"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.262559" elapsed="0.000721"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.264094" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:54.263518" elapsed="0.000687"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.264677" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.264311" elapsed="0.000451"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.264283" elapsed="0.000516"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:36:54.264856" 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-08-22T23:36:54.268868" elapsed="0.000233"/>
</kw>
<msg time="2026-08-22T23:36:54.269196" 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-08-22T23:36:54.267252" elapsed="0.002170"/>
</kw>
<kw name="Open 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-08-22T23:36:54.269872" elapsed="0.000116"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.270486" elapsed="0.000202"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:36:54.266253" elapsed="0.004622"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:36:54.265312" 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-08-22T23:36:54.170620" elapsed="0.100451"/>
</kw>
<msg time="2026-08-22T23:36:54.271182" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:54.271258" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:54.169617" elapsed="0.101688"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:36:54.271539" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-08-22T23:36:54.271414" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.271388" elapsed="0.000317"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.272160" 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-08-22T23:36:54.272529" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:36:54.272649" 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-08-22T23:36:54.168349" elapsed="0.104422"/>
</kw>
<msg time="2026-08-22T23:36:54.272882" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:54.272932" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:54.162908" elapsed="0.110066"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.273406" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.273126" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.273105" elapsed="0.000387"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:36:54.162764" elapsed="0.110756"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:36:53.941471" elapsed="0.332087"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:36:53.938953" elapsed="0.334699"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:36:53.933445" elapsed="0.340273"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:53.932790" elapsed="0.340980"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:36:53.928063" elapsed="0.345772"/>
</kw>
<kw name="Check_Device_Has_No_Netconf_Connector" owner="NetconfKeywords">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.287841" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:54.285239" elapsed="0.002635"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.288231" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-22T23:36:54.288073" elapsed="0.000218"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-22T23:36:54.287940" elapsed="0.000380"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.288667" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.288390" elapsed="0.000337"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.289464" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:54.288989" elapsed="0.000502"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:54.288753" elapsed="0.000775"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.289735" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.289554" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.288371" elapsed="0.001441"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:36:54.289850" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:36:54.290012" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:36:54.284752" elapsed="0.005285"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:36:54.290083" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:36:54.290251" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:36:54.284185" elapsed="0.006091"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.297675" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:54.297392" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.298166" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:54.297879" 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-08-22T23:36:54.327844" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:36:54.328215" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Fri, 21-Aug-2026 23:36:54 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1011'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}} 
 </msg>
<msg time="2026-08-22T23:36:54.328670" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:36:54.300365" elapsed="0.028370"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:54.298293" elapsed="0.030557"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.329347" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.328920" elapsed="0.000582"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.298274" elapsed="0.031279"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.338496" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:54.332189" elapsed="0.006519"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:54.331683" elapsed="0.007138"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.331637" elapsed="0.007259"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.346061" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:54.339740" elapsed="0.006487"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:54.339062" elapsed="0.007255"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.339014" elapsed="0.007362"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.347323" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:54.346846" 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-08-22T23:36:54.347749" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.347426" elapsed="0.000391"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.348330" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:54.348018" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:54.347846" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.347408" elapsed="0.001009"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.348985" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:54.348593" 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-08-22T23:36:54.349322" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.349085" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.349895" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:54.349564" elapsed="0.000360"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:54.349404" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.349067" 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-08-22T23:36:54.350144" elapsed="0.000377"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:36:54.351046" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:54.350709" 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-08-22T23:36:54.351232" 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-08-22T23:36:54.330645" elapsed="0.023078"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:36:54.353923" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:54.353799" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.353781" elapsed="0.000221"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:36:54.357327" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:36:54.354156" elapsed="0.003203"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:36:54.357488" elapsed="0.000042"/>
</return>
<msg time="2026-08-22T23:36:54.357690" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:36:54.292924" elapsed="0.064795"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:36:54.357781" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:36:54.357937" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:36:54.290498" elapsed="0.067467"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.358432" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:54.358145" elapsed="0.000346"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.359095" level="INFO">${actual_count} = 0</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:54.358675" elapsed="0.000449"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-22T23:36:54.359173" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:54.359335" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-22T23:36:54.274664" elapsed="0.084698"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.359811" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:36:54.359523" elapsed="0.000344"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=node1</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="PASS" start="2026-08-22T23:36:54.274107" elapsed="0.085827"/>
</kw>
<kw name="Check_Device_Has_No_Netconf_Connector" owner="NetconfKeywords">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.371655" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:54.369323" elapsed="0.002361"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.372037" elapsed="0.000021"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-22T23:36:54.371880" elapsed="0.000217"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-22T23:36:54.371747" elapsed="0.000378"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.372445" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.372193" elapsed="0.000312"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.373267" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:54.372783" elapsed="0.000511"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:54.372529" elapsed="0.000803"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.373524" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.373357" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.372173" elapsed="0.001448"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:36:54.373658" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:36:54.373810" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:36:54.368850" elapsed="0.004989"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:36:54.373885" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:36:54.374027" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:36:54.368330" elapsed="0.005758"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.382151" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:54.381889" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.382651" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:54.382381" 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-08-22T23:36:54.409424" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:36:54.409787" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Fri, 21-Aug-2026 23:36:54 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1011'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}} 
 </msg>
<msg time="2026-08-22T23:36:54.410028" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:36:54.384916" elapsed="0.025171"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:54.382763" elapsed="0.027421"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.410661" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.410277" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.382745" elapsed="0.028136"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.419074" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:54.413249" elapsed="0.005882"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:54.412730" elapsed="0.006437"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.412688" elapsed="0.006505"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.421864" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:54.419474" elapsed="0.002437"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:54.419249" elapsed="0.002698"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.419233" elapsed="0.002740"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.422544" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:54.422143" 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-08-22T23:36:54.422946" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.422662" elapsed="0.000344"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.423515" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:54.423208" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:54.423031" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.422643" elapsed="0.000975"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.424166" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:54.423778" 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-08-22T23:36:54.424547" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.424266" elapsed="0.000358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.425130" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:54.424816" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:54.424651" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.424248" 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-08-22T23:36:54.425370" elapsed="0.000372"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:36:54.426228" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:54.425908" 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-08-22T23:36:54.426414" elapsed="0.002390"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:36:54.411718" elapsed="0.017152"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:36:54.429050" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:54.428942" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.428924" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:36:54.432219" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:36:54.429270" elapsed="0.002981"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:36:54.432305" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:36:54.432466" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:36:54.377309" elapsed="0.055184"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:36:54.432552" elapsed="0.000042"/>
</return>
<msg time="2026-08-22T23:36:54.432721" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:36:54.374592" elapsed="0.058156"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.433170" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:54.432911" elapsed="0.000329"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.433814" level="INFO">${actual_count} = 0</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:54.433401" elapsed="0.000441"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-22T23:36:54.433889" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:36:54.434043" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-22T23:36:54.360713" elapsed="0.073356"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.434530" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:36:54.434260" elapsed="0.000342"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=node2</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="PASS" start="2026-08-22T23:36:54.360192" elapsed="0.074472"/>
</kw>
<kw name="Check_Device_Has_No_Netconf_Connector" owner="NetconfKeywords">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.446191" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:54.443859" elapsed="0.002373"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.446569" elapsed="0.000038"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-22T23:36:54.446407" elapsed="0.000239"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-22T23:36:54.446288" elapsed="0.000384"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.446981" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.446736" elapsed="0.000304"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.447803" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:54.447298" elapsed="0.000556"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:54.447065" elapsed="0.000831"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.448091" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.447921" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.446719" elapsed="0.001452"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:36:54.448206" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:36:54.448356" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:36:54.443382" elapsed="0.005000"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:36:54.448428" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:36:54.448605" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:36:54.442899" elapsed="0.005734"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.456167" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:54.455912" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.456639" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:54.456368" 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-08-22T23:36:54.482442" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:36:54.482810" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Fri, 21-Aug-2026 23:36:54 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1011'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}} 
 </msg>
<msg time="2026-08-22T23:36:54.483080" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:36:54.458928" elapsed="0.024216"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:54.456775" elapsed="0.026475"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.483729" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.483310" elapsed="0.000572"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.456757" elapsed="0.027175"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.491762" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:54.486451" elapsed="0.005417"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:54.485907" elapsed="0.006000"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.485864" elapsed="0.006068"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.494644" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:54.492223" elapsed="0.002469"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:54.491990" elapsed="0.002739"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.491973" elapsed="0.002781"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.495364" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:54.494926" 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-08-22T23:36:54.495721" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.495465" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.496281" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:54.495969" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:54.495807" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.495447" elapsed="0.000923"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.496924" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:54.496531" 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-08-22T23:36:54.497254" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.497022" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.497823" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:54.497505" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:54.497344" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.497005" 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-08-22T23:36:54.498060" elapsed="0.000383"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:36:54.498918" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:54.498625" 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-08-22T23:36:54.499099" 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-08-22T23:36:54.484863" elapsed="0.016699"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:36:54.501760" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:54.501649" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.501631" elapsed="0.000199"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:36:54.504962" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:36:54.501974" elapsed="0.003018"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:36:54.505044" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:36:54.505210" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:36:54.451367" elapsed="0.053870"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:36:54.505295" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:36:54.505453" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:36:54.448853" elapsed="0.056628"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.505920" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:54.505658" elapsed="0.000363"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.506624" level="INFO">${actual_count} = 0</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:54.506178" elapsed="0.000475"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-22T23:36:54.506701" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:54.506854" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-22T23:36:54.435342" elapsed="0.071537"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.507295" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:36:54.507034" elapsed="0.000316"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=node3</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="PASS" start="2026-08-22T23:36:54.434905" elapsed="0.072505"/>
</kw>
<doc>Sanity check making sure our device is not there. Fail if found.</doc>
<status status="PASS" start="2026-08-22T23:36:53.927234" elapsed="0.580307"/>
</test>
<test id="s1-s6-t3" name="Configure_Device_On_Netconf" 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-08-22T23:36:54.510953" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:36:54.510688" 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-08-22T23:36:54.512236" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:54.512124" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.512105" 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-08-22T23:36:54.519366" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:54.519255" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.519236" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.520450" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:54.520066" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.520972" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:36:54.520659" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:36:54.521045" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:36:54.521200" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:36:54.519685" elapsed="0.001541"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:36:54.527097" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:54.526986" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.526961" 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-08-22T23:36:54.528429" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:54.528321" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.528302" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:54.528989" level="INFO">${karaf_connection_index} = 34</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:54.528665" elapsed="0.000352"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:54.529402" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:36:54.529174" elapsed="0.000254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:36:54.583401" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:36:54.529951" elapsed="0.053733"/>
</kw>
<msg time="2026-08-22T23:36:54.584050" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:36:54.584154" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:54.529604" elapsed="0.054632"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:36:54.603804" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:36:54.585690" elapsed="0.018223"/>
</kw>
<msg time="2026-08-22T23:36:54.604134" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:36:54.604182" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:54.584859" elapsed="0.019361"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.604520" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.604299" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.604279" elapsed="0.000357"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.605094" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:54.604778" 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-08-22T23:36:54.605445" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.605230" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.605211" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:36:54.605556" 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-08-22T23:36:54.608199" elapsed="0.000211"/>
</kw>
<msg time="2026-08-22T23:36:54.608474" 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-08-22T23:36:54.607085" elapsed="0.001542"/>
</kw>
<kw name="Open 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-08-22T23:36:54.608904" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.609258" 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-08-22T23:36:54.606434" 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-08-22T23:36:54.605849" 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-08-22T23:36:54.528012" elapsed="0.081619"/>
</kw>
<msg time="2026-08-22T23:36:54.609724" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:54.609769" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:54.527324" elapsed="0.082483"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:36:54.610164" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:36:54.609883" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.609865" 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 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.610689" 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-08-22T23:36:54.611022" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:36:54.611103" 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-08-22T23:36:54.526591" elapsed="0.084623"/>
</kw>
<msg time="2026-08-22T23:36:54.611307" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:54.611352" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:54.521616" elapsed="0.089773"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.611737" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.611465" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.611447" elapsed="0.000369"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:36:54.521459" elapsed="0.090381"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:36:54.617343" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:54.617235" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.617215" 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-08-22T23:36:54.618654" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:54.618522" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.618504" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:54.619163" level="INFO">${karaf_connection_index} = 35</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:54.618865" elapsed="0.000333"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:54.619595" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:36:54.619360" elapsed="0.000264"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:36:54.668968" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:36:54.620119" elapsed="0.048973"/>
</kw>
<msg time="2026-08-22T23:36:54.669265" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:36:54.669313" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:54.619782" elapsed="0.049567"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:36:54.691301" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:36:54.669907" elapsed="0.021494"/>
</kw>
<msg time="2026-08-22T23:36:54.691558" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:36:54.691626" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:54.669528" elapsed="0.022137"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.691966" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.691743" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.691723" elapsed="0.000321"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.692475" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:54.692182" 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-08-22T23:36:54.692834" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.692623" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.692604" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:36:54.692945" 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-08-22T23:36:54.695446" elapsed="0.000194"/>
</kw>
<msg time="2026-08-22T23:36:54.695703" 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-08-22T23:36:54.694373" elapsed="0.001461"/>
</kw>
<kw name="Open 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-08-22T23:36:54.696108" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.696437" 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-08-22T23:36:54.693751" 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-08-22T23:36:54.693207" elapsed="0.003499"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:36:54.618193" elapsed="0.078611"/>
</kw>
<msg time="2026-08-22T23:36:54.696896" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:54.696940" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:54.617559" elapsed="0.079418"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:36:54.697159" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:36:54.697053" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.697035" 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-08-22T23:36:54.697849" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.698223" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:36:54.698295" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:36:54.616884" elapsed="0.081543"/>
</kw>
<msg time="2026-08-22T23:36:54.698522" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:54.698565" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:54.612115" elapsed="0.086593"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.699040" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.698786" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.698768" elapsed="0.000349"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:36:54.611967" elapsed="0.087174"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:36:54.704479" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:54.704372" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.704353" 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-08-22T23:36:54.705707" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:54.705596" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.705557" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:54.706220" level="INFO">${karaf_connection_index} = 36</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:54.705916" elapsed="0.000331"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:54.706665" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:36:54.706429" elapsed="0.000263"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:36:54.750361" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:36:54.707177" elapsed="0.043454"/>
</kw>
<msg time="2026-08-22T23:36:54.750881" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:36:54.750930" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:54.706848" elapsed="0.044120"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:36:54.770919" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:36:54.751726" elapsed="0.019336"/>
</kw>
<msg time="2026-08-22T23:36:54.771246" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:36:54.771294" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:54.751236" elapsed="0.020097"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.771773" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.771446" elapsed="0.000390"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.771411" elapsed="0.000452"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.772381" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:54.772013" 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-08-22T23:36:54.772752" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.772515" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.772496" elapsed="0.000334"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:36:54.772870" 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-08-22T23:36:54.775648" elapsed="0.000157"/>
</kw>
<msg time="2026-08-22T23:36:54.775956" 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-08-22T23:36:54.774495" elapsed="0.001601"/>
</kw>
<kw name="Open 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-08-22T23:36:54.776368" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.776721" 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-08-22T23:36:54.773806" elapsed="0.003101"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:36:54.773205" elapsed="0.003768"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:36:54.705274" elapsed="0.071800"/>
</kw>
<msg time="2026-08-22T23:36:54.777170" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:54.777215" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:54.704713" elapsed="0.072539"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:36:54.777439" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:36:54.777331" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.777312" 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-08-22T23:36:54.777955" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.778296" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:36:54.778368" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:36:54.704028" elapsed="0.074482"/>
</kw>
<msg time="2026-08-22T23:36:54.778714" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:54.778761" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:54.699401" elapsed="0.079397"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.779347" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.778877" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.778859" elapsed="0.000568"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:36:54.699266" elapsed="0.080185"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:36:54.521281" elapsed="0.258203"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:36:54.518886" elapsed="0.260659"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:36:54.511834" elapsed="0.267789"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:54.511371" elapsed="0.268299"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:36:54.508303" elapsed="0.271421"/>
</kw>
<kw name="Configure_Device_In_Netconf" owner="NetconfKeywords">
<kw name="Set_Variable_If_At_Least_Scandium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Set_Variable_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Set Variable If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:54.801066" elapsed="0.000431"/>
</kw>
<msg time="2026-08-22T23:36:54.801554" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>BuiltIn.Set_Variable_If</arg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:54.800702" elapsed="0.000920"/>
</kw>
<arg>scandium</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Compare ${lower_bound} to titanium and return scandium if titanium is at least ${lower_bound},
return calcium otherwise.</doc>
<status status="PASS" start="2026-08-22T23:36:54.800295" elapsed="0.001405"/>
</kw>
<msg time="2026-08-22T23:36:54.801742" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Set_Variable_If_At_Least</arg>
<arg>scandium</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:54.791303" elapsed="0.010481"/>
</kw>
<msg time="2026-08-22T23:36:54.801888" level="INFO">${version} = scandium</msg>
<var>${version}</var>
<arg>scandium</arg>
<arg>calcium</arg>
<doc>Compare scandium to titanium and return ${value_if_true} if titanium is at least scandium, return ${value_if_false} otherwise.</doc>
<status status="PASS" start="2026-08-22T23:36:54.790977" elapsed="0.010935"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.802909" level="INFO">${mapping} = {'DEVICE_IP': '10.30.171.196', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/t...</msg>
<var>${mapping}</var>
<arg>DEVICE_IP=${device_address}</arg>
<arg>DEVICE_NAME=${device_name}</arg>
<arg>DEVICE_PORT=${device_port}</arg>
<arg>DEVICE_USER=${device_user}</arg>
<arg>DEVICE_PASSWORD=${device_password}</arg>
<arg>DEVICE_KEY=${device_key}</arg>
<arg>SCHEMA_DIRECTORY=${schema_directory}</arg>
<arg>RESTCONF_ROOT=${RESTCONF_ROOT}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:36:54.802128" elapsed="0.000809"/>
</kw>
<if>
<branch type="IF" condition="'${http_method}'=='post'">
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<arg>folder=${DIRECTORY_WITH_DEVICE_TEMPLATES}${/}${version}${/}${device_type}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.803355" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.803031" elapsed="0.000391"/>
</branch>
<branch type="ELSE">
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.835345" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:54.834964" elapsed="0.000409"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:36:54.836166" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:36:54.835885" elapsed="0.000361">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:36:54.836341" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:36:54.835534" elapsed="0.000832"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.836927" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:54.836526" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:36:54.837251" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:36:54.837413" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:36:54.837112" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.837856" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:54.837606" 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-08-22T23:36:54.838873" level="INFO">mapping: {'DEVICE_IP': '10.30.171.196', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tmp/schema', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:54.838612" elapsed="0.000308"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.839337" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:36:54.839075" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.840359" level="INFO">${value} = 10.30.171.196</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:36:54.839747" elapsed="0.000638"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:36:54.841377" level="INFO">${encoded} = 10.30.171.196</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:36:54.840975" elapsed="0.000503"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:36:54.841766" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:36:54.841930" level="INFO">${encoded_value} = 10.30.171.196</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:36:54.840570" elapsed="0.001385"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:36:54.842105" elapsed="0.000436"/>
</kw>
<var name="${key}">DEVICE_IP</var>
<var name="${value}">10.30.171.196</var>
<status status="PASS" start="2026-08-22T23:36:54.839614" elapsed="0.002991"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.843279" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:36:54.842864" elapsed="0.000442"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:36:54.844327" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:36:54.843895" elapsed="0.000531"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:36:54.844714" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:36:54.844875" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:36:54.843487" elapsed="0.001414"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:36:54.845048" elapsed="0.000393"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:36:54.842725" elapsed="0.002758"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.846203" level="INFO">${value} = 17830</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:36:54.845784" elapsed="0.000446"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:36:54.847480" level="INFO">${encoded} = 17830</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:36:54.847091" elapsed="0.000502"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:36:54.847863" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:36:54.848024" level="INFO">${encoded_value} = 17830</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:36:54.846415" elapsed="0.001634"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:36:54.848199" elapsed="0.000427"/>
</kw>
<var name="${key}">DEVICE_PORT</var>
<var name="${value}">17830</var>
<status status="PASS" start="2026-08-22T23:36:54.845618" elapsed="0.003051"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.849322" level="INFO">${value} = admin</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:36:54.848912" elapsed="0.000436"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:36:54.850315" level="INFO">${encoded} = admin</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:36:54.849927" elapsed="0.000486"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:36:54.850811" elapsed="0.000041"/>
</return>
<msg time="2026-08-22T23:36:54.850998" level="INFO">${encoded_value} = admin</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:36:54.849531" elapsed="0.001496"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:36:54.851185" elapsed="0.000429"/>
</kw>
<var name="${key}">DEVICE_USER</var>
<var name="${value}">admin</var>
<status status="PASS" start="2026-08-22T23:36:54.848783" elapsed="0.002874"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.852315" level="INFO">${value} = topsecret</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:36:54.851901" elapsed="0.000440"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:36:54.853363" level="INFO">${encoded} = topsecret</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:36:54.852980" elapsed="0.000479"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:36:54.853808" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:36:54.853969" level="INFO">${encoded_value} = topsecret</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:36:54.852523" elapsed="0.001471"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:36:54.854141" elapsed="0.000402"/>
</kw>
<var name="${key}">DEVICE_PASSWORD</var>
<var name="${value}">topsecret</var>
<status status="PASS" start="2026-08-22T23:36:54.851772" elapsed="0.002836"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.855268" level="INFO">${value} = device-key</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:36:54.854859" elapsed="0.000435"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:36:54.856266" level="INFO">${encoded} = device-key</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:36:54.855881" elapsed="0.000483"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:36:54.856684" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:36:54.856844" level="INFO">${encoded_value} = device-key</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:36:54.855475" elapsed="0.001395"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:36:54.857016" elapsed="0.000386"/>
</kw>
<var name="${key}">DEVICE_KEY</var>
<var name="${value}">device-key</var>
<status status="PASS" start="2026-08-22T23:36:54.854723" elapsed="0.002719"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.858156" level="INFO">${value} = /tmp/schema</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:36:54.857744" elapsed="0.000438"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:36:54.860421" level="INFO">${encoded} = /tmp/schema</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:36:54.859525" elapsed="0.001045"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:36:54.861005" elapsed="0.000069"/>
</return>
<msg time="2026-08-22T23:36:54.861269" level="INFO">${encoded_value} = /tmp/schema</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:36:54.858375" elapsed="0.002930"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:36:54.861526" elapsed="0.000627"/>
</kw>
<var name="${key}">SCHEMA_DIRECTORY</var>
<var name="${value}">/tmp/schema</var>
<status status="PASS" start="2026-08-22T23:36:54.857556" elapsed="0.004660"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.863300" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:36:54.862649" elapsed="0.000688"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:36:54.864815" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:36:54.864233" elapsed="0.000719"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:36:54.865330" elapsed="0.000045"/>
</return>
<msg time="2026-08-22T23:36:54.865554" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:36:54.863695" elapsed="0.001971"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:36:54.865885" elapsed="0.000548"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:36:54.862411" elapsed="0.004122"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:36:54.839414" elapsed="0.027216"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:36:54.866703" elapsed="0.000041"/>
</return>
<msg time="2026-08-22T23:36:54.866942" level="INFO">${mapping_to_use} = {'DEVICE_IP': '10.30.171.196', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/t...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:36:54.838260" elapsed="0.028720"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:54.837969" elapsed="0.029059"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.867298" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.867071" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.837950" elapsed="0.029469"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.869153" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:54.867661" elapsed="0.001532"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:36:54.869265" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:36:54.834271" elapsed="0.035183"/>
</kw>
<msg time="2026-08-22T23:36:54.869534" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:54.821641" elapsed="0.048005"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.883692" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.896082" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.908645" 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-08-22T23:36:54.908943" 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-08-22T23:36:54.909128" 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-08-22T23:36:54.909544" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.909397" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:36:54.909378" 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-08-22T23:36:54.909785" 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-08-22T23:36:54.909950" 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-08-22T23:36:54.910110" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:36:54.909341" elapsed="0.000821"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:36:54.909217" 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-08-22T23:36:54.910335" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:36:54.910413" elapsed="0.000018"/>
</return>
<msg time="2026-08-22T23:36:54.910597" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:36:54.817224" elapsed="0.093403"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.937483" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:54.937078" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:36:54.938399" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology.titanium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:36:54.938068" elapsed="0.000418">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology.titanium/data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:36:54.938636" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:36:54.937723" elapsed="0.000940"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.939219" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:54.938831" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:36:54.939552" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:36:54.939754" level="INFO">${template} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;$DEVICE_NAME&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;$DEVICE_IP&lt;/host&gt;
    &lt;port&gt;$DEVI...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:36:54.939406" elapsed="0.000378"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.940371" level="INFO">&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;$DEVICE_NAME&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;$DEVICE_IP&lt;/host&gt;
    &lt;port&gt;$DEVICE_PORT&lt;/port&gt;
    &lt;login-password-unencrypted&gt;
      &lt;username&gt;$DEVICE_USER&lt;/username&gt;
      &lt;password&gt;$DEVICE_PASSWORD&lt;/password&gt;
    &lt;/login-password-unencrypted&gt;
    &lt;tcp-only&gt;false&lt;/tcp-only&gt;
    &lt;keepalive-delay&gt;0&lt;/keepalive-delay&gt;
  &lt;/netconf-node&gt;
&lt;/node&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:54.940119" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:36:54.940938" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.940600" elapsed="0.000398"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.941483" level="INFO">${mapping_to_use} = {'DEVICE_IP': '10.30.171.196', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/t...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:54.941175" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:54.941028" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.940557" elapsed="0.001013"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.942533" level="INFO">${final_text} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;10.30.171.196&lt;/host&gt;
    &lt;...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:54.941736" elapsed="0.000829"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:36:54.942636" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:36:54.936442" elapsed="0.006339"/>
</kw>
<msg time="2026-08-22T23:36:54.942839" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:36:54.923704" elapsed="0.019185"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.955606" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.968063" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.980424" 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-08-22T23:36:54.980631" 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-08-22T23:36:54.980805" 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-08-22T23:36:54.981193" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.981048" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:36:54.981034" 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-08-22T23:36:54.981412" 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-08-22T23:36:54.981593" 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-08-22T23:36:54.981760" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:36:54.981003" elapsed="0.000809"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:36:54.980889" elapsed="0.000953"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.982087" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:36:54.982166" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:36:54.982298" level="INFO">${data} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;10.30.171.196&lt;/host&gt;
    &lt;...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:36:54.920913" elapsed="0.061417"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:36:54.983672" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:36:54.983392" elapsed="0.000352">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:36:54.983839" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:36:54.983051" elapsed="0.000813"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:54.984184" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:54.983936" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.984762" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:54.984449" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:54.984266" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.983917" elapsed="0.000929"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.987225" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:54.984996" elapsed="0.002256"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:36:54.987304" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:54.987457" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:36:54.982718" elapsed="0.004765"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.988887" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:54.988637" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.989322" level="INFO">&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;10.30.171.196&lt;/host&gt;
    &lt;port&gt;17830&lt;/port&gt;
    &lt;login-password-unencrypted&gt;
      &lt;username&gt;admin&lt;/username&gt;
      &lt;password&gt;topsecret&lt;/password&gt;
    &lt;/login-password-unencrypted&gt;
    &lt;tcp-only&gt;false&lt;/tcp-only&gt;
    &lt;keepalive-delay&gt;0&lt;/keepalive-delay&gt;
  &lt;/netconf-node&gt;
&lt;/node&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:54.989084" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.989787" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:54.989524" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.990220" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:54.989979" elapsed="0.000284"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:54.991103" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:36:54.990893" elapsed="0.000236"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:36:54.991466" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:36:54.991286" elapsed="0.000206"/>
</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-08-22T23:36:54.991655" elapsed="0.000221"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:54.992278" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:54.992032" elapsed="0.000291"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:36:54.992365" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:36:54.992588" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:36:54.990462" elapsed="0.002154"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:36:55.029756" level="INFO">PUT Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Content-Length': '452', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;10.30.171.196&lt;/host&gt;
    &lt;port&gt;17830&lt;/port&gt;
    &lt;login-password-unencrypted&gt;
      &lt;username&gt;admin&lt;/username&gt;
      &lt;password&gt;topsecret&lt;/password&gt;
    &lt;/login-password-unencrypted&gt;
    &lt;tcp-only&gt;false&lt;/tcp-only&gt;
    &lt;keepalive-delay&gt;0&lt;/keepalive-delay&gt;
  &lt;/netconf-node&gt;
&lt;/node&gt; 
 </msg>
<msg time="2026-08-22T23:36:55.029815" level="INFO">PUT Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-08-22T23:36:55.029930" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:36:54.994965" elapsed="0.034992"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:54.992688" elapsed="0.037314"/>
</branch>
<branch type="ELSE">
<kw name="PUT 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 PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:55.030184" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:55.030029" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.992670" elapsed="0.037604"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:55.033760" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:55.031263" elapsed="0.002542"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:55.031043" elapsed="0.002797"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.031024" elapsed="0.002841"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:55.036470" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:55.034142" elapsed="0.002374"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:55.033923" elapsed="0.002628"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.033907" elapsed="0.002681"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:55.037152" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:55.036755" 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-08-22T23:36:55.037484" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:55.037250" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:55.038044" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:55.037742" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:55.037566" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.037233" elapsed="0.000895"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:55.038727" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:55.038284" 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-08-22T23:36:55.039056" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:55.038826" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:55.039605" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:55.039294" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:55.039137" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.038807" 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-08-22T23:36:55.039838" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:36:55.040655" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:55.040348" 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-08-22T23:36:55.040834" elapsed="0.002351"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:36:55.030680" elapsed="0.012571"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:36:55.043518" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-08-22T23:36:55.043407" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.043387" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:55.043769" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:36:55.043838" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:36:55.046089" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT 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-08-22T23:36:54.987833" elapsed="0.058283"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:36:55.046182" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:36:55.046341" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-08-22T23:36:54.806317" elapsed="0.240049"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:55.046753" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:55.046468" elapsed="0.000355"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.046450" elapsed="0.000397"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:36:55.046880" elapsed="0.000026"/>
</return>
<arg>folder=${DIRECTORY_WITH_DEVICE_TEMPLATES}${/}${version}${/}${device_type}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-08-22T23:36:54.803697" elapsed="0.243312"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:54.803448" elapsed="0.243606"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:54.803011" elapsed="0.244066"/>
</if>
<kw name="Set To Dictionary" owner="Collections">
<arg>${NetconfKeywords__mounted_device_types}</arg>
<arg>${device_name}</arg>
<arg>${device_type}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:36:55.047223" elapsed="0.000242"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>device_type=configure-via-topology</arg>
<arg>session=node1</arg>
<doc>Tell Netconf about the specified device so it can add it into its configuration.</doc>
<status status="PASS" start="2026-08-22T23:36:54.780002" elapsed="0.267531"/>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:55.048761" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:55.048329" elapsed="0.000459"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-08-22T23:36:55.049005" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:36:55.048862" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.048844" elapsed="0.000241"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:55.049250" elapsed="0.000021"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:55.049422" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:55.049617" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:55.049788" elapsed="0.000019"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:55.049952" elapsed="0.000019"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:55.050114" elapsed="0.000019"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:55.050273" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:55.050515" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:55.050354" elapsed="0.000245"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:36:55.050338" elapsed="0.000287"/>
</if>
<arg>5089</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:36:55.047978" elapsed="0.002701"/>
</kw>
<doc>Use node 1 to configure a testtool device on Netconf connector</doc>
<status status="PASS" start="2026-08-22T23:36:54.507786" elapsed="0.542940"/>
</test>
<test id="s1-s6-t4" name="Wait_For_Device_To_Become_Visible_For_All_Nodes" line="72">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:36:55.054544" elapsed="0.000260"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:36:55.054279" elapsed="0.000581"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:36:55.055856" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:55.055746" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.055726" 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-08-22T23:36:55.060800" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:55.060692" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.060674" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:36:55.061864" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:36:55.061464" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:36:55.062354" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:36:55.062050" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:36:55.062425" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:55.062620" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:36:55.061089" 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-08-22T23:36:55.068071" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:55.067962" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.067944" 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-08-22T23:36:55.069319" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:55.069212" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.069193" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:55.069853" level="INFO">${karaf_connection_index} = 34</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:55.069528" elapsed="0.000352"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:55.070264" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:36:55.070038" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:36:55.117239" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:36:55.070825" elapsed="0.046546"/>
</kw>
<msg time="2026-08-22T23:36:55.117547" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:36:55.117615" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:55.070445" elapsed="0.047210"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:36:55.148616" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "A "l "l "_ "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-08-22T23:36:55.118184" elapsed="0.030585"/>
</kw>
<msg time="2026-08-22T23:36:55.148960" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:36:55.149007" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:55.117833" elapsed="0.031212"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:55.149441" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:55.149153" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.149120" elapsed="0.000408"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:55.150066" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "A "l "l "_ "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-08-22T23:36:55.149705" elapsed="0.000438"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:55.150512" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:55.150295" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.150275" elapsed="0.000336"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:36:55.150685" 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-08-22T23:36:55.153443" elapsed="0.000182"/>
</kw>
<msg time="2026-08-22T23:36:55.153691" 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-08-22T23:36:55.152299" elapsed="0.001531"/>
</kw>
<kw name="Open 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-08-22T23:36:55.154103" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:55.154435" 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-08-22T23:36:55.151637" 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-08-22T23:36:55.151028" 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-08-22T23:36:55.068908" elapsed="0.085921"/>
</kw>
<msg time="2026-08-22T23:36:55.154930" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:55.154975" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:55.068286" elapsed="0.086728"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:36:55.155208" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-08-22T23:36:55.155096" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.155076" 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-08-22T23:36:55.155751" 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-08-22T23:36:55.156099" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:36:55.156173" 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-08-22T23:36:55.067625" elapsed="0.088662"/>
</kw>
<msg time="2026-08-22T23:36:55.156388" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:55.156432" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:55.063028" elapsed="0.093444"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:55.156827" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:55.156549" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.156532" elapsed="0.000373"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:36:55.062887" elapsed="0.094042"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:36:55.162667" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:55.162524" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.162504" 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-08-22T23:36:55.163897" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:55.163790" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.163772" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:55.164416" level="INFO">${karaf_connection_index} = 35</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:55.164107" elapsed="0.000335"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:55.164830" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:36:55.164612" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:36:55.210233" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:36:55.165339" elapsed="0.045117"/>
</kw>
<msg time="2026-08-22T23:36:55.210887" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:36:55.210939" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:55.165010" elapsed="0.045968"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:36:55.243143" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "A "l "l "_ "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-08-22T23:36:55.211754" elapsed="0.031538"/>
</kw>
<msg time="2026-08-22T23:36:55.243510" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:36:55.243560" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:55.211242" elapsed="0.032376"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:55.244219" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:55.243737" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.243699" elapsed="0.000608"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:55.244837" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "A "l "l "_ "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-08-22T23:36:55.244455" elapsed="0.000458"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:55.245197" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:55.244982" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.244964" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:36:55.245318" 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-08-22T23:36:55.248242" elapsed="0.000164"/>
</kw>
<msg time="2026-08-22T23:36:55.248469" 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-08-22T23:36:55.246992" 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-08-22T23:36:55.248908" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:55.249268" 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-08-22T23:36:55.246274" elapsed="0.003182"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:36:55.245686" 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-08-22T23:36:55.163467" elapsed="0.086180"/>
</kw>
<msg time="2026-08-22T23:36:55.249745" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:55.249790" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:55.162893" elapsed="0.086935"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:36:55.250013" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:36:55.249906" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.249887" 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-08-22T23:36:55.250506" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:55.250936" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:36:55.251009" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:36:55.162154" elapsed="0.088965"/>
</kw>
<msg time="2026-08-22T23:36:55.251218" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:55.251262" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:55.157214" elapsed="0.094085"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:55.251763" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:55.251441" elapsed="0.000377"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.251422" elapsed="0.000420"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:36:55.157071" elapsed="0.094796"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:36:55.257376" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:55.257267" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.257248" 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-08-22T23:36:55.258599" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:55.258469" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.258451" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:36:55.259141" level="INFO">${karaf_connection_index} = 36</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:36:55.258834" elapsed="0.000334"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:36:55.259537" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:36:55.259324" elapsed="0.000239"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:36:55.315355" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:36:55.260069" elapsed="0.055388"/>
</kw>
<msg time="2026-08-22T23:36:55.315652" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:36:55.315700" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:55.259738" elapsed="0.055998"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:36:55.346486" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "A "l "l "_ "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-08-22T23:36:55.316251" elapsed="0.032394"/>
</kw>
<msg time="2026-08-22T23:36:55.348811" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:36:55.348858" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:55.315909" elapsed="0.032987"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:55.349209" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:55.348979" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.348956" elapsed="0.000333"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:55.349750" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "A "l "l "_ "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-08-22T23:36:55.349427" 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-08-22T23:36:55.350100" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:55.349887" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.349870" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:36:55.350212" 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-08-22T23:36:55.352881" elapsed="0.000153"/>
</kw>
<msg time="2026-08-22T23:36:55.353097" 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-08-22T23:36:55.351722" 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-08-22T23:36:55.353500" elapsed="0.000096"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:55.353858" 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-08-22T23:36:55.351080" 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-08-22T23:36:55.350490" elapsed="0.003621"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:36:55.258169" elapsed="0.096089"/>
</kw>
<msg time="2026-08-22T23:36:55.354351" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:55.354395" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:55.257610" elapsed="0.096822"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:36:55.354646" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:36:55.354507" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.354489" elapsed="0.000239"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:55.355141" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:55.355473" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:36:55.355545" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:36:55.256914" elapsed="0.098764"/>
</kw>
<msg time="2026-08-22T23:36:55.355775" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:36:55.355820" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:55.252151" elapsed="0.103705"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:55.356181" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:55.355931" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.355914" elapsed="0.000346"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:36:55.252008" elapsed="0.104275"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:36:55.062705" elapsed="0.293611"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:36:55.060316" elapsed="0.296060"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:36:55.055436" elapsed="0.300995"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:36:55.055013" elapsed="0.301463"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:36:55.051832" elapsed="0.304695"/>
</kw>
<kw name="Wait_Device_Connected" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:55.368819" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:55.366496" elapsed="0.002350"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:55.369529" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:55.369201" elapsed="0.000355"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:36:55.369047" elapsed="0.000561"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:55.370166" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:55.369840" elapsed="0.000353"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:36:55.369690" elapsed="0.000539"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:36:55.368904" elapsed="0.001354"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:55.370565" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:55.370323" elapsed="0.000318"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:55.371393" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:55.370924" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:55.370665" elapsed="0.000793"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:55.371664" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:55.371483" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.370305" elapsed="0.001479"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:36:55.371819" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:36:55.371969" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:36:55.366034" elapsed="0.005961"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:36:55.372041" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:36:55.372182" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:36:55.365433" elapsed="0.006774"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:55.379597" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:55.379324" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:55.380044" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:55.379799" 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-08-22T23:36:55.393020" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:36:55.393324" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"connection-status":"connecting","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196"}}]} 
 </msg>
<msg time="2026-08-22T23:36:55.393570" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:36:55.382225" elapsed="0.011441"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:55.380155" 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-08-22T23:36:55.394170" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:55.393827" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.380137" elapsed="0.014229"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:55.402163" level="INFO">{"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"connection-status":"connecting","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196"}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:55.396718" elapsed="0.005554"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:55.396198" elapsed="0.006152"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.396156" elapsed="0.006249"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:55.405977" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:55.403134" elapsed="0.002891"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:55.402529" elapsed="0.003530"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.402492" elapsed="0.003592"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:55.406652" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:55.406246" 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-08-22T23:36:55.407000" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:55.406751" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:55.407539" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:55.407239" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:55.407081" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.406733" elapsed="0.000908"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:55.408346" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:55.407976" 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-08-22T23:36:55.408691" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:55.408442" elapsed="0.000349"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:55.409281" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:55.408981" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:55.408820" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.408424" 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-08-22T23:36:55.409512" elapsed="0.000368"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:36:55.410345" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:55.410042" 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-08-22T23:36:55.410524" elapsed="0.002366"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:36:55.395218" elapsed="0.017738"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:36:55.413133" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:55.413026" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:55.413008" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:36:55.416080" level="INFO">${text_normalized} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:36:55.413345" elapsed="0.002765"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:36:55.416161" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:36:55.416325" level="INFO">${response_text} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:36:55.374973" elapsed="0.041379"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:36:55.416409" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:36:55.416560" level="INFO">${device_status} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:36:55.372428" elapsed="0.044318"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:36:55.417285" level="FAIL">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</msg>
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:36:55.416910" elapsed="0.000459">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</status>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:36:55.357869" elapsed="0.059630">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:56.434564" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:56.432236" elapsed="0.002374"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:56.435312" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:56.434978" elapsed="0.000362"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:36:56.434823" elapsed="0.000572"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:56.435971" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:56.435644" elapsed="0.000355"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:36:56.435479" elapsed="0.000556"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:36:56.434678" elapsed="0.001387"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:56.436476" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:56.436138" elapsed="0.000398"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:56.437289" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:56.436815" elapsed="0.000503"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:56.436562" elapsed="0.000793"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:56.437544" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:56.437381" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:56.436119" elapsed="0.001520"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:36:56.437676" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:36:56.437836" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:36:56.431756" elapsed="0.006107"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:36:56.437910" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:36:56.438054" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:36:56.431153" elapsed="0.006927"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:56.445399" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:56.445101" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:56.445874" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:56.445624" 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-08-22T23:36:56.458164" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:36:56.458459" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"connection-status":"connecting","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196"}}]} 
 </msg>
<msg time="2026-08-22T23:36:56.458711" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:36:56.448056" elapsed="0.010715"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:56.445986" elapsed="0.012885"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:56.459276" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:56.458931" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:56.445967" elapsed="0.013536"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:56.466170" level="INFO">{"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"connection-status":"connecting","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196"}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:56.461848" elapsed="0.004391"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:56.461323" elapsed="0.004965"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:56.461282" elapsed="0.005042"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:56.470016" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:56.466734" elapsed="0.003348"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:56.466403" elapsed="0.003729"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:56.466380" elapsed="0.003787"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:56.470983" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:56.470396" 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-08-22T23:36:56.471487" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:56.471121" elapsed="0.000473"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:56.472148" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:56.471841" elapsed="0.000394"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:56.471631" elapsed="0.000651"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:56.471095" elapsed="0.001209"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:56.472871" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:56.472476" 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-08-22T23:36:56.473199" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:56.472969" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:56.473758" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:56.473440" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:56.473282" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:56.472951" 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-08-22T23:36:56.473999" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:36:56.474827" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:56.474510" 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-08-22T23:36:56.475010" elapsed="0.002344"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:36:56.460332" elapsed="0.017087"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:36:56.477612" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:56.477489" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:56.477471" elapsed="0.000211"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:36:56.480533" level="INFO">${text_normalized} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:36:56.477827" elapsed="0.002736"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:36:56.480633" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:36:56.480795" level="INFO">${response_text} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:36:56.440795" elapsed="0.040028"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:36:56.480881" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:36:56.481033" level="INFO">${device_status} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:36:56.438304" elapsed="0.042756"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:36:56.481573" level="FAIL">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</msg>
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:36:56.481217" elapsed="0.000448">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</status>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:36:56.418345" elapsed="0.063443">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:57.502113" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:57.499760" elapsed="0.002386"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:57.502872" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:57.502520" elapsed="0.000449"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:36:57.502365" elapsed="0.000644"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:57.503598" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:57.503244" elapsed="0.000382"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:36:57.503093" elapsed="0.000571"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:36:57.502216" elapsed="0.001477"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:57.504059" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:57.503765" elapsed="0.000355"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:57.504874" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:57.504378" elapsed="0.000524"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:57.504146" elapsed="0.000794"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:57.505128" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:57.504965" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:57.503745" elapsed="0.001463"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:36:57.505246" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:36:57.505406" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:36:57.499266" elapsed="0.006165"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:36:57.505478" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:36:57.505637" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:36:57.498650" elapsed="0.007020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:57.512975" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:57.512716" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:57.513417" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:57.513175" 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-08-22T23:36:57.530332" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:36:57.530541" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '3689'} 
 body={"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"unavailable-capabilities":{"unavailable-capability":[{"failure-reason":"missing-source","capability":"(urn:ietf:params:xml:ns:netconf:notification:1.0?revision=2008-07-14)notifications"}]},"clustered-connection-status":{"netconf-master-node":"pekko://opendaylight-cluster-data@127.0.0.1:2550"},"negotiated-ssh-transport-parameters":{"encryption-alg":"chacha20-poly1305","host-key-alg":"rsa-sha2-512","mac-alg":"none","key-exchange-alg":"sntrup761x25519-sha512"},"session-id":1,"connection-status":"connected","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196","available-capabilities":{"available-capability":[{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:notification:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:exi:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:candidate:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.1"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.0"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people?revision=2014-08-18)people"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)ietf-yang-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?revision=2010-10-04)ietf-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car?revision=2014-08-18)car"},{"capability-origin":"device-advertised","capability":"(ns:augment:main:a?revision=2014-01-21)augment-main-a"},{"capability-origin":"device-advertised","capability":"(ns:main?revision=2014-01-21)main"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:netconf:monitoring?revision=2022-07-18)odl-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:netconf:base:1.0?revision=2011-06-01)ietf-netconf"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring-extension?revision=2013-12-10)ietf-netconf-monitoring-extension"},{"capability-origin":"device-advertised","capability":"(org:opendaylight:coretutorials:ncmount:example:l2fib?revision=2016-03-07)ncmount-l2fib"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people?revision=2014-08-18)car-people"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-purchase?revision=2014-08-18)car-purchase"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:test:netconf:crud?revision=2014-10-18)test"},{"capability-origin":"device-advertised","capability":"(https://example.com/ns/example-action?revision=2016-07-07)example-action"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2013-07-15)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2010-09-24)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:yang:extension:yang-ext?revision=2013-07-09)yang-ext"}]}}}]} 
 </msg>
<msg time="2026-08-22T23:36:57.530725" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:36:57.515644" elapsed="0.015112"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:57.513529" elapsed="0.017273"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:57.531230" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:57.530841" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:57.513511" elapsed="0.017930"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:57.539810" level="INFO">{"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"unavailable-capabilities":{"unavailable-capability":[{"failure-reason":"missing-source","capability":"(urn:ietf:params:xml:ns:netconf:notification:1.0?revision=2008-07-14)notifications"}]},"clustered-connection-status":{"netconf-master-node":"pekko://opendaylight-cluster-data@127.0.0.1:2550"},"negotiated-ssh-transport-parameters":{"encryption-alg":"chacha20-poly1305","host-key-alg":"rsa-sha2-512","mac-alg":"none","key-exchange-alg":"sntrup761x25519-sha512"},"session-id":1,"connection-status":"connected","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196","available-capabilities":{"available-capability":[{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:notification:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:exi:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:candidate:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.1"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.0"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people?revision=2014-08-18)people"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)ietf-yang-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?revision=2010-10-04)ietf-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car?revision=2014-08-18)car"},{"capability-origin":"device-advertised","capability":"(ns:augment:main:a?revision=2014-01-21)augment-main-a"},{"capability-origin":"device-advertised","capability":"(ns:main?revision=2014-01-21)main"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:netconf:monitoring?revision=2022-07-18)odl-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:netconf:base:1.0?revision=2011-06-01)ietf-netconf"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring-extension?revision=2013-12-10)ietf-netconf-monitoring-extension"},{"capability-origin":"device-advertised","capability":"(org:opendaylight:coretutorials:ncmount:example:l2fib?revision=2016-03-07)ncmount-l2fib"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people?revision=2014-08-18)car-people"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-purchase?revision=2014-08-18)car-purchase"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:test:netconf:crud?revision=2014-10-18)test"},{"capability-origin":"device-advertised","capability":"(https://example.com/ns/example-action?revision=2016-07-07)example-action"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2013-07-15)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2010-09-24)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:yang:extension:yang-ext?revision=2013-07-09)yang-ext"}]}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:57.533866" elapsed="0.006157"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:57.533338" elapsed="0.006771"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:57.533295" elapsed="0.006871"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:57.543189" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:57.540827" elapsed="0.002410"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:57.540295" elapsed="0.002978"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:57.540257" elapsed="0.003042"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:57.543876" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:57.543462" 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-08-22T23:36:57.544232" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:57.543994" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:57.544804" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:57.544479" elapsed="0.000356"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:57.544317" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:57.543958" elapsed="0.000939"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:36:57.545424" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:57.545056" 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-08-22T23:36:57.545773" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:57.545523" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:57.546317" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:57.546019" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:57.545861" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:57.545505" 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-08-22T23:36:57.546607" elapsed="0.000357"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:36:57.547423" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:36:57.547128" 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-08-22T23:36:57.547620" elapsed="0.002401"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:36:57.532342" elapsed="0.017744"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:36:57.550265" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:57.550157" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:57.550139" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:36:57.553929" level="INFO">${text_normalized} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "available-capabilities": {
     "available-capability": [
      {
       "capability": "(https://example.com/ns/exampl...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:36:57.550478" elapsed="0.003483"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:36:57.554018" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:36:57.554181" level="INFO">${response_text} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "available-capabilities": {
     "available-capability": [
      {
       "capability": "(https://example.com/ns/exampl...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:36:57.508348" elapsed="0.045860"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:36:57.554266" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:36:57.554417" level="INFO">${device_status} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "available-capabilities": {
     "available-capability": [
      {
       "capability": "(https://example.com/ns/exampl...</msg>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:36:57.505893" elapsed="0.048550"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-08-22T23:36:57.554617" elapsed="0.000306"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="PASS" start="2026-08-22T23:36:57.482661" elapsed="0.072324"/>
</kw>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Connected</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:36:55.357261" elapsed="2.197779"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=node1</arg>
<doc>Wait for the device to become connected.
It is more readable to use this keyword in a test case than to put the whole WUKS below into it.</doc>
<status status="PASS" start="2026-08-22T23:36:55.356823" elapsed="2.198284"/>
</kw>
<kw name="Wait_Device_Connected" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:57.567162" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:57.564981" elapsed="0.002209"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:57.567865" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:57.567524" elapsed="0.000368"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:36:57.567375" elapsed="0.000553"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:57.568517" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:57.568195" elapsed="0.000348"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:36:57.568043" elapsed="0.000552"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:36:57.567244" elapsed="0.001382"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:57.568929" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:57.568690" elapsed="0.000297"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:57.569726" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:57.569241" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:57.569011" elapsed="0.000815"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:57.570016" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:57.569852" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:57.568672" elapsed="0.001421"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:36:57.570128" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:36:57.570276" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:36:57.564511" elapsed="0.005791"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:36:57.570348" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:36:57.570491" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:36:57.563929" elapsed="0.006587"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:57.577756" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:57.577489" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:57.578193" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:57.577952" 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-08-22T23:36:57.596544" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:36:57.596873" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:36:57.597152" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:36:57.580373" elapsed="0.017660">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:36:57.578302" elapsed="0.019920">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:57.598681" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:57.598301" elapsed="0.000529"/>
</branch>
<status status="FAIL" start="2026-08-22T23:36:57.578284" elapsed="0.020600">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:57.599736" elapsed="0.000060"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:36:57.600102" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:57.599956" elapsed="0.000249"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:36:57.599915" 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-08-22T23:36:57.600572" elapsed="0.000083"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:36:57.600769" elapsed="0.000034"/>
</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-08-22T23:36:57.573199" elapsed="0.027804">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:36:57.601162" elapsed="0.000037"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:36:57.570749" elapsed="0.030626">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:57.601879" elapsed="0.000052"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:36:57.556351" elapsed="0.045783">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:58.619969" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:58.617787" elapsed="0.002216"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:58.620772" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:58.620379" elapsed="0.000422"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:36:58.620225" elapsed="0.000616"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:58.621400" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:58.621074" elapsed="0.000353"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:36:58.620923" elapsed="0.000540"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:36:58.620075" elapsed="0.001416"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:58.621855" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:58.621568" elapsed="0.000348"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:58.622672" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:58.622176" elapsed="0.000524"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:58.621941" elapsed="0.000797"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:58.622928" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:58.622763" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:58.621547" elapsed="0.001461"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:36:58.623048" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:36:58.623212" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:36:58.617278" elapsed="0.005961"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:36:58.623287" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:36:58.623436" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:36:58.616625" elapsed="0.006837"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:58.631040" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:58.630775" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:58.631488" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:58.631241" 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-08-22T23:36:58.642753" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:36:58.642935" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:36:58.643081" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:36:58.633701" elapsed="0.009923">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:36:58.631617" elapsed="0.012195">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:58.644089" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:58.643868" elapsed="0.000317"/>
</branch>
<status status="FAIL" start="2026-08-22T23:36:58.631598" elapsed="0.012623">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:58.644850" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:36:58.645043" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:58.644991" elapsed="0.000111"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:36:58.644968" elapsed="0.000164"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:58.645329" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:36:58.645431" 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-08-22T23:36:58.626379" elapsed="0.019224">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:36:58.645707" elapsed="0.000022"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:36:58.623710" elapsed="0.022133">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:58.646082" elapsed="0.000031"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:36:58.603276" elapsed="0.042963">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:59.664958" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:59.662751" elapsed="0.002243"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:59.665913" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:59.665373" elapsed="0.000571"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:36:59.665216" elapsed="0.000766"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:59.666548" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:59.666221" elapsed="0.000379"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:36:59.666066" elapsed="0.000573"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:36:59.665066" elapsed="0.001602"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:59.667013" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:59.666744" elapsed="0.000329"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:36:59.667836" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:36:59.667331" elapsed="0.000534"/>
</kw>
<status status="PASS" start="2026-08-22T23:36:59.667098" elapsed="0.000803"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:59.668089" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:59.667926" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:36:59.666722" elapsed="0.001443"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:36:59.668203" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:36:59.668366" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:36:59.662200" elapsed="0.006194"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:36:59.668444" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:36:59.668682" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:36:59.661592" elapsed="0.007118"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:59.676110" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:59.675844" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:36:59.676554" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:36:59.676310" 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-08-22T23:36:59.688003" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:36:59.688309" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:36:59.688540" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:36:59.678799" elapsed="0.010591">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:36:59.676686" elapsed="0.012964">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:59.690167" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:36:59.689733" elapsed="0.000612"/>
</branch>
<status status="FAIL" start="2026-08-22T23:36:59.676668" elapsed="0.013735">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:59.691385" elapsed="0.000066"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:36:59.691752" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:36:59.691660" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:36:59.691616" 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-08-22T23:36:59.692279" elapsed="0.000053"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:36:59.692456" elapsed="0.000036"/>
</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-08-22T23:36:59.671440" elapsed="0.021308">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:36:59.692923" elapsed="0.000037"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:36:59.668937" elapsed="0.024244">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:36:59.693665" elapsed="0.000056"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:36:59.647112" elapsed="0.046828">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:00.712914" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:00.709954" elapsed="0.003114"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:00.714021" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:00.713592" elapsed="0.000457"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:37:00.713357" elapsed="0.000730"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:00.714677" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:00.714319" elapsed="0.000385"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:37:00.714168" elapsed="0.000573"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:37:00.713159" elapsed="0.001611"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:00.715147" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:00.714840" elapsed="0.000373"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:00.715969" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:00.715478" elapsed="0.000519"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:00.715238" elapsed="0.000796"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:00.716220" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:00.716059" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:00.714821" elapsed="0.001477"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:00.716335" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:37:00.716491" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:37:00.709277" elapsed="0.007241"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:00.716565" elapsed="0.000042"/>
</return>
<msg time="2026-08-22T23:37:00.716726" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:37:00.708449" elapsed="0.008303"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:00.724147" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:00.723889" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:00.724606" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:00.724345" 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-08-22T23:37:00.736048" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:00.736247" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:37:00.736390" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:00.726921" elapsed="0.010037">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:00.724719" elapsed="0.012352">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:00.737333" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:00.737118" elapsed="0.000307"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:00.724701" elapsed="0.012757">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:00.737990" elapsed="0.000082"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:00.738230" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:00.738177" elapsed="0.000112"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:00.738152" elapsed="0.000168"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:00.738517" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:00.738639" 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-08-22T23:37:00.719601" elapsed="0.019186">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:00.738885" elapsed="0.000021"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:00.716986" elapsed="0.022031">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:00.739248" elapsed="0.000031"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:37:00.694884" elapsed="0.044516">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:01.756632" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:01.754485" elapsed="0.002181"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:01.757374" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:01.757041" elapsed="0.000361"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:37:01.756875" elapsed="0.000565"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:01.758009" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:01.757685" elapsed="0.000351"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:37:01.757521" elapsed="0.000552"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:37:01.756732" elapsed="0.001370"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:01.758433" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:01.758172" elapsed="0.000327"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:01.759255" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:01.758776" elapsed="0.000508"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:01.758524" elapsed="0.000797"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:01.759509" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:01.759346" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:01.758153" elapsed="0.001451"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:01.759642" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:37:01.759801" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:37:01.754009" elapsed="0.005818"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:01.759875" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:37:01.760018" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:37:01.753422" elapsed="0.006622"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:01.767335" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:01.767079" elapsed="0.000378"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:01.767880" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:01.767629" 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-08-22T23:37:01.781748" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:01.781904" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:37:01.782121" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:01.771631" elapsed="0.011294">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:01.767991" elapsed="0.015114">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:01.783523" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:01.783180" elapsed="0.000525"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:01.767973" elapsed="0.015788">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:01.784609" elapsed="0.000076"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:01.784934" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:01.784849" elapsed="0.000183"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:01.784809" 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-08-22T23:37:01.785394" elapsed="0.000049"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:01.785554" elapsed="0.000063"/>
</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-08-22T23:37:01.762765" elapsed="0.023057">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:01.785978" elapsed="0.000035"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:01.760267" elapsed="0.025925">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:01.786558" elapsed="0.000079"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:37:01.740254" elapsed="0.046579">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:02.804429" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:02.802094" elapsed="0.002371"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:02.805190" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:02.804859" elapsed="0.000359"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:37:02.804704" elapsed="0.000552"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:02.805843" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:02.805501" elapsed="0.000369"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:37:02.805350" elapsed="0.000653"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:37:02.804537" elapsed="0.001496"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:02.806386" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:02.806115" elapsed="0.000329"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:02.807189" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:02.806719" elapsed="0.000500"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:02.806471" elapsed="0.000785"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:02.807445" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:02.807281" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:02.806093" elapsed="0.001430"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:02.807564" elapsed="0.000053"/>
</return>
<msg time="2026-08-22T23:37:02.807746" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:37:02.801594" elapsed="0.006178"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:02.807819" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:37:02.807965" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:37:02.800921" elapsed="0.007070"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:02.815533" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:02.815273" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:02.816001" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:02.815752" 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-08-22T23:37:02.828011" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:02.828175" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:37:02.828287" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:02.818186" elapsed="0.010533">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:02.816116" elapsed="0.012686">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:02.828996" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:02.828838" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:02.816098" elapsed="0.012988">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:02.829492" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:02.829649" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:02.829610" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:02.829591" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:02.829855" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:02.830007" elapsed="0.000036"/>
</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-08-22T23:37:02.810938" elapsed="0.019304">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:02.830398" elapsed="0.000033"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:02.808220" elapsed="0.022413">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:02.831003" elapsed="0.000048"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:37:02.787670" elapsed="0.043570">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:03.850533" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:03.848179" elapsed="0.002387"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:03.851281" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:03.850950" elapsed="0.000359"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:37:03.850798" elapsed="0.000547"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:03.851917" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:03.851575" elapsed="0.000368"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:37:03.851426" elapsed="0.000559"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:37:03.850651" elapsed="0.001363"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:03.852351" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:03.852086" elapsed="0.000324"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:03.853155" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:03.852683" elapsed="0.000500"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:03.852435" elapsed="0.000786"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:03.853410" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:03.853246" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:03.852066" elapsed="0.001423"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:03.853525" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:37:03.853699" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:37:03.847698" elapsed="0.006028"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:03.853772" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:37:03.853916" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:37:03.847104" elapsed="0.006838"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:03.861469" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:03.861208" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:03.861934" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:03.861686" 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-08-22T23:37:03.870960" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:03.871197" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:37:03.871305" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:03.864130" elapsed="0.007584">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:03.862046" elapsed="0.009752">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:03.871986" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:03.871832" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:03.862028" elapsed="0.010054">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:03.872455" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:03.872605" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:03.872551" elapsed="0.000098"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:03.872534" elapsed="0.000137"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:03.872813" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:03.872885" 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-08-22T23:37:03.856784" elapsed="0.016207">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:03.873061" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:03.854274" elapsed="0.018883">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:03.873322" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:37:03.832143" elapsed="0.041288">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:04.891385" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:04.889262" elapsed="0.002155"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:04.892134" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:04.891800" elapsed="0.000362"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:37:04.891649" elapsed="0.000550"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:04.892766" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:04.892427" elapsed="0.000366"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:37:04.892280" elapsed="0.000550"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:37:04.891490" elapsed="0.001369"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:04.893191" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:04.892930" elapsed="0.000320"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:04.893993" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:04.893506" elapsed="0.000515"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:04.893275" elapsed="0.000841"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:04.894305" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:04.894143" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:04.892910" elapsed="0.001473"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:04.894420" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:37:04.894593" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:37:04.888788" elapsed="0.005833"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:04.894668" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:37:04.894813" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:37:04.888203" elapsed="0.006636"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:04.902163" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:04.901905" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:04.902624" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:04.902363" 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-08-22T23:37:04.912978" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:04.913126" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:37:04.913231" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:04.904810" elapsed="0.008826">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:04.902738" elapsed="0.010985">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:04.913911" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:04.913758" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:04.902720" elapsed="0.011283">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:04.914376" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:04.914511" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:04.914473" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:04.914456" elapsed="0.000136"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:04.914736" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:04.914809" elapsed="0.000014"/>
</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-08-22T23:37:04.897547" elapsed="0.017368">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:04.914986" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:04.895061" elapsed="0.020030">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:04.915357" elapsed="0.000025"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:37:04.874157" elapsed="0.041320">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:05.936545" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:05.933274" elapsed="0.003337"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:05.937712" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:05.937151" elapsed="0.000602"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:37:05.936919" elapsed="0.000889"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:05.938430" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:05.938106" elapsed="0.000351"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:37:05.937926" elapsed="0.000568"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:37:05.936708" elapsed="0.001815"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:05.938885" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:05.938614" elapsed="0.000330"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:05.939687" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:05.939203" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:05.938971" elapsed="0.000782"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:05.939939" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:05.939777" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:05.938592" elapsed="0.001425"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:05.940056" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:37:05.940222" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:37:05.932512" elapsed="0.007736"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:05.940296" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:37:05.940443" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:37:05.931474" elapsed="0.008996"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:05.947950" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:05.947682" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:05.948402" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:05.948158" 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-08-22T23:37:05.957997" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:05.958156" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:37:05.958270" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:05.950800" elapsed="0.007891">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:05.948519" elapsed="0.010336">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:05.959054" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:05.958894" elapsed="0.000233"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:05.948498" elapsed="0.010654">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:05.959551" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:05.959710" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:05.959670" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:05.959652" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:05.959921" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:05.959993" 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-08-22T23:37:05.943289" elapsed="0.016814">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:05.960175" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:05.940730" elapsed="0.019544">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:05.960445" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:37:05.916289" elapsed="0.044268">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:06.979005" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:06.976776" elapsed="0.002264"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:06.979790" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:06.979434" elapsed="0.000384"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:37:06.979263" elapsed="0.000593"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:06.980430" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:06.980103" elapsed="0.000354"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:37:06.979948" elapsed="0.000546"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:37:06.979113" elapsed="0.001410"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:06.980886" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:06.980616" elapsed="0.000343"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:06.981732" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:06.981236" elapsed="0.000524"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:06.980989" elapsed="0.000809"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:06.982000" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:06.981824" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:06.980593" elapsed="0.001489"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:06.982121" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:37:06.982286" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:37:06.976267" elapsed="0.006045"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:06.982360" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:37:06.982600" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:37:06.975664" elapsed="0.006965"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:06.990135" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:06.989862" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:06.990606" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:06.990339" 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-08-22T23:37:07.001484" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:07.001668" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:37:07.001781" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:06.992831" elapsed="0.009352">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:06.990724" elapsed="0.011553">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:07.002473" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:07.002314" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:06.990705" elapsed="0.011860">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:07.002965" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:07.003105" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:07.003066" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:07.003047" elapsed="0.000160"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:07.003363" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:07.003436" elapsed="0.000017"/>
</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-08-22T23:37:06.985394" elapsed="0.018153">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:07.003639" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:06.982855" elapsed="0.020883">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:07.003906" elapsed="0.000023"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:37:06.961389" elapsed="0.042629">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:08.023325" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:08.020380" elapsed="0.003070"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:08.024224" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:08.023883" elapsed="0.000368"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:37:08.023713" elapsed="0.000576"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:08.024866" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:08.024523" elapsed="0.000370"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:37:08.024372" elapsed="0.000558"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:37:08.023531" elapsed="0.001429"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:08.025320" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:08.025041" elapsed="0.000339"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:08.026163" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:08.025663" elapsed="0.000529"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:08.025407" elapsed="0.000823"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:08.026419" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:08.026255" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:08.025018" elapsed="0.001478"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:08.026538" elapsed="0.000058"/>
</return>
<msg time="2026-08-22T23:37:08.026730" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:37:08.019668" elapsed="0.007089"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:08.026806" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:37:08.026950" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:37:08.018718" elapsed="0.008258"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:08.035112" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:08.034796" elapsed="0.000376"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:08.035593" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:08.035333" 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-08-22T23:37:08.046722" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:08.046956" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:37:08.047129" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:08.037854" elapsed="0.009897">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:08.035722" elapsed="0.012164">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:08.048225" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:08.047943" elapsed="0.000396"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:08.035696" elapsed="0.012680">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:08.049026" elapsed="0.000133"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:08.049351" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:08.049287" elapsed="0.000133"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:08.049251" 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-08-22T23:37:08.049725" elapsed="0.000035"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:08.049835" 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-08-22T23:37:08.029827" elapsed="0.020176">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:08.050107" elapsed="0.000022"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:08.027240" elapsed="0.023010">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:08.050523" elapsed="0.000032"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:37:08.004876" elapsed="0.045839">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:09.067888" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:09.065758" elapsed="0.002171"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:09.068685" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:09.068294" elapsed="0.000419"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:37:09.068140" elapsed="0.000611"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:09.069306" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:09.068982" elapsed="0.000351"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:37:09.068832" elapsed="0.000538"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:37:09.067996" elapsed="0.001403"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:09.069746" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:09.069469" elapsed="0.000337"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:09.070530" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:09.070061" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:09.069830" elapsed="0.000782"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:09.070799" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:09.070638" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:09.069450" elapsed="0.001428"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:09.070915" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:37:09.071074" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:37:09.065259" elapsed="0.005842"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:09.071149" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:37:09.071293" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:37:09.064656" elapsed="0.006663"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:09.078546" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:09.078288" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:09.079083" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:09.078834" 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-08-22T23:37:09.089723" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:09.089882" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:37:09.089989" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:09.081385" elapsed="0.009309">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:09.079195" elapsed="0.011679">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:09.091293" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:09.090952" elapsed="0.000489"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:09.079176" elapsed="0.012319">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:09.092338" elapsed="0.000105"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:09.092744" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:09.092655" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:09.092611" elapsed="0.000286"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:09.093228" elapsed="0.000052"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:09.093403" elapsed="0.000036"/>
</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-08-22T23:37:09.074011" elapsed="0.019680">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:09.093866" elapsed="0.000038"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:09.071542" elapsed="0.022557">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:09.094474" elapsed="0.000048"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:37:09.051575" elapsed="0.043173">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:10.111487" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:10.109359" elapsed="0.002159"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:10.112247" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:10.111917" elapsed="0.000358"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:37:10.111764" elapsed="0.000548"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:10.112879" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:10.112541" elapsed="0.000365"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:37:10.112393" elapsed="0.000621"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:37:10.111607" elapsed="0.001438"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:10.113384" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:10.113120" elapsed="0.000322"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:10.114185" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:10.113715" elapsed="0.000498"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:10.113466" elapsed="0.000784"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:10.114438" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:10.114275" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:10.113099" elapsed="0.001418"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:10.114555" elapsed="0.000050"/>
</return>
<msg time="2026-08-22T23:37:10.114733" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:37:10.108872" elapsed="0.005888"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:10.114807" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:37:10.114952" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:37:10.108279" elapsed="0.006698"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:10.122452" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:10.122194" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:10.122919" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:10.122670" 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-08-22T23:37:10.133110" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:10.133261" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:37:10.133371" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:10.125097" elapsed="0.008682">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:10.123033" elapsed="0.010827">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:10.134053" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:10.133894" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:10.123015" elapsed="0.011127">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:10.134527" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:10.134688" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:10.134649" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:10.134631" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:10.134894" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:10.135019" elapsed="0.000017"/>
</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-08-22T23:37:10.117881" elapsed="0.017249">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:10.135201" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:10.115199" elapsed="0.020098">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:10.135493" elapsed="0.000023"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:37:10.095689" elapsed="0.039937">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:11.155153" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:11.151726" elapsed="0.003464"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:11.155909" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:11.155559" elapsed="0.000378"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:37:11.155404" elapsed="0.000571"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:11.156533" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:11.156208" elapsed="0.000352"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:37:11.156058" elapsed="0.000555"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:37:11.155258" elapsed="0.001386"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:11.156984" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:11.156719" elapsed="0.000323"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:11.157787" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:11.157299" elapsed="0.000516"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:11.157066" elapsed="0.000786"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:11.158040" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:11.157877" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:11.156698" elapsed="0.001420"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:11.158156" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:37:11.158318" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:37:11.151043" elapsed="0.007301"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:11.158391" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:37:11.158534" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:37:11.150166" elapsed="0.008394"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:11.165928" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:11.165662" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:11.166374" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:11.166129" 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-08-22T23:37:11.177200" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:11.177521" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:37:11.177710" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:11.168622" elapsed="0.009641">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:11.166486" elapsed="0.011903">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:11.178721" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:11.178443" elapsed="0.000380"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:11.166467" elapsed="0.012421">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:11.179471" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:11.179698" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:11.179640" elapsed="0.000122"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:11.179613" elapsed="0.000181"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:11.180001" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:11.180104" 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-08-22T23:37:11.161283" elapsed="0.018975">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:11.180358" elapsed="0.000023"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:11.158809" elapsed="0.021688">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:11.180761" elapsed="0.000032"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:37:11.136467" elapsed="0.044469">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:12.198020" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:12.195856" elapsed="0.002196"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:12.198788" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:12.198422" elapsed="0.000395"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:37:12.198265" elapsed="0.000590"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:12.199410" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:12.199086" elapsed="0.000350"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:37:12.198937" elapsed="0.000536"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:37:12.198120" elapsed="0.001382"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:12.199854" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:12.199589" elapsed="0.000324"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:12.200658" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:12.200171" elapsed="0.000516"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:12.199938" elapsed="0.000867"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:12.200997" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:12.200831" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:12.199555" elapsed="0.001521"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:12.201114" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:37:12.201274" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:37:12.195366" elapsed="0.005935"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:12.201348" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:37:12.201491" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:37:12.194769" elapsed="0.006748"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:12.208902" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:12.208641" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:12.209346" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:12.209101" 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-08-22T23:37:12.220847" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:12.221013" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:37:12.221131" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:12.211551" elapsed="0.009971">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:12.209458" elapsed="0.012168">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:12.221843" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:12.221664" elapsed="0.000247"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:12.209440" elapsed="0.012495">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:12.222337" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:12.222476" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:12.222436" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:12.222418" elapsed="0.000177"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:12.222741" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:12.222812" 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-08-22T23:37:12.204251" elapsed="0.018668">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:12.222991" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:12.201761" elapsed="0.021324">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:12.223490" elapsed="0.000049"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:37:12.181752" elapsed="0.042016">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:13.243090" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:13.240953" elapsed="0.002170"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:13.243846" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:13.243498" elapsed="0.000375"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:37:13.243344" elapsed="0.000566"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:13.244460" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:13.244139" elapsed="0.000348"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:37:13.243992" elapsed="0.000530"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:37:13.243192" elapsed="0.001359"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:13.244904" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:13.244643" elapsed="0.000319"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:13.245699" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:13.245214" elapsed="0.000514"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:13.244987" elapsed="0.000779"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:13.245954" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:13.245791" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:13.244621" elapsed="0.001411"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:13.246072" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:37:13.246233" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:37:13.240458" elapsed="0.005801"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:13.246312" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:37:13.246456" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:37:13.239831" elapsed="0.006662"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:13.253911" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:13.253649" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:13.254354" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:13.254111" 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-08-22T23:37:13.265615" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:13.265775" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:37:13.265906" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:13.256535" elapsed="0.009772">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:13.254479" elapsed="0.012011">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:13.266711" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:13.266528" elapsed="0.000252"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:13.254447" elapsed="0.012358">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:13.267196" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:13.267335" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:13.267295" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:13.267278" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:13.267542" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:13.267634" 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-08-22T23:37:13.249189" elapsed="0.018554">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:13.267813" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:13.246739" elapsed="0.021169">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:13.268078" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:37:13.224711" elapsed="0.043476">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:14.286093" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:14.283955" elapsed="0.002171"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:14.286863" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:14.286496" elapsed="0.000394"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:37:14.286342" elapsed="0.000586"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:14.287482" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:14.287162" elapsed="0.000347"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:37:14.287010" elapsed="0.000550"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:37:14.286196" elapsed="0.001420"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:14.287960" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:14.287694" elapsed="0.000325"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:14.288753" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:14.288271" elapsed="0.000509"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:14.288044" elapsed="0.000772"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:14.289005" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:14.288842" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:14.287673" elapsed="0.001409"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:14.289120" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:37:14.289282" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:37:14.283456" elapsed="0.005853"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:14.289357" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:37:14.289590" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:37:14.282789" elapsed="0.006831"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:14.296980" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:14.296714" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:14.297428" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:14.297183" 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-08-22T23:37:14.308045" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:14.308202" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:37:14.308330" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:14.299631" elapsed="0.009117">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:14.297542" elapsed="0.011290">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:14.309036" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:14.308868" elapsed="0.000235"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:14.297523" elapsed="0.011605">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:14.309525" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:14.309683" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:14.309643" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:14.309624" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:14.309892" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:14.309963" 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-08-22T23:37:14.292357" elapsed="0.017714">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:14.310142" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:14.289852" elapsed="0.020386">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:14.310406" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:37:14.269017" elapsed="0.041499">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:15.333836" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:15.331691" elapsed="0.002272"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:15.334694" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:15.334337" elapsed="0.000386"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:37:15.334181" elapsed="0.000579"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:15.335340" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:15.335009" elapsed="0.000358"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:37:15.334843" elapsed="0.000561"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:37:15.334034" elapsed="0.001400"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:15.335792" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:15.335506" elapsed="0.000351"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:15.336608" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:15.336118" elapsed="0.000519"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:15.335882" elapsed="0.000792"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:15.336864" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:15.336700" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:15.335487" elapsed="0.001455"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:15.336980" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:37:15.337141" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:37:15.331043" elapsed="0.006124"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:15.337213" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:37:15.337357" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:37:15.329642" elapsed="0.007740"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:15.344796" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:15.344518" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:15.345240" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:15.344997" 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-08-22T23:37:15.355882" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:15.356032" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:37:15.356137" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:15.347425" elapsed="0.009100">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:15.345349" elapsed="0.011273">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:15.356812" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:15.356657" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:15.345331" elapsed="0.011571">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:15.357278" elapsed="0.000063"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:15.357455" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:15.357416" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:15.357398" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:15.357680" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:15.357752" 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-08-22T23:37:15.340096" elapsed="0.017762">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:15.357928" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:15.337622" elapsed="0.020401">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:15.358189" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:37:15.311463" elapsed="0.046835">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:16.375598" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:16.373364" elapsed="0.002272"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:16.376365" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:16.376032" elapsed="0.000360"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:37:16.375877" elapsed="0.000552"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:16.377013" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:16.376691" elapsed="0.000349"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:37:16.376512" elapsed="0.000564"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:37:16.375720" elapsed="0.001386"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:16.377446" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:16.377181" elapsed="0.000323"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:16.378242" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:16.377779" elapsed="0.000490"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:16.377530" elapsed="0.000775"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:16.378491" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:16.378330" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:16.377160" elapsed="0.001408"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:16.378623" elapsed="0.000039"/>
</return>
<msg time="2026-08-22T23:37:16.378788" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:37:16.372884" elapsed="0.005930"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:16.378861" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:37:16.379002" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:37:16.372278" elapsed="0.006749"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:16.386386" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:16.386129" elapsed="0.000384"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:16.386932" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:16.386683" 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-08-22T23:37:16.397548" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:16.397738" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:37:16.397848" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:16.389254" elapsed="0.008986">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:16.387044" elapsed="0.011282">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:16.398515" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:16.398360" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:16.387025" elapsed="0.011597">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:16.399001" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:16.399135" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:16.399096" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:16.399079" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:16.399340" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:16.399411" 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-08-22T23:37:16.381743" elapsed="0.017796">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:16.399636" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:16.379248" elapsed="0.020485">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:16.399902" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:37:16.359145" elapsed="0.040866">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:17.416750" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:17.414538" elapsed="0.002246"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:17.417488" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:17.417160" elapsed="0.000354"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:37:17.417006" elapsed="0.000547"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:17.418124" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:17.417803" elapsed="0.000348"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:37:17.417652" elapsed="0.000611"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:37:17.416856" elapsed="0.001438"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:17.418686" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:17.418381" elapsed="0.000365"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:17.419477" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:17.419006" elapsed="0.000499"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:17.418771" elapsed="0.000771"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:17.419748" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:17.419568" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:17.418356" elapsed="0.001472"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:17.419867" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:37:17.420030" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:37:17.414056" elapsed="0.006001"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:17.420104" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:37:17.420249" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:37:17.413447" elapsed="0.006828"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:17.427605" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:17.427331" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:17.428050" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:17.427808" 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-08-22T23:37:17.438299" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:17.438462" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:37:17.438569" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:17.430237" elapsed="0.008738">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:17.428160" elapsed="0.010897">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:17.439248" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:17.439092" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:17.428142" elapsed="0.011196">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:17.439738" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:17.439875" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:17.439836" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:17.439819" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:17.440079" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:17.440202" elapsed="0.000017"/>
</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-08-22T23:37:17.422996" elapsed="0.017346">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:17.440416" elapsed="0.000017"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:17.420514" elapsed="0.020000">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:17.440704" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:37:17.400910" elapsed="0.039906">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.459088" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:18.456281" elapsed="0.002841"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.459856" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:18.459502" elapsed="0.000382"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:37:18.459346" elapsed="0.000576"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.460492" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:18.460160" elapsed="0.000360"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:37:18.460007" elapsed="0.000549"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:37:18.459194" elapsed="0.001407"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:18.460944" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:18.460678" elapsed="0.000325"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.461818" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:18.461282" elapsed="0.000564"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:18.461028" elapsed="0.000856"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:18.462078" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:18.461910" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.460657" elapsed="0.001500"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:18.462194" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:37:18.462356" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:37:18.455606" elapsed="0.006777"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:37:18.462430" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:37:18.462590" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:37:18.454770" elapsed="0.007848"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.470024" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:18.469762" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.470470" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:18.470226" 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-08-22T23:37:18.481834" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:18.482057" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:37:18.482167" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:18.472658" elapsed="0.009998">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:18.470598" elapsed="0.012173">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:18.483038" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:18.482820" elapsed="0.000311"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:18.470562" elapsed="0.012605">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:18.483710" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:18.483901" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:18.483849" elapsed="0.000111"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:18.483824" elapsed="0.000166"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:18.484190" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:18.484290" 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-08-22T23:37:18.465345" elapsed="0.019094">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:18.484538" elapsed="0.000021"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:18.462842" elapsed="0.021853">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:18.484931" elapsed="0.000031"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:37:18.441736" elapsed="0.043350">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<msg time="2026-08-22T23:37:18.485275" level="FAIL">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Connected</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:36:57.555767" elapsed="20.929652">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=node2</arg>
<doc>Wait for the device to become connected.
It is more readable to use this keyword in a test case than to put the whole WUKS below into it.</doc>
<status status="FAIL" start="2026-08-22T23:36:57.555310" elapsed="20.930288">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Wait_Device_Connected" owner="NetconfKeywords">
<arg>${DEVICE_NAME}</arg>
<arg>session=node3</arg>
<doc>Wait for the device to become connected.
It is more readable to use this keyword in a test case than to put the whole WUKS below into it.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:18.485904" elapsed="0.000035"/>
</kw>
<doc>Check that the cluster communication about a new Netconf device configuration works</doc>
<status status="FAIL" start="2026-08-22T23:36:55.051124" elapsed="23.435008">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</test>
<test id="s1-s6-t5" name="Check_Device_Data_Is_Seen_As_Empty_On_All_Nodes" line="78">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:37:18.491423" elapsed="0.000375"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:37:18.491054" elapsed="0.000824"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:37:18.493356" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:18.493130" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.493103" elapsed="0.000367"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:37:18.498837" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:18.498729" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.498710" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.499914" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:37:18.499507" elapsed="0.000435"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.500408" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:37:18.500102" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:37:18.500479" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:37:18.500654" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:37:18.499128" 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-08-22T23:37:18.506305" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:18.506195" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.506176" 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-08-22T23:37:18.507553" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:18.507445" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.507426" elapsed="0.000220"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:37:18.508094" level="INFO">${karaf_connection_index} = 34</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:37:18.507791" elapsed="0.000330"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:37:18.508505" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:37:18.508280" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:37:18.555841" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:37:18.509041" elapsed="0.046906"/>
</kw>
<msg time="2026-08-22T23:37:18.556113" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:37:18.556160" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:37:18.508706" elapsed="0.047492"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:37:18.597043" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "A "l "l "_ "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-08-22T23:37:18.556736" elapsed="0.040439"/>
</kw>
<msg time="2026-08-22T23:37:18.597340" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:37:18.597386" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:37:18.556369" elapsed="0.041055"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:18.597750" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:18.597501" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.597481" elapsed="0.000350"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.598270" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "A "l "l "_ "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-08-22T23:37:18.597973" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:18.598640" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:18.598410" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.598391" elapsed="0.000375"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:37:18.598800" 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-08-22T23:37:18.601429" elapsed="0.000167"/>
</kw>
<msg time="2026-08-22T23:37:18.601660" 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-08-22T23:37:18.600241" elapsed="0.001553"/>
</kw>
<kw name="Open 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-08-22T23:37:18.602065" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:18.602398" 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-08-22T23:37:18.599618" elapsed="0.002983"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:37:18.599063" elapsed="0.003606"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:37:18.507140" elapsed="0.095629"/>
</kw>
<msg time="2026-08-22T23:37:18.602861" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:37:18.602905" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:37:18.506524" elapsed="0.096418"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:37:18.603128" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:37:18.603019" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.603000" 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-08-22T23:37:18.603633" 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-08-22T23:37:18.603961" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:37:18.604032" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:37:18.505833" elapsed="0.098308"/>
</kw>
<msg time="2026-08-22T23:37:18.604235" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:37:18.604279" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:37:18.501042" elapsed="0.103273"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:18.604716" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:18.604389" elapsed="0.000384"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.604373" elapsed="0.000424"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:37:18.500902" elapsed="0.103918"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:37:18.610431" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:18.610314" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.610243" 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-08-22T23:37:18.611666" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:18.611534" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.611516" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:37:18.612169" level="INFO">${karaf_connection_index} = 35</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:37:18.611875" elapsed="0.000321"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:37:18.612561" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:37:18.612350" elapsed="0.000254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:37:18.652168" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:37:18.613143" elapsed="0.039128"/>
</kw>
<msg time="2026-08-22T23:37:18.652445" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:37:18.652529" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:37:18.612761" elapsed="0.039808"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:37:18.680322" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "A "l "l "_ "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-08-22T23:37:18.653169" elapsed="0.027263"/>
</kw>
<msg time="2026-08-22T23:37:18.680611" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:37:18.680692" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:37:18.652785" elapsed="0.027959"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:18.681073" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:18.680837" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.680813" elapsed="0.000341"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.681625" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "A "l "l "_ "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-08-22T23:37:18.681293" 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-08-22T23:37:18.681984" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:18.681768" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.681750" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:37:18.682095" 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-08-22T23:37:18.684565" elapsed="0.000213"/>
</kw>
<msg time="2026-08-22T23:37:18.684851" 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-08-22T23:37:18.683509" elapsed="0.001473"/>
</kw>
<kw name="Open 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-08-22T23:37:18.685254" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:18.685611" 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-08-22T23:37:18.682888" elapsed="0.002913"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:37:18.682347" elapsed="0.003518"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:37:18.611228" elapsed="0.074735"/>
</kw>
<msg time="2026-08-22T23:37:18.686055" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:37:18.686099" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:37:18.610665" elapsed="0.075471"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:37:18.686321" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:37:18.686215" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.686196" 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-08-22T23:37:18.686815" 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-08-22T23:37:18.687144" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:37:18.687215" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:37:18.609921" elapsed="0.077401"/>
</kw>
<msg time="2026-08-22T23:37:18.687414" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:37:18.687458" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:37:18.605146" elapsed="0.082350"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:18.687875" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:18.687622" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.687602" elapsed="0.000352"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:37:18.604977" elapsed="0.083001"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:37:18.693454" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:18.693339" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.693320" 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-08-22T23:37:18.694711" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:18.694565" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.694547" elapsed="0.000232"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:37:18.695215" level="INFO">${karaf_connection_index} = 36</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:37:18.694920" elapsed="0.000321"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:37:18.695625" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:37:18.695396" elapsed="0.000256"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:37:18.739592" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:37:18.696140" elapsed="0.043697"/>
</kw>
<msg time="2026-08-22T23:37:18.740084" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:37:18.740134" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:37:18.695809" elapsed="0.044364"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:37:18.769811" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "A "l "l "_ "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-08-22T23:37:18.741328" elapsed="0.028598"/>
</kw>
<msg time="2026-08-22T23:37:18.770088" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:37:18.770136" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:37:18.740435" elapsed="0.029739"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:18.770532" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:18.770274" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.770245" elapsed="0.000396"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.771104" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "A "l "l "_ "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-08-22T23:37:18.770792" 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-08-22T23:37:18.771460" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:18.771245" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.771227" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:37:18.771600" 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-08-22T23:37:18.774442" elapsed="0.000182"/>
</kw>
<msg time="2026-08-22T23:37:18.774688" 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-08-22T23:37:18.773209" elapsed="0.001631"/>
</kw>
<kw name="Open 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-08-22T23:37:18.775119" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:18.775458" 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-08-22T23:37:18.772525" elapsed="0.003233"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:37:18.771931" elapsed="0.003908"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:37:18.694262" elapsed="0.081677"/>
</kw>
<msg time="2026-08-22T23:37:18.776096" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:37:18.776141" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:37:18.693699" elapsed="0.082479"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:37:18.776423" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-08-22T23:37:18.776257" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.776237" elapsed="0.000281"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:18.777200" 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-08-22T23:37:18.777541" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:37:18.777634" 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-08-22T23:37:18.692996" elapsed="0.084755"/>
</kw>
<msg time="2026-08-22T23:37:18.777866" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:37:18.777912" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:37:18.688239" elapsed="0.089710"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:18.778279" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:18.778026" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.778007" elapsed="0.000351"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:37:18.688100" elapsed="0.090282"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:37:18.500731" elapsed="0.277688"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:37:18.498344" elapsed="0.280142"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:37:18.492723" elapsed="0.285828"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:37:18.492091" elapsed="0.286533"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:37:18.487662" elapsed="0.291025"/>
</kw>
<kw name="Get_Topology">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Topology_Core">
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.787596" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:18.787328" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.788044" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:18.787799" 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-08-22T23:37:18.817092" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:18.817556" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '4698'} 
 body={"network-topology:topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}},"node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"unavailable-capabilities":{"unavailable-capability":[{"failure-reason":"missing-source","capability":"(urn:ietf:params:xml:ns:netconf:notification:1.0?revision=2008-07-14)notifications"}]},"keepalive-delay":0,"tcp-only":false,"clustered-connection-status":{"netconf-master-node":"pekko://opendaylight-cluster-data@127.0.0.1:2550"},"negotiated-ssh-transport-parameters":{"encryption-alg":"chacha20-poly1305","host-key-alg":"rsa-sha2-512","mac-alg":"none","key-exchange-alg":"sntrup761x25519-sha512"},"session-id":1,"connection-status":"connected","login-password-unencrypted":{"username":"admin","password":"topsecret"},"available-capabilities":{"available-capability":[{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:notification:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:exi:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:candidate:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.1"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.0"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people?revision=2014-08-18)people"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)ietf-yang-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?revision=2010-10-04)ietf-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car?revision=2014-08-18)car"},{"capability-origin":"device-advertised","capability":"(ns:augment:main:a?revision=2014-01-21)augment-main-a"},{"capability-origin":"device-advertised","capability":"(ns:main?revision=2014-01-21)main"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:netconf:monitoring?revision=2022-07-18)odl-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:netconf:base:1.0?revision=2011-06-01)ietf-netconf"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring-extension?revision=2013-12-10)ietf-netconf-monitoring-extension"},{"capability-origin":"device-advertised","capability":"(org:opendaylight:coretutorials:ncmount:example:l2fib?revision=2016-03-07)ncmount-l2fib"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people?revision=2014-08-18)car-people"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-purchase?revision=2014-08-18)car-purchase"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:test:netconf:crud?revision=2014-10-18)test"},{"capability-origin":"device-advertised","capability":"(https://example.com/ns/example-action?revision=2016-07-07)example-action"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2013-07-15)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2010-09-24)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:yang:extension:yang-ext?revision=2013-07-09)yang-ext"}]},"host":"10.30.171.196"}}]}]} 
 </msg>
<msg time="2026-08-22T23:37:18.818112" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:37:18.790245" elapsed="0.027929"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:18.788157" elapsed="0.030116"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:18.818779" elapsed="0.000072"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:18.818335" elapsed="0.000628"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.788138" elapsed="0.030876"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.826176" level="INFO">{"network-topology:topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}},"node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"unavailable-capabilities":{"unavailable-capability":[{"failure-reason":"missing-source","capability":"(urn:ietf:params:xml:ns:netconf:notification:1.0?revision=2008-07-14)notifications"}]},"keepalive-delay":0,"tcp-only":false,"clustered-connection-status":{"netconf-master-node":"pekko://opendaylight-cluster-data@127.0.0.1:2550"},"negotiated-ssh-transport-parameters":{"encryption-alg":"chacha20-poly1305","host-key-alg":"rsa-sha2-512","mac-alg":"none","key-exchange-alg":"sntrup761x25519-sha512"},"session-id":1,"connection-status":"connected","login-password-unencrypted":{"username":"admin","password":"topsecret"},"available-capabilities":{"available-capability":[{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:notification:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:exi:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:candidate:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.1"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.0"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people?revision=2014-08-18)people"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)ietf-yang-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?revision=2010-10-04)ietf-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car?revision=2014-08-18)car"},{"capability-origin":"device-advertised","capability":"(ns:augment:main:a?revision=2014-01-21)augment-main-a"},{"capability-origin":"device-advertised","capability":"(ns:main?revision=2014-01-21)main"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:netconf:monitoring?revision=2022-07-18)odl-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:netconf:base:1.0?revision=2011-06-01)ietf-netconf"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring-extension?revision=2013-12-10)ietf-netconf-monitoring-extension"},{"capability-origin":"device-advertised","capability":"(org:opendaylight:coretutorials:ncmount:example:l2fib?revision=2016-03-07)ncmount-l2fib"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people?revision=2014-08-18)car-people"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-purchase?revision=2014-08-18)car-purchase"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:test:netconf:crud?revision=2014-10-18)test"},{"capability-origin":"device-advertised","capability":"(https://example.com/ns/example-action?revision=2016-07-07)example-action"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2013-07-15)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2010-09-24)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:yang:extension:yang-ext?revision=2013-07-09)yang-ext"}]},"host":"10.30.171.196"}}]}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:18.821506" elapsed="0.004750"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:18.821012" elapsed="0.005279"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.820968" elapsed="0.005349"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.828930" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:18.826605" elapsed="0.002372"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:18.826373" elapsed="0.002639"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.826356" elapsed="0.002681"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.829611" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:37:18.829202" 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-08-22T23:37:18.829967" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:18.829711" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.830523" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:18.830214" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:18.830051" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.829692" elapsed="0.000932"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.831195" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:37:18.830792" 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-08-22T23:37:18.831524" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:18.831293" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.832076" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:18.831780" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:18.831622" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.831274" 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-08-22T23:37:18.832317" elapsed="0.000364"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:37:18.833145" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:37:18.832842" 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-08-22T23:37:18.833324" 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-08-22T23:37:18.819944" elapsed="0.015934"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:18.836052" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:18.835947" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.835929" elapsed="0.000190"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:37:18.840020" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "netconf-node-topology:netconf-node": {
      "available-capabilities": {
       "available-capability": [
        {
         "capability"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:37:18.836290" elapsed="0.003761"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:37:18.840104" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:37:18.840286" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "netconf-node-topology:netconf-node": {
      "available-capabilities": {
       "available-capability": [
        {
         "capability"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:37:18.782905" elapsed="0.057407"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:37:18.840370" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:37:18.840519" level="INFO">${config_topology} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "netconf-node-topology:netconf-node": {
      "available-capabilities": {
       "available-capability": [
        {
         "capability"...</msg>
<var>${config_topology}</var>
<arg>${config_topology_url}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:37:18.780142" elapsed="0.060402"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.840972" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "netconf-node-topology:netconf-node": {
      "available-capabilities": {
       "available-capability": [
        {
         "capability": "(https://example.com/ns/example-action?revision=2016-07-07)example-action",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(ns:augment:main:a?revision=2014-01-21)augment-main-a",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(ns:main?revision=2014-01-21)main",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(org:opendaylight:coretutorials:ncmount:example:l2fib?revision=2016-03-07)ncmount-l2fib",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:ietf:params:xml:ns:netconf:base:1.0?revision=2011-06-01)ietf-netconf",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2010-09-24)ietf-inet-types",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2013-07-15)ietf-inet-types",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring-extension?revision=2013-12-10)ietf-netconf-monitoring-extension",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?revision=2010-10-04)ietf-netconf-monitoring",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)ietf-yang-types",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people?revision=2014-08-18)car-people",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-purchase?revision=2014-08-18)car-purchase",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car?revision=2014-08-18)car",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people?revision=2014-08-18)people",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:opendaylight:params:xml:ns:yang:netconf:monitoring?revision=2022-07-18)odl-netconf-monitoring",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:opendaylight:test:netconf:crud?revision=2014-10-18)test",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:opendaylight:yang:extension:yang-ext?revision=2013-07-09)yang-ext",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "urn:ietf:params:netconf:base:1.0",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "urn:ietf:params:netconf:base:1.1",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "urn:ietf:params:netconf:capability:candidate:1.0",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "urn:ietf:params:netconf:capability:exi:1.0",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "urn:ietf:params:netconf:capability:notification:1.0",
         "capability-origin": "device-advertised"
        }
       ]
      },
      "clustered-connection-status": {
       "netconf-master-node": "pekko://opendaylight-cluster-data@127.0.0.1:2550"
      },
      "connection-status": "connected",
      "host": "10.30.171.196",
      "keepalive-delay": 0,
      "login-password-unencrypted": {
       "password": "topsecret",
       "username": "admin"
      },
      "negotiated-ssh-transport-parameters": {
       "encryption-alg": "chacha20-poly1305",
       "host-key-alg": "rsa-sha2-512",
       "key-exchange-alg": "sntrup761x25519-sha512",
       "mac-alg": "none"
      },
      "port": 17830,
      "session-id": 1,
      "tcp-only": false,
      "unavailable-capabilities": {
       "unavailable-capability": [
        {
         "capability": "(urn:ietf:params:xml:ns:netconf:notification:1.0?revision=2008-07-14)notifications",
         "failure-reason": "missing-source"
        }
       ]
      }
     },
     "node-id": "netconf-test-device"
    }
   ],
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "encryption": {
       "encryption-alg": [
        "AEAD_AES_128_GCM",
        "AEAD_AES_256_GCM",
        "aes128-cbc",
        "aes128-ctr",
        "aes192-cbc",
        "aes192-ctr",
        "aes256-cbc",
        "aes256-ctr",
        "chacha20-poly1305"
       ]
      },
      "host-key": {
       "host-key-alg": [
        "ecdsa-sha2-nistp256",
        "ecdsa-sha2-nistp384",
        "ecdsa-sha2-nistp521",
        "rsa-sha2-256",
        "rsa-sha2-512",
        "ssh-ed25519",
        "ssh-rsa"
       ]
      },
      "key-exchange": {
       "key-exchange-alg": [
        "curve25519-sha256",
        "curve448-sha512",
        "diffie-hellman-group-exchange-sha256",
        "diffie-hellman-group14-sha256",
        "diffie-hellman-group15-sha512",
        "diffie-hellman-group16-sha512",
        "diffie-hellman-group17-sha512",
        "diffie-hellman-group18-sha512",
        "ecdh-sha2-nistp256",
        "ecdh-sha2-nistp384",
        "ecdh-sha2-nistp521",
        "mlkem1024nistp384-sha384",
        "mlkem768nistp256-sha256",
        "mlkem768x25519-sha256",
        "sntrup761x25519-sha512"
       ]
      },
      "mac": {
       "mac-alg": [
        "hmac-sha1",
        "hmac-sha2-256",
        "hmac-sha2-512"
       ]
      }
     }
    }
   }
  }
 ]
}
</msg>
<arg>${config_topology}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:18.840719" elapsed="0.000375"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.848240" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:18.847971" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.848743" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:18.848469" 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-08-22T23:37:18.862328" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:18.862768" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '4698'} 
 body={"network-topology:topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}},"node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"unavailable-capabilities":{"unavailable-capability":[{"failure-reason":"missing-source","capability":"(urn:ietf:params:xml:ns:netconf:notification:1.0?revision=2008-07-14)notifications"}]},"keepalive-delay":0,"tcp-only":false,"clustered-connection-status":{"netconf-master-node":"pekko://opendaylight-cluster-data@127.0.0.1:2550"},"negotiated-ssh-transport-parameters":{"encryption-alg":"chacha20-poly1305","host-key-alg":"rsa-sha2-512","mac-alg":"none","key-exchange-alg":"sntrup761x25519-sha512"},"session-id":1,"connection-status":"connected","login-password-unencrypted":{"username":"admin","password":"topsecret"},"available-capabilities":{"available-capability":[{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:notification:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:exi:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:candidate:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.1"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.0"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people?revision=2014-08-18)people"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)ietf-yang-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?revision=2010-10-04)ietf-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car?revision=2014-08-18)car"},{"capability-origin":"device-advertised","capability":"(ns:augment:main:a?revision=2014-01-21)augment-main-a"},{"capability-origin":"device-advertised","capability":"(ns:main?revision=2014-01-21)main"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:netconf:monitoring?revision=2022-07-18)odl-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:netconf:base:1.0?revision=2011-06-01)ietf-netconf"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring-extension?revision=2013-12-10)ietf-netconf-monitoring-extension"},{"capability-origin":"device-advertised","capability":"(org:opendaylight:coretutorials:ncmount:example:l2fib?revision=2016-03-07)ncmount-l2fib"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people?revision=2014-08-18)car-people"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-purchase?revision=2014-08-18)car-purchase"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:test:netconf:crud?revision=2014-10-18)test"},{"capability-origin":"device-advertised","capability":"(https://example.com/ns/example-action?revision=2016-07-07)example-action"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2013-07-15)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2010-09-24)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:yang:extension:yang-ext?revision=2013-07-09)yang-ext"}]},"host":"10.30.171.196"}}]}]} 
 </msg>
<msg time="2026-08-22T23:37:18.863062" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:37:18.850889" elapsed="0.012231"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:18.848854" elapsed="0.014363"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:18.863651" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:18.863274" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.848836" elapsed="0.015010"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.873620" level="INFO">{"network-topology:topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}},"node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"unavailable-capabilities":{"unavailable-capability":[{"failure-reason":"missing-source","capability":"(urn:ietf:params:xml:ns:netconf:notification:1.0?revision=2008-07-14)notifications"}]},"keepalive-delay":0,"tcp-only":false,"clustered-connection-status":{"netconf-master-node":"pekko://opendaylight-cluster-data@127.0.0.1:2550"},"negotiated-ssh-transport-parameters":{"encryption-alg":"chacha20-poly1305","host-key-alg":"rsa-sha2-512","mac-alg":"none","key-exchange-alg":"sntrup761x25519-sha512"},"session-id":1,"connection-status":"connected","login-password-unencrypted":{"username":"admin","password":"topsecret"},"available-capabilities":{"available-capability":[{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:notification:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:exi:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:candidate:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.1"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.0"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people?revision=2014-08-18)people"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)ietf-yang-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?revision=2010-10-04)ietf-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car?revision=2014-08-18)car"},{"capability-origin":"device-advertised","capability":"(ns:augment:main:a?revision=2014-01-21)augment-main-a"},{"capability-origin":"device-advertised","capability":"(ns:main?revision=2014-01-21)main"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:netconf:monitoring?revision=2022-07-18)odl-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:netconf:base:1.0?revision=2011-06-01)ietf-netconf"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring-extension?revision=2013-12-10)ietf-netconf-monitoring-extension"},{"capability-origin":"device-advertised","capability":"(org:opendaylight:coretutorials:ncmount:example:l2fib?revision=2016-03-07)ncmount-l2fib"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people?revision=2014-08-18)car-people"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-purchase?revision=2014-08-18)car-purchase"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:test:netconf:crud?revision=2014-10-18)test"},{"capability-origin":"device-advertised","capability":"(https://example.com/ns/example-action?revision=2016-07-07)example-action"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2013-07-15)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2010-09-24)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:yang:extension:yang-ext?revision=2013-07-09)yang-ext"}]},"host":"10.30.171.196"}}]}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:18.866156" elapsed="0.007595"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:18.865657" elapsed="0.008132"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.865614" elapsed="0.008202"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.876431" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:18.874106" elapsed="0.002372"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:18.873876" elapsed="0.002639"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.873858" elapsed="0.002681"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.877104" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:37:18.876721" 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-08-22T23:37:18.877437" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:18.877202" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.877996" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:18.877693" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:18.877519" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.877184" elapsed="0.000897"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.878611" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:37:18.878236" 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-08-22T23:37:18.879011" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:18.878709" elapsed="0.000361"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.879551" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:18.879250" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:18.879094" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.878691" 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-08-22T23:37:18.879804" elapsed="0.000362"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:37:18.880662" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:37:18.880332" 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-08-22T23:37:18.880841" elapsed="0.002311"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:37:18.864672" elapsed="0.018544"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:18.883391" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:18.883285" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.883267" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:37:18.887248" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "netconf-node-topology:netconf-node": {
      "available-capabilities": {
       "available-capability": [
        {
         "capability"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:37:18.883614" elapsed="0.003664"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:37:18.887330" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:37:18.887490" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "netconf-node-topology:netconf-node": {
      "available-capabilities": {
       "available-capability": [
        {
         "capability"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:37:18.843692" elapsed="0.043825"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:37:18.887573" elapsed="0.000041"/>
</return>
<msg time="2026-08-22T23:37:18.887740" level="INFO">${operational_topology} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "netconf-node-topology:netconf-node": {
      "available-capabilities": {
       "available-capability": [
        {
         "capability"...</msg>
<var>${operational_topology}</var>
<arg>${operational_topology_url}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:37:18.841305" elapsed="0.046461"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.888208" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "netconf-node-topology:netconf-node": {
      "available-capabilities": {
       "available-capability": [
        {
         "capability": "(https://example.com/ns/example-action?revision=2016-07-07)example-action",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(ns:augment:main:a?revision=2014-01-21)augment-main-a",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(ns:main?revision=2014-01-21)main",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(org:opendaylight:coretutorials:ncmount:example:l2fib?revision=2016-03-07)ncmount-l2fib",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:ietf:params:xml:ns:netconf:base:1.0?revision=2011-06-01)ietf-netconf",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2010-09-24)ietf-inet-types",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2013-07-15)ietf-inet-types",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring-extension?revision=2013-12-10)ietf-netconf-monitoring-extension",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?revision=2010-10-04)ietf-netconf-monitoring",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)ietf-yang-types",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people?revision=2014-08-18)car-people",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-purchase?revision=2014-08-18)car-purchase",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car?revision=2014-08-18)car",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people?revision=2014-08-18)people",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:opendaylight:params:xml:ns:yang:netconf:monitoring?revision=2022-07-18)odl-netconf-monitoring",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:opendaylight:test:netconf:crud?revision=2014-10-18)test",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:opendaylight:yang:extension:yang-ext?revision=2013-07-09)yang-ext",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "urn:ietf:params:netconf:base:1.0",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "urn:ietf:params:netconf:base:1.1",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "urn:ietf:params:netconf:capability:candidate:1.0",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "urn:ietf:params:netconf:capability:exi:1.0",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "urn:ietf:params:netconf:capability:notification:1.0",
         "capability-origin": "device-advertised"
        }
       ]
      },
      "clustered-connection-status": {
       "netconf-master-node": "pekko://opendaylight-cluster-data@127.0.0.1:2550"
      },
      "connection-status": "connected",
      "host": "10.30.171.196",
      "keepalive-delay": 0,
      "login-password-unencrypted": {
       "password": "topsecret",
       "username": "admin"
      },
      "negotiated-ssh-transport-parameters": {
       "encryption-alg": "chacha20-poly1305",
       "host-key-alg": "rsa-sha2-512",
       "key-exchange-alg": "sntrup761x25519-sha512",
       "mac-alg": "none"
      },
      "port": 17830,
      "session-id": 1,
      "tcp-only": false,
      "unavailable-capabilities": {
       "unavailable-capability": [
        {
         "capability": "(urn:ietf:params:xml:ns:netconf:notification:1.0?revision=2008-07-14)notifications",
         "failure-reason": "missing-source"
        }
       ]
      }
     },
     "node-id": "netconf-test-device"
    }
   ],
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "encryption": {
       "encryption-alg": [
        "AEAD_AES_128_GCM",
        "AEAD_AES_256_GCM",
        "aes128-cbc",
        "aes128-ctr",
        "aes192-cbc",
        "aes192-ctr",
        "aes256-cbc",
        "aes256-ctr",
        "chacha20-poly1305"
       ]
      },
      "host-key": {
       "host-key-alg": [
        "ecdsa-sha2-nistp256",
        "ecdsa-sha2-nistp384",
        "ecdsa-sha2-nistp521",
        "rsa-sha2-256",
        "rsa-sha2-512",
        "ssh-ed25519",
        "ssh-rsa"
       ]
      },
      "key-exchange": {
       "key-exchange-alg": [
        "curve25519-sha256",
        "curve448-sha512",
        "diffie-hellman-group-exchange-sha256",
        "diffie-hellman-group14-sha256",
        "diffie-hellman-group15-sha512",
        "diffie-hellman-group16-sha512",
        "diffie-hellman-group17-sha512",
        "diffie-hellman-group18-sha512",
        "ecdh-sha2-nistp256",
        "ecdh-sha2-nistp384",
        "ecdh-sha2-nistp521",
        "mlkem1024nistp384-sha384",
        "mlkem768nistp256-sha256",
        "mlkem768x25519-sha256",
        "sntrup761x25519-sha512"
       ]
      },
      "mac": {
       "mac-alg": [
        "hmac-sha1",
        "hmac-sha2-256",
        "hmac-sha2-512"
       ]
      }
     }
    }
   }
  }
 ]
}
</msg>
<arg>${operational_topology}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:18.887922" elapsed="0.000432"/>
</kw>
<return>
<value>${config_topology}</value>
<value>${operational_topology}</value>
<status status="PASS" start="2026-08-22T23:37:18.888400" elapsed="0.000027"/>
</return>
<arg>${session}</arg>
<doc>Get both versions of topology (config and operational), log them and return them for further processing.</doc>
<status status="PASS" start="2026-08-22T23:37:18.779758" elapsed="0.108801"/>
</kw>
<msg time="2026-08-22T23:37:18.888729" level="INFO">${result} = ['{\n "network-topology:topology": [\n  {\n   "node": [\n    {\n     "netconf-node-topology:netconf-node": {\n      "available-capabilities": {\n       "available-capability": [\n        {\n         "...</msg>
<var>${result}</var>
<arg>${DEVICE_BOOT_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Get_Topology_Core</arg>
<arg>${session}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:37:18.779190" elapsed="0.109566"/>
</kw>
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:37:18.888807" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:37:18.888971" level="INFO">${config_topology} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "netconf-node-topology:netconf-node": {
      "available-capabilities": {
       "available-capability": [
        {
         "capability"...</msg>
<msg time="2026-08-22T23:37:18.889018" level="INFO">${operational_topology} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "netconf-node-topology:netconf-node": {
      "available-capabilities": {
       "available-capability": [
        {
         "capability"...</msg>
<var>${config_topology}</var>
<var>${operational_topology}</var>
<arg>session=node1</arg>
<doc>Repeatedly try to get the topologies using Get_Topology_Core until either the request succeeds or boot timeout period expires.</doc>
<status status="PASS" start="2026-08-22T23:37:18.778866" elapsed="0.110176"/>
</kw>
<kw name="Get_Topology">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Topology_Core">
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.897675" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:18.897365" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.898119" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:18.897872" 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-08-22T23:37:18.919562" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:18.919897" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '990'} 
 body={"network-topology:topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]} 
 </msg>
<msg time="2026-08-22T23:37:18.920167" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:37:18.900305" elapsed="0.019923"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:18.898230" elapsed="0.022096"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:18.920771" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:18.920390" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.898212" elapsed="0.022760"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.928677" level="INFO">{"network-topology:topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:18.923404" elapsed="0.005329"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:18.922905" elapsed="0.005864"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.922862" elapsed="0.005933"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.931378" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:18.929078" elapsed="0.002347"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:18.928852" elapsed="0.002608"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.928835" elapsed="0.002650"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.932059" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:37:18.931663" 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-08-22T23:37:18.932440" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:18.932200" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.933005" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:18.932700" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:18.932522" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.932180" elapsed="0.000911"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.933630" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:37:18.933247" 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-08-22T23:37:18.933962" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:18.933729" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.934502" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:18.934201" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:18.934044" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.933710" 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-08-22T23:37:18.934752" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:37:18.935542" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:37:18.935262" elapsed="0.000307"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:37:18.935735" 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-08-22T23:37:18.921848" elapsed="0.016274"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:18.938302" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:18.938193" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.938175" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:37:18.941412" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "en...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:37:18.938512" elapsed="0.002930"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:37:18.941494" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:37:18.941673" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "en...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:37:18.892828" elapsed="0.048872"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:37:18.941758" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:37:18.941908" level="INFO">${config_topology} = {
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "en...</msg>
<var>${config_topology}</var>
<arg>${config_topology_url}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:37:18.890401" elapsed="0.051534"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.942347" level="INFO">{
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "encryption": {
       "encryption-alg": [
        "AEAD_AES_128_GCM",
        "AEAD_AES_256_GCM",
        "aes128-cbc",
        "aes128-ctr",
        "aes192-cbc",
        "aes192-ctr",
        "aes256-cbc",
        "aes256-ctr",
        "chacha20-poly1305"
       ]
      },
      "host-key": {
       "host-key-alg": [
        "ecdsa-sha2-nistp256",
        "ecdsa-sha2-nistp384",
        "ecdsa-sha2-nistp521",
        "rsa-sha2-256",
        "rsa-sha2-512",
        "ssh-ed25519",
        "ssh-rsa"
       ]
      },
      "key-exchange": {
       "key-exchange-alg": [
        "curve25519-sha256",
        "curve448-sha512",
        "diffie-hellman-group-exchange-sha256",
        "diffie-hellman-group14-sha256",
        "diffie-hellman-group15-sha512",
        "diffie-hellman-group16-sha512",
        "diffie-hellman-group17-sha512",
        "diffie-hellman-group18-sha512",
        "ecdh-sha2-nistp256",
        "ecdh-sha2-nistp384",
        "ecdh-sha2-nistp521",
        "mlkem1024nistp384-sha384",
        "mlkem768nistp256-sha256",
        "mlkem768x25519-sha256",
        "sntrup761x25519-sha512"
       ]
      },
      "mac": {
       "mac-alg": [
        "hmac-sha1",
        "hmac-sha2-256",
        "hmac-sha2-512"
       ]
      }
     }
    }
   }
  }
 ]
}
</msg>
<arg>${config_topology}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:18.942093" elapsed="0.000354"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.949909" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:18.949660" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.950350" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:18.950105" 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-08-22T23:37:18.961384" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:18.961566" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '990'} 
 body={"network-topology:topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]} 
 </msg>
<msg time="2026-08-22T23:37:18.961735" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:37:18.952527" elapsed="0.009244"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:18.950460" elapsed="0.011371"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:18.962079" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:18.961867" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.950441" elapsed="0.011759"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.967102" level="INFO">{"network-topology:topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:18.963627" elapsed="0.003551"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:18.963298" elapsed="0.003929"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.963272" elapsed="0.003991"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.970988" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:18.967671" elapsed="0.003388"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:18.967342" elapsed="0.003765"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.967318" elapsed="0.003825"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.971986" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:37:18.971382" 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-08-22T23:37:18.972444" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:18.972126" elapsed="0.000376"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.973038" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:18.972699" elapsed="0.000369"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:18.972526" elapsed="0.000579"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.972100" elapsed="0.001027"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.973771" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:37:18.973285" elapsed="0.000515"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:18.974207" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:18.973884" elapsed="0.000404"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.975042" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:18.974542" elapsed="0.000536"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:18.974323" elapsed="0.000806"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.973859" 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-08-22T23:37:18.975386" elapsed="0.000550"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:37:18.976568" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:37:18.976166" 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-08-22T23:37:18.976866" elapsed="0.003485"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:37:18.962704" elapsed="0.017718"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:18.980678" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:18.980501" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.980476" elapsed="0.000295"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:37:18.984359" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "en...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:37:18.980972" elapsed="0.003418"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:37:18.984443" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:37:18.984631" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "en...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:37:18.945246" elapsed="0.039414"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:37:18.984718" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:37:18.984872" level="INFO">${operational_topology} = {
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "en...</msg>
<var>${operational_topology}</var>
<arg>${operational_topology_url}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:37:18.942679" elapsed="0.042220"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.985318" level="INFO">{
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "encryption": {
       "encryption-alg": [
        "AEAD_AES_128_GCM",
        "AEAD_AES_256_GCM",
        "aes128-cbc",
        "aes128-ctr",
        "aes192-cbc",
        "aes192-ctr",
        "aes256-cbc",
        "aes256-ctr",
        "chacha20-poly1305"
       ]
      },
      "host-key": {
       "host-key-alg": [
        "ecdsa-sha2-nistp256",
        "ecdsa-sha2-nistp384",
        "ecdsa-sha2-nistp521",
        "rsa-sha2-256",
        "rsa-sha2-512",
        "ssh-ed25519",
        "ssh-rsa"
       ]
      },
      "key-exchange": {
       "key-exchange-alg": [
        "curve25519-sha256",
        "curve448-sha512",
        "diffie-hellman-group-exchange-sha256",
        "diffie-hellman-group14-sha256",
        "diffie-hellman-group15-sha512",
        "diffie-hellman-group16-sha512",
        "diffie-hellman-group17-sha512",
        "diffie-hellman-group18-sha512",
        "ecdh-sha2-nistp256",
        "ecdh-sha2-nistp384",
        "ecdh-sha2-nistp521",
        "mlkem1024nistp384-sha384",
        "mlkem768nistp256-sha256",
        "mlkem768x25519-sha256",
        "sntrup761x25519-sha512"
       ]
      },
      "mac": {
       "mac-alg": [
        "hmac-sha1",
        "hmac-sha2-256",
        "hmac-sha2-512"
       ]
      }
     }
    }
   }
  }
 ]
}
</msg>
<arg>${operational_topology}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:18.985059" elapsed="0.000315"/>
</kw>
<return>
<value>${config_topology}</value>
<value>${operational_topology}</value>
<status status="PASS" start="2026-08-22T23:37:18.985417" elapsed="0.000028"/>
</return>
<arg>${session}</arg>
<doc>Get both versions of topology (config and operational), log them and return them for further processing.</doc>
<status status="PASS" start="2026-08-22T23:37:18.890026" elapsed="0.095571"/>
</kw>
<msg time="2026-08-22T23:37:18.985703" level="INFO">${result} = ['{\n "network-topology:topology": [\n  {\n   "topology-id": "topology-netconf",\n   "topology-types": {\n    "netconf-node-topology:topology-netconf": {\n     "ssh-transport-topology-parameters": {\n...</msg>
<var>${result}</var>
<arg>${DEVICE_BOOT_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Get_Topology_Core</arg>
<arg>${session}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:37:18.889513" elapsed="0.096216"/>
</kw>
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:37:18.985782" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:37:18.985949" level="INFO">${config_topology} = {
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "en...</msg>
<msg time="2026-08-22T23:37:18.985998" level="INFO">${operational_topology} = {
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "en...</msg>
<var>${config_topology}</var>
<var>${operational_topology}</var>
<arg>session=node2</arg>
<doc>Repeatedly try to get the topologies using Get_Topology_Core until either the request succeeds or boot timeout period expires.</doc>
<status status="PASS" start="2026-08-22T23:37:18.889197" elapsed="0.096826"/>
</kw>
<kw name="Get_Topology">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Topology_Core">
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.994622" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:18.994356" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:18.995066" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:18.994820" 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-08-22T23:37:19.017478" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:19.017660" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '990'} 
 body={"network-topology:topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]} 
 </msg>
<msg time="2026-08-22T23:37:19.017768" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:37:18.997240" elapsed="0.020555"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:18.995177" elapsed="0.022663"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:19.018024" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:19.017868" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:18.995158" elapsed="0.022953"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:19.021796" level="INFO">{"network-topology:topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:19.019144" elapsed="0.002708"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:19.018924" elapsed="0.002963"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:19.018906" elapsed="0.003006"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:19.024565" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:19.022190" elapsed="0.002437"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:19.021969" elapsed="0.002692"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:19.021952" elapsed="0.002734"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:37:19.025253" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:37:19.024858" 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-08-22T23:37:19.025600" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:19.025350" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:19.026145" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:19.025844" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:19.025684" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:19.025333" elapsed="0.000897"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:37:19.026763" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:37:19.026385" 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-08-22T23:37:19.027088" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:19.026858" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:19.027709" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:19.027327" elapsed="0.000410"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:19.027170" elapsed="0.000603"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:19.026841" 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-08-22T23:37:19.027946" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:37:19.028758" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:37:19.028458" 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-08-22T23:37:19.028937" elapsed="0.002317"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:37:19.018474" elapsed="0.012844"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:19.031493" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:19.031387" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:19.031369" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:37:19.034590" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "en...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:37:19.031733" elapsed="0.002888"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:37:19.034676" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:37:19.034837" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "en...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:37:18.990031" elapsed="0.044832"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:37:19.034921" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:37:19.035073" level="INFO">${config_topology} = {
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "en...</msg>
<var>${config_topology}</var>
<arg>${config_topology_url}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:37:18.987440" elapsed="0.047660"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:19.035514" level="INFO">{
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "encryption": {
       "encryption-alg": [
        "AEAD_AES_128_GCM",
        "AEAD_AES_256_GCM",
        "aes128-cbc",
        "aes128-ctr",
        "aes192-cbc",
        "aes192-ctr",
        "aes256-cbc",
        "aes256-ctr",
        "chacha20-poly1305"
       ]
      },
      "host-key": {
       "host-key-alg": [
        "ecdsa-sha2-nistp256",
        "ecdsa-sha2-nistp384",
        "ecdsa-sha2-nistp521",
        "rsa-sha2-256",
        "rsa-sha2-512",
        "ssh-ed25519",
        "ssh-rsa"
       ]
      },
      "key-exchange": {
       "key-exchange-alg": [
        "curve25519-sha256",
        "curve448-sha512",
        "diffie-hellman-group-exchange-sha256",
        "diffie-hellman-group14-sha256",
        "diffie-hellman-group15-sha512",
        "diffie-hellman-group16-sha512",
        "diffie-hellman-group17-sha512",
        "diffie-hellman-group18-sha512",
        "ecdh-sha2-nistp256",
        "ecdh-sha2-nistp384",
        "ecdh-sha2-nistp521",
        "mlkem1024nistp384-sha384",
        "mlkem768nistp256-sha256",
        "mlkem768x25519-sha256",
        "sntrup761x25519-sha512"
       ]
      },
      "mac": {
       "mac-alg": [
        "hmac-sha1",
        "hmac-sha2-256",
        "hmac-sha2-512"
       ]
      }
     }
    }
   }
  }
 ]
}
</msg>
<arg>${config_topology}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:19.035258" elapsed="0.000311"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:19.042973" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:19.042724" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:19.043415" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:19.043171" 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-08-22T23:37:19.057998" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:19.058128" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '990'} 
 body={"network-topology:topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]} 
 </msg>
<msg time="2026-08-22T23:37:19.058265" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:37:19.045666" elapsed="0.012626"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:19.043528" elapsed="0.014807"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:19.058519" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:19.058365" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:19.043510" elapsed="0.015120"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:19.062292" level="INFO">{"network-topology:topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:19.059674" elapsed="0.002672"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:19.059417" elapsed="0.002965"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:19.059398" elapsed="0.003010"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:19.065092" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:19.062697" elapsed="0.002441"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:19.062463" elapsed="0.002710"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:19.062447" elapsed="0.002751"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:37:19.065754" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:37:19.065361" 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-08-22T23:37:19.066083" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:19.065851" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:19.066635" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:19.066320" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:19.066164" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:19.065833" elapsed="0.000887"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:37:19.067234" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:37:19.066875" 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-08-22T23:37:19.067614" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:19.067331" elapsed="0.000342"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:19.068153" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:19.067855" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:19.067697" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:19.067312" 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-08-22T23:37:19.068410" elapsed="0.000507"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:37:19.069531" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:37:19.069141" 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-08-22T23:37:19.069801" elapsed="0.003251"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:37:19.058986" elapsed="0.014155"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:19.073388" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:19.073239" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:19.073214" elapsed="0.000267"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:37:19.077678" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "en...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:37:19.073701" elapsed="0.004019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:37:19.077851" elapsed="0.000044"/>
</return>
<msg time="2026-08-22T23:37:19.078080" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "en...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:37:19.038273" elapsed="0.039844"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:37:19.078197" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:37:19.078411" level="INFO">${operational_topology} = {
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "en...</msg>
<var>${operational_topology}</var>
<arg>${operational_topology_url}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:37:19.035812" elapsed="0.042635"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:19.079046" level="INFO">{
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "encryption": {
       "encryption-alg": [
        "AEAD_AES_128_GCM",
        "AEAD_AES_256_GCM",
        "aes128-cbc",
        "aes128-ctr",
        "aes192-cbc",
        "aes192-ctr",
        "aes256-cbc",
        "aes256-ctr",
        "chacha20-poly1305"
       ]
      },
      "host-key": {
       "host-key-alg": [
        "ecdsa-sha2-nistp256",
        "ecdsa-sha2-nistp384",
        "ecdsa-sha2-nistp521",
        "rsa-sha2-256",
        "rsa-sha2-512",
        "ssh-ed25519",
        "ssh-rsa"
       ]
      },
      "key-exchange": {
       "key-exchange-alg": [
        "curve25519-sha256",
        "curve448-sha512",
        "diffie-hellman-group-exchange-sha256",
        "diffie-hellman-group14-sha256",
        "diffie-hellman-group15-sha512",
        "diffie-hellman-group16-sha512",
        "diffie-hellman-group17-sha512",
        "diffie-hellman-group18-sha512",
        "ecdh-sha2-nistp256",
        "ecdh-sha2-nistp384",
        "ecdh-sha2-nistp521",
        "mlkem1024nistp384-sha384",
        "mlkem768nistp256-sha256",
        "mlkem768x25519-sha256",
        "sntrup761x25519-sha512"
       ]
      },
      "mac": {
       "mac-alg": [
        "hmac-sha1",
        "hmac-sha2-256",
        "hmac-sha2-512"
       ]
      }
     }
    }
   }
  }
 ]
}
</msg>
<arg>${operational_topology}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:19.078687" elapsed="0.000438"/>
</kw>
<return>
<value>${config_topology}</value>
<value>${operational_topology}</value>
<status status="PASS" start="2026-08-22T23:37:19.079186" elapsed="0.000039"/>
</return>
<arg>${session}</arg>
<doc>Get both versions of topology (config and operational), log them and return them for further processing.</doc>
<status status="PASS" start="2026-08-22T23:37:18.987069" elapsed="0.092337"/>
</kw>
<msg time="2026-08-22T23:37:19.079594" level="INFO">${result} = ['{\n "network-topology:topology": [\n  {\n   "topology-id": "topology-netconf",\n   "topology-types": {\n    "netconf-node-topology:topology-netconf": {\n     "ssh-transport-topology-parameters": {\n...</msg>
<var>${result}</var>
<arg>${DEVICE_BOOT_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Get_Topology_Core</arg>
<arg>${session}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:37:18.986552" elapsed="0.093084"/>
</kw>
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:37:19.079709" elapsed="0.000038"/>
</return>
<msg time="2026-08-22T23:37:19.079942" level="INFO">${config_topology} = {
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "en...</msg>
<msg time="2026-08-22T23:37:19.080008" level="INFO">${operational_topology} = {
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "en...</msg>
<var>${config_topology}</var>
<var>${operational_topology}</var>
<arg>session=node3</arg>
<doc>Repeatedly try to get the topologies using Get_Topology_Core until either the request succeeds or boot timeout period expires.</doc>
<status status="PASS" start="2026-08-22T23:37:18.986229" elapsed="0.093813"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:19.081637" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:19.081241" elapsed="0.000423"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:19.089061" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:19.088811" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:19.089595" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:19.089259" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:37:19.137668" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:19.137925" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:37:19.138145" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:37:19.091830" elapsed="0.046373"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:19.089749" elapsed="0.048625"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:19.138815" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:19.138436" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:19.089730" elapsed="0.049282"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:19.146817" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:19.141364" elapsed="0.005564"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:19.140873" elapsed="0.006134"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:19.140831" elapsed="0.006232"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:19.150400" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:19.147760" elapsed="0.002686"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:19.147190" elapsed="0.003292"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:19.147152" elapsed="0.003354"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:37:19.151062" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:37:19.150681" 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-08-22T23:37:19.151405" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:19.151160" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:19.151967" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:19.151665" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:19.151487" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:19.151142" elapsed="0.000909"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:37:19.152568" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:37:19.152208" 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-08-22T23:37:19.152917" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:19.152686" elapsed="0.000402"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:19.153607" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:19.153275" elapsed="0.000359"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:19.153115" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:19.152667" 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-08-22T23:37:19.153839" elapsed="0.000365"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:37:19.154694" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:37:19.154368" 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-08-22T23:37:19.154875" elapsed="0.002726"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:37:19.139869" elapsed="0.017801"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:37:19.157853" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-08-22T23:37:19.157742" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:19.157723" 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-08-22T23:37:19.158089" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:19.158162" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:37:19.160542" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:37:19.084291" elapsed="0.076280"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:37:19.160688" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:37:19.160853" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:37:19.081878" elapsed="0.079002"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:37:19.161213" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:37:19.160996" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:19.160978" elapsed="0.000642"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:19.161881" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:19.161676" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-08-22T23:37:19.161659" elapsed="0.000304"/>
</if>
<arg>node1</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="PASS" start="2026-08-22T23:37:19.080875" elapsed="0.081137"/>
</kw>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>node1</arg>
<arg>${empty_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:37:19.080272" elapsed="0.081791"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:19.163594" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:19.163163" elapsed="0.000460"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:19.171792" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:19.171406" elapsed="0.000452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:19.172439" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:19.172089" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:37:19.190445" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:19.190832" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:19.191137" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:19.175615" elapsed="0.016499">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:19.172619" elapsed="0.019723">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:19.192879" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:19.192440" elapsed="0.000603"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:19.172569" elapsed="0.020533">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:19.194106" elapsed="0.000067"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:19.194468" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:19.194357" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:19.194309" elapsed="0.000354"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:19.195011" elapsed="0.000054"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:19.195212" elapsed="0.000039"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:19.166440" elapsed="0.029057">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:19.195817" elapsed="0.000042"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:19.163836" elapsed="0.032227">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:19.196652" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:19.196261" elapsed="0.000524"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:19.196220" elapsed="0.000618"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:19.197275" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:19.196961" elapsed="0.000434"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:19.196924" elapsed="0.000531"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:19.162801" elapsed="0.034880">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:20.200743" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:20.199697" elapsed="0.001131"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:20.216301" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:20.215874" elapsed="0.000503"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:20.217041" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:20.216656" elapsed="0.000457"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:37:20.228788" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:20.228965" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:20.229097" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:20.220375" elapsed="0.009146">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:20.217228" elapsed="0.012402">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:20.229850" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:20.229672" elapsed="0.000244"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:20.217194" elapsed="0.012746">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:20.230386" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:20.230535" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:20.230493" elapsed="0.000103"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:20.230473" elapsed="0.000146"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:20.230766" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:20.230837" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:20.207128" elapsed="0.023818">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:20.231089" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:20.201370" elapsed="0.029817">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:20.231437" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:20.231283" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:20.231263" elapsed="0.000256"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:20.231733" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:20.231572" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:20.231557" elapsed="0.000256"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:20.198560" elapsed="0.033333">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:21.234856" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:21.233809" elapsed="0.001118"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:21.248769" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:21.248488" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:21.249214" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:21.248969" 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-08-22T23:37:21.259283" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:21.259462" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:21.259643" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:21.251407" elapsed="0.008746">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:21.249335" elapsed="0.010932">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:21.260532" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:21.260316" elapsed="0.000331"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:21.249312" elapsed="0.011369">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:21.261203" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:21.261394" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:21.261340" elapsed="0.000114"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:21.261316" 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-08-22T23:37:21.261780" elapsed="0.000052"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:21.261904" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:21.241310" elapsed="0.020743">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:21.262152" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:21.235427" elapsed="0.026857">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:21.262614" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:21.262395" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:21.262372" elapsed="0.000356"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:21.262997" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:21.262803" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:21.262781" elapsed="0.000329"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:21.232785" elapsed="0.030433">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:22.266477" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:22.265464" elapsed="0.001083"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:22.277653" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:22.277264" elapsed="0.000459"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:22.278277" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:22.277937" 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-08-22T23:37:22.288681" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:22.288896" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:22.289052" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:22.281101" elapsed="0.008507">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:22.278439" elapsed="0.011283">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:22.289986" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:22.289769" elapsed="0.000310"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:22.278409" elapsed="0.011704">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:22.290652" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:22.290934" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:22.290879" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:22.290853" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:22.291228" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:22.291327" elapsed="0.000043"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:22.271269" elapsed="0.020234">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:22.291619" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:22.267071" elapsed="0.024682">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:22.292063" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:22.291863" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:22.291840" elapsed="0.000336"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:22.292445" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:22.292250" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:22.292229" elapsed="0.000327"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:22.264386" elapsed="0.028300">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:23.294259" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:23.293797" elapsed="0.000497"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:23.302001" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:23.301538" elapsed="0.000512"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:23.302451" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:23.302205" 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-08-22T23:37:23.312488" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:23.312669" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:23.312785" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:23.304678" elapsed="0.008515">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:23.302570" elapsed="0.010706">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:23.313470" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:23.313310" elapsed="0.000305"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:23.302548" elapsed="0.011107">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:23.314056" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:23.314202" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:23.314162" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:23.314144" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:23.314410" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:23.314480" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:23.297231" elapsed="0.017368">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:23.314670" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:23.294524" elapsed="0.020240">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:23.314985" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:23.314843" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:23.314826" elapsed="0.000248"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:23.315267" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:23.315127" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:23.315112" elapsed="0.000233"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:23.293243" elapsed="0.022188">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:24.318259" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:24.317228" elapsed="0.001100"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:24.332339" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:24.332056" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:24.332812" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:24.332546" 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-08-22T23:37:24.342257" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:24.342414" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:24.342542" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:24.335022" elapsed="0.007953">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:24.332933" elapsed="0.010188">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:24.343326" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:24.343158" elapsed="0.000235"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:24.332911" elapsed="0.010506">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:24.343834" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:24.343972" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:24.343932" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:24.343914" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:24.344185" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:24.344255" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:24.327435" elapsed="0.016925">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:24.344428" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:24.318873" elapsed="0.025648">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:24.344758" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:24.344615" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:24.344597" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:24.345029" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:24.344891" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:24.344875" elapsed="0.000233"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:24.316225" elapsed="0.028959">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:25.348057" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:25.347071" elapsed="0.001058"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:25.363202" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:25.362876" elapsed="0.000385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:25.363704" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:25.363421" 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-08-22T23:37:25.373532" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:25.373744" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:25.373882" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:25.365952" elapsed="0.008405">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:25.363830" elapsed="0.010623">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:25.374729" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:25.374499" elapsed="0.000300"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:25.363806" elapsed="0.011017">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:25.375256" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:25.375402" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:25.375359" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:25.375341" elapsed="0.000129"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:25.375638" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:25.375711" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:25.354260" elapsed="0.021561">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:25.375890" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:25.348651" elapsed="0.027335">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:25.376214" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:25.376068" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:25.376050" elapsed="0.000244"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:25.376487" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:25.376347" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:25.376332" elapsed="0.000238"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:25.346052" elapsed="0.030613">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:26.380219" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:26.378996" elapsed="0.001314"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:26.390011" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:26.389730" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:26.390467" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:26.390220" 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-08-22T23:37:26.400599" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:26.400765" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:26.400947" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:26.392701" elapsed="0.008671">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:26.390604" elapsed="0.010854">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:26.401673" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:26.401493" elapsed="0.000246"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:26.390566" elapsed="0.011197">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:26.402155" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:26.402311" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:26.402270" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:26.402250" elapsed="0.000128"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:26.402522" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:26.402611" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:26.385098" elapsed="0.017656">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:26.402826" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:26.380891" elapsed="0.022029">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:26.403152" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:26.402997" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:26.402981" elapsed="0.000249"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:26.403420" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:26.403282" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:26.403267" elapsed="0.000230"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:26.377712" elapsed="0.025936">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:27.406746" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:27.405755" elapsed="0.001065"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:27.418414" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:27.418138" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:27.418909" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:27.418659" 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-08-22T23:37:27.429035" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:27.429213" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:27.429443" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:27.421158" elapsed="0.008729">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:27.419040" elapsed="0.010939">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:27.430210" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:27.430021" elapsed="0.000259"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:27.419010" elapsed="0.011295">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:27.430761" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:27.430909" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:27.430868" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:27.430849" elapsed="0.000128"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:27.431123" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:27.431195" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:27.412950" elapsed="0.018356">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:27.431377" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:27.407318" elapsed="0.024156">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:27.431721" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:27.431555" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:27.431538" elapsed="0.000265"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:27.431998" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:27.431857" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:27.431842" elapsed="0.000236"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:27.404658" elapsed="0.027498">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:28.435082" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:28.434059" elapsed="0.001099"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:28.447533" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:28.447270" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:28.448004" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:28.447756" 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-08-22T23:37:28.458304" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:28.458477" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:28.458704" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:28.450267" elapsed="0.008863">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:28.448129" elapsed="0.011091">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:28.459446" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:28.459260" elapsed="0.000252"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:28.448105" elapsed="0.011430">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:28.459982" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:28.460129" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:28.460086" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:28.460067" elapsed="0.000130"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:28.460342" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:28.460412" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:28.441354" elapsed="0.019169">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:28.460608" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:28.435693" elapsed="0.025015">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:28.460935" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:28.460789" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:28.460771" elapsed="0.000242"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:28.461206" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:28.461066" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:28.461050" elapsed="0.000234"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:28.433031" elapsed="0.028330">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:29.464368" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:29.463378" elapsed="0.001064"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:29.477166" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:29.476906" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:29.477660" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:29.477392" 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-08-22T23:37:29.487158" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:29.487322" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:29.487504" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:29.479926" elapsed="0.007994">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:29.477784" elapsed="0.010218">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:29.488196" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:29.488038" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:29.477761" elapsed="0.010528">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:29.488687" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:29.488826" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:29.488786" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:29.488768" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:29.489038" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:29.489109" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:29.470640" elapsed="0.018593">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:29.489304" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:29.464977" elapsed="0.024426">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:29.489647" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:29.489481" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:29.489465" elapsed="0.000263"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:29.489920" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:29.489781" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:29.489766" elapsed="0.000233"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:29.462281" elapsed="0.027795">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:30.493070" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:30.492076" elapsed="0.001067"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:30.504887" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:30.504620" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:30.505338" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:30.505090" 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-08-22T23:37:30.516604" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:30.516767" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:30.516947" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:30.507537" elapsed="0.009799">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:30.505460" elapsed="0.011957">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:30.517625" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:30.517452" elapsed="0.000240"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:30.505437" elapsed="0.012279">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:30.518091" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:30.518236" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:30.518190" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:30.518173" elapsed="0.000129"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:30.518445" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:30.518516" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:30.499196" elapsed="0.019441">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:30.518713" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:30.493668" elapsed="0.025140">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:30.519030" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:30.518888" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:30.518871" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:30.519305" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:30.519164" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:30.519148" elapsed="0.000236"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:30.490990" elapsed="0.028471">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:31.522712" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:31.521464" elapsed="0.001302"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:31.533408" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:31.533047" elapsed="0.000428"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:31.534106" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:31.533716" elapsed="0.000454"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:37:31.544437" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:31.544620" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:31.544864" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:31.536549" elapsed="0.008835">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:31.534318" elapsed="0.011180">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:31.545813" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:31.545548" elapsed="0.000361"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:31.534283" elapsed="0.011661">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:31.546498" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:31.546717" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:31.546661" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:31.546635" elapsed="0.000175"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:31.547012" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:31.547112" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:31.526613" elapsed="0.020646">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:31.547357" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:31.523111" elapsed="0.024379">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:31.547822" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:31.547621" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:31.547597" elapsed="0.000339"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:31.548205" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:31.548011" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:31.547989" elapsed="0.000327"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:31.520300" elapsed="0.028123">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:32.551660" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:32.550673" elapsed="0.001061"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:32.564062" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:32.563686" elapsed="0.000444"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:32.564750" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:32.564351" elapsed="0.000444"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:37:32.575050" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:32.575218" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:32.575418" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:32.566939" elapsed="0.008944">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:32.564873" elapsed="0.011125">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:32.576263" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:32.576047" elapsed="0.000309"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:32.564850" elapsed="0.011538">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:32.576954" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:32.577146" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:32.577092" elapsed="0.000114"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:32.577067" elapsed="0.000170"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:32.577437" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:32.577536" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:32.557096" elapsed="0.020606">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:32.577798" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:32.552226" elapsed="0.025702">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:32.578235" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:32.578037" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:32.578014" elapsed="0.000332"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:32.578634" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:32.578420" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:32.578399" elapsed="0.000348"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:32.549573" elapsed="0.029280">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:33.581797" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:33.580822" elapsed="0.001049"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:33.593038" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:33.592675" elapsed="0.000433"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:33.593694" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:33.593325" 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-08-22T23:37:33.604255" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:33.604416" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:33.604616" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:33.596558" elapsed="0.008531">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:33.593863" elapsed="0.011340">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:33.605466" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:33.605250" elapsed="0.000308"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:33.593834" elapsed="0.011779">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:33.606142" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:33.606332" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:33.606277" elapsed="0.000115"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:33.606253" elapsed="0.000169"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:33.606639" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:33.606739" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:33.586321" elapsed="0.020566">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:33.606983" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:33.582363" elapsed="0.024776">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:33.607446" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:33.607249" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:33.607226" elapsed="0.000330"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:33.607848" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:33.607655" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:33.607632" elapsed="0.000326"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:33.579798" elapsed="0.028267">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:34.611151" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:34.610073" elapsed="0.001171"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:34.623185" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:34.622820" elapsed="0.000463"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:34.623926" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:34.623544" elapsed="0.000446"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:37:34.635333" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:34.635507" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:34.635712" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:34.627540" elapsed="0.008575">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:34.624094" elapsed="0.012105">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:34.636391" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:34.636235" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:34.624064" elapsed="0.012417">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:34.636877" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:34.637016" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:34.636975" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:34.636958" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:34.637223" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:34.637293" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:34.616529" elapsed="0.020865">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:34.637463" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:34.611884" elapsed="0.025671">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:34.637819" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:34.637668" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:34.637650" elapsed="0.000248"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:34.638091" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:34.637951" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:34.637936" elapsed="0.000234"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:34.608968" elapsed="0.029277">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:35.641279" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:35.640203" elapsed="0.001149"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:35.653309" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:35.653046" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:35.653802" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:35.653513" 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-08-22T23:37:35.663270" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:35.663435" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:35.663643" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:35.655984" elapsed="0.008042">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:35.653925" elapsed="0.010184">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:35.664298" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:35.664144" elapsed="0.000235"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:35.653902" elapsed="0.010501">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:35.664798" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:35.664939" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:35.664896" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:35.664878" elapsed="0.000128"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:35.665149" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:35.665220" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:35.647508" elapsed="0.017816">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:35.665392" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:35.641881" elapsed="0.023603">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:35.665720" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:35.665562" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:35.665545" elapsed="0.000255"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:35.666000" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:35.665861" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:35.665846" elapsed="0.000232"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:35.639145" elapsed="0.027010">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:36.669496" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:36.668431" elapsed="0.001138"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:36.684649" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:36.684268" elapsed="0.000454"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:36.685261" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:36.684933" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:37:36.696284" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:36.696446" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:36.696662" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:36.687806" elapsed="0.009386">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:36.685435" elapsed="0.011877">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:36.697603" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:36.697361" elapsed="0.000338"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:36.685401" elapsed="0.012332">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:36.698317" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:36.698517" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:36.698460" elapsed="0.000141"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:36.698435" elapsed="0.000200"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:36.698835" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:36.698936" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:36.674898" elapsed="0.024211">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:36.699225" elapsed="0.000024"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:36.670266" elapsed="0.029187">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:36.699899" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:36.699630" elapsed="0.000370"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:36.699577" elapsed="0.000466"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:36.700343" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:36.700139" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:36.700111" elapsed="0.000367"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:36.667134" elapsed="0.033489">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:37.704075" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:37.703037" elapsed="0.001112"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:37.715224" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:37.714964" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:37.715686" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:37.715424" 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-08-22T23:37:37.725407" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:37.725569" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:37.725774" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:37.718088" elapsed="0.008088">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:37.715808" elapsed="0.010453">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:37.726448" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:37.726295" elapsed="0.000219"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:37.715786" elapsed="0.010752">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:37.726921" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:37.727060" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:37.727018" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:37.727001" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:37.727269" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:37.727340" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:37.710331" elapsed="0.017113">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:37.727513" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:37.704672" elapsed="0.022949">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:37.727843" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:37.727700" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:37.727684" elapsed="0.000239"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:37.728113" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:37.727975" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:37.727960" elapsed="0.000232"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:37.701983" elapsed="0.026284">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:38.731264" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:38.730269" elapsed="0.001069"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:38.742144" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:38.741783" elapsed="0.000427"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:38.742793" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:38.742425" elapsed="0.000433"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:37:38.753615" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:38.753773" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:38.753947" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:38.745884" elapsed="0.008447">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:38.742964" elapsed="0.011449">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:38.754623" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:38.754449" elapsed="0.000242"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:38.742933" elapsed="0.011782">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:38.755106" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:38.755244" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:38.755203" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:38.755186" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:38.755451" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:38.755522" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:38.735755" elapsed="0.019887">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:38.755713" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:38.731872" elapsed="0.023934">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:38.756026" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:38.755884" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:38.755868" elapsed="0.000237"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:38.756297" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:38.756157" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:38.756142" elapsed="0.000234"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:38.729196" elapsed="0.027255">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:39.759425" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:39.758413" elapsed="0.001085"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:39.771958" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:39.771533" elapsed="0.000508"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:39.772624" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:39.772261" 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-08-22T23:37:39.784221" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:39.784396" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:39.784604" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:39.776038" elapsed="0.009107">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:39.772796" elapsed="0.012578">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:39.785846" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:39.785461" elapsed="0.000544"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:39.772764" elapsed="0.013297">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:39.786926" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:39.787233" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:39.787146" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:39.787107" 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-08-22T23:37:39.787763" elapsed="0.000052"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:39.787933" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:39.765339" elapsed="0.022825">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:39.788321" elapsed="0.000034"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:39.760081" elapsed="0.028451">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:39.789090" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:39.788745" elapsed="0.000480"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:39.788707" elapsed="0.000572"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:39.789748" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:39.789402" elapsed="0.000477"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:39.789367" elapsed="0.000567"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:39.757285" elapsed="0.032824">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:40.793185" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:40.792178" elapsed="0.001084"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:40.804294" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:40.803923" elapsed="0.000450"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:40.804954" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:40.804607" 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-08-22T23:37:40.815727" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:40.815892" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:40.816152" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:40.807971" elapsed="0.008816">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:40.805125" elapsed="0.011779">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:40.817176" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:40.816956" elapsed="0.000315"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:40.805093" elapsed="0.012213">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:40.817871" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:40.818067" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:40.818012" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:40.817986" elapsed="0.000175"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:40.818363" elapsed="0.000056"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:40.818493" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:40.797835" elapsed="0.020825">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:40.818761" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:40.793794" elapsed="0.025100">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:40.819215" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:40.819011" elapsed="0.000285"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:40.818988" elapsed="0.000342"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:40.819622" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:40.819405" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:40.819384" elapsed="0.000354"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:40.791077" elapsed="0.028769">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:41.823072" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:41.821985" elapsed="0.001177"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:41.834554" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:41.834292" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:41.835028" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:41.834773" 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-08-22T23:37:41.845222" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:41.845423" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:41.845649" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:41.837472" elapsed="0.008589">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:41.835152" elapsed="0.010997">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:41.846355" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:41.846187" elapsed="0.000235"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:41.835129" elapsed="0.011318">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:41.846914" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:41.847062" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:41.847021" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:41.847001" elapsed="0.000128"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:41.847273" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:41.847344" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:41.829931" elapsed="0.017521">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:41.847520" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:41.823767" elapsed="0.023863">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:41.847853" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:41.847710" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:41.847694" elapsed="0.000242"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:41.848126" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:41.847989" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:41.847974" elapsed="0.000228"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:41.820798" elapsed="0.027481">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:42.851440" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:42.850431" elapsed="0.001084"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:42.862791" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:42.862399" elapsed="0.000462"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:42.863415" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:42.863073" 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-08-22T23:37:42.873990" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:42.874204" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:42.874475" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:42.866306" elapsed="0.008727">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:42.863608" elapsed="0.011541">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:42.875415" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:42.875199" elapsed="0.000310"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:42.863554" elapsed="0.011988">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:42.876082" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:42.876271" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:42.876218" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:42.876194" elapsed="0.000346"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:42.876957" elapsed="0.000058"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:42.877140" elapsed="0.000039"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:42.855918" elapsed="0.021480">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:42.877565" elapsed="0.000066"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:42.852051" elapsed="0.025770">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:42.878357" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:42.878014" elapsed="0.000477"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:42.877975" elapsed="0.000572"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:42.879039" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:42.878708" elapsed="0.000462"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:42.878671" elapsed="0.000554"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:42.849328" elapsed="0.030074">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:43.881376" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:43.880823" elapsed="0.000598"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:43.889159" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:43.888893" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:43.889621" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:43.889359" 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-08-22T23:37:43.900426" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:43.900634" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:43.900845" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:43.892263" elapsed="0.009014">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:43.889798" elapsed="0.011568">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:43.901562" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:43.901405" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:43.889768" elapsed="0.011903">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:43.902059" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:43.902199" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:43.902156" elapsed="0.000091"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:43.902139" elapsed="0.000129"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:43.902412" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:43.902482" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:43.884551" elapsed="0.018054">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:43.902675" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:43.881828" elapsed="0.020940">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:43.902990" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:43.902846" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:43.902830" elapsed="0.000239"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:43.903258" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:43.903121" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:43.903106" elapsed="0.000230"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:43.880124" elapsed="0.023331">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:44.905563" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:44.904908" elapsed="0.000729"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:44.916173" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:44.915865" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:44.916657" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:44.916392" 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-08-22T23:37:44.926851" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:44.927066" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:44.927307" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:44.919081" elapsed="0.008786">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:44.916783" elapsed="0.011206">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:44.928275" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:44.928041" elapsed="0.000331"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:44.916759" elapsed="0.011649">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:44.929013" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:44.929217" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:44.929159" elapsed="0.000124"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:44.929133" elapsed="0.000182"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:44.929526" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:44.929651" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:44.909749" elapsed="0.020058">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:44.929909" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:44.905973" elapsed="0.024076">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:44.930378" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:44.930165" elapsed="0.000322"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:44.930141" elapsed="0.000382"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:44.930830" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:44.930622" elapsed="0.000290"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:44.930598" elapsed="0.000348"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:44.904175" elapsed="0.026884">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:45.933942" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:45.932945" elapsed="0.001069"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:45.945770" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:45.945450" elapsed="0.000374"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:45.946227" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:45.945981" 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-08-22T23:37:45.956311" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:45.956475" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:45.956676" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:45.948621" elapsed="0.008443">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:45.946352" elapsed="0.010796">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:45.957349" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:45.957185" elapsed="0.000230"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:45.946328" elapsed="0.011111">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:45.957896" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:45.958039" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:45.957998" elapsed="0.000092"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:45.957980" elapsed="0.000131"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:45.958254" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:45.958322" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:45.939983" elapsed="0.018446">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:45.958497" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:45.934503" elapsed="0.024106">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:45.958834" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:45.958689" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:45.958673" elapsed="0.000239"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:45.959102" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:45.958965" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:45.958949" elapsed="0.000229"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:45.931950" elapsed="0.027303">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:46.962276" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:46.961282" elapsed="0.001066"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:46.973522" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:46.973227" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:46.974006" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:46.973758" 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-08-22T23:37:46.983899" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:46.984069" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:46.984269" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:46.976409" elapsed="0.008322">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:46.974132" elapsed="0.010688">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:46.985036" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:46.984859" elapsed="0.000244"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:46.974107" elapsed="0.011020">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:46.985557" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:46.985720" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:46.985678" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:46.985659" elapsed="0.000129"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:46.985931" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:46.986001" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:46.968341" elapsed="0.017771">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:46.986182" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:46.962869" elapsed="0.023408">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:46.986500" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:46.986355" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:46.986339" elapsed="0.000255"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:46.986815" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:46.986650" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:46.986634" elapsed="0.000265"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:46.960133" elapsed="0.026845">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:47.989980" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:47.988928" elapsed="0.001129"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:48.000882" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:48.000618" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:48.001328" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:48.001081" 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-08-22T23:37:48.012306" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:48.012644" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:48.012987" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:48.003778" elapsed="0.010012">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:48.001450" elapsed="0.012522">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:48.014415" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:48.014050" elapsed="0.000513"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:48.001427" elapsed="0.013221">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:48.015489" elapsed="0.000058"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:48.015868" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:48.015780" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:48.015696" elapsed="0.000317"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:48.016232" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:48.016334" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:47.996320" elapsed="0.020167">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:48.016608" elapsed="0.000024"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:47.990614" elapsed="0.026135">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:48.017076" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:48.016864" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:48.016840" elapsed="0.000353"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:48.017477" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:48.017271" elapsed="0.000287"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:48.017249" elapsed="0.000364"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:47.987867" elapsed="0.029863">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:49.020611" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:49.019645" elapsed="0.001040"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:49.033497" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:49.033230" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:49.033967" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:49.033718" 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-08-22T23:37:49.044145" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:49.044303" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:49.044500" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:49.036218" elapsed="0.008697">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:49.034088" elapsed="0.010912">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:49.045212" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:49.045039" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:49.034066" elapsed="0.011239">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:49.045726" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:49.045869" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:49.045828" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:49.045810" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:49.046078" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:49.046151" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:49.026617" elapsed="0.019640">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:49.046329" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:49.021172" elapsed="0.025251">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:49.046663" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:49.046503" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:49.046487" elapsed="0.000258"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:49.046980" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:49.046800" elapsed="0.000239"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:49.046784" elapsed="0.000279"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:49.018619" elapsed="0.028557">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:50.050802" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:50.049416" elapsed="0.001475"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:50.065130" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:50.064867" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:50.065594" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:50.065335" 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-08-22T23:37:50.075112" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:50.075275" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:50.075453" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:50.068004" elapsed="0.007862">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:50.065722" elapsed="0.010228">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:50.076143" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:50.075985" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:50.065697" elapsed="0.010537">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:50.076626" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:50.076764" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:50.076724" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:50.076707" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:50.076972" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:50.077042" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:50.057320" elapsed="0.019830">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:50.077221" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:50.051444" elapsed="0.025870">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:50.077537" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:50.077393" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:50.077376" elapsed="0.000256"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:50.077827" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:50.077686" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:50.077670" elapsed="0.000236"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:50.048161" elapsed="0.029822">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:51.080807" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:51.079843" elapsed="0.001036"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:51.094567" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:51.094308" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:51.095031" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:51.094784" 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-08-22T23:37:51.105445" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:51.105629" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:51.105831" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:51.097564" elapsed="0.008683">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:51.095158" elapsed="0.011172">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:51.106566" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:51.106367" elapsed="0.000325"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:51.095134" elapsed="0.011617">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:51.107267" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:51.107405" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:51.107365" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:51.107347" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:51.107632" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:51.107704" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:51.087094" elapsed="0.020715">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:51.107878" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:51.081419" elapsed="0.026553">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:51.108196" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:51.108050" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:51.108034" elapsed="0.000242"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:51.108467" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:51.108328" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:51.108313" elapsed="0.000232"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:51.078853" elapsed="0.029786">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:52.111566" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:52.110560" elapsed="0.001115"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:52.124396" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:52.124123" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:52.124907" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:52.124645" 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-08-22T23:37:52.135130" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:52.135300" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:52.135489" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:52.127349" elapsed="0.008559">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:52.125038" elapsed="0.010954">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:52.136196" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:52.136030" elapsed="0.000235"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:52.125013" elapsed="0.011278">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:52.136738" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:52.136882" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:52.136841" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:52.136823" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:52.137095" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:52.137167" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:52.117948" elapsed="0.019328">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:52.137345" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:52.112186" elapsed="0.025255">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:52.137681" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:52.137519" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:52.137503" elapsed="0.000259"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:52.137957" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:52.137816" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:52.137801" elapsed="0.000235"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:52.109475" elapsed="0.028639">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:53.141408" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:53.140262" elapsed="0.001221"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:53.154880" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:53.154425" elapsed="0.000535"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:53.155621" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:53.155198" elapsed="0.000531"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:37:53.166474" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:53.166659" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:53.166860" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:53.158339" elapsed="0.008981">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:53.155851" elapsed="0.011598">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:53.167825" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:53.167503" elapsed="0.000428"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:53.155816" elapsed="0.012151">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:53.168685" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:53.168903" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:53.168841" elapsed="0.000142"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:53.168813" 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-08-22T23:37:53.169244" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:53.169381" elapsed="0.000032"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:53.147063" elapsed="0.022561">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:53.169770" elapsed="0.000032"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:53.142019" elapsed="0.027939">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:53.170370" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:53.170102" elapsed="0.000379"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:53.170069" elapsed="0.000465"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:53.170991" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:53.170685" elapsed="0.000423"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:53.170648" elapsed="0.000506"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:53.139031" elapsed="0.032273">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:54.174202" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:54.173213" elapsed="0.001066"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:54.187205" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:54.186923" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:54.187673" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:54.187407" 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-08-22T23:37:54.196997" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:54.197154" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:54.197362" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:54.190079" elapsed="0.007696">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:54.187796" elapsed="0.010063">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:54.198051" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:54.197894" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:54.187774" elapsed="0.010369">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:54.198518" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:54.198677" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:54.198636" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:54.198618" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:54.198889" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:54.198988" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:54.181744" elapsed="0.017352">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:54.199167" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:54.174806" elapsed="0.024458">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:54.199488" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:54.199344" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:54.199328" elapsed="0.000242"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:54.199781" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:54.199641" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:54.199624" elapsed="0.000237"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:54.172190" elapsed="0.027750">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:55.202883" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:55.201873" elapsed="0.001083"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:55.214897" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:55.214517" elapsed="0.000447"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:55.215519" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:55.215177" elapsed="0.000425"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:37:55.226094" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:55.226262" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:55.226443" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:55.218896" elapsed="0.007955">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:55.215708" elapsed="0.011227">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:55.227127" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:55.226970" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:55.215678" elapsed="0.011541">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:55.227623" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:55.227763" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:55.227723" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:55.227705" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:55.227973" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:55.228045" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:55.208355" elapsed="0.019795">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:55.228220" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:55.203450" elapsed="0.024870">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:55.228543" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:55.228401" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:55.228384" elapsed="0.000256"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:55.228837" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:55.228695" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:55.228679" elapsed="0.000238"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:55.200850" elapsed="0.028145">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:56.232025" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:56.231034" elapsed="0.001065"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:56.243227" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:56.242866" elapsed="0.000428"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:56.243871" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:56.243505" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:37:56.254178" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:56.254343" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:56.254525" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:56.247012" elapsed="0.007927">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:56.244039" elapsed="0.010983">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:56.255215" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:56.255058" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:56.244008" elapsed="0.011298">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:56.255701" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:56.255838" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:56.255799" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:56.255781" 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-08-22T23:37:56.256080" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:56.256152" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:56.236779" elapsed="0.019478">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:56.256326" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:56.232626" elapsed="0.023793">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:56.256658" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:56.256498" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:56.256482" elapsed="0.000257"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:56.256933" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:56.256793" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:56.256777" elapsed="0.000235"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:56.229949" elapsed="0.027139">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:57.260074" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:57.259038" elapsed="0.001108"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:57.272662" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:57.272387" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:57.273121" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:57.272873" 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-08-22T23:37:57.283178" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:57.283346" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:57.283528" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:57.275488" elapsed="0.008448">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:57.273244" elapsed="0.010775">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:57.284210" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:57.284055" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:57.273221" elapsed="0.011080">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:57.284699" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:57.284855" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:57.284814" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:57.284779" elapsed="0.000142"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:57.285065" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:57.285135" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:57.266324" elapsed="0.018916">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:57.285310" elapsed="0.000018"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:57.260670" elapsed="0.024736">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:57.285641" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:57.285483" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:57.285467" elapsed="0.000255"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:57.285913" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:57.285775" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:57.285760" elapsed="0.000231"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:57.257985" elapsed="0.028083">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:58.289130" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:58.288033" elapsed="0.001174"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:58.300703" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:58.300426" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:58.301147" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:58.300902" 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-08-22T23:37:58.311073" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:58.311234" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:58.311415" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:58.303524" elapsed="0.008299">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:58.301272" elapsed="0.010635">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:58.312124" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:58.311943" elapsed="0.000249"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:58.301249" elapsed="0.010967">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:58.312624" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:58.312764" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:58.312724" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:58.312706" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:58.312974" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:58.313042" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:58.295531" elapsed="0.017617">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:58.313215" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:58.289792" elapsed="0.023515">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:58.313532" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:58.313386" elapsed="0.000365"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:58.313369" elapsed="0.000406"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:58.313967" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:58.313829" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:58.313813" elapsed="0.000231"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:58.286949" elapsed="0.027171">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:37:59.316287" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:37:59.315646" elapsed="0.000691"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:59.327241" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:59.326979" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:37:59.327724" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:37:59.327457" 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-08-22T23:37:59.337880" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:37:59.338037" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:37:59.338214" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:37:59.330147" elapsed="0.008468">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:37:59.327849" elapsed="0.010851">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:59.338892" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:59.338735" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:37:59.327825" elapsed="0.011163">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:59.339384" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:59.339553" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:37:59.339512" elapsed="0.000102"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:59.339494" elapsed="0.000142"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:59.339783" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:37:59.339855" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:37:59.320182" elapsed="0.019789">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:37:59.340068" elapsed="0.000020"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:37:59.316680" elapsed="0.023499">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:59.340418" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:59.340273" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:59.340256" elapsed="0.000260"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:37:59.340732" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:37:59.340571" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:37:59.340555" elapsed="0.000256"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:37:59.314836" elapsed="0.026064">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:00.344127" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:00.343119" elapsed="0.001083"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:00.355438" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:00.355177" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:00.355901" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:00.355654" 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-08-22T23:38:00.365381" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:38:00.365549" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:00.365766" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:00.358289" elapsed="0.007869">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:00.356027" elapsed="0.010217">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:00.366435" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:00.366281" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:00.356002" elapsed="0.010525">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:00.366939" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:00.367076" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:00.367038" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:00.367020" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:00.367290" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:00.367361" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:00.350239" elapsed="0.017228">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:00.367537" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:00.344744" elapsed="0.022904">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:00.367873" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:00.367730" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:00.367713" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:00.368149" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:00.368009" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:00.367993" elapsed="0.000235"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:38:00.342015" elapsed="0.026293">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:01.371358" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:01.370356" elapsed="0.001074"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:01.386466" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:01.386180" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:01.386935" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:01.386688" 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-08-22T23:38:01.396792" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:38:01.396950" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:01.397143" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:01.389122" elapsed="0.008413">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:01.387058" elapsed="0.010581">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:01.397848" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:01.397676" elapsed="0.000238"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:01.387034" elapsed="0.010904">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:01.398383" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:01.398660" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:01.398537" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:01.398496" 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-08-22T23:38:01.399121" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:01.399275" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:01.377418" elapsed="0.022087">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:01.399691" elapsed="0.000035"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:01.371960" elapsed="0.027939">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:01.400384" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:01.400070" elapsed="0.000437"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:01.400034" elapsed="0.000525"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:01.401022" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:01.400713" elapsed="0.000432"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:01.400677" elapsed="0.000519"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:38:01.369245" elapsed="0.032122">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:02.404353" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:02.403361" elapsed="0.001064"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:02.417260" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:02.416880" elapsed="0.000450"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:02.417957" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:02.417565" 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-08-22T23:38:02.472188" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:38:02.472363" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:02.472570" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:02.464546" elapsed="0.008440">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:02.418232" elapsed="0.054848">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:02.473294" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:02.473119" elapsed="0.000243"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:02.418101" elapsed="0.055285">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:02.473866" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:02.474014" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:02.473972" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:02.473953" elapsed="0.000129"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:02.474227" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:02.474297" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:02.410514" elapsed="0.063896">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:02.474480" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:02.404954" elapsed="0.069637">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:02.474818" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:02.474673" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:02.474656" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:02.475091" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:02.474950" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:02.474935" elapsed="0.000233"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:38:02.402280" elapsed="0.072967">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:03.478267" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:03.477230" elapsed="0.001112"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:03.490218" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:03.489885" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:03.490691" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:03.490425" 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-08-22T23:38:03.503525" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:38:03.504200" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:03.504822" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:03.492976" elapsed="0.013850">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:03.490816" elapsed="0.016236">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:03.507705" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:03.507154" elapsed="0.000710"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:03.490792" elapsed="0.017128">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:03.508768" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:03.508945" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:03.508895" elapsed="0.000102"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:03.508870" elapsed="0.000149"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:03.509171" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:03.509243" elapsed="0.000018"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:03.484831" elapsed="0.024548">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:03.509456" elapsed="0.000019"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:03.478877" elapsed="0.030689">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:03.509833" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:03.509677" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:03.509656" elapsed="0.000260"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:03.510116" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:03.509971" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:03.509954" elapsed="0.000241"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:38:03.476161" elapsed="0.034119">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:04.513681" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:04.512615" elapsed="0.001150"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:04.524768" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:04.524484" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:04.525219" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:04.524971" 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-08-22T23:38:04.534723" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:38:04.534905" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:04.535129" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:04.527540" elapsed="0.008052">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:04.525354" elapsed="0.010332">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:04.535887" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:04.535727" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:04.525323" elapsed="0.010654">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:04.536364" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:04.536508" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:04.536464" elapsed="0.000094"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:04.536447" elapsed="0.000147"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:04.536741" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:04.536812" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:04.519791" elapsed="0.017134">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:04.536994" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:04.514280" elapsed="0.022807">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:04.537308" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:04.537164" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:04.537148" elapsed="0.000238"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:04.537591" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:04.537439" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:04.537424" elapsed="0.000247"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:38:04.511369" elapsed="0.026380">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:05.540879" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:05.539840" elapsed="0.001114"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:05.554152" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:05.553783" elapsed="0.000438"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:05.554847" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:05.554452" 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-08-22T23:38:05.565247" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:38:05.565413" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:05.565644" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:05.558044" elapsed="0.008765">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:05.555021" elapsed="0.011886">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:05.567125" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:05.566952" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:05.554989" elapsed="0.012228">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:05.567659" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:05.567813" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:05.567771" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:05.567753" elapsed="0.000129"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:05.568030" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:05.568102" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:05.547183" elapsed="0.021035">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:05.568290" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:05.541456" elapsed="0.026929">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:05.568627" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:05.568465" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:05.568448" elapsed="0.000262"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:05.568904" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:05.568764" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:05.568748" elapsed="0.000235"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:38:05.538687" elapsed="0.030373">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:06.572371" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:06.571194" elapsed="0.001254"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:06.585083" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:06.584705" elapsed="0.000448"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:06.585765" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:06.585372" elapsed="0.000458"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:38:06.596441" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:38:06.596697" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:06.596955" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:06.588975" elapsed="0.008509">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:06.585941" elapsed="0.011684">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:06.597898" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:06.597678" elapsed="0.000316"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:06.585908" elapsed="0.012120">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:06.598569" elapsed="0.000070"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:06.598821" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:06.598764" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:06.598737" elapsed="0.000179"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:06.599144" elapsed="0.000039"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:06.599268" elapsed="0.000028"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:06.578129" elapsed="0.021322">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:06.599595" elapsed="0.000030"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:06.573052" elapsed="0.026715">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:06.600082" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:06.599881" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:06.599858" elapsed="0.000335"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:06.600460" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:06.600268" elapsed="0.000268"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:06.600246" elapsed="0.000322"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:38:06.569970" elapsed="0.030727">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:07.603660" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:07.602666" elapsed="0.001069"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:07.614819" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:07.614451" elapsed="0.000418"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:07.615271" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:07.615025" 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-08-22T23:38:07.625234" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:38:07.625414" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:07.625637" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:07.617491" elapsed="0.008544">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:07.615395" elapsed="0.010724">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:07.626316" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:07.626156" elapsed="0.000228"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:07.615371" elapsed="0.011037">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:07.626815" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:07.626956" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:07.626914" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:07.626897" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:07.627167" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:07.627237" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:07.609901" elapsed="0.017442">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:07.627411" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:07.604230" elapsed="0.023274">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:07.627747" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:07.627600" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:07.627568" elapsed="0.000258"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:07.628019" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:07.627879" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:07.627863" elapsed="0.000234"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:38:07.601534" elapsed="0.026639">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:08.630996" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:08.630017" elapsed="0.001051"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:08.643060" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:08.642798" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:08.643506" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:08.643262" 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-08-22T23:38:08.653093" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:38:08.653260" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:08.653442" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:08.645739" elapsed="0.008125">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:08.643648" elapsed="0.010300">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:08.654141" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:08.653985" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:08.643624" elapsed="0.010609">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:08.654653" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:08.654794" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:08.654753" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:08.654735" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:08.655006" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:08.655079" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:08.637270" elapsed="0.017915">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:08.655256" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:08.631625" elapsed="0.023727">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:08.655590" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:08.655432" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:08.655415" elapsed="0.000263"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:08.655876" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:08.655735" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:08.655719" elapsed="0.000238"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:38:08.628991" elapsed="0.027044">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:09.659246" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:09.658148" elapsed="0.001174"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:09.672510" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:09.672239" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:09.673003" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:09.672737" 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-08-22T23:38:09.682548" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:38:09.682744" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:09.682948" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:09.675354" elapsed="0.007993">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:09.673145" elapsed="0.010287">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:09.683673" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:09.683471" elapsed="0.000274"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:09.673113" elapsed="0.010658">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:09.684174" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:09.684318" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:09.684276" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:09.684258" elapsed="0.000129"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:09.684532" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:09.684623" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:09.665803" elapsed="0.018928">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:09.684802" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:09.659884" elapsed="0.025015">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:09.685147" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:09.684998" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:09.684979" elapsed="0.000252"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:09.685429" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:09.685286" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:09.685270" elapsed="0.000240"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:38:09.657003" elapsed="0.028603">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:10.688642" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:10.687614" elapsed="0.001104"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:10.700734" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:10.700449" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:10.701186" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:10.700938" 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-08-22T23:38:10.710437" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:38:10.710620" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:10.710802" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:10.703382" elapsed="0.007808">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:10.701308" elapsed="0.009965">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:10.711463" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:10.711308" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:10.701286" elapsed="0.010306">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:10.711974" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:10.712111" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:10.712072" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:10.712054" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:10.712320" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:10.712391" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:10.694764" elapsed="0.017731">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:10.712565" elapsed="0.000031"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:10.689210" elapsed="0.023473">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:10.712904" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:10.712762" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:10.712745" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:10.713187" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:10.713038" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:10.713022" elapsed="0.000245"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:38:10.686498" elapsed="0.026845">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:11.716506" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:11.715492" elapsed="0.001115"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:11.727601" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:11.727323" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:11.728064" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:11.727815" 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-08-22T23:38:11.737210" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:38:11.737367" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:11.737554" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:11.730268" elapsed="0.007692">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:11.728186" elapsed="0.009856">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:11.738266" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:11.738077" elapsed="0.000256"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:11.728164" elapsed="0.010193">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:11.738765" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:11.738904" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:11.738864" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:11.738846" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:11.739112" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:11.739183" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:11.722785" elapsed="0.016502">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:11.739356" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:11.717110" elapsed="0.022340">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:11.739688" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:11.739529" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:11.739512" elapsed="0.000257"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:11.739962" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:11.739822" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:11.739807" elapsed="0.000233"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:38:11.714192" elapsed="0.025924">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:12.743004" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:12.741993" elapsed="0.001112"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:12.755496" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:12.755235" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:12.755962" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:12.755717" 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-08-22T23:38:12.765109" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:38:12.765265" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:12.765449" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:12.758152" elapsed="0.007712">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:12.756084" elapsed="0.009866">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:12.766142" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:12.765986" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:12.756060" elapsed="0.010173">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:12.766630" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:12.766771" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:12.766730" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:12.766713" elapsed="0.000144"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:12.767001" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:12.767072" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:12.749370" elapsed="0.017808">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:12.767248" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:12.743796" elapsed="0.023545">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:12.767562" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:12.767419" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:12.767403" elapsed="0.000257"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:12.767855" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:12.767715" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:12.767700" elapsed="0.000234"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:38:12.740987" elapsed="0.027024">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:13.771168" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:13.770102" elapsed="0.001143"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:13.783193" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:13.782828" elapsed="0.000432"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:13.783893" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:13.783516" 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-08-22T23:38:13.795323" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:38:13.795497" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:13.795725" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:13.787007" elapsed="0.009294">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:13.784067" elapsed="0.012352">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:13.796743" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:13.796470" elapsed="0.000371"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:13.784033" elapsed="0.012843">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:13.797399" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:13.797949" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:13.797886" elapsed="0.000128"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:13.797840" 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-08-22T23:38:13.798295" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:13.798396" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:13.776461" elapsed="0.022100">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:13.798679" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:13.771783" elapsed="0.027029">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:13.799122" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:13.798921" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:13.798898" elapsed="0.000336"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:13.799501" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:13.799308" elapsed="0.000288"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:13.799286" elapsed="0.000345"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:38:13.768954" elapsed="0.030784">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:14.802331" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:14.801347" elapsed="0.001050"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:14.816391" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:14.816129" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:14.816860" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:14.816609" 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-08-22T23:38:14.825914" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:38:14.826075" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:14.826258" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:14.819148" elapsed="0.007519">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:14.816977" elapsed="0.009772">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:14.826936" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:14.826784" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:14.816957" elapsed="0.010070">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:14.827399" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:14.827536" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:14.827497" elapsed="0.000097"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:14.827480" elapsed="0.000138"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:14.827759" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:14.827829" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:14.808370" elapsed="0.019562">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:14.828000" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:14.802909" elapsed="0.025182">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:14.828309" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:14.828167" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:14.828151" elapsed="0.000236"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:14.828591" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:14.828439" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:14.828424" elapsed="0.000247"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:38:14.800405" elapsed="0.028343">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:15.831167" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:15.830442" elapsed="0.000793"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:15.846852" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:15.846431" elapsed="0.000495"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:15.847490" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:15.847146" 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-08-22T23:38:15.859162" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:38:15.859422" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:15.859779" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:15.850916" elapsed="0.009438">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:15.847708" elapsed="0.012772">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:15.860818" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:15.860536" elapsed="0.000367"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:15.847667" elapsed="0.013268">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:15.861515" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:15.861728" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:15.861672" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:15.861645" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:15.862009" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:15.862098" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:15.835362" elapsed="0.026882">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:15.862333" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:15.831601" elapsed="0.030859">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:15.862737" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:15.862558" elapsed="0.000238"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:15.862539" elapsed="0.000281"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:15.863022" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:15.862877" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:15.862860" elapsed="0.000251"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:38:15.829531" elapsed="0.033663">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:16.866163" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:16.865159" elapsed="0.001077"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:16.878031" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:16.877661" elapsed="0.000438"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:16.878678" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:16.878313" elapsed="0.000516"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:38:16.889019" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:38:16.889198" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:16.889403" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:16.881557" elapsed="0.008287">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:16.878959" elapsed="0.010973">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:16.890128" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:16.889970" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:16.878912" elapsed="0.011306">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:16.890632" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:16.890775" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:16.890733" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:16.890716" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:16.890988" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:16.891058" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:16.871177" elapsed="0.019990">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:16.891235" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:16.866758" elapsed="0.024570">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:16.891549" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:16.891405" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:16.891389" elapsed="0.000255"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:16.891843" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:16.891698" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:16.891683" elapsed="0.000237"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:38:16.864084" elapsed="0.027913">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:17.895168" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:17.894120" elapsed="0.001122"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:17.909885" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:17.909619" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:17.910333" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:17.910087" 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-08-22T23:38:17.920224" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:38:17.920390" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:17.920615" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:17.912840" elapsed="0.008172">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:17.910463" elapsed="0.010633">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:17.921290" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:17.921132" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:17.910437" elapsed="0.010942">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:17.921790" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:17.921929" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:17.921889" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:17.921871" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:17.922140" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:17.922210" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:17.901632" elapsed="0.020684">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:17.922385" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:17.895773" elapsed="0.026705">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:17.922713" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:17.922555" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:17.922539" elapsed="0.000264"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:17.922994" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:17.922855" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:17.922840" elapsed="0.000232"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:38:17.893043" elapsed="0.030105">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:18.926209" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:18.925105" elapsed="0.001180"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:18.937015" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:18.936680" elapsed="0.000396"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:18.937499" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:18.937244" 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-08-22T23:38:18.948110" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:38:18.948300" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:18.948514" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:18.940134" elapsed="0.008844">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:18.937669" elapsed="0.011412">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:18.949299" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:18.949121" elapsed="0.000248"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:18.937636" elapsed="0.011757">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:18.949837" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:18.949986" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:18.949944" elapsed="0.000093"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:18.949925" elapsed="0.000146"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:18.950234" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:18.950308" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:18.932066" elapsed="0.018355">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:18.950493" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:18.926902" elapsed="0.023707">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:18.950841" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:18.950693" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:18.950675" elapsed="0.000248"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:18.951125" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:18.950977" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:18.950961" elapsed="0.000267"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:38:18.924028" elapsed="0.027282">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:19.954811" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:19.953736" elapsed="0.001170"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:19.967029" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:19.966759" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:19.967496" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:19.967242" 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-08-22T23:38:19.976970" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:38:19.977138" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:19.977336" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:19.970061" elapsed="0.007718">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:19.967641" elapsed="0.010257">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:19.978118" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:19.977947" elapsed="0.000243"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:19.967615" elapsed="0.010599">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:19.978670" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:19.978821" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:19.978780" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:19.978761" elapsed="0.000128"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:19.979042" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:19.979118" elapsed="0.000019"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:19.961240" elapsed="0.017991">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:19.979301" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:19.955426" elapsed="0.023991">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:19.979684" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:19.979514" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:19.979496" elapsed="0.000276"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:19.979984" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:19.979837" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:19.979820" elapsed="0.000251"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:38:19.952517" elapsed="0.027635">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<msg time="2026-08-22T23:38:19.980253" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:37:19.162228" elapsed="60.818119">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:19.980564" elapsed="0.000040"/>
</kw>
<doc>Sanity check against possible data left-overs from previous suites. Also causes the suite to wait until the entire cluster sees the device and its data mount.</doc>
<status status="FAIL" start="2026-08-22T23:37:18.486643" elapsed="61.494129">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</test>
<test id="s1-s6-t6" name="Kill_node1_Before_Create" line="87">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:38:19.984938" elapsed="0.000306"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:38:19.984535" elapsed="0.000788"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:38:19.986849" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:19.986687" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:19.986660" elapsed="0.000288"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:38:19.994336" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:19.994182" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:19.994156" elapsed="0.000289"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:19.995601" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:19.995192" elapsed="0.000439"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:38:19.996111" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:38:19.995792" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:38:19.996183" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:38:19.996362" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:38:19.994790" 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-08-22T23:38:20.001950" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:20.001832" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.001812" 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-08-22T23:38:20.003231" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:20.003121" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.003102" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:20.003785" level="INFO">${karaf_connection_index} = 34</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:38:20.003445" elapsed="0.000368"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:38:20.004202" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:38:20.003973" elapsed="0.000255"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:38:20.048116" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:38:20.004741" elapsed="0.043478"/>
</kw>
<msg time="2026-08-22T23:38:20.048401" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:38:20.048450" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:38:20.004386" elapsed="0.044101"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:38:20.071979" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "1 "_ "B "e "f "o "r "e "_ "C "r "e "a "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:38:20.049023" elapsed="0.023054"/>
</kw>
<msg time="2026-08-22T23:38:20.072236" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:38:20.072282" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "1 "_ "B "e "f "o "r "e "_ "C "r "e "a "t "e "[K"
[?1l&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-08-22T23:38:20.048679" elapsed="0.023641"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:20.072644" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:20.072397" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.072377" elapsed="0.000348"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:20.073165" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "1 "_ "B "e "f "o "r "e "_ "C "r "e "a "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:20.072868" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:20.073544" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:20.073324" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.073305" elapsed="0.000341"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:38:20.073679" 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-08-22T23:38:20.076260" elapsed="0.000291"/>
</kw>
<msg time="2026-08-22T23:38:20.076633" 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-08-22T23:38:20.075141" 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-08-22T23:38:20.077039" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:20.077396" 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-08-22T23:38:20.074478" 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-08-22T23:38:20.073950" elapsed="0.003725"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:38:20.002798" elapsed="0.074976"/>
</kw>
<msg time="2026-08-22T23:38:20.077870" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:38:20.077913" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "1 "_ "B "e "f "o "r "e "_ "C "r "e "a "t "e "[K"
[?1l&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-08-22T23:38:20.002170" elapsed="0.075782"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:38:20.078134" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:38:20.078028" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.078009" 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-08-22T23:38:20.078638" 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-08-22T23:38:20.078968" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:38:20.079039" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:38:20.001458" elapsed="0.077689"/>
</kw>
<msg time="2026-08-22T23:38:20.079240" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:38:20.079285" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "1 "_ "B "e "f "o "r "e "_ "C "r "e "a "t "e "[K"
[?1l&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-08-22T23:38:19.996818" elapsed="0.082505"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:20.079726" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:20.079398" elapsed="0.000383"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.079380" elapsed="0.000425"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:38:19.996671" elapsed="0.083158"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:38:20.085219" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:20.085112" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.085093" 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-08-22T23:38:20.086451" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:20.086335" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.086316" elapsed="0.000202"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:20.086983" level="INFO">${karaf_connection_index} = 35</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:38:20.086683" elapsed="0.000327"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:38:20.087375" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:38:20.087164" elapsed="0.000237"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:38:20.126499" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:38:20.087911" elapsed="0.038712"/>
</kw>
<msg time="2026-08-22T23:38:20.126808" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:38:20.126857" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:38:20.087555" elapsed="0.039339"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:38:20.162772" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "1 "_ "B "e "f "o "r "e "_ "C "r "e "a "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:38:20.127418" elapsed="0.035459"/>
</kw>
<msg time="2026-08-22T23:38:20.163040" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:38:20.163087" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "1 "_ "B "e "f "o "r "e "_ "C "r "e "a "t "e "[K"
[?1l&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-08-22T23:38:20.127067" elapsed="0.036060"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:20.163429" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:20.163205" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.163185" elapsed="0.000324"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:20.163976" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "1 "_ "B "e "f "o "r "e "_ "C "r "e "a "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:20.163675" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:20.164321" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:20.164108" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.164089" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:38:20.164433" 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-08-22T23:38:20.166966" elapsed="0.000146"/>
</kw>
<msg time="2026-08-22T23:38:20.167172" 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-08-22T23:38:20.165905" 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-08-22T23:38:20.167764" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:20.168100" 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-08-22T23:38:20.165265" elapsed="0.003020"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:38:20.164709" elapsed="0.003642"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:38:20.086035" elapsed="0.082413"/>
</kw>
<msg time="2026-08-22T23:38:20.168539" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:38:20.168613" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "1 "_ "B "e "f "o "r "e "_ "C "r "e "a "t "e "[K"
[?1l&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-08-22T23:38:20.085446" elapsed="0.083209"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:38:20.168854" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:38:20.168733" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.168714" elapsed="0.000223"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:20.169328" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:20.169685" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:38:20.169759" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:38:20.084769" elapsed="0.085100"/>
</kw>
<msg time="2026-08-22T23:38:20.169963" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:38:20.170007" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "1 "_ "B "e "f "o "r "e "_ "C "r "e "a "t "e "[K"
[?1l&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-08-22T23:38:20.080090" elapsed="0.089955"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:20.170365" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:20.170120" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.170103" elapsed="0.000338"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:38:20.079953" elapsed="0.090511"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:38:20.175996" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:20.175888" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.175868" elapsed="0.000297"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:38:20.177343" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:20.177236" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.177218" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:20.177880" level="INFO">${karaf_connection_index} = 36</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:38:20.177550" elapsed="0.000356"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:38:20.178274" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:38:20.178061" elapsed="0.000239"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:38:20.225991" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:38:20.178805" elapsed="0.047292"/>
</kw>
<msg time="2026-08-22T23:38:20.226283" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:38:20.226329" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:38:20.178455" elapsed="0.047910"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:38:20.248253" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "1 "_ "B "e "f "o "r "e "_ "C "r "e "a "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:38:20.226900" elapsed="0.021454"/>
</kw>
<msg time="2026-08-22T23:38:20.248544" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:38:20.248618" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "1 "_ "B "e "f "o "r "e "_ "C "r "e "a "t "e "[K"
[?1l&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-08-22T23:38:20.226533" elapsed="0.022126"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:20.248958" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:20.248738" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.248718" elapsed="0.000317"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:20.249477" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "1 "_ "B "e "f "o "r "e "_ "C "r "e "a "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:20.249177" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:20.249842" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:20.249627" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.249608" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:38:20.249953" 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-08-22T23:38:20.252452" elapsed="0.000182"/>
</kw>
<msg time="2026-08-22T23:38:20.252695" 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-08-22T23:38:20.251376" elapsed="0.001448"/>
</kw>
<kw name="Open 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-08-22T23:38:20.253094" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:20.253422" 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-08-22T23:38:20.250758" elapsed="0.002872"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:38:20.250210" 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="PASS" start="2026-08-22T23:38:20.176932" elapsed="0.076861"/>
</kw>
<msg time="2026-08-22T23:38:20.253884" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:38:20.253929" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "1 "_ "B "e "f "o "r "e "_ "C "r "e "a "t "e "[K"
[?1l&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-08-22T23:38:20.176321" elapsed="0.077649"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:38:20.254188" elapsed="0.000202"/>
</return>
<status status="PASS" start="2026-08-22T23:38:20.254082" elapsed="0.000344"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.254063" elapsed="0.000387"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:20.254872" 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-08-22T23:38:20.255208" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:38:20.255280" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:38:20.175530" elapsed="0.079860"/>
</kw>
<msg time="2026-08-22T23:38:20.255483" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:38:20.255530" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "1 "_ "B "e "f "o "r "e "_ "C "r "e "a "t "e "[K"
[?1l&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-08-22T23:38:20.170824" elapsed="0.084744"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:20.255979" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:20.255731" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.255712" elapsed="0.000344"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:38:20.170684" elapsed="0.085395"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:38:19.996462" elapsed="0.259646"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:38:19.993624" elapsed="0.262541"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:38:19.986196" elapsed="0.270026"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:38:19.985535" elapsed="0.270732"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:38:19.981851" elapsed="0.274482"/>
</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-08-22T23:38:20.259491" level="INFO">${member_int} = 1</msg>
<var>${member_int}</var>
<arg>${member}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-08-22T23:38:20.259175" elapsed="0.000343"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:38:20.259978" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>${member_int}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:38:20.259685" elapsed="0.000319"/>
</kw>
<return>
<value>${index_list}</value>
<status status="PASS" start="2026-08-22T23:38:20.260050" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:38:20.260203" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>${member}</arg>
<status status="PASS" start="2026-08-22T23:38:20.258858" elapsed="0.001369"/>
</kw>
<kw name="Return_Member_IP" owner="ClusterManagement">
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-08-22T23:38:20.261170" level="INFO">${member_int} = 1</msg>
<var>${member_int}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-08-22T23:38:20.260857" elapsed="0.000339"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:20.261630" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:38:20.261347" elapsed="0.000310"/>
</kw>
<return>
<value>${member_ip}</value>
<status status="PASS" start="2026-08-22T23:38:20.261705" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:38:20.261864" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:38:20.260500" elapsed="0.001388"/>
</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-08-22T23:38:20.268757" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:20.268646" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.268628" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:20.269840" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:20.269431" elapsed="0.000437"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:38:20.270334" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:38:20.270025" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:38:20.270405" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:38:20.270561" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:38:20.269050" 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-08-22T23:38:20.276315" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:20.276164" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.276145" elapsed="0.000239"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:38:20.277466" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:20.277360" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.277342" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:20.277923" level="INFO">${karaf_connection_index} = 34</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:38:20.277696" elapsed="0.000253"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:38:20.278285" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:38:20.278104" elapsed="0.000208"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:38:20.311440" 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 "1 "[C "1 "0 ". "3 "0 ". "1 "7 "0 ". "2 "0 "0 "[K"</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:38:20.278816" elapsed="0.032795"/>
</kw>
<msg time="2026-08-22T23:38:20.311745" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:38:20.311791" 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 "1 "[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-08-22T23:38:20.278466" elapsed="0.033363"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:38:20.314003" 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-08-22T23:38:20.312406" elapsed="0.001656"/>
</kw>
<msg time="2026-08-22T23:38:20.314158" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:38:20.314202" 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-08-22T23:38:20.312043" elapsed="0.002186"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:20.314535" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:20.314314" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.314290" elapsed="0.000344"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:20.315027" 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-08-22T23:38:20.314776" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:20.315352" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:20.315141" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.315123" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:38:20.315462" 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-08-22T23:38:20.317321" elapsed="0.000201"/>
</kw>
<msg time="2026-08-22T23:38:20.317654" 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-08-22T23:38:20.316661" elapsed="0.001067"/>
</kw>
<kw name="Open 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-08-22T23:38:20.317889" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:20.318048" 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-08-22T23:38:20.316276" elapsed="0.001853"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:38:20.315745" elapsed="0.002429"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:38:20.277063" elapsed="0.041206"/>
</kw>
<msg time="2026-08-22T23:38:20.318361" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:38:20.318404" 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-08-22T23:38:20.276535" elapsed="0.041897"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:38:20.318696" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-08-22T23:38:20.318508" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.318490" 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 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:20.319178" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:20.319510" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:38:20.319602" 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-08-22T23:38:20.275820" elapsed="0.043895"/>
</kw>
<msg time="2026-08-22T23:38:20.319810" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:38:20.319853" 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-08-22T23:38:20.271029" elapsed="0.048851"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:20.320222" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:20.319956" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.319939" elapsed="0.000360"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:38:20.270889" elapsed="0.049434"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:38:20.325939" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:20.325830" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.325811" 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-08-22T23:38:20.327107" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:20.327001" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.326983" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:20.327532" level="INFO">${karaf_connection_index} = 35</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:38:20.327315" elapsed="0.000242"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:38:20.327902" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:38:20.327729" elapsed="0.000199"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:38:20.375426" 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 "1 "[C "1 "0 ". "3 "0 ". "1 "7 "0 ". "2 "0 "0 "[K"</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:38:20.328456" elapsed="0.047046"/>
</kw>
<msg time="2026-08-22T23:38:20.375617" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:38:20.375663" 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 "1 "[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-08-22T23:38:20.328125" elapsed="0.047595"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:38:20.380408" 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-08-22T23:38:20.376229" elapsed="0.004237"/>
</kw>
<msg time="2026-08-22T23:38:20.380562" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:38:20.380625" 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-08-22T23:38:20.375892" elapsed="0.004760"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:20.380945" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:20.380729" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.380709" elapsed="0.000313"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:20.381412" 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-08-22T23:38:20.381161" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:20.381772" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:20.381527" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.381509" elapsed="0.000342"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:38:20.381884" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<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-08-22T23:38:20.383636" elapsed="0.000225"/>
</kw>
<msg time="2026-08-22T23:38:20.383964" 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-08-22T23:38:20.383073" elapsed="0.000954"/>
</kw>
<kw name="Open 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-08-22T23:38:20.384182" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:20.384339" 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-08-22T23:38:20.382717" elapsed="0.001701"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:38:20.382198" elapsed="0.002265"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:38:20.326702" elapsed="0.057857"/>
</kw>
<msg time="2026-08-22T23:38:20.384670" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:38:20.384713" 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-08-22T23:38:20.326166" elapsed="0.058574"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:38:20.384920" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-08-22T23:38:20.384815" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.384798" elapsed="0.000202"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:20.385382" 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-08-22T23:38:20.385739" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:38:20.385812" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:38:20.325467" elapsed="0.060460"/>
</kw>
<msg time="2026-08-22T23:38:20.386020" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:38:20.386062" 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-08-22T23:38:20.320605" elapsed="0.065484"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:20.386407" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:20.386164" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.386147" elapsed="0.000337"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:38:20.320442" elapsed="0.066064"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:38:20.393762" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:20.393651" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.393632" 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-08-22T23:38:20.394908" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:20.394803" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.394785" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:20.395331" level="INFO">${karaf_connection_index} = 36</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:38:20.395114" elapsed="0.000243"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:38:20.395712" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:38:20.395510" elapsed="0.000228"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:38:20.431117" 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 "1 "[C "1 "0 ". "3 "0 ". "1 "7 "0 ". "2 "0 "0 "[K"</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:38:20.396229" elapsed="0.034963"/>
</kw>
<msg time="2026-08-22T23:38:20.431292" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:38:20.431337" 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 "1 "[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-08-22T23:38:20.395896" elapsed="0.035477"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:38:20.433926" 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-08-22T23:38:20.431947" elapsed="0.002036"/>
</kw>
<msg time="2026-08-22T23:38:20.434078" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:38:20.434122" 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-08-22T23:38:20.431609" elapsed="0.002539"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:20.434435" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:20.434223" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.434203" elapsed="0.000310"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:20.434917" 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-08-22T23:38:20.434667" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:20.435243" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:20.435032" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.435014" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:38:20.435353" 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-08-22T23:38:20.437092" elapsed="0.000200"/>
</kw>
<msg time="2026-08-22T23:38:20.437389" 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-08-22T23:38:20.436504" elapsed="0.000949"/>
</kw>
<kw name="Open 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-08-22T23:38:20.437631" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:20.437793" 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-08-22T23:38:20.436142" elapsed="0.001740"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:38:20.435648" 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-08-22T23:38:20.394486" elapsed="0.043542"/>
</kw>
<msg time="2026-08-22T23:38:20.438119" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:38:20.438162" 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-08-22T23:38:20.393980" elapsed="0.044209"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:38:20.438369" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:38:20.438265" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.438246" elapsed="0.000204"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:20.438856" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:20.439186" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:38:20.439257" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:38:20.393291" elapsed="0.046085"/>
</kw>
<msg time="2026-08-22T23:38:20.439471" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:38:20.439514" 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-08-22T23:38:20.386791" elapsed="0.052749"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:20.439889" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:20.439642" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.439624" elapsed="0.000343"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:38:20.386653" elapsed="0.053338"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:38:20.270708" elapsed="0.169345"/>
</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-08-22T23:38:20.266432" elapsed="0.173683"/>
</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-08-22T23:38:20.441728" 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-08-22T23:38:20.441337" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:38:20.442392" 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-08-22T23:38:20.441911" elapsed="0.000508"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:38:20.442465" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:38:20.442641" level="INFO">${kill_index_list} = [1]</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-08-22T23:38:20.440967" elapsed="0.001700"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:20.443662" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:20.443247" elapsed="0.000442"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:38:20.444280" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:38:20.443846" elapsed="0.000460"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:38:20.444351" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:38:20.444508" 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-08-22T23:38:20.442873" elapsed="0.001660"/>
</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-08-22T23:38:20.445988" 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-08-22T23:38:20.445619" elapsed="0.000396"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:38:20.446462" 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-08-22T23:38:20.446170" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:38:20.446531" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:38:20.446702" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:38:20.445236" elapsed="0.001490"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:20.447795" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:38:20.447508" elapsed="0.000313"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:38:20.448562" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:38:20.448440" 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-08-22T23:38:20.451844" elapsed="0.000078"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:20.451152" elapsed="0.000860"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:20.451133" elapsed="0.000907"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:38:20.452299" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:38:20.452453" level="INFO">${current_ssh_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:38:20.452188" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:20.453616" 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.200" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:20.452668" elapsed="0.001049"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:38:20.454667" 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-08-22T23:38:20.453894" elapsed="0.000801"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:38:20.456527" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:38:20.456822" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:38:20.455973" 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-08-22T23:38:20.457216" elapsed="0.000645"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:38:20.459151" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:38:21.048130" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:38:20 UTC 2026

  System load:  0.1                Processes:             121
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:48 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:38:20.458827" elapsed="0.589504"/>
</kw>
<msg time="2026-08-22T23:38:21.048492" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:20.458167" elapsed="0.590470"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:38:20.454963" elapsed="0.593867"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:38:21.049567" level="INFO">Executing command 'ps axf | grep org.apache.karaf | grep -v grep | awk '{print "kill -9 " $1}' | sh'.</msg>
<msg time="2026-08-22T23:38:21.072332" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:38:21.072668" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:38:21.072771" 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-08-22T23:38:21.049145" elapsed="0.023679"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:38:21.073302" elapsed="0.000502"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:21.075438" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:21.074228" elapsed="0.001307"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:38:21.076219" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:21.075793" elapsed="0.000665"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:21.075735" elapsed="0.000785"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:38:21.077042" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-08-22T23:38:21.076687" elapsed="0.000615"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:21.076649" elapsed="0.000713"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:38:21.077439" 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-08-22T23:38:21.085691" elapsed="0.000153"/>
</kw>
<msg time="2026-08-22T23:38:21.085905" 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-08-22T23:38:21.084378" elapsed="0.001638"/>
</kw>
<kw name="Open 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-08-22T23:38:21.086308" elapsed="0.000046"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:21.086648" 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-08-22T23:38:21.078196" elapsed="0.008643"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:38:20.450539" elapsed="0.636396"/>
</kw>
<msg time="2026-08-22T23:38:21.086990" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:20.449911" elapsed="0.637131"/>
</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-08-22T23:38:20.449360" elapsed="0.637827"/>
</kw>
<msg time="2026-08-22T23:38:21.087231" 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-08-22T23:38:20.448863" elapsed="0.638417"/>
</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-08-22T23:38:21.090925" elapsed="0.000146"/>
</kw>
<msg time="2026-08-22T23:38:21.091114" 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-08-22T23:38:21.090409" elapsed="0.000767"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:21.091331" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:21.091490" 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-08-22T23:38:21.087574" elapsed="0.003997"/>
</kw>
<msg time="2026-08-22T23:38:21.091685" 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-08-22T23:38:20.448036" elapsed="0.643675"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:21.092147" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:21.091886" elapsed="0.000302"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:38:21.092230" 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-08-22T23:38:20.447079" elapsed="0.645277"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:38:20.446904" elapsed="0.645491"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:38:20.446777" elapsed="0.645660"/>
</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-08-22T23:38:20.444756" elapsed="0.647748"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:38:21.092987" 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-08-22T23:38:21.092676" elapsed="0.000338"/>
</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-08-22T23:38:21.093165" elapsed="0.000222"/>
</kw>
<if>
<branch type="IF" condition="not ${confirm}">
<return>
<value>${updated_index_list}</value>
<status status="NOT RUN" start="2026-08-22T23:38:21.093566" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:21.093460" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:21.093440" elapsed="0.000209"/>
</if>
<kw name="Sleep" owner="BuiltIn">
<msg time="2026-08-22T23:38:22.094262" level="INFO">Slept 1 second.</msg>
<msg time="2026-08-22T23:38:22.094420" 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-08-22T23:38:21.093787" elapsed="1.000771"/>
</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-08-22T23:38:22.098427" 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-08-22T23:38:22.097658" elapsed="0.000830"/>
</kw>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:22.100529" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:38:22.099919" elapsed="0.000699"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:38:22.102325" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:38:22.102046" elapsed="0.000597"/>
</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-08-22T23:38:22.109952" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:22.109219" elapsed="0.000835"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:22.109168" elapsed="0.000961"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:38:22.110797" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:38:22.111098" level="INFO">${current_ssh_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:38:22.110410" elapsed="0.000872"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:22.112299" level="INFO">Attempting to execute command "ps axf | grep org.apache.karaf | grep -v grep | wc -l" on remote system "10.30.170.200" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:22.111657" elapsed="0.000859"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:38:22.114061" level="INFO">${conn_id} = 41</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:38:22.112880" elapsed="0.001288"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:38:22.115790" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:38:22.115869" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:38:22.115453" 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-08-22T23:38:22.116099" elapsed="0.000327"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:38:22.117367" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:38:22.452202" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:38:20 UTC 2026

  System load:  0.1                Processes:             121
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:38:20 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:38:22.117022" elapsed="0.335338"/>
</kw>
<msg time="2026-08-22T23:38:22.452448" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:22.116661" elapsed="0.335878"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:38:22.114551" elapsed="0.338245"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:38:22.453703" level="INFO">Executing command 'ps axf | grep org.apache.karaf | grep -v grep | wc -l'.</msg>
<msg time="2026-08-22T23:38:22.476282" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:38:22.477027" level="INFO">${stdout} = 0</msg>
<msg time="2026-08-22T23:38:22.477421" 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-08-22T23:38:22.453172" elapsed="0.024545"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:38:22.478525" elapsed="0.001571"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:22.483199" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:22.481771" elapsed="0.001773"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:38:22.484358" elapsed="0.000054"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:22.483869" elapsed="0.000624"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:22.483778" elapsed="0.000879"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:38:22.485334" elapsed="0.000102"/>
</return>
<status status="PASS" start="2026-08-22T23:38:22.484904" elapsed="0.000620"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:22.484832" elapsed="0.000833"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:38:22.485798" 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-08-22T23:38:22.490626" elapsed="0.000154"/>
</kw>
<msg time="2026-08-22T23:38:22.490824" 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-08-22T23:38:22.490003" elapsed="0.000923"/>
</kw>
<kw name="Open 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-08-22T23:38:22.491182" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:22.491453" 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-08-22T23:38:22.486844" elapsed="0.004800"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:38:22.106969" elapsed="0.384928"/>
</kw>
<msg time="2026-08-22T23:38:22.492067" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:22.105409" elapsed="0.386714"/>
</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-08-22T23:38:22.104185" elapsed="0.388021"/>
</kw>
<msg time="2026-08-22T23:38:22.492248" 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-08-22T23:38:22.102993" elapsed="0.389302"/>
</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-08-22T23:38:22.495897" elapsed="0.000170"/>
</kw>
<msg time="2026-08-22T23:38:22.496110" 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-08-22T23:38:22.495379" 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-08-22T23:38:22.496328" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:22.496488" 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-08-22T23:38:22.492602" elapsed="0.003966"/>
</kw>
<msg time="2026-08-22T23:38:22.496681" 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-08-22T23:38:22.101101" elapsed="0.395605"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:22.497131" level="INFO">0</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:22.496879" elapsed="0.000296"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:38:22.497218" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:38:22.497371" 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-08-22T23:38:22.098963" elapsed="0.398434"/>
</kw>
<return>
<value>${count}</value>
<status status="PASS" start="2026-08-22T23:38:22.497444" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:38:22.497607" 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-08-22T23:38:22.096825" elapsed="0.400809"/>
</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-08-22T23:38:22.497786" elapsed="0.000439"/>
</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-08-22T23:38:22.095837" elapsed="0.402454"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:38:22.095259" elapsed="0.403064"/>
</iter>
<var>${index}</var>
<value>@{kill_index_list}</value>
<status status="PASS" start="2026-08-22T23:38:22.094792" elapsed="0.403569"/>
</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-08-22T23:38:22.501637" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:22.501210" elapsed="0.000457"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:38:22.502212" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:38:22.501854" elapsed="0.000385"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:38:22.502286" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:38:22.502449" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:38:22.500813" elapsed="0.001661"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:22.503542" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:38:22.503270" elapsed="0.000300"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:38:22.504338" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:38:22.504203" 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-08-22T23:38:22.507866" elapsed="0.000088"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:22.507113" elapsed="0.001005"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:22.507092" elapsed="0.001058"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:38:22.508416" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:38:22.508594" level="INFO">${current_ssh_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:38:22.508303" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:22.509804" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.200" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:22.508793" elapsed="0.001090"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:38:22.511101" 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-08-22T23:38:22.510091" elapsed="0.001038"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:38:22.512825" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:38:22.513092" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:38:22.512190" elapsed="0.001006"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:38:22.513496" elapsed="0.000712"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:38:22.515530" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:38:22.870653" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:38:20 UTC 2026

  System load:  0.1                Processes:             121
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:38:22 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:38:22.515208" elapsed="0.355602"/>
</kw>
<msg time="2026-08-22T23:38:22.870959" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:22.514513" elapsed="0.356552"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:38:22.511395" elapsed="0.359840"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:38:22.871882" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-08-22T23:38:22.884499" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-08-22T23:38:22.884995" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:38:22.885099" 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-08-22T23:38:22.871500" elapsed="0.013654"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:38:22.885779" elapsed="0.000576"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:22.888072" 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-08-22T23:38:22.886810" elapsed="0.001433"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:38:22.888922" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:22.888460" elapsed="0.000709"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:22.888407" elapsed="0.000822"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:38:22.889763" elapsed="0.000068"/>
</return>
<status status="PASS" start="2026-08-22T23:38:22.889358" elapsed="0.000692"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:22.889322" elapsed="0.000789"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:38:22.890190" 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-08-22T23:38:22.896851" elapsed="0.000217"/>
</kw>
<msg time="2026-08-22T23:38:22.897173" 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-08-22T23:38:22.895633" elapsed="0.001715"/>
</kw>
<kw name="Open 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-08-22T23:38:22.897800" elapsed="0.000069"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:22.898261" 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-08-22T23:38:22.890958" elapsed="0.007584"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:38:22.506466" elapsed="0.392344"/>
</kw>
<msg time="2026-08-22T23:38:22.898889" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:22.505692" elapsed="0.393270"/>
</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-08-22T23:38:22.505150" elapsed="0.393927"/>
</kw>
<msg time="2026-08-22T23:38:22.899135" 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-08-22T23:38:22.504643" elapsed="0.394559"/>
</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-08-22T23:38:22.903980" elapsed="0.000222"/>
</kw>
<msg time="2026-08-22T23:38:22.904262" 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-08-22T23:38:22.903264" elapsed="0.001086"/>
</kw>
<kw name="Open 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-08-22T23:38:22.904567" elapsed="0.000052"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:22.904815" elapsed="0.000029"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:38:22.899677" elapsed="0.005253"/>
</kw>
<msg time="2026-08-22T23:38:22.905066" 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-08-22T23:38:22.503800" elapsed="0.401303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:22.905771" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:22.905387" elapsed="0.000444"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:38:22.905896" elapsed="0.000047"/>
</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-08-22T23:38:22.502868" elapsed="0.403217"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:38:22.502690" elapsed="0.403446"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:22.907515" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:38:22.907129" elapsed="0.000424"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:38:22.908679" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:38:22.908482" elapsed="0.000380"/>
</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-08-22T23:38:22.912094" elapsed="0.000092"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:22.911385" elapsed="0.000895"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:22.911361" elapsed="0.000949"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:38:22.912599" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:38:22.912761" level="INFO">${current_ssh_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:38:22.912464" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:22.913942" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.12" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:22.912962" elapsed="0.001044"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:38:22.914980" level="INFO">${conn_id} = 43</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:38:22.914180" elapsed="0.000828"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:38:22.916954" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:38:22.917222" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:38:22.916302" 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-08-22T23:38:22.917636" elapsed="0.000608"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:38:22.919596" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:38:23.491734" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:38:23 UTC 2026

  System load:  0.27               Processes:             122
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:43 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:38:22.919254" elapsed="0.572570"/>
</kw>
<msg time="2026-08-22T23:38:23.491924" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:22.918548" elapsed="0.573458"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:38:22.915310" elapsed="0.576836"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:38:23.492684" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-08-22T23:38:23.505392" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-08-22T23:38:23.505612" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:38:23.505681" 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-08-22T23:38:23.492354" elapsed="0.013362"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:38:23.506052" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:23.507398" 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-08-22T23:38:23.506645" 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-08-22T23:38:23.507915" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:23.507653" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:23.507618" elapsed="0.000494"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:38:23.508426" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:38:23.508193" elapsed="0.000437"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:23.508170" elapsed="0.000503"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:38:23.508725" 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-08-22T23:38:23.514637" elapsed="0.000217"/>
</kw>
<msg time="2026-08-22T23:38:23.514944" 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-08-22T23:38:23.513195" elapsed="0.001910"/>
</kw>
<kw name="Open 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-08-22T23:38:23.515529" elapsed="0.000099"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:23.516037" 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-08-22T23:38:23.509176" elapsed="0.007144"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:38:22.910772" elapsed="0.605684"/>
</kw>
<msg time="2026-08-22T23:38:23.516532" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:22.910084" elapsed="0.606561"/>
</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-08-22T23:38:22.909536" elapsed="0.607227"/>
</kw>
<msg time="2026-08-22T23:38:23.516821" 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-08-22T23:38:22.909034" elapsed="0.607854"/>
</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-08-22T23:38:23.522206" elapsed="0.000213"/>
</kw>
<msg time="2026-08-22T23:38:23.522481" 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-08-22T23:38:23.521426" elapsed="0.001146"/>
</kw>
<kw name="Open 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-08-22T23:38:23.522826" elapsed="0.000032"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:23.523015" 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-08-22T23:38:23.517308" elapsed="0.005787"/>
</kw>
<msg time="2026-08-22T23:38:23.523184" 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-08-22T23:38:22.907877" elapsed="0.615331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:23.523638" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:23.523375" elapsed="0.000306"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:38:23.523723" 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-08-22T23:38:22.906531" elapsed="0.617315"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:38:22.906276" elapsed="0.617606"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:23.524836" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:38:23.524550" elapsed="0.000312"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:38:23.525604" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:38:23.525474" elapsed="0.000258"/>
</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-08-22T23:38:23.528890" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:23.528201" elapsed="0.000858"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:23.528182" elapsed="0.000905"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:38:23.529347" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:38:23.529502" level="INFO">${current_ssh_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:38:23.529237" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:23.530705" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.79" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:23.529719" elapsed="0.001051"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:38:23.531702" level="INFO">${conn_id} = 44</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:38:23.530941" elapsed="0.000788"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:38:23.533308" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:38:23.533679" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:38:23.532778" elapsed="0.001007"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:38:23.534106" elapsed="0.000623"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:38:23.536053" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:38:24.125301" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:38:23 UTC 2026

  System load:  0.1                Processes:             124
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:44 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:38:23.535736" elapsed="0.589910"/>
</kw>
<msg time="2026-08-22T23:38:24.125878" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:23.535031" elapsed="0.591035"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:38:23.531993" elapsed="0.594388"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:38:24.127627" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-08-22T23:38:24.140360" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-08-22T23:38:24.140658" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:38:24.140748" 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-08-22T23:38:24.126903" elapsed="0.013890"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:38:24.141154" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:24.142550" 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-08-22T23:38:24.141769" elapsed="0.000911"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:38:24.143091" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:24.142821" elapsed="0.000434"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:24.142786" elapsed="0.000509"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:38:24.143637" elapsed="0.000072"/>
</return>
<status status="PASS" start="2026-08-22T23:38:24.143376" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:24.143353" elapsed="0.000546"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:38:24.143966" 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-08-22T23:38:24.152901" elapsed="0.000326"/>
</kw>
<msg time="2026-08-22T23:38:24.153362" 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-08-22T23:38:24.150739" elapsed="0.002904"/>
</kw>
<kw name="Open 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-08-22T23:38:24.154292" elapsed="0.000100"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:24.155068" 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-08-22T23:38:24.144692" elapsed="0.010794"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:38:23.527573" elapsed="0.628203"/>
</kw>
<msg time="2026-08-22T23:38:24.155895" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:23.526942" elapsed="0.629027"/>
</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-08-22T23:38:23.526397" elapsed="0.629654"/>
</kw>
<msg time="2026-08-22T23:38:24.156092" 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-08-22T23:38:23.525899" elapsed="0.630239"/>
</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-08-22T23:38:24.159444" elapsed="0.000162"/>
</kw>
<msg time="2026-08-22T23:38:24.159660" 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-08-22T23:38:24.158954" 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="NOT RUN" start="2026-08-22T23:38:24.159877" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:24.160033" 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-08-22T23:38:24.156424" elapsed="0.003688"/>
</kw>
<msg time="2026-08-22T23:38:24.160204" 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-08-22T23:38:23.525074" elapsed="0.635155"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:24.160663" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:24.160398" elapsed="0.000307"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:38:24.160747" 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-08-22T23:38:23.524149" elapsed="0.636763"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:38:23.523972" elapsed="0.636978"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:38:22.502531" elapsed="1.658457"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-08-22T23:38:22.498598" elapsed="1.662456"/>
</kw>
<return>
<value>${updated_index_list}</value>
<status status="PASS" start="2026-08-22T23:38:24.161097" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:38:24.161263" level="INFO">${updated_index_list} = [2, 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-08-22T23:38:20.440427" elapsed="3.720862"/>
</kw>
<return>
<value>${updated_index_list}</value>
<status status="PASS" start="2026-08-22T23:38:24.161343" elapsed="0.000025"/>
</return>
<arg>1</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-08-22T23:38:20.256649" elapsed="3.904821"/>
</kw>
<doc>Simulate node 1 crashes just before device data is created, fail if node 1 survives.</doc>
<status status="PASS" start="2026-08-22T23:38:19.981198" elapsed="4.180412"/>
</test>
<test id="s1-s6-t7" name="Create_Device_Data_With_node1_Down" line="91">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:38:24.165324" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:38:24.165059" 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-08-22T23:38:24.166611" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:24.166483" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:24.166465" elapsed="0.000215"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:38:24.171765" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:24.171642" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:24.171622" elapsed="0.000212"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:24.172893" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:24.172438" elapsed="0.000485"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:38:24.173463" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:38:24.173118" elapsed="0.000374"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:38:24.173544" elapsed="0.000047"/>
</return>
<msg time="2026-08-22T23:38:24.173741" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:38:24.172063" elapsed="0.001707"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:38:24.180417" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:24.180287" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:24.180265" 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-08-22T23:38:24.181997" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:24.181870" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:24.181848" elapsed="0.000228"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:24.182542" level="INFO">${karaf_connection_index} = 34</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:38:24.182230" elapsed="0.000339"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:38:24.182966" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:38:24.182746" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:38:24.183799" 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-08-22T23:38:24.183480" elapsed="0.003886">OSError: Socket is closed</status>
</kw>
<msg time="2026-08-22T23:38:24.187678" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-08-22T23:38:24.187727" 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-08-22T23:38:24.183147" elapsed="0.004605"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:38:34.188891" 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-08-22T23:38:24.188275" elapsed="10.001539">No match found for 'opendaylight-user.*root.*&gt;' in 10 seconds
Output:
.</status>
</kw>
<msg time="2026-08-22T23:38:34.190253" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-08-22T23:38:34.190304" 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-08-22T23:38:24.187922" elapsed="10.002408"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-08-22T23:38:34.191569" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Create_Device_Data_With_node1_Down"</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-08-22T23:38:34.190821" elapsed="0.000837">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Create_Device_Data_With_node1_Down"</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:34.190458" elapsed="0.001272">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Create_Device_Data_With_node1_Down"</status>
</branch>
<status status="FAIL" start="2026-08-22T23:38:34.190419" elapsed="0.001347">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Create_Device_Data_With_node1_Down"</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-08-22T23:38:34.191931" 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-08-22T23:38:34.192163" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:34.192021" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:34.192003" elapsed="0.000238"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-08-22T23:38:34.192279" 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-08-22T23:38:34.195170" elapsed="0.000160"/>
</kw>
<msg time="2026-08-22T23:38:34.195409" 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-08-22T23:38:34.193912" 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-08-22T23:38:34.195850" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:34.196191" 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-08-22T23:38:34.193223" elapsed="0.003157"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:38:34.192627" 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="FAIL" start="2026-08-22T23:38:24.181472" elapsed="10.015089">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Create_Device_Data_With_node1_Down"</status>
</kw>
<msg time="2026-08-22T23:38:34.196694" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:38:34.196740" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Create_Device_Data_With_node1_Down"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:38:24.180689" elapsed="10.016075"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:38:34.196970" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:34.196844" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:34.196825" elapsed="0.000210"/>
</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-08-22T23:38:34.197865" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:34.197758" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:34.197739" elapsed="0.000194"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:38:34.198209" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:38:34.198315" level="INFO">${current_ssh_connection_object} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:38:34.198083" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:34.198905" level="INFO">{1: 34, 2: 35, 3: 36}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:34.198492" elapsed="0.000458"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:34.199351" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:34.199102" 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-08-22T23:38:34.199935" elapsed="0.000270"/>
</kw>
<msg time="2026-08-22T23:38:34.200305" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:38:34.200353" level="INFO">${old_connection_index} = 34</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-08-22T23:38:34.199552" elapsed="0.000824"/>
</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-08-22T23:38:34.201262" elapsed="0.000212"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:38:34.202619" 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-08-22T23:38:34.202158" elapsed="0.001374">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-08-22T23:38:34.201669" elapsed="0.001989"/>
</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-08-22T23:38:34.204623" elapsed="0.000357"/>
</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-08-22T23:38:34.203827" elapsed="0.001240"/>
</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-08-22T23:38:34.200748" elapsed="0.004368"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:34.200501" elapsed="0.004669"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:34.200481" elapsed="0.004716"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:34.206162" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:38:34.205847" elapsed="0.000342"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:38:34.206238" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:38:34.206392" level="INFO">${odl_ip} = 10.30.170.200</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:38:34.205406" elapsed="0.001012"/>
</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-08-22T23:38:34.206571" elapsed="0.000508"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:38:34.207355" level="INFO">index=45
host=10.30.170.200
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-08-22T23:38:34.207459" level="INFO">${karaf_connection_object} = index=45
host=10.30.170.200
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-08-22T23:38:34.207247" elapsed="0.000238"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:38:34.207667" elapsed="0.002325"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:38:34.210419" level="INFO">Logging into '10.30.170.200:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:38:34.213319" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.200</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-08-22T23:38:34.210156" elapsed="0.003761">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.200</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-08-22T23:38:34.231691" elapsed="0.000399"/>
</kw>
<msg time="2026-08-22T23:38:34.232179" 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-08-22T23:38:34.229935" elapsed="0.002398"/>
</kw>
<kw name="Open 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-08-22T23:38:34.232492" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:34.232765" elapsed="0.000025"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:38:34.214717" elapsed="0.018138"/>
</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-08-22T23:38:34.214189" elapsed="0.018713"/>
</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-08-22T23:38:34.197437" elapsed="0.035546">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.200</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-08-22T23:38:34.233326" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:38:34.233400" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_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-08-22T23:38:24.179894" elapsed="10.053608">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.200</status>
</kw>
<msg time="2026-08-22T23:38:34.233628" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:38:34.233672" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.200</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:38:24.174200" elapsed="10.059531"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:34.234068" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:34.233814" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:34.233794" elapsed="0.000352"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:38:24.174035" elapsed="10.060136"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:38:34.239788" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:34.239680" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:34.239661" 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-08-22T23:38:34.240998" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:34.240891" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:34.240873" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:34.241504" level="INFO">${karaf_connection_index} = 35</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:38:34.241207" elapsed="0.000323"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:38:34.241919" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:38:34.241702" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:38:34.276956" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:38:34.242435" elapsed="0.034620"/>
</kw>
<msg time="2026-08-22T23:38:34.277230" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:38:34.277277" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:38:34.242101" elapsed="0.035212"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:38:34.298232" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "n "o "d "e "1 "_ "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-08-22T23:38:34.277839" elapsed="0.020492"/>
</kw>
<msg time="2026-08-22T23:38:34.298490" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:38:34.298535" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "n "o "d "e ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:38:34.277478" elapsed="0.021094"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:34.298901" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:34.298670" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:34.298651" elapsed="0.000328"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:34.299416" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "n "o "d "e "1 "_ "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-08-22T23:38:34.299119" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:34.299783" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:34.299550" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:34.299532" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:38:34.299894" 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-08-22T23:38:34.302345" elapsed="0.000147"/>
</kw>
<msg time="2026-08-22T23:38:34.302553" 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-08-22T23:38:34.301296" elapsed="0.001431"/>
</kw>
<kw name="Open 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-08-22T23:38:34.303030" elapsed="0.000091"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:34.303377" 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-08-22T23:38:34.300688" elapsed="0.002873"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:38:34.300145" elapsed="0.003503"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:38:34.240569" elapsed="0.063267"/>
</kw>
<msg time="2026-08-22T23:38:34.303929" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:38:34.303974" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "n "o "d "e ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:38:34.240005" elapsed="0.064006"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:38:34.304194" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:38:34.304088" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:34.304069" 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-08-22T23:38:34.304691" 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-08-22T23:38:34.305026" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:38:34.305097" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:38:34.239321" elapsed="0.065885"/>
</kw>
<msg time="2026-08-22T23:38:34.305299" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:38:34.305342" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "n "o "d "e ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:38:34.234445" elapsed="0.070934"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:34.305781" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:34.305454" elapsed="0.000382"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:34.305437" elapsed="0.000423"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:38:34.234306" elapsed="0.071578"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:38:34.311490" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:34.311383" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:34.311363" 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-08-22T23:38:34.312726" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:34.312616" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:34.312596" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:34.313233" level="INFO">${karaf_connection_index} = 36</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:38:34.312936" elapsed="0.000324"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:38:34.313646" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:38:34.313413" elapsed="0.000260"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:38:34.354277" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:38:34.314156" elapsed="0.040219"/>
</kw>
<msg time="2026-08-22T23:38:34.354533" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:38:34.354648" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:38:34.313828" elapsed="0.040862"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:38:34.382705" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "n "o "d "e "1 "_ "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-08-22T23:38:34.355191" elapsed="0.027615"/>
</kw>
<msg time="2026-08-22T23:38:34.382962" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:38:34.383008" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "n "o "d "e ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:38:34.354857" elapsed="0.028188"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:34.383336" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:34.383121" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:34.383101" elapsed="0.000350"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:34.383913" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "n "o "d "e "1 "_ "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-08-22T23:38:34.383613" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:34.384259" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:34.384046" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:34.384028" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:38:34.384369" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<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-08-22T23:38:34.386856" elapsed="0.000147"/>
</kw>
<msg time="2026-08-22T23:38:34.387064" 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-08-22T23:38:34.385781" elapsed="0.001412"/>
</kw>
<kw name="Open 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-08-22T23:38:34.387460" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:34.387810" 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-08-22T23:38:34.385156" elapsed="0.002837"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:38:34.384635" elapsed="0.003423"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:38:34.312292" elapsed="0.075862"/>
</kw>
<msg time="2026-08-22T23:38:34.388246" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:38:34.388289" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "n "o "d "e ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:38:34.311725" elapsed="0.076601"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:38:34.388507" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:38:34.388402" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:34.388384" elapsed="0.000229"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:34.389004" 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-08-22T23:38:34.389335" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:38:34.389405" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:38:34.311042" elapsed="0.078471"/>
</kw>
<msg time="2026-08-22T23:38:34.389637" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:38:34.389684" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "n "o "d "e ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:38:34.306141" elapsed="0.083580"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:34.390040" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:34.389795" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:34.389778" elapsed="0.000339"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:38:34.306005" elapsed="0.084136"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:38:24.173834" elapsed="10.216335"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:38:24.171223" elapsed="10.219004"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:38:24.166194" elapsed="10.224090"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:38:24.165759" elapsed="10.224571"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:38:24.162653" elapsed="10.227730"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:38:34.391068" level="INFO">${mapping} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>RESTCONF_ROOT=${RESTCONF_ROOT}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:38:34.390630" elapsed="0.000465"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:34.425554" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:34.425175" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:34.426347" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:34.426096" elapsed="0.000316">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:34.426505" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:34.425759" elapsed="0.000786"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:34.427110" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:34.426726" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:38:34.427432" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:38:34.427569" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:38:34.427295" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:34.428010" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:34.427765" 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-08-22T23:38:34.429021" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:34.428749" elapsed="0.000317"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:38:34.429479" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:38:34.429221" elapsed="0.000283"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:38:34.430189" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:38:34.429867" elapsed="0.000350"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:38:34.431129" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:38:34.430783" elapsed="0.000372"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:38:34.431205" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:38:34.431357" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:38:34.430405" elapsed="0.000976"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:38:34.431530" elapsed="0.000295"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:38:34.429737" elapsed="0.002130"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:38:34.432438" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:38:34.432110" elapsed="0.000354"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:38:34.433503" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:38:34.433149" elapsed="0.000380"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:38:34.433599" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:38:34.433768" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:38:34.432669" elapsed="0.001124"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:38:34.433942" elapsed="0.000273"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:38:34.431980" elapsed="0.002277"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:38:34.429553" elapsed="0.004738"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:38:34.434369" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:38:34.434566" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:38:34.428413" elapsed="0.006203"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:34.428122" elapsed="0.006527"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:34.434821" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:34.434674" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:34.428103" elapsed="0.006794"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:38:34.435665" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:38:34.435038" elapsed="0.000655"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:38:34.435743" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:38:34.424531" elapsed="0.011337"/>
</kw>
<msg time="2026-08-22T23:38:34.435921" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:34.411979" elapsed="0.023989"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:34.448161" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:34.460379" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:34.472567" 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-08-22T23:38:34.472770" 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-08-22T23:38:34.472943" 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-08-22T23:38:34.473306" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:34.473164" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:34.473150" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:34.473529" 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-08-22T23:38:34.473708" 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-08-22T23:38:34.473870" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:38:34.473122" elapsed="0.000800"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:38:34.473019" elapsed="0.000928"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:34.474090" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:34.474198" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:38:34.474321" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:38:34.407695" elapsed="0.066654"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:34.499359" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:34.498979" elapsed="0.000409"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:34.500104" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:34.499896" elapsed="0.000271">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:34.500260" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:34.499548" elapsed="0.000736"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:34.500844" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:34.500443" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:38:34.501165" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:38:34.501289" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:38:34.501029" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:34.501730" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:34.501469" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:38:34.502130" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:34.501844" elapsed="0.000344"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:34.502874" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:34.502357" elapsed="0.000545"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:34.502213" elapsed="0.000726"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:34.501825" elapsed="0.001137"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:38:34.503543" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:38:34.503108" elapsed="0.000464"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:38:34.503640" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:38:34.498332" elapsed="0.005435"/>
</kw>
<msg time="2026-08-22T23:38:34.503821" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:34.485267" elapsed="0.018602"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:34.516318" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:34.528742" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:34.540948" 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-08-22T23:38:34.541137" 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-08-22T23:38:34.541309" 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-08-22T23:38:34.541684" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:34.541527" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:34.541512" 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-08-22T23:38:34.541904" 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-08-22T23:38:34.542069" 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-08-22T23:38:34.542231" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:38:34.541484" elapsed="0.000799"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:38:34.541382" elapsed="0.000927"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:34.542481" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:34.542557" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:38:34.542690" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:38:34.484407" elapsed="0.058311"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:34.543947" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:34.543715" elapsed="0.000295">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:34.544100" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:34.543366" elapsed="0.000758"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:34.544433" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:34.544194" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:34.544980" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:34.544688" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:34.544512" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:34.544175" elapsed="0.000888"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:34.547379" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:34.545208" elapsed="0.002198"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:38:34.547457" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:38:34.547660" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:38:34.543047" elapsed="0.004639"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:34.549193" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:34.548947" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:34.549641" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:34.549388" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:34.550077" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:34.549834" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:34.550523" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:34.550268" elapsed="0.000298"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:34.551374" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:38:34.551178" elapsed="0.000222"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:38:34.551750" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:38:34.551557" 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-08-22T23:38:34.551920" elapsed="0.000197"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:34.552703" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:34.552269" elapsed="0.000480"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:38:34.552793" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:38:34.552949" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:38:34.550779" elapsed="0.002195"/>
</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-08-22T23:38:34.568434" level="INFO">POST Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Content-Length': '72', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:38:34.568620" level="INFO">POST Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:34.568732" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:34.555132" elapsed="0.013950">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:34.553043" elapsed="0.016121">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:34.569556" elapsed="0.000084"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:34.569205" elapsed="0.000536"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:34.553027" elapsed="0.016767">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:34.570661" elapsed="0.000057"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:34.570963" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:34.570881" elapsed="0.000173"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:34.570843" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:34.571421" elapsed="0.000115"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:34.571677" elapsed="0.000037"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:34.548009" elapsed="0.023901">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:34.572087" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:34.396530" elapsed="0.175764">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:34.572968" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:34.572544" elapsed="0.000574"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:34.572508" elapsed="0.000663"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:34.573245" elapsed="0.000032"/>
</return>
<arg>${directory_with_template_folders}${/}dataorig</arg>
<arg>${mapping}</arg>
<arg>session=node2</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:38:34.391950" elapsed="0.181503">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:35.613497" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:35.613075" elapsed="0.000458"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:35.614330" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:35.614056" elapsed="0.000351">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:35.614502" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:35.613720" elapsed="0.000807"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:35.615089" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:35.614705" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:38:35.615415" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:38:35.615672" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:38:35.615273" elapsed="0.000426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:35.616101" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:35.615854" 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-08-22T23:38:35.617228" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:35.616955" elapsed="0.000319"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:38:35.617716" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:38:35.617429" elapsed="0.000313"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:38:35.618464" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:38:35.618103" elapsed="0.000506"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:38:35.619507" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:38:35.619152" elapsed="0.000382"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:38:35.619607" elapsed="0.000038"/>
</return>
<msg time="2026-08-22T23:38:35.619775" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:38:35.618805" elapsed="0.000996"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:38:35.619952" elapsed="0.000293"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:38:35.617972" elapsed="0.002315"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:38:35.620882" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:38:35.620531" elapsed="0.000378"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:38:35.621809" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:38:35.621448" elapsed="0.000387"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:38:35.621886" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:38:35.622038" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:38:35.621092" elapsed="0.000971"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:38:35.622210" elapsed="0.000275"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:38:35.620401" elapsed="0.002125"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:38:35.617794" elapsed="0.004767"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:38:35.622629" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:38:35.622786" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:38:35.616549" elapsed="0.006263"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:35.616244" elapsed="0.006601"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:35.623016" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:35.622871" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:35.616219" elapsed="0.006874"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:38:35.623840" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:38:35.623234" elapsed="0.000634"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:38:35.623917" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:38:35.612445" elapsed="0.011596"/>
</kw>
<msg time="2026-08-22T23:38:35.624095" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:35.599721" elapsed="0.024422"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:35.636659" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:35.648835" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:35.660990" 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-08-22T23:38:35.661203" 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-08-22T23:38:35.661377" 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-08-22T23:38:35.661758" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:35.661614" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:35.661598" 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-08-22T23:38:35.661975" 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-08-22T23:38:35.662139" 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-08-22T23:38:35.662299" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:38:35.661554" elapsed="0.000799"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:38:35.661453" elapsed="0.000925"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:35.662521" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:35.662613" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:38:35.662734" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:38:35.595445" elapsed="0.067315"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:35.687048" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:35.686674" elapsed="0.000402"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:35.687782" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:35.687560" elapsed="0.000286">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:35.687939" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:35.687233" elapsed="0.000730"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:35.688505" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:35.688121" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:38:35.688841" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:38:35.688966" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:38:35.688704" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:35.689407" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:35.689163" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:38:35.689829" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:35.689521" elapsed="0.000367"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:35.690390" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:35.690096" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:35.689947" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:35.689503" elapsed="0.000971"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:38:35.691072" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:38:35.690633" elapsed="0.000468"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:38:35.691149" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:38:35.686054" elapsed="0.005220"/>
</kw>
<msg time="2026-08-22T23:38:35.691327" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:35.673669" elapsed="0.017704"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:35.703766" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:35.715924" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:35.728274" 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-08-22T23:38:35.728465" 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-08-22T23:38:35.728652" 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-08-22T23:38:35.729022" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:35.728869" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:35.728855" 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-08-22T23:38:35.729240" 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-08-22T23:38:35.729401" 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-08-22T23:38:35.729559" elapsed="0.000033"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:38:35.728828" elapsed="0.000798"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:38:35.728727" elapsed="0.000925"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:35.729793" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:35.729867" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:38:35.729984" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:38:35.672774" elapsed="0.057269"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:35.731279" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:35.731046" elapsed="0.000296">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:35.731434" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:35.730713" elapsed="0.000746"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:35.731789" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:35.731528" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:35.732334" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:35.732043" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:35.731870" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:35.731510" elapsed="0.000906"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:35.734770" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:35.732561" elapsed="0.002235"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:38:35.734847" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:38:35.735000" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:38:35.730376" elapsed="0.004650"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:35.736526" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:35.736280" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:35.736972" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:35.736736" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:35.737418" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:35.737177" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:35.737862" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:35.737622" elapsed="0.000283"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:35.738768" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:38:35.738556" elapsed="0.000238"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:38:35.739118" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:38:35.738944" 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-08-22T23:38:35.739288" elapsed="0.000194"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:35.739898" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:35.739652" elapsed="0.000290"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:38:35.739985" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:38:35.740139" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:38:35.738102" 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-08-22T23:38:35.750507" level="INFO">POST Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Content-Length': '72', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:38:35.750692" level="INFO">POST Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:35.750828" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:35.742500" elapsed="0.008698">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:35.740233" elapsed="0.011054">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:35.751473" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:35.751320" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:35.740216" elapsed="0.011348">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:35.751947" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:35.752083" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:35.752046" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:35.752029" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:35.752285" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:35.752352" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:35.735346" elapsed="0.017109">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:35.752534" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:35.582208" elapsed="0.170433">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:35.752929" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:35.752753" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:35.752737" elapsed="0.000314"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:35.753084" elapsed="0.000014"/>
</return>
<arg>${directory_with_template_folders}${/}dataorig</arg>
<arg>${mapping}</arg>
<arg>session=node2</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:38:35.574539" elapsed="0.178640">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:36.796702" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:36.796255" elapsed="0.000483"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:36.797749" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:36.797453" elapsed="0.000375">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:36.797924" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:36.796919" elapsed="0.001030"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:36.798504" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:36.798113" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:38:36.798853" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:38:36.799010" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:38:36.798707" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:36.799442" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:36.799190" 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-08-22T23:38:36.800521" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:36.800259" elapsed="0.000309"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:38:36.801036" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:38:36.800744" elapsed="0.000324"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:38:36.801881" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:38:36.801485" elapsed="0.000423"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:38:36.802834" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:38:36.802442" elapsed="0.000419"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:38:36.802917" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:38:36.803084" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:38:36.802098" elapsed="0.001012"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:38:36.803263" elapsed="0.000290"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:38:36.801343" elapsed="0.002301"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:38:36.804216" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:38:36.803891" elapsed="0.000352"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:38:36.805200" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:38:36.804792" elapsed="0.000435"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:38:36.805279" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:38:36.805431" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:38:36.804426" elapsed="0.001030"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:38:36.805639" elapsed="0.000275"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:38:36.803760" elapsed="0.002196"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:38:36.801132" elapsed="0.004858"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:38:36.806034" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:38:36.806193" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:38:36.799931" elapsed="0.006288"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:36.799569" elapsed="0.006682"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:36.806428" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:36.806278" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:36.799545" elapsed="0.006960"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:38:36.807258" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:38:36.806673" elapsed="0.000613"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:38:36.807425" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:38:36.795549" elapsed="0.012004"/>
</kw>
<msg time="2026-08-22T23:38:36.807644" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:36.780894" elapsed="0.026803"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:36.820698" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:36.833379" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:36.846248" 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-08-22T23:38:36.846553" 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-08-22T23:38:36.846763" 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-08-22T23:38:36.847299" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:36.847128" elapsed="0.000237"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:36.847107" 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-08-22T23:38:36.847545" elapsed="0.000067"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:36.847767" 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-08-22T23:38:36.847932" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:38:36.847056" elapsed="0.000930"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:38:36.846856" elapsed="0.001158"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:36.848161" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:36.848243" elapsed="0.000019"/>
</return>
<msg time="2026-08-22T23:38:36.848417" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:38:36.776324" elapsed="0.072123"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:36.873573" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:36.873147" elapsed="0.000477"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:36.874404" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:36.874146" elapsed="0.000331">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:36.874573" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:36.873803" elapsed="0.000810"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:36.875217" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:36.874806" elapsed="0.000439"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:38:36.875547" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:38:36.875731" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:38:36.875405" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:36.876159" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:36.875913" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:38:36.876643" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:36.876286" elapsed="0.000418"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:36.877169" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:36.876875" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:36.876732" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:36.876262" elapsed="0.000991"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:38:36.877864" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:38:36.877401" elapsed="0.000491"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:38:36.877944" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:38:36.872444" elapsed="0.005637"/>
</kw>
<msg time="2026-08-22T23:38:36.878136" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:36.859549" elapsed="0.018634"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:36.890758" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:36.903080" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:36.915588" 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-08-22T23:38:36.915932" 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-08-22T23:38:36.916118" 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-08-22T23:38:36.916557" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:36.916403" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:36.916383" elapsed="0.000276"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:36.916805" 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-08-22T23:38:36.916971" 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-08-22T23:38:36.917133" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:38:36.916342" elapsed="0.000844"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:38:36.916204" elapsed="0.001011"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:36.917362" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:36.917465" elapsed="0.000020"/>
</return>
<msg time="2026-08-22T23:38:36.917692" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:38:36.858560" elapsed="0.059167"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:36.919248" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:36.918940" elapsed="0.000387">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:36.919427" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:36.918495" elapsed="0.000958"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:36.919831" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:36.919530" elapsed="0.000363"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:36.920426" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:36.920107" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:36.919918" elapsed="0.000576"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:36.919511" elapsed="0.001006"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:36.922979" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:36.920692" elapsed="0.002314"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:38:36.923059" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:38:36.923216" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:38:36.918106" elapsed="0.005136"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:36.924947" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:36.924689" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:36.925427" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:36.925145" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:36.925976" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:36.925697" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:36.926649" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:36.926210" elapsed="0.000494"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:36.927664" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:38:36.927408" elapsed="0.000286"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:38:36.928099" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:38:36.927872" elapsed="0.000256"/>
</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-08-22T23:38:36.928303" elapsed="0.000245"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:36.929066" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:36.928748" elapsed="0.000427"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:38:36.929230" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:38:36.929411" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:38:36.926944" elapsed="0.002495"/>
</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-08-22T23:38:36.940046" level="INFO">POST Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Content-Length': '72', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:38:36.940226" level="INFO">POST Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:36.940400" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:36.932304" elapsed="0.008671">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:36.929521" elapsed="0.011576">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:36.941364" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:36.941145" elapsed="0.000313"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:36.929500" elapsed="0.011992">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:36.942047" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:36.942241" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:36.942187" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:36.942164" elapsed="0.000169"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:36.942531" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:36.942646" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:36.923742" elapsed="0.019050">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:36.942959" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:36.762878" elapsed="0.180218">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:36.943501" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:36.943253" elapsed="0.000363"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:36.943230" elapsed="0.000421"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:36.943698" elapsed="0.000021"/>
</return>
<arg>${directory_with_template_folders}${/}dataorig</arg>
<arg>${mapping}</arg>
<arg>session=node2</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:38:36.754231" elapsed="0.189601">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:37.983101" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:37.982706" elapsed="0.000429"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:37.983917" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:37.983657" elapsed="0.000337">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:37.984089" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:37.983309" elapsed="0.000804"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:37.984685" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:37.984275" elapsed="0.000437"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:38:37.985015" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:38:37.985176" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:38:37.984872" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:37.985654" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:37.985356" elapsed="0.000346"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:37.986915" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:37.986649" elapsed="0.000312"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:38:37.987394" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:38:37.987120" elapsed="0.000300"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:38:37.988156" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:38:37.987796" elapsed="0.000387"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:38:37.989086" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:38:37.988736" elapsed="0.000376"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:38:37.989166" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:38:37.989336" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:38:37.988368" elapsed="0.000995"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:38:37.989520" elapsed="0.000382"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:38:37.987663" elapsed="0.002283"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:38:37.990517" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:38:37.990191" elapsed="0.000353"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:38:37.991435" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:38:37.991091" elapsed="0.000371"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:38:37.991514" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:38:37.991687" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:38:37.990753" elapsed="0.000960"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:38:37.991861" elapsed="0.000273"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:38:37.990061" elapsed="0.002115"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:38:37.987474" elapsed="0.004738"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:38:37.992256" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:38:37.992416" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:38:37.986079" elapsed="0.006364"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:37.985780" elapsed="0.006695"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:37.992670" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:37.992500" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:37.985757" elapsed="0.006993"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:38:37.993516" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:38:37.992891" elapsed="0.000654"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:38:37.993636" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:38:37.982056" elapsed="0.011708"/>
</kw>
<msg time="2026-08-22T23:38:37.993818" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:37.969466" elapsed="0.024400"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:38.006229" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:38.018468" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:38.031133" 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-08-22T23:38:38.031334" 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-08-22T23:38:38.031549" 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-08-22T23:38:38.031935" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:38.031791" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:38.031776" 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-08-22T23:38:38.032167" 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-08-22T23:38:38.032334" 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-08-22T23:38:38.032501" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:38:38.031747" elapsed="0.000807"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:38:38.031643" elapsed="0.000962"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:38.032754" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:38.032831" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:38:38.032953" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:38:37.965245" elapsed="0.067735"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:38.058284" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:38.057884" elapsed="0.000429"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:38.059049" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:38.058828" elapsed="0.000290">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:38.059221" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:38.058475" elapsed="0.000773"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:38.059858" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:38.059418" elapsed="0.000471"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:38:38.060196" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:38:38.060337" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:38:38.060049" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:38.060819" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:38.060534" elapsed="0.000333"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:38:38.061254" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:38.060937" elapsed="0.000380"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:38.061809" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:38.061488" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:38.061342" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:38.060918" elapsed="0.000978"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:38:38.062494" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:38:38.062041" elapsed="0.000482"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:38:38.062624" elapsed="0.000034"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:38:38.057181" elapsed="0.005579"/>
</kw>
<msg time="2026-08-22T23:38:38.062813" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:38.044028" elapsed="0.018833"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:38.075369" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:38.087615" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:38.099997" 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-08-22T23:38:38.100190" 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-08-22T23:38:38.100363" 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-08-22T23:38:38.100742" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:38.100596" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:38.100568" 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-08-22T23:38:38.100961" 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-08-22T23:38:38.101125" 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-08-22T23:38:38.101286" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:38:38.100540" elapsed="0.000799"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:38:38.100436" 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-08-22T23:38:38.101508" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:38.101597" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:38:38.101718" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:38:38.043155" elapsed="0.058591"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:38.103063" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:38.102826" elapsed="0.000302">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:38.103221" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:38.102415" elapsed="0.000831"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:38.103603" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:38.103316" elapsed="0.000354"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:38.104216" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:38.103893" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:38.103696" elapsed="0.000583"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:38.103298" elapsed="0.001003"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:38.106702" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:38.104456" elapsed="0.002284"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:38:38.106805" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:38:38.107018" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:38:38.102074" elapsed="0.004979"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:38.109282" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:38.108892" elapsed="0.000474"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:38.109802" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:38.109536" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:38.110353" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:38.110062" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:38.110821" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:38.110550" elapsed="0.000315"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:38.111700" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:38:38.111480" elapsed="0.000247"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:38:38.112053" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:38:38.111876" 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-08-22T23:38:38.112247" elapsed="0.000208"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:38.112875" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:38.112625" elapsed="0.000295"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:38:38.112965" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:38:38.113121" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:38:38.111062" elapsed="0.002085"/>
</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-08-22T23:38:38.123342" level="INFO">POST Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Content-Length': '72', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:38:38.123511" level="INFO">POST Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:38.123643" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:38.115542" elapsed="0.008491">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:38.113227" elapsed="0.010937">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:38.124373" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:38.124205" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:38.113208" elapsed="0.011257">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:38.124865" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:38.125009" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:38.124970" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:38.124951" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:38.125231" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:38.125303" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:38.107453" elapsed="0.017963">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:38.125496" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:37.954144" elapsed="0.171482">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:38.125935" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:38.125750" elapsed="0.000254"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:38.125732" elapsed="0.000298"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:38.126064" elapsed="0.000015"/>
</return>
<arg>${directory_with_template_folders}${/}dataorig</arg>
<arg>${mapping}</arg>
<arg>session=node2</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:38:37.944875" elapsed="0.181294">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:39.167509" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:39.167105" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:39.168342" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:39.168080" elapsed="0.000340">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:39.168515" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:39.167738" elapsed="0.000802"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:39.169102" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:39.168717" elapsed="0.000487"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:38:39.169511" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:38:39.169684" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:38:39.169368" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:39.170117" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:39.169869" 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-08-22T23:38:39.171201" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:39.170932" elapsed="0.000315"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:38:39.171722" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:38:39.171418" elapsed="0.000331"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:38:39.172496" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:38:39.172113" elapsed="0.000419"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:38:39.173467" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:38:39.173111" elapsed="0.000383"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:38:39.173550" elapsed="0.000051"/>
</return>
<msg time="2026-08-22T23:38:39.173732" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:38:39.172765" elapsed="0.000991"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:38:39.173906" elapsed="0.000295"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:38:39.171980" elapsed="0.002262"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:38:39.174843" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:38:39.174484" elapsed="0.000386"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:38:39.175758" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:38:39.175388" elapsed="0.000397"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:38:39.175835" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:38:39.175985" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:38:39.175054" elapsed="0.000955"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:38:39.176157" elapsed="0.000271"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:38:39.174355" elapsed="0.002114"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:38:39.171804" elapsed="0.004699"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:38:39.176547" elapsed="0.000048"/>
</return>
<msg time="2026-08-22T23:38:39.176728" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:38:39.170568" elapsed="0.006187"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:39.170244" elapsed="0.006543"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:39.176958" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:39.176811" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:39.170219" elapsed="0.006816"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:38:39.177792" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:38:39.177175" elapsed="0.000645"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:38:39.177869" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:38:39.166451" elapsed="0.011541"/>
</kw>
<msg time="2026-08-22T23:38:39.178046" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:39.153510" elapsed="0.024619"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:39.190609" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:39.202794" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:39.214902" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:39.215094" 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-08-22T23:38:39.215267" 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-08-22T23:38:39.215645" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:39.215489" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:39.215474" 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-08-22T23:38:39.215865" 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-08-22T23:38:39.216032" 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-08-22T23:38:39.216192" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:38:39.215445" elapsed="0.000800"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:38:39.215343" elapsed="0.000927"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:39.216414" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:39.216489" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:38:39.216624" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:38:39.149182" elapsed="0.067469"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:39.240925" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:39.240534" elapsed="0.000419"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:39.241693" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:39.241457" elapsed="0.000301">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:39.241891" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:39.241110" elapsed="0.000806"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:39.242461" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:39.242075" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:38:39.242800" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:38:39.242926" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:38:39.242661" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:39.243358" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:39.243111" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:38:39.243788" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:39.243474" elapsed="0.000373"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:39.244310" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:39.244016" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:39.243872" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:39.243455" elapsed="0.000939"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:38:39.244990" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:38:39.244538" elapsed="0.000479"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:38:39.245066" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:38:39.239926" elapsed="0.005277"/>
</kw>
<msg time="2026-08-22T23:38:39.245256" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:39.227548" elapsed="0.017755"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:39.257756" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:39.270219" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:39.282324" 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-08-22T23:38:39.282515" 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-08-22T23:38:39.282699" 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-08-22T23:38:39.283108" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:39.282963" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:39.282948" 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-08-22T23:38:39.283328" 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-08-22T23:38:39.283493" 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-08-22T23:38:39.283670" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:38:39.282919" elapsed="0.000806"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:38:39.282813" 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-08-22T23:38:39.283892" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:39.283966" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:38:39.284084" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:38:39.226656" elapsed="0.057456"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:39.285442" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:39.285197" elapsed="0.000310">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:39.285618" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:39.284857" 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-08-22T23:38:39.285963" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:39.285716" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:39.286537" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:39.286237" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:39.286043" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:39.285698" elapsed="0.000941"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:39.288979" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:39.286788" elapsed="0.002217"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:38:39.289057" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:38:39.289211" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:38:39.284498" elapsed="0.004737"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:39.290781" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:39.290510" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:39.291252" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:39.291005" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:39.291714" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:39.291447" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:39.292201" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:39.291918" elapsed="0.000327"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:39.293073" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:38:39.292878" elapsed="0.000221"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:38:39.293420" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:38:39.293247" 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-08-22T23:38:39.293646" elapsed="0.000202"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:39.294251" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:39.294003" elapsed="0.000292"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:38:39.294337" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:38:39.294493" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:38:39.292451" elapsed="0.002067"/>
</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-08-22T23:38:39.303905" level="INFO">POST Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Content-Length': '72', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:38:39.304078" level="INFO">POST Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:39.304182" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:39.296842" elapsed="0.007820">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:39.294602" elapsed="0.010178">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:39.305049" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:39.304828" elapsed="0.000317"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:39.294570" elapsed="0.010610">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:39.305750" elapsed="0.000043"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:39.305958" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:39.305903" elapsed="0.000114"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:39.305879" elapsed="0.000168"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:39.306273" elapsed="0.000046"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:39.306410" elapsed="0.000030"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:39.289563" elapsed="0.017043">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:39.306723" elapsed="0.000032"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:39.135397" elapsed="0.171524">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:39.307391" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:39.307135" elapsed="0.000353"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:39.307108" elapsed="0.000413"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:39.307568" elapsed="0.000044"/>
</return>
<arg>${directory_with_template_folders}${/}dataorig</arg>
<arg>${mapping}</arg>
<arg>session=node2</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:38:39.127158" elapsed="0.180597">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:40.349636" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:40.349209" elapsed="0.000470"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:40.350465" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:40.350197" elapsed="0.000349">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:40.350659" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:40.349855" elapsed="0.000829"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:40.351231" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:40.350848" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:38:40.351564" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:38:40.351771" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:38:40.351422" elapsed="0.000376"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:40.352199" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:40.351951" 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-08-22T23:38:40.353312" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:40.353021" elapsed="0.000355"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:38:40.353839" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:38:40.353539" elapsed="0.000325"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:38:40.354644" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:38:40.354245" elapsed="0.000425"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:38:40.355551" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:38:40.355195" elapsed="0.000410"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:38:40.355663" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:38:40.355829" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:38:40.354855" elapsed="0.000999"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:38:40.356006" elapsed="0.000293"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:38:40.354109" elapsed="0.002232"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:38:40.356990" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:38:40.356605" elapsed="0.000413"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:38:40.357914" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:38:40.357545" elapsed="0.000396"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:38:40.357991" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:38:40.358225" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:38:40.357204" elapsed="0.001047"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:38:40.358400" elapsed="0.000297"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:38:40.356456" elapsed="0.002292"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:38:40.353919" elapsed="0.004863"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:38:40.358827" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:38:40.358986" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:38:40.352636" elapsed="0.006375"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:40.352320" elapsed="0.006723"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:40.359216" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:40.359068" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:40.352297" elapsed="0.006996"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:38:40.360042" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:38:40.359435" elapsed="0.000635"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:38:40.360119" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:38:40.348528" elapsed="0.011715"/>
</kw>
<msg time="2026-08-22T23:38:40.360298" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:40.334233" elapsed="0.026113"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:40.373253" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:40.385901" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:40.398358" 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-08-22T23:38:40.398554" 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-08-22T23:38:40.398744" 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-08-22T23:38:40.399107" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:40.398964" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:40.398950" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:40.399324" 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-08-22T23:38:40.399487" 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-08-22T23:38:40.399705" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:38:40.398922" elapsed="0.000839"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:38:40.398820" 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-08-22T23:38:40.399979" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:40.400075" elapsed="0.000019"/>
</return>
<msg time="2026-08-22T23:38:40.400207" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:38:40.329890" elapsed="0.070343"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:40.425064" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:40.424688" elapsed="0.000405"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:40.425821" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:40.425597" elapsed="0.000289">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:40.425979" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:40.425252" elapsed="0.000751"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:40.426550" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:40.426169" elapsed="0.000422"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:38:40.426888" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:38:40.427016" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:38:40.426752" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:40.427488" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:40.427195" elapsed="0.000349"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:38:40.427948" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:40.427640" elapsed="0.000366"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:40.428472" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:40.428176" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:40.428031" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:40.427621" elapsed="0.000935"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:38:40.429153" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:38:40.428717" elapsed="0.000465"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:38:40.429231" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:38:40.424052" elapsed="0.005306"/>
</kw>
<msg time="2026-08-22T23:38:40.429414" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:40.411217" elapsed="0.018243"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:40.442240" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:40.454732" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:40.467610" 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-08-22T23:38:40.467894" 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-08-22T23:38:40.468094" 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-08-22T23:38:40.468541" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:40.468389" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:40.468370" 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-08-22T23:38:40.468790" 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-08-22T23:38:40.468955" 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-08-22T23:38:40.469117" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:38:40.468334" elapsed="0.000836"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:38:40.468189" elapsed="0.001009"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:40.469343" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:40.469422" elapsed="0.000018"/>
</return>
<msg time="2026-08-22T23:38:40.469573" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:38:40.410364" elapsed="0.059255"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:40.471176" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:40.470881" elapsed="0.000369">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:40.471343" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:40.470452" elapsed="0.000915"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:40.471718" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:40.471438" elapsed="0.000399"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:40.472347" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:40.472044" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:40.471865" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:40.471419" elapsed="0.001013"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:40.474861" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:40.472598" elapsed="0.002291"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:38:40.474943" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:38:40.475116" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:38:40.470065" elapsed="0.005077"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:40.476689" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:40.476414" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:40.477132" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:40.476890" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:40.477571" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:40.477326" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:40.478026" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:40.477782" elapsed="0.000288"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:40.478909" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:38:40.478706" elapsed="0.000228"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:38:40.479256" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:38:40.479082" 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-08-22T23:38:40.479425" elapsed="0.000219"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:40.480039" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:40.479796" elapsed="0.000287"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:38:40.480125" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:38:40.480278" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:38:40.478283" elapsed="0.002020"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:38:40.490346" level="INFO">POST Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Content-Length': '72', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:38:40.490539" level="INFO">POST Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:40.490679" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:40.482732" elapsed="0.008326">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:40.480372" elapsed="0.010771">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:40.491333" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:40.491177" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:40.480355" elapsed="0.011072">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:40.491859" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:40.492000" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:40.491962" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:40.491944" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:40.492207" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:40.492276" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:40.475471" elapsed="0.016909">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:40.492462" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:40.318728" elapsed="0.173829">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:40.492867" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:40.492688" elapsed="0.000247"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:40.492670" elapsed="0.000290"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:40.492993" elapsed="0.000015"/>
</return>
<arg>${directory_with_template_folders}${/}dataorig</arg>
<arg>${mapping}</arg>
<arg>session=node2</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:38:40.308769" elapsed="0.184321">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:41.534027" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:41.533618" elapsed="0.000446"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:41.534949" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:41.534656" elapsed="0.000385">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:41.535145" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:41.534244" elapsed="0.000926"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:41.535741" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:41.535334" elapsed="0.000435"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:38:41.536071" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:38:41.536238" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:38:41.535927" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:41.536687" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:41.536421" 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-08-22T23:38:41.538025" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:41.537757" elapsed="0.000315"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:38:41.538548" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:38:41.538233" elapsed="0.000370"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:38:41.539375" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:38:41.538995" elapsed="0.000409"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:38:41.540329" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:38:41.539968" elapsed="0.000390"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:38:41.540412" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:38:41.540594" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:38:41.539620" elapsed="0.001002"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:38:41.540775" elapsed="0.000304"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:38:41.538858" elapsed="0.002262"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:38:41.541723" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:38:41.541370" elapsed="0.000380"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:38:41.542715" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:38:41.542322" elapsed="0.000421"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:38:41.542794" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:38:41.542952" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:38:41.541937" elapsed="0.001040"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:38:41.543125" elapsed="0.000278"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:38:41.541238" elapsed="0.002206"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:38:41.538670" elapsed="0.004810"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:38:41.543524" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:38:41.543707" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:38:41.537190" elapsed="0.006544"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:41.536881" elapsed="0.006885"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:41.543938" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:41.543791" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:41.536857" elapsed="0.007159"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:38:41.544771" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:38:41.544157" elapsed="0.000644"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:38:41.544849" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:38:41.532970" elapsed="0.012006"/>
</kw>
<msg time="2026-08-22T23:38:41.545040" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:41.520283" elapsed="0.024821"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:41.557388" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:41.569457" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:41.582067" 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-08-22T23:38:41.582262" 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-08-22T23:38:41.582432" 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-08-22T23:38:41.582813" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:41.582669" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:41.582654" 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-08-22T23:38:41.583032" 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-08-22T23:38:41.583195" 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-08-22T23:38:41.583355" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:38:41.582624" elapsed="0.000783"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:38:41.582506" elapsed="0.000927"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:41.583591" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:41.583669" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:38:41.583789" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:38:41.516039" elapsed="0.067777"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:41.608123" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:41.607747" elapsed="0.000404"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:41.608872" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:41.608655" elapsed="0.000282">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:41.609030" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:41.608312" elapsed="0.000765"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:41.609651" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:41.609241" elapsed="0.000438"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:38:41.609970" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:38:41.610100" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:38:41.609834" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:41.610565" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:41.610317" elapsed="0.000315"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:38:41.610992" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:41.610701" elapsed="0.000350"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:41.611517" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:41.611219" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:41.611076" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:41.610682" elapsed="0.000935"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:38:41.612200" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:38:41.611763" elapsed="0.000465"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:38:41.612277" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:38:41.607124" elapsed="0.005277"/>
</kw>
<msg time="2026-08-22T23:38:41.612454" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:41.594727" elapsed="0.017773"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:41.625078" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:41.637259" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:41.649547" elapsed="0.000039"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:41.649753" 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-08-22T23:38:41.649925" 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-08-22T23:38:41.650289" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:41.650146" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:41.650131" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:41.650512" 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-08-22T23:38:41.650693" 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-08-22T23:38:41.650857" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:38:41.650103" elapsed="0.000806"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:38:41.650000" 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-08-22T23:38:41.651129" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:41.651206" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:38:41.651324" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:38:41.593872" elapsed="0.057480"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:41.652645" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:41.652375" elapsed="0.000334">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:41.652803" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:41.652028" 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-08-22T23:38:41.653139" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:41.652897" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:41.653708" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:41.653393" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:41.653220" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:41.652879" elapsed="0.000911"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:41.656105" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:41.653937" elapsed="0.002194"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:38:41.656183" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:38:41.656360" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:38:41.651705" elapsed="0.004681"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:41.657985" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:41.657669" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:41.658419" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:41.658182" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:41.658875" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:41.658629" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:41.659303" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:41.659065" elapsed="0.000281"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:41.660156" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:38:41.659963" elapsed="0.000219"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:38:41.660518" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:38:41.660343" 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-08-22T23:38:41.660712" elapsed="0.000198"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:41.661308" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:41.661063" elapsed="0.000289"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:38:41.661397" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:38:41.661553" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:38:41.659548" elapsed="0.002045"/>
</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-08-22T23:38:41.671702" level="INFO">POST Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Content-Length': '72', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:38:41.671870" level="INFO">POST Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:41.671974" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:41.663940" elapsed="0.008416">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:41.661664" elapsed="0.010777">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:41.672649" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:41.672474" elapsed="0.000245"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:41.661647" elapsed="0.011095">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:41.673104" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:41.673240" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:41.673203" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:41.673186" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:41.673443" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:41.673509" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:41.656734" elapsed="0.016894">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:41.673707" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:41.502494" elapsed="0.171308">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:41.674088" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:41.673912" elapsed="0.000242"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:41.673896" elapsed="0.000282"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:41.674211" elapsed="0.000014"/>
</return>
<arg>${directory_with_template_folders}${/}dataorig</arg>
<arg>${mapping}</arg>
<arg>session=node2</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:38:41.494117" elapsed="0.180186">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:42.714525" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:42.714116" elapsed="0.000445"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:42.715355" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:42.715089" elapsed="0.000348">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:42.715547" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:42.714752" elapsed="0.000843"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:42.716161" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:42.715775" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:38:42.716489" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:38:42.716667" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:38:42.716346" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:42.717094" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:42.716848" 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-08-22T23:38:42.718359" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:42.718093" elapsed="0.000312"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:38:42.718854" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:38:42.718563" elapsed="0.000317"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:38:42.719672" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:38:42.719250" elapsed="0.000450"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:38:42.720605" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:38:42.720229" elapsed="0.000404"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:38:42.720688" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:38:42.720851" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:38:42.719888" elapsed="0.000988"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:38:42.721028" elapsed="0.000289"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:38:42.719116" elapsed="0.002243"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:38:42.721954" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:38:42.721630" elapsed="0.000351"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:38:42.722863" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:38:42.722499" elapsed="0.000391"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:38:42.722940" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:38:42.723092" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:38:42.722163" elapsed="0.000954"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:38:42.723263" elapsed="0.000292"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:38:42.721475" elapsed="0.002152"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:38:42.718935" elapsed="0.004728"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:38:42.723707" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:38:42.723867" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:38:42.717764" elapsed="0.006129"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:42.717221" elapsed="0.006704"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:42.724145" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:42.723952" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:42.717195" elapsed="0.007029"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:38:42.724973" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:38:42.724365" elapsed="0.000636"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:38:42.725050" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:38:42.713478" elapsed="0.011697"/>
</kw>
<msg time="2026-08-22T23:38:42.725229" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:42.700961" elapsed="0.024314"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:42.738028" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:42.750959" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:42.763901" 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-08-22T23:38:42.764125" 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-08-22T23:38:42.764308" 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-08-22T23:38:42.764849" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:42.764681" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:42.764660" 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-08-22T23:38:42.765082" 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-08-22T23:38:42.765248" 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-08-22T23:38:42.765409" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:38:42.764515" elapsed="0.000945"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:38:42.764391" 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-08-22T23:38:42.765653" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:42.765733" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:38:42.765896" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:38:42.696735" elapsed="0.069191"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:42.792834" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:42.792299" elapsed="0.000580"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:42.793737" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:42.793453" elapsed="0.000364">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:42.793913" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:42.793097" elapsed="0.000841"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:42.794538" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:42.794123" elapsed="0.000467"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:38:42.794900" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:38:42.795086" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:38:42.794754" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:42.795564" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:42.795303" elapsed="0.000339"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:38:42.796153" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:42.795755" elapsed="0.000471"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:42.796750" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:42.796426" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:42.796267" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:42.795720" elapsed="0.001114"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:38:42.797543" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:38:42.796980" elapsed="0.000620"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:38:42.797673" elapsed="0.000045"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:38:42.791533" elapsed="0.006325"/>
</kw>
<msg time="2026-08-22T23:38:42.797931" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:42.778097" elapsed="0.019898"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:42.811225" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:42.827528" elapsed="0.000082"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:42.844795" 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-08-22T23:38:42.845105" 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-08-22T23:38:42.845293" 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-08-22T23:38:42.845883" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:42.845657" elapsed="0.000292"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:42.845622" elapsed="0.000356"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:42.846140" 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-08-22T23:38:42.846322" 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-08-22T23:38:42.846484" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:38:42.845541" elapsed="0.000995"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:38:42.845385" elapsed="0.001180"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:42.846744" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:42.846829" elapsed="0.000020"/>
</return>
<msg time="2026-08-22T23:38:42.847023" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:38:42.777087" elapsed="0.069969"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:42.848639" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:42.848302" elapsed="0.000419">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:42.848819" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:42.847831" elapsed="0.001012"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:42.849204" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:42.848914" elapsed="0.000350"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:42.849853" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:42.849469" elapsed="0.000410"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:42.849288" elapsed="0.000628"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:42.848895" elapsed="0.001042"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:42.852334" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:42.850090" elapsed="0.002278"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:38:42.852422" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:38:42.852596" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:38:42.847438" elapsed="0.005186"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:42.854295" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:42.854030" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:42.854861" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:42.854505" elapsed="0.000420"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:42.855471" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:42.855128" elapsed="0.000406"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:42.856130" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:42.855773" elapsed="0.000428"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:42.857321" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:38:42.857049" elapsed="0.000306"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:38:42.857832" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:38:42.857600" elapsed="0.000265"/>
</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-08-22T23:38:42.858062" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:42.858884" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:42.858546" elapsed="0.000396"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:38:42.858998" elapsed="0.000038"/>
</return>
<msg time="2026-08-22T23:38:42.859197" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:38:42.856490" elapsed="0.002740"/>
</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-08-22T23:38:42.870735" level="INFO">POST Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Content-Length': '72', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:38:42.871027" level="INFO">POST Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:42.871235" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:42.862474" elapsed="0.009510">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:42.859323" elapsed="0.012820">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:42.872512" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:42.872209" elapsed="0.000457"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:42.859299" elapsed="0.013413">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:42.873448" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:42.873668" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:42.873615" elapsed="0.000111"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:42.873561" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:42.873957" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:42.874060" elapsed="0.000024"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:42.853025" elapsed="0.021196">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:42.874428" elapsed="0.000029"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:42.685643" elapsed="0.188970">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:42.875066" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:42.874792" elapsed="0.000384"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:42.874765" elapsed="0.000455"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:42.875277" elapsed="0.000024"/>
</return>
<arg>${directory_with_template_folders}${/}dataorig</arg>
<arg>${mapping}</arg>
<arg>session=node2</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:38:42.675315" elapsed="0.200122">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:43.917250" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:43.916792" elapsed="0.000495"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:43.918116" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:43.917842" elapsed="0.000356">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:43.918294" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:43.917467" elapsed="0.000852"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:43.918891" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:43.918484" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:38:43.919261" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:38:43.919430" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:38:43.919112" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:43.919890" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:43.919638" 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-08-22T23:38:43.920944" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:43.920682" elapsed="0.000307"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:38:43.921423" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:38:43.921148" elapsed="0.000300"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:38:43.922202" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:38:43.921844" elapsed="0.000384"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:38:43.923159" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:38:43.922779" elapsed="0.000466"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:38:43.923303" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:38:43.923472" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:38:43.922411" elapsed="0.001086"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:38:43.923673" elapsed="0.000302"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:38:43.921708" elapsed="0.002311"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:38:43.924624" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:38:43.924267" elapsed="0.000385"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:38:43.925542" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:38:43.925183" elapsed="0.000386"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:38:43.925643" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:38:43.925800" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:38:43.924839" elapsed="0.000986"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:38:43.925975" elapsed="0.000277"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:38:43.924134" elapsed="0.002159"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:38:43.921510" elapsed="0.004819"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:38:43.926373" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:38:43.926532" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:38:43.920345" elapsed="0.006214"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:43.920020" elapsed="0.006596"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:43.926790" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:43.926643" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:43.919993" elapsed="0.006875"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:38:43.927641" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:38:43.927031" elapsed="0.000640"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:38:43.927720" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:38:43.916020" elapsed="0.011825"/>
</kw>
<msg time="2026-08-22T23:38:43.927900" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:43.900787" elapsed="0.027162"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:43.940473" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:43.952703" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:43.964864" 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-08-22T23:38:43.965097" 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-08-22T23:38:43.965269" 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-08-22T23:38:43.965647" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:43.965490" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:43.965475" 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-08-22T23:38:43.965885" 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-08-22T23:38:43.966053" 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-08-22T23:38:43.966217" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:38:43.965446" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:38:43.965345" 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-08-22T23:38:43.966473" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:43.966553" elapsed="0.000039"/>
</return>
<msg time="2026-08-22T23:38:43.966704" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:38:43.896546" elapsed="0.070184"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:43.991332" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:43.990945" elapsed="0.000417"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:43.992116" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:43.991876" elapsed="0.000314">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:43.992284" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:43.991523" elapsed="0.000786"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:43.992877" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:43.992471" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:38:43.993201" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:38:43.993373" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:38:43.993062" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:43.993823" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:43.993556" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:38:43.994258" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:43.993940" elapsed="0.000378"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:43.994812" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:43.994489" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:43.994344" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:43.993920" elapsed="0.000977"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:38:43.995487" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:38:43.995043" elapsed="0.000522"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:38:43.995651" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:38:43.990261" elapsed="0.005532"/>
</kw>
<msg time="2026-08-22T23:38:43.995851" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:43.977680" elapsed="0.018218"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:44.008419" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:44.020723" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:44.032880" 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-08-22T23:38:44.033072" 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-08-22T23:38:44.033242" 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-08-22T23:38:44.033655" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:44.033469" elapsed="0.000248"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:44.033454" elapsed="0.000287"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:44.033881" 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-08-22T23:38:44.034044" 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-08-22T23:38:44.034204" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:38:44.033424" elapsed="0.000832"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:38:44.033320" elapsed="0.000964"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:44.034427" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:44.034501" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:38:44.034634" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:38:43.976791" elapsed="0.057872"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:44.035960" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:44.035719" elapsed="0.000308">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:44.036119" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:44.035359" 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-08-22T23:38:44.036456" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:44.036212" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:44.037023" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:44.036731" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:44.036536" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:44.036194" elapsed="0.000912"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:44.039545" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:44.037252" elapsed="0.002320"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:38:44.039638" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:38:44.039794" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:38:44.035034" elapsed="0.004784"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:44.041334" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:44.041073" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:44.041806" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:44.041541" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:44.042243" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:44.042000" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:44.042687" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:44.042432" elapsed="0.000298"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:44.043523" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:38:44.043324" elapsed="0.000225"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:38:44.043891" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:38:44.043715" elapsed="0.000201"/>
</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-08-22T23:38:44.044061" elapsed="0.000206"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:44.044690" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:44.044429" elapsed="0.000305"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:38:44.044777" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:38:44.044930" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:38:44.042926" elapsed="0.002029"/>
</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-08-22T23:38:44.054611" level="INFO">POST Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Content-Length': '72', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:38:44.054787" level="INFO">POST Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:44.054906" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:44.047291" elapsed="0.008023">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:44.045023" elapsed="0.010376">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:44.055609" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:44.055432" elapsed="0.000245"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:44.045006" elapsed="0.010696">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:44.056071" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:44.056207" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:44.056170" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:44.056153" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:44.056411" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:44.056478" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:44.040140" elapsed="0.016463">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:44.056684" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:43.885517" elapsed="0.171261">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:44.057068" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:44.056891" elapsed="0.000245"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:44.056874" elapsed="0.000286"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:44.057193" elapsed="0.000015"/>
</return>
<arg>${directory_with_template_folders}${/}dataorig</arg>
<arg>${mapping}</arg>
<arg>session=node2</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:38:43.876452" elapsed="0.180865">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:45.096545" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:45.096148" elapsed="0.000447"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:45.097390" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:45.097117" elapsed="0.000352">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:45.097565" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:45.096768" elapsed="0.000842"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:45.098160" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:45.097774" elapsed="0.000547"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:38:45.098654" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:38:45.098813" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:38:45.098490" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:45.099248" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:45.099000" 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-08-22T23:38:45.100497" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:45.100234" elapsed="0.000310"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:38:45.100996" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:38:45.100721" elapsed="0.000302"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:38:45.101789" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:38:45.101411" elapsed="0.000405"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:38:45.102724" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:38:45.102341" elapsed="0.000410"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:38:45.102807" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:38:45.102970" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:38:45.102001" elapsed="0.000994"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:38:45.103147" elapsed="0.000307"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:38:45.101278" elapsed="0.002218"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:38:45.104080" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:38:45.103755" elapsed="0.000351"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:38:45.105002" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:38:45.104653" elapsed="0.000387"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:38:45.105090" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:38:45.105240" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:38:45.104288" elapsed="0.000978"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:38:45.105412" elapsed="0.000304"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:38:45.103625" elapsed="0.002132"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:38:45.101098" elapsed="0.004694"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:38:45.105836" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:38:45.105991" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:38:45.099690" elapsed="0.006327"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:45.099372" elapsed="0.006676"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:45.106220" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:45.106075" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:45.099348" elapsed="0.006947"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:38:45.107047" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:38:45.106443" elapsed="0.000632"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:38:45.107123" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:38:45.095523" elapsed="0.011723"/>
</kw>
<msg time="2026-08-22T23:38:45.107387" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:45.082918" elapsed="0.024522"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:45.119794" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:45.132107" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:45.144486" 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-08-22T23:38:45.144714" 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-08-22T23:38:45.144891" 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-08-22T23:38:45.145253" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:45.145111" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:45.145097" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:45.145469" 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-08-22T23:38:45.145651" 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-08-22T23:38:45.145815" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:38:45.145069" elapsed="0.000799"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:38:45.144966" elapsed="0.000927"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:45.146036" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:45.146113" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:38:45.146232" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:38:45.078568" elapsed="0.067690"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:45.170677" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:45.170284" elapsed="0.000421"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:45.171407" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:45.171198" elapsed="0.000273">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:45.171616" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:45.170865" elapsed="0.000778"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:45.172192" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:45.171805" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:38:45.172531" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:38:45.172678" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:38:45.172391" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:45.173108" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:45.172863" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:38:45.173507" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:45.173222" elapsed="0.000344"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:45.174047" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:45.173752" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:45.173607" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:45.173203" elapsed="0.000927"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:38:45.174719" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:38:45.174271" elapsed="0.000476"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:38:45.174796" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:38:45.169676" elapsed="0.005244"/>
</kw>
<msg time="2026-08-22T23:38:45.174972" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:45.157186" elapsed="0.017832"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:45.187528" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:45.199813" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:45.212115" 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-08-22T23:38:45.212306" 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-08-22T23:38:45.212477" 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-08-22T23:38:45.212903" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:45.212759" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:45.212744" 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-08-22T23:38:45.213122" 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-08-22T23:38:45.213285" 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-08-22T23:38:45.213447" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:38:45.212716" elapsed="0.000785"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:38:45.212609" elapsed="0.000917"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:45.213686" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:45.213762" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:38:45.213879" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:38:45.156296" elapsed="0.057611"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:45.215159" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:45.214915" elapsed="0.000307">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:45.215314" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:45.214558" elapsed="0.000781"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:45.215672" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:45.215408" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:45.216248" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:45.215953" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:45.215754" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:45.215390" elapsed="0.000940"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:45.218685" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:45.216479" elapsed="0.002232"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:38:45.218762" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:38:45.218915" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:38:45.214237" elapsed="0.004702"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:45.220549" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:45.220293" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:45.221004" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:45.220765" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:45.221436" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:45.221196" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:45.221881" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:45.221641" elapsed="0.000283"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:45.222732" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:38:45.222519" elapsed="0.000239"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:38:45.223135" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:38:45.222956" 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-08-22T23:38:45.223307" elapsed="0.000198"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:45.223943" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:45.223679" elapsed="0.000309"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:38:45.224031" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:38:45.224188" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:38:45.222120" elapsed="0.002093"/>
</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-08-22T23:38:45.233916" level="INFO">POST Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Content-Length': '72', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:38:45.234075" level="INFO">POST Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:45.234177" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:45.226530" elapsed="0.008014">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:45.224282" elapsed="0.010367">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:45.234841" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:45.234684" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:45.224265" elapsed="0.010668">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:45.235302" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:45.235439" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:45.235401" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:45.235384" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:45.235673" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:45.235742" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:45.219265" elapsed="0.016582">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:45.235928" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:45.067501" elapsed="0.168521">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:45.236348" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:45.236169" elapsed="0.000246"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:45.236151" elapsed="0.000288"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:45.236473" elapsed="0.000015"/>
</return>
<arg>${directory_with_template_folders}${/}dataorig</arg>
<arg>${mapping}</arg>
<arg>session=node2</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:38:45.058331" elapsed="0.178237">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:46.276512" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:46.276095" elapsed="0.000460"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:46.277388" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:46.277089" elapsed="0.000387">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:46.277592" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:46.276751" elapsed="0.000867"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:46.278168" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:46.277784" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:38:46.278498" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:38:46.278689" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:38:46.278352" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:46.279120" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:46.278874" 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-08-22T23:38:46.280443" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:46.280180" elapsed="0.000309"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:38:46.280945" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:38:46.280666" elapsed="0.000304"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:38:46.281771" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:38:46.281391" elapsed="0.000406"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:38:46.282748" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:38:46.282330" elapsed="0.000445"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:38:46.282832" elapsed="0.000038"/>
</return>
<msg time="2026-08-22T23:38:46.283004" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:38:46.281985" elapsed="0.001044"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:38:46.283182" elapsed="0.000301"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:38:46.281251" elapsed="0.002273"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:38:46.284115" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:38:46.283794" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:38:46.285028" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:38:46.284686" elapsed="0.000392"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:38:46.285128" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:38:46.285342" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:38:46.284323" elapsed="0.001044"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:38:46.285519" elapsed="0.000307"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:38:46.283663" elapsed="0.002205"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:38:46.281032" elapsed="0.004871"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:38:46.285949" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:38:46.286108" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:38:46.279851" elapsed="0.006283"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:46.279252" elapsed="0.006914"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:46.286340" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:46.286193" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:46.279225" elapsed="0.007192"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:38:46.287172" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:38:46.286558" elapsed="0.000642"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:38:46.287249" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:38:46.275467" elapsed="0.011905"/>
</kw>
<msg time="2026-08-22T23:38:46.287426" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:46.262923" elapsed="0.024550"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:46.299783" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:46.312139" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:46.324227" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:46.324427" 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-08-22T23:38:46.324618" 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-08-22T23:38:46.325019" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:46.324874" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:46.324856" 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-08-22T23:38:46.325236" 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-08-22T23:38:46.325397" 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-08-22T23:38:46.325642" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:38:46.324823" elapsed="0.000875"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:38:46.324713" 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-08-22T23:38:46.325875" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:46.325953" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:38:46.326095" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:38:46.258638" elapsed="0.067484"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:46.350822" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:46.350414" elapsed="0.000437"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:46.351632" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:46.351347" elapsed="0.000368">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:46.351810" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:46.351013" elapsed="0.000820"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:46.352372" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:46.351993" elapsed="0.000420"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:38:46.352737" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:38:46.352899" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:38:46.352592" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:46.353329" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:46.353083" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:38:46.353766" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:46.353447" elapsed="0.000378"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:46.354287" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:46.353993" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:46.353850" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:46.353428" elapsed="0.000942"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:38:46.354986" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:38:46.354513" elapsed="0.000501"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:38:46.355065" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:38:46.349801" elapsed="0.005393"/>
</kw>
<msg time="2026-08-22T23:38:46.355248" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:46.337221" elapsed="0.018074"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:46.367618" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:46.379745" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:46.391802" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:46.391999" 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-08-22T23:38:46.392202" 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-08-22T23:38:46.392627" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:46.392457" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:46.392440" 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-08-22T23:38:46.392851" 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-08-22T23:38:46.393013" 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-08-22T23:38:46.393173" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:38:46.392405" elapsed="0.000820"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:38:46.392290" elapsed="0.000963"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:46.393397" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:46.393473" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:38:46.393620" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:38:46.336304" elapsed="0.057346"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:46.395000" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:46.394712" elapsed="0.000366">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:46.395170" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:46.394330" 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-08-22T23:38:46.395516" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:46.395264" elapsed="0.000379"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:46.396170" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:46.395860" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:46.395672" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:46.395246" elapsed="0.001007"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:46.398602" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:46.396402" elapsed="0.002228"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:38:46.398680" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:38:46.398835" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:38:46.393987" elapsed="0.004873"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:46.400401" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:46.400148" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:46.400915" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:46.400616" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:46.401354" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:46.401110" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:46.401801" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:46.401543" elapsed="0.000302"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:46.402678" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:38:46.402446" elapsed="0.000259"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:38:46.403032" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:38:46.402854" 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-08-22T23:38:46.403204" elapsed="0.000216"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:46.403843" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:46.403590" elapsed="0.000320"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:38:46.403955" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:38:46.404110" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:38:46.402043" elapsed="0.002093"/>
</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-08-22T23:38:46.413886" level="INFO">POST Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Content-Length': '72', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:38:46.414077" level="INFO">POST Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:46.414185" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:46.406447" elapsed="0.008187">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:46.404204" elapsed="0.010558">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:46.415044" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:46.414812" elapsed="0.000332"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:46.404187" elapsed="0.010994">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:46.415840" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:46.416046" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:46.415989" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:46.415964" elapsed="0.000175"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:46.416354" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:46.416454" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:46.399186" elapsed="0.017444">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:46.416752" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:46.246163" elapsed="0.170732">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:46.417332" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:46.417066" elapsed="0.000368"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:46.417042" elapsed="0.000428"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:46.417520" elapsed="0.000021"/>
</return>
<arg>${directory_with_template_folders}${/}dataorig</arg>
<arg>${mapping}</arg>
<arg>session=node2</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:38:46.237720" elapsed="0.179965">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:47.459083" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:47.458634" elapsed="0.000484"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:47.459913" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:47.459653" elapsed="0.000337">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:47.460085" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:47.459292" elapsed="0.000818"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:47.460678" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:47.460272" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:38:47.461007" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:38:47.461177" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:38:47.460864" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:47.461629" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:47.461359" 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-08-22T23:38:47.462807" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:47.462493" elapsed="0.000360"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:38:47.463284" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:38:47.463011" elapsed="0.000299"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:38:47.464047" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:38:47.463689" elapsed="0.000384"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:38:47.464991" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:38:47.464636" elapsed="0.000382"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:38:47.465073" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:38:47.465236" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:38:47.464258" elapsed="0.001003"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:38:47.465412" elapsed="0.000314"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:38:47.463538" elapsed="0.002230"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:38:47.466335" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:38:47.466011" elapsed="0.000350"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:38:47.467280" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:38:47.466934" elapsed="0.000373"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:38:47.467358" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:38:47.467510" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:38:47.466545" elapsed="0.000990"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:38:47.467709" elapsed="0.000275"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:38:47.465881" elapsed="0.002145"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:38:47.463364" elapsed="0.004696"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:38:47.468103" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:38:47.468261" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:38:47.462166" elapsed="0.006121"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:47.461816" elapsed="0.006526"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:47.468520" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:47.468369" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:47.461792" elapsed="0.006831"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:38:47.469350" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:38:47.468767" elapsed="0.000612"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:38:47.469429" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:38:47.457900" elapsed="0.011655"/>
</kw>
<msg time="2026-08-22T23:38:47.469639" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:47.443675" elapsed="0.026017"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:47.482305" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:47.494708" elapsed="0.000097"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:47.507029" 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-08-22T23:38:47.507239" 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-08-22T23:38:47.507414" 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-08-22T23:38:47.507851" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:47.507697" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:47.507679" elapsed="0.000336"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:47.508163" 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-08-22T23:38:47.508330" 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-08-22T23:38:47.508493" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:38:47.507631" elapsed="0.000918"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:38:47.507498" elapsed="0.001098"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:47.508749" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:47.508827" elapsed="0.000018"/>
</return>
<msg time="2026-08-22T23:38:47.508972" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:38:47.439415" elapsed="0.069585"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:47.533804" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:47.533392" elapsed="0.000442"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:47.534676" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:47.534367" elapsed="0.000391">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:47.534854" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:47.533997" elapsed="0.000882"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:47.535424" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:47.535041" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:38:47.535768" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:38:47.535987" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:38:47.535625" elapsed="0.000432"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:47.536464" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:47.536217" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:38:47.536898" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:47.536597" elapsed="0.000360"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:47.537425" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:47.537127" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:47.536982" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:47.536561" elapsed="0.000950"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:38:47.538149" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:38:47.537679" elapsed="0.000502"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:38:47.538232" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:38:47.532772" elapsed="0.005589"/>
</kw>
<msg time="2026-08-22T23:38:47.538416" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:47.520147" elapsed="0.018315"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:47.551142" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:47.563489" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:47.575730" 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-08-22T23:38:47.575922" 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-08-22T23:38:47.576092" 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-08-22T23:38:47.576458" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:47.576314" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:47.576300" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:47.576698" 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-08-22T23:38:47.576866" 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-08-22T23:38:47.577028" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:38:47.576271" elapsed="0.000810"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:38:47.576169" 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-08-22T23:38:47.577292" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:47.577368" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:38:47.577486" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:38:47.519230" elapsed="0.058284"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:47.578794" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:47.578539" elapsed="0.000322">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:47.578954" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:47.578202" 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-08-22T23:38:47.579293" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:47.579049" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:47.579860" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:47.579550" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:47.579373" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:47.579031" elapsed="0.000913"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:47.582302" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:47.580091" elapsed="0.002237"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:38:47.582380" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:38:47.582533" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:38:47.577877" elapsed="0.004682"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:47.584101" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:47.583846" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:47.584545" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:47.584306" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:47.585002" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:47.584759" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:47.585433" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:47.585193" elapsed="0.000283"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:47.586309" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:38:47.586106" elapsed="0.000229"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:38:47.586678" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:38:47.586486" 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-08-22T23:38:47.586853" elapsed="0.000216"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:47.587465" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:47.587221" elapsed="0.000289"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:38:47.587558" elapsed="0.000042"/>
</return>
<msg time="2026-08-22T23:38:47.587730" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:38:47.585690" elapsed="0.002065"/>
</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-08-22T23:38:47.597960" level="INFO">POST Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Content-Length': '72', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:38:47.598150" level="INFO">POST Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:47.598268" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:47.590130" elapsed="0.008557">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:47.587825" elapsed="0.010948">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:47.598964" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:47.598807" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:47.587808" elapsed="0.011248">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:47.599425" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:47.599564" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:47.599525" elapsed="0.000100"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:47.599508" elapsed="0.000139"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:47.599790" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:47.599857" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:47.582904" elapsed="0.017057">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:47.600041" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:47.428230" elapsed="0.171906">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:47.600428" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:47.600249" elapsed="0.000248"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:47.600233" elapsed="0.000288"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:47.600555" elapsed="0.000014"/>
</return>
<arg>${directory_with_template_folders}${/}dataorig</arg>
<arg>${mapping}</arg>
<arg>session=node2</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:38:47.418930" elapsed="0.181736">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:48.642627" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:48.642213" elapsed="0.000447"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:48.643532" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:48.643273" elapsed="0.000353">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:48.643722" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:48.642931" elapsed="0.000816"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:48.644291" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:48.643908" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:38:48.644630" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:38:48.644788" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:38:48.644476" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:48.645216" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:48.644968" 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-08-22T23:38:48.646451" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:48.646191" elapsed="0.000307"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:38:48.646950" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:38:48.646674" elapsed="0.000302"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:38:48.647744" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:38:48.647340" elapsed="0.000431"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:38:48.648675" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:38:48.648300" elapsed="0.000402"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:38:48.648754" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:38:48.648913" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:38:48.647959" elapsed="0.000979"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:38:48.649095" elapsed="0.000290"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:38:48.647206" elapsed="0.002221"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:38:48.650055" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:38:48.649695" elapsed="0.000387"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:38:48.651009" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:38:48.650644" elapsed="0.000392"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:38:48.651086" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:38:48.651236" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:38:48.650264" elapsed="0.001001"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:38:48.651414" elapsed="0.000341"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:38:48.649541" elapsed="0.002256"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:38:48.647030" elapsed="0.004800"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:38:48.651874" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:38:48.652031" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:38:48.645647" elapsed="0.006409"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:48.645335" elapsed="0.006753"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:48.652384" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:48.652113" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:48.645314" elapsed="0.007150"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:38:48.653216" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:38:48.652633" elapsed="0.000611"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:38:48.653293" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:38:48.641564" elapsed="0.011851"/>
</kw>
<msg time="2026-08-22T23:38:48.653470" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:48.628857" elapsed="0.024660"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:48.665844" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:48.678149" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:48.690554" elapsed="0.000038"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:48.690759" 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-08-22T23:38:48.690931" 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-08-22T23:38:48.691296" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:48.691152" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:48.691138" 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-08-22T23:38:48.691514" 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-08-22T23:38:48.691694" 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-08-22T23:38:48.691858" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:38:48.691110" elapsed="0.000800"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:38:48.691007" 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-08-22T23:38:48.692078" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:48.692153" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:38:48.692272" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:38:48.624546" elapsed="0.067752"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:48.716972" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:48.716599" elapsed="0.000402"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:48.717755" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:48.717519" elapsed="0.000300">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:48.717913" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:48.717165" elapsed="0.000772"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:48.718483" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:48.718096" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:38:48.718818" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:38:48.718949" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:38:48.718683" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:48.719376" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:48.719133" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:38:48.719795" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:48.719490" elapsed="0.000364"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:48.720313" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:48.720022" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:48.719878" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:48.719471" elapsed="0.000925"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:38:48.720990" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:38:48.720538" elapsed="0.000480"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:38:48.721067" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:38:48.715973" elapsed="0.005217"/>
</kw>
<msg time="2026-08-22T23:38:48.721243" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:48.703256" elapsed="0.018032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:48.734015" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:48.746263" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:48.758897" 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-08-22T23:38:48.759106" 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-08-22T23:38:48.759307" 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-08-22T23:38:48.759691" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:48.759526" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:48.759512" 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-08-22T23:38:48.759941" 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-08-22T23:38:48.760106" 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-08-22T23:38:48.760268" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:38:48.759484" elapsed="0.000836"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:38:48.759382" elapsed="0.000963"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:48.760487" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:48.760561" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:38:48.760695" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:38:48.702403" elapsed="0.058319"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:48.761996" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:48.761761" elapsed="0.000297">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:48.762150" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:48.761398" 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-08-22T23:38:48.762494" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:48.762245" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:48.763059" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:48.762766" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:48.762589" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:48.762227" elapsed="0.000915"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:48.765480" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:48.763290" elapsed="0.002216"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:38:48.765558" elapsed="0.000046"/>
</return>
<msg time="2026-08-22T23:38:48.765730" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:38:48.761053" elapsed="0.004702"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:48.767302" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:48.767055" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:48.767757" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:48.767499" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:48.768195" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:48.767951" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:48.768649" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:48.768385" elapsed="0.000309"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:48.769511" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:38:48.769318" elapsed="0.000219"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:38:48.769886" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:38:48.769710" 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-08-22T23:38:48.770056" elapsed="0.000196"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:48.770671" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:48.770409" elapsed="0.000306"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:38:48.770758" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:38:48.770912" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:38:48.768893" 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-08-22T23:38:48.781639" level="INFO">POST Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Content-Length': '72', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:38:48.781844" level="INFO">POST Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:48.781984" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:48.773251" elapsed="0.009219">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:48.771006" elapsed="0.011601">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:48.782871" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:48.782655" elapsed="0.000313"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:48.770989" elapsed="0.012013">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:48.783508" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:48.783728" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:48.783675" elapsed="0.000111"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:48.783650" elapsed="0.000166"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:48.784014" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:48.784109" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:48.766112" elapsed="0.018140">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:48.784414" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:48.611741" elapsed="0.172809">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:48.784994" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:48.784730" elapsed="0.000359"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:48.784706" elapsed="0.000418"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:48.785171" elapsed="0.000020"/>
</return>
<arg>${directory_with_template_folders}${/}dataorig</arg>
<arg>${mapping}</arg>
<arg>session=node2</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:38:48.601485" elapsed="0.183818">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:49.825374" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:49.824967" elapsed="0.000451"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:49.826233" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:49.825950" elapsed="0.000378">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:49.826424" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:49.825608" elapsed="0.000841"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:49.827021" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:49.826630" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:38:49.827351" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:38:49.827605" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:38:49.827209" elapsed="0.000424"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:49.828036" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:49.827790" 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-08-22T23:38:49.829318" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:49.829060" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:38:49.829822" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:38:49.829523" elapsed="0.000325"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:38:49.830645" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:38:49.830228" elapsed="0.000449"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:38:49.831637" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:38:49.831255" elapsed="0.000471"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:38:49.831785" elapsed="0.000038"/>
</return>
<msg time="2026-08-22T23:38:49.831964" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:38:49.830881" elapsed="0.001108"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:38:49.832141" elapsed="0.000311"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:38:49.830092" elapsed="0.002402"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:38:49.833125" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:38:49.832794" elapsed="0.000357"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:38:49.834035" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:38:49.833689" elapsed="0.000372"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:38:49.834111" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:38:49.834279" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:38:49.833334" elapsed="0.000972"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:38:49.834455" elapsed="0.000307"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:38:49.832633" elapsed="0.002170"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:38:49.829908" elapsed="0.004930"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:38:49.834883" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:38:49.835040" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:38:49.828733" elapsed="0.006333"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:49.828166" elapsed="0.006933"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:49.835271" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:49.835125" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:49.828141" elapsed="0.007207"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:38:49.836131" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:38:49.835497" elapsed="0.000661"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:38:49.836207" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:38:49.824297" elapsed="0.012033"/>
</kw>
<msg time="2026-08-22T23:38:49.836384" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:49.811561" elapsed="0.024870"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:49.848649" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:49.861129" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:49.873466" 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-08-22T23:38:49.873714" 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-08-22T23:38:49.873888" 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-08-22T23:38:49.874268" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:49.874123" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:49.874109" 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-08-22T23:38:49.874483" 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-08-22T23:38:49.874686" 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-08-22T23:38:49.874861" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:38:49.874080" elapsed="0.000833"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:38:49.873964" 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-08-22T23:38:49.875083" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:49.875158" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:38:49.875278" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:38:49.807193" elapsed="0.068111"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:49.899544" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:49.899172" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:49.900331" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:49.900120" elapsed="0.000276">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:49.900488" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:49.899788" elapsed="0.000724"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:49.901071" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:49.900687" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:38:49.901387" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:38:49.901516" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:38:49.901253" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:49.901997" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:49.901714" elapsed="0.000331"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:38:49.902402" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:49.902112" elapsed="0.000349"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:49.902944" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:49.902644" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:49.902485" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:49.902094" elapsed="0.000934"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:38:49.903619" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:38:49.903169" elapsed="0.000517"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:38:49.903737" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:38:49.898549" elapsed="0.005315"/>
</kw>
<msg time="2026-08-22T23:38:49.903917" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:38:49.886149" elapsed="0.017814"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:49.916233" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:49.928572" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:49.940789" 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-08-22T23:38:49.940982" 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-08-22T23:38:49.941156" 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-08-22T23:38:49.941521" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:49.941379" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:49.941364" 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-08-22T23:38:49.941777" 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-08-22T23:38:49.941942" 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-08-22T23:38:49.942102" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:38:49.941336" elapsed="0.000819"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:38:49.941232" 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-08-22T23:38:49.942425" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:49.942503" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:38:49.942639" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:38:49.885286" elapsed="0.057381"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:38:49.943973" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:38:49.943729" elapsed="0.000310">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:38:49.944132" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:38:49.943371" elapsed="0.000786"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:49.944469" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:49.944226" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:49.945042" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:49.944747" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:49.944549" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:49.944208" elapsed="0.000917"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:49.947446" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:49.945281" elapsed="0.002192"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:38:49.947524" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:38:49.947699" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:38:49.943040" elapsed="0.004684"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:49.949238" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:49.948988" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:49.949744" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:49.949440" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:49.950184" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:49.949940" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:49.950638" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:49.950375" elapsed="0.000308"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:49.951499" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:38:49.951294" elapsed="0.000230"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:38:49.951869" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:38:49.951692" 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-08-22T23:38:49.952038" elapsed="0.000199"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:49.952649" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:49.952388" elapsed="0.000306"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:38:49.952736" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:38:49.952893" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:38:49.950883" 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-08-22T23:38:49.962539" level="INFO">POST Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Content-Length': '72', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:38:49.962745" level="INFO">POST Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:49.962852" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:49.955237" elapsed="0.008028">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:49.952986" elapsed="0.010365">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:49.963541" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:49.963385" elapsed="0.000243"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:49.952969" elapsed="0.010684">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:49.964024" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:49.964162" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:49.964124" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:49.964107" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:49.964366" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:49.964434" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:49.948056" elapsed="0.016482">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:49.964636" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:49.796169" elapsed="0.168563">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:49.965024" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:49.964846" elapsed="0.000245"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:49.964829" elapsed="0.000286"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:49.965148" elapsed="0.000015"/>
</return>
<arg>${directory_with_template_folders}${/}dataorig</arg>
<arg>${mapping}</arg>
<arg>session=node2</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:38:49.786379" elapsed="0.178865">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<msg time="2026-08-22T23:38:49.965345" level="FAIL">Keyword 'TemplatedRequests.Post_As_Xml_Templated' failed after retrying for 15 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<arg>${MASTER_CONNECT_TIMEOUT}</arg>
<arg>1s</arg>
<arg>TemplatedRequests.Post_As_Xml_Templated</arg>
<arg>${directory_with_template_folders}${/}dataorig</arg>
<arg>${mapping}</arg>
<arg>session=node2</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:38:34.391260" elapsed="15.574182">Keyword 'TemplatedRequests.Post_As_Xml_Templated' failed after retrying for 15 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<doc>Check that the create requests work when node 1 is down.
As ODL may be in the process of connecting possible new master to the device,
the action is retried few times.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-08-22T23:38:24.161890" elapsed="25.803780">Keyword 'TemplatedRequests.Post_As_Xml_Templated' failed after retrying for 15 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</test>
<test id="s1-s6-t8" name="Check_New_Device_Data_Is_Visible_On_Nodes_Without_node1" line="107">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:38:49.969897" elapsed="0.000283"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:38:49.969621" elapsed="0.000757"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:38:49.971817" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:49.971659" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:49.971631" elapsed="0.000281"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:38:49.980513" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:49.980364" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:49.980338" elapsed="0.000290"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:38:49.981924" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:38:49.981498" elapsed="0.000453"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:38:49.982410" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:38:49.982106" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:38:49.982480" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:38:49.982656" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:38:49.980940" elapsed="0.001741"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:38:49.988029" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:49.987921" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:49.987902" 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-08-22T23:38:49.989260" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:49.989148" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:49.989130" elapsed="0.000208"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:49.989813" level="INFO">${karaf_connection_index} = 45</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:38:49.989481" elapsed="0.000359"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:38:49.990225" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:38:49.989997" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:38:49.991022" 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-08-22T23:38:49.990757" elapsed="0.000903">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-08-22T23:38:49.991857" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-08-22T23:38:49.991903" 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-08-22T23:38:49.990405" elapsed="0.001521"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:38:49.992696" 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-08-22T23:38:49.992426" elapsed="0.000943">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-08-22T23:38:49.993556" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-08-22T23:38:49.993629" 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-08-22T23:38:49.992091" elapsed="0.001563"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-08-22T23:38:49.994571" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_New_Device_Data_Is_Visible_On_Nodes_Without_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-08-22T23:38:49.993946" elapsed="0.000723">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_New_Device_Data_Is_Visible_On_Nodes_Without_node1"</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:49.993729" elapsed="0.001006">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_New_Device_Data_Is_Visible_On_Nodes_Without_node1"</status>
</branch>
<status status="FAIL" start="2026-08-22T23:38:49.993710" elapsed="0.001200">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_New_Device_Data_Is_Visible_On_Nodes_Without_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-08-22T23:38:49.995071" 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-08-22T23:38:49.995296" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:49.995158" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:49.995141" elapsed="0.000265"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-08-22T23:38:49.995440" 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-08-22T23:38:49.998133" elapsed="0.000147"/>
</kw>
<msg time="2026-08-22T23:38:49.998342" 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-08-22T23:38:49.996937" 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-08-22T23:38:49.998805" elapsed="0.000081"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:49.999281" 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-08-22T23:38:49.996280" elapsed="0.003194"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:38:49.995732" 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-08-22T23:38:49.988844" elapsed="0.010796">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_New_Device_Data_Is_Visible_On_Nodes_Without_node1"</status>
</kw>
<msg time="2026-08-22T23:38:49.999742" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:38:49.999785" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_New_Device_Data_Is_Visible_On_Nodes_Without_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-08-22T23:38:49.988245" elapsed="0.011563"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:38:49.999992" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:49.999883" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:49.999865" 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-08-22T23:38:50.000915" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:50.000811" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:50.000793" elapsed="0.000188"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:38:50.001272" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:38:50.001376" level="INFO">${current_ssh_connection_object} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:38:50.001132" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:50.001889" level="INFO">{1: 45, 2: 35, 3: 36}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:50.001555" elapsed="0.000380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:50.002323" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:50.002083" 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-08-22T23:38:50.002896" elapsed="0.000257"/>
</kw>
<msg time="2026-08-22T23:38:50.003251" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:38:50.003297" level="INFO">${old_connection_index} = 45</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-08-22T23:38:50.002521" 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-08-22T23:38:50.004153" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:38:50.005442" 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-08-22T23:38:50.005005" elapsed="0.001317">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-08-22T23:38:50.004512" elapsed="0.001907"/>
</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-08-22T23:38:50.007080" elapsed="0.000285"/>
</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-08-22T23:38:50.006618" elapsed="0.000832"/>
</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-08-22T23:38:50.003638" elapsed="0.003858"/>
</kw>
<status status="PASS" start="2026-08-22T23:38:50.003395" elapsed="0.004149"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:50.003376" elapsed="0.004193"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:50.008422" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:38:50.008115" elapsed="0.000369"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:38:50.008533" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:38:50.008753" level="INFO">${odl_ip} = 10.30.170.200</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:38:50.007795" elapsed="0.000982"/>
</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-08-22T23:38:50.008927" elapsed="0.000444"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:38:50.009726" level="INFO">index=46
host=10.30.170.200
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-08-22T23:38:50.009827" level="INFO">${karaf_connection_object} = index=46
host=10.30.170.200
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-08-22T23:38:50.009536" elapsed="0.000317"/>
</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-08-22T23:38:50.009997" elapsed="0.002404"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:38:50.012842" level="INFO">Logging into '10.30.170.200:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:38:50.015128" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.200</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-08-22T23:38:50.012563" elapsed="0.002938">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.200</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-08-22T23:38:50.032823" elapsed="0.000490"/>
</kw>
<msg time="2026-08-22T23:38:50.033418" 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-08-22T23:38:50.031367" elapsed="0.002201"/>
</kw>
<kw name="Open 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-08-22T23:38:50.033747" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:50.033907" 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-08-22T23:38:50.016574" elapsed="0.017414"/>
</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-08-22T23:38:50.015868" elapsed="0.018166"/>
</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-08-22T23:38:50.000445" elapsed="0.033668">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.200</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-08-22T23:38:50.034441" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:38:50.034514" 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-08-22T23:38:49.987569" elapsed="0.047130">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.200</status>
</kw>
<msg time="2026-08-22T23:38:50.034815" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:38:50.034868" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.200</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:38:49.983044" elapsed="0.051853"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:50.035235" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:50.034987" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:50.034967" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:38:49.982906" elapsed="0.052429"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:38:50.040846" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:50.040738" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:50.040718" 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-08-22T23:38:50.042145" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:50.042037" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:50.042019" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:50.042696" level="INFO">${karaf_connection_index} = 35</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:38:50.042353" elapsed="0.000426"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:38:50.043163" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:38:50.042941" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:38:50.078973" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:38:50.043730" elapsed="0.035342"/>
</kw>
<msg time="2026-08-22T23:38:50.079247" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:38:50.079293" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:38:50.043347" elapsed="0.035983"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:38:50.110163" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "N "o "d "e "s "_ "W "i "t "h "o "u "t "_ "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-08-22T23:38:50.079861" elapsed="0.030711"/>
</kw>
<msg time="2026-08-22T23:38:50.111079" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:38:50.111188" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:38:50.079497" elapsed="0.031777"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:50.112230" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:50.111510" elapsed="0.000853"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:50.111442" elapsed="0.000980"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:50.113681" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "N "o "d "e "s "_ "W "i "t "h "o "u "t "_ "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-08-22T23:38:50.112817" elapsed="0.001036"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:50.114497" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:50.114007" elapsed="0.000646"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:50.113966" elapsed="0.000742"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:38:50.114793" 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">
<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-08-22T23:38:50.119401" elapsed="0.000158"/>
</kw>
<msg time="2026-08-22T23:38:50.119647" 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-08-22T23:38:50.118231" elapsed="0.001566"/>
</kw>
<kw name="Open 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-08-22T23:38:50.120078" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:50.120418" 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-08-22T23:38:50.117415" elapsed="0.003233"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:38:50.115456" elapsed="0.005264"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:38:50.041703" elapsed="0.079116"/>
</kw>
<msg time="2026-08-22T23:38:50.120915" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:38:50.120960" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:38:50.041075" elapsed="0.079923"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:38:50.121183" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:38:50.121076" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:50.121058" 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-08-22T23:38:50.121698" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:50.122037" elapsed="0.000081"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:38:50.122169" 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-08-22T23:38:50.040384" elapsed="0.081897"/>
</kw>
<msg time="2026-08-22T23:38:50.122378" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:38:50.122422" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:38:50.035608" elapsed="0.086850"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:50.122806" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:50.122534" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:50.122517" elapsed="0.000367"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:38:50.035457" elapsed="0.087452"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:38:50.128472" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:50.128363" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:50.128344" elapsed="0.000329"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:38:50.129833" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:50.129724" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:50.129706" elapsed="0.000209"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:38:50.130372" level="INFO">${karaf_connection_index} = 36</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:38:50.130061" elapsed="0.000338"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:38:50.130850" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:38:50.130553" elapsed="0.000324"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:38:50.169091" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:38:50.131372" elapsed="0.037836"/>
</kw>
<msg time="2026-08-22T23:38:50.169381" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:38:50.169427" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:38:50.131037" elapsed="0.038426"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:38:50.198485" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "N "o "d "e "s "_ "W "i "t "h "o "u "t "_ "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-08-22T23:38:50.170031" elapsed="0.028645"/>
</kw>
<msg time="2026-08-22T23:38:50.198887" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:38:50.198932" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:38:50.169668" elapsed="0.029301"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:50.199379" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:50.199081" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:50.199047" elapsed="0.000416"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:50.200007" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "N "o "d "e "s "_ "W "i "t "h "o "u "t "_ "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-08-22T23:38:50.199647" 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-08-22T23:38:50.200403" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:50.200188" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:50.200170" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:38:50.200517" 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-08-22T23:38:50.203652" elapsed="0.000163"/>
</kw>
<msg time="2026-08-22T23:38:50.203941" 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-08-22T23:38:50.202456" 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-08-22T23:38:50.204376" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:50.204823" 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-08-22T23:38:50.201447" elapsed="0.003578"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:38:50.200868" elapsed="0.004224"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:38:50.129390" elapsed="0.075802"/>
</kw>
<msg time="2026-08-22T23:38:50.205284" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:38:50.205328" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:38:50.128828" elapsed="0.076538"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:38:50.205550" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-08-22T23:38:50.205443" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:50.205425" 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-08-22T23:38:50.206061" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:50.206399" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:38:50.206472" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:38:50.128012" elapsed="0.078583"/>
</kw>
<msg time="2026-08-22T23:38:50.206695" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:38:50.206739" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:38:50.123189" elapsed="0.083588"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:50.207105" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:50.206853" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-08-22T23:38:50.206836" elapsed="0.000348"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:38:50.123047" elapsed="0.084161"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:38:49.982734" elapsed="0.224511"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:38:49.979856" elapsed="0.227458"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:38:49.971230" elapsed="0.236143"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:38:49.970613" elapsed="0.236808"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:38:49.967084" elapsed="0.240394"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:50.209176" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:50.208780" elapsed="0.000424"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:50.216651" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:50.216382" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:50.217094" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:50.216849" 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-08-22T23:38:50.226642" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:38:50.226852" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:50.226969" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:50.219406" elapsed="0.007966">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:50.217203" elapsed="0.010256">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:50.227665" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:50.227493" elapsed="0.000243"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:50.217184" elapsed="0.010577">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:50.228158" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:50.228295" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:50.228257" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:50.228240" 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-08-22T23:38:50.228502" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:50.228587" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:50.211994" elapsed="0.016706">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:50.228769" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:50.209417" elapsed="0.019444">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:50.229082" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:50.228939" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:50.228923" elapsed="0.000238"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:50.229352" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:50.229213" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:50.229198" elapsed="0.000232"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:38:50.208312" elapsed="0.021195">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:51.232482" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:51.231481" elapsed="0.001072"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:51.243993" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:51.243724" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:51.244453" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:51.244201" 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-08-22T23:38:51.254100" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:38:51.254322" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:51.254474" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:51.246895" elapsed="0.007997">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:51.244596" elapsed="0.010381">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:51.255174" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:51.255014" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:51.244558" elapsed="0.010707">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:51.255671" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:51.255812" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:51.255771" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:51.255753" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:51.256020" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:51.256091" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:51.238787" elapsed="0.017409">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:51.256265" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:51.233083" elapsed="0.023275">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:51.256591" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:51.256435" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:51.256419" elapsed="0.000260"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:51.256872" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:51.256732" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:51.256717" elapsed="0.000234"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:38:51.230367" elapsed="0.026660">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:52.259994" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:52.259017" elapsed="0.001048"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:52.271107" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:52.270845" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:52.271682" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:52.271414" 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-08-22T23:38:52.281340" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:38:52.281508" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:52.281687" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:52.274071" elapsed="0.008020">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:52.271816" elapsed="0.010364">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:52.282380" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:52.282216" elapsed="0.000232"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:52.271793" elapsed="0.010679">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:52.283006" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:52.283212" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:52.283153" elapsed="0.000124"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:52.283126" elapsed="0.000185"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:52.283523" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:52.283650" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:52.266245" elapsed="0.017562">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:52.283911" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:52.260553" elapsed="0.023498">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:52.284391" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:52.284167" elapsed="0.000309"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:52.284143" elapsed="0.000369"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:52.284865" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:52.284611" elapsed="0.000357"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:52.284568" elapsed="0.000447"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:38:52.257945" elapsed="0.027200">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:53.288278" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:53.287273" elapsed="0.001076"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:53.301125" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:53.300866" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:53.301607" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:53.301338" 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-08-22T23:38:53.311447" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:38:53.311635" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:53.311750" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:53.303801" elapsed="0.008347">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:53.301732" elapsed="0.010497">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:53.312420" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:53.312264" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:53.301709" elapsed="0.010801">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:53.312912" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:53.313048" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:53.313009" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:53.312991" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:53.313281" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:53.313356" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:53.294693" elapsed="0.018766">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:53.313528" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:53.288995" elapsed="0.024644">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:53.313867" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:53.313720" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:53.313703" elapsed="0.000243"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:53.314134" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:53.313998" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:53.313983" elapsed="0.000228"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:38:53.286128" elapsed="0.028159">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:54.317699" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:54.316506" elapsed="0.001276"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:54.330366" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:54.330094" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:54.330852" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:54.330573" 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-08-22T23:38:54.340955" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:38:54.341138" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:54.341263" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:54.333083" elapsed="0.008633">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:54.330992" elapsed="0.010813">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:54.342007" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:54.341842" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:54.330965" elapsed="0.011141">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:54.342503" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:54.342663" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:54.342621" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:54.342602" elapsed="0.000128"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:54.342887" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:54.342959" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:54.324550" elapsed="0.018519">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:54.343149" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:54.318355" elapsed="0.024891">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:54.343471" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:54.343327" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:54.343310" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:54.343764" elapsed="0.000082"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:54.343621" elapsed="0.000264"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:54.343605" elapsed="0.000304"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:38:54.315330" elapsed="0.028659">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:55.347074" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:55.346023" elapsed="0.001123"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:55.359237" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:55.358971" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:55.359707" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:55.359440" 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-08-22T23:38:55.369117" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:38:55.369293" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:55.369416" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:55.361884" elapsed="0.007965">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:55.359831" elapsed="0.010103">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:55.370140" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:55.369970" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:55.359807" elapsed="0.010422">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:55.370622" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:55.370760" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:55.370719" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:55.370702" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:55.370967" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:55.371035" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:55.354003" elapsed="0.017135">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:55.371206" elapsed="0.000014"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:55.347676" elapsed="0.023620">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:55.371591" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:55.371434" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:55.371417" elapsed="0.000255"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:55.371869" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:55.371726" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:55.371710" elapsed="0.000236"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:38:55.344908" elapsed="0.027114">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:56.375273" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:56.374163" elapsed="0.001182"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:56.387835" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:56.387509" elapsed="0.000382"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:56.388305" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:56.388052" 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-08-22T23:38:56.397721" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:38:56.397892" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:56.398013" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:56.390528" elapsed="0.007896">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:56.388429" elapsed="0.010081">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:56.398735" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:56.398548" elapsed="0.000254"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:56.388405" elapsed="0.010422">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:56.399269" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:56.399411" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:56.399370" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:56.399352" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:56.399636" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:56.399707" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:56.381519" elapsed="0.018296">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:56.399941" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:56.375877" elapsed="0.024161">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:56.400270" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:56.400118" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:56.400101" elapsed="0.000248"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:56.400543" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:56.400403" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:56.400387" elapsed="0.000250"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:38:56.373067" elapsed="0.027650">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:57.403653" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:57.402667" elapsed="0.001059"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:57.418107" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:57.417840" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:57.418558" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:57.418310" 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-08-22T23:38:57.427536" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:38:57.427716" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:57.427842" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:57.420796" elapsed="0.007433">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:57.418697" elapsed="0.009634">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:57.428522" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:57.428366" elapsed="0.000240"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:57.418674" elapsed="0.009958">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:57.429020" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:57.429156" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:57.429116" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:57.429100" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:57.429364" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:57.429434" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:57.409797" elapsed="0.019742">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:57.429681" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:57.404220" elapsed="0.025558">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:57.430000" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:57.429857" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:57.429841" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:57.430272" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:57.430134" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:57.430119" elapsed="0.000233"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:38:57.401536" elapsed="0.028893">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:58.433312" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:58.432331" elapsed="0.001052"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:58.445979" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:58.445707" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:58.446427" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:58.446181" 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-08-22T23:38:58.456954" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:38:58.457116" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:58.457228" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:58.448797" elapsed="0.008840">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:58.446549" elapsed="0.011171">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:58.457927" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:58.457756" elapsed="0.000238"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:58.446526" elapsed="0.011492">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:58.458390" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:58.458526" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:58.458486" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:58.458469" 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-08-22T23:38:58.458849" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:58.458920" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:58.439552" elapsed="0.019472">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:58.459093" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:58.433937" elapsed="0.025249">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:58.459407" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:58.459264" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:58.459248" elapsed="0.000238"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:58.459693" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:58.459538" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:58.459523" elapsed="0.000249"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:38:58.431290" elapsed="0.028566">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:38:59.462760" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:38:59.461778" elapsed="0.001054"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:59.475836" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:59.475531" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:38:59.476288" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:38:59.476040" 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-08-22T23:38:59.485655" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:38:59.485818" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:38:59.485936" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:38:59.478682" elapsed="0.007646">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:38:59.476414" elapsed="0.009996">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:59.486615" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:59.486446" elapsed="0.000242"/>
</branch>
<status status="FAIL" start="2026-08-22T23:38:59.476390" elapsed="0.010323">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:59.487085" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:59.487277" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:38:59.487237" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:59.487219" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:59.487485" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:38:59.487555" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:38:59.468940" elapsed="0.018752">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:38:59.487763" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:38:59.463350" elapsed="0.024506">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:59.488076" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:59.487935" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:59.487918" elapsed="0.000237"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:38:59.488346" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:38:59.488208" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:38:59.488192" elapsed="0.000232"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:38:59.460750" elapsed="0.027750">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:00.491614" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:00.490610" elapsed="0.001080"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:00.505526" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:00.505264" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:00.506018" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:00.505763" 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-08-22T23:39:00.516063" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:00.516229" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:00.516346" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:00.508421" elapsed="0.008340">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:00.506151" elapsed="0.010696">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:00.517041" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:00.516884" elapsed="0.000281"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:00.506125" elapsed="0.011065">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:00.517666" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:00.517829" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:00.517787" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:00.517768" elapsed="0.000130"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:00.518058" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:00.518132" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:00.498178" elapsed="0.020060">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:00.518308" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:00.492218" elapsed="0.026181">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:00.518639" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:00.518477" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:00.518461" elapsed="0.000260"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:00.518916" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:00.518774" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:00.518758" elapsed="0.000236"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:00.489377" elapsed="0.029694">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:01.522057" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:01.521037" elapsed="0.001093"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:01.533473" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:01.533111" elapsed="0.000429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:01.534116" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:01.533776" 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-08-22T23:39:01.544228" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:01.544388" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:01.544502" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:01.537278" elapsed="0.007654">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:01.534285" elapsed="0.010786">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:01.545262" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:01.545107" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:01.534254" elapsed="0.011096">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:01.545750" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:01.545889" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:01.545848" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:01.545830" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:01.546098" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:01.546167" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:01.526987" elapsed="0.019283">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:01.546338" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:01.522670" elapsed="0.023760">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:01.546664" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:01.546507" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:01.546490" elapsed="0.000254"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:01.546941" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:01.546797" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:01.546782" elapsed="0.000237"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:01.519961" elapsed="0.027134">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:02.550039" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:02.549052" elapsed="0.001058"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:02.560694" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:02.560312" elapsed="0.000451"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:02.561315" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:02.560973" 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-08-22T23:39:02.571379" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:02.571544" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:02.571683" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:02.564208" elapsed="0.008026">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:02.561485" elapsed="0.010863">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:02.572634" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:02.572397" elapsed="0.000331"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:02.561454" elapsed="0.011308">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:02.573284" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:02.573475" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:02.573421" elapsed="0.000114"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:02.573397" elapsed="0.000168"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:02.573792" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:02.573889" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:02.554256" elapsed="0.019779">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:02.574139" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:02.550687" elapsed="0.023584">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:02.574620" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:02.574400" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:02.574376" elapsed="0.000357"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:02.575000" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:02.574807" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:02.574786" elapsed="0.000323"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:02.548004" elapsed="0.027212">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:03.578477" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:03.577330" elapsed="0.001221"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:03.590179" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:03.589915" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:03.590645" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:03.590383" 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-08-22T23:39:03.600217" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:03.600378" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:03.600562" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:03.593081" elapsed="0.007941">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:03.590778" elapsed="0.010343">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:03.601328" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:03.601163" elapsed="0.000232"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:03.590753" elapsed="0.010667">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:03.601812" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:03.601952" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:03.601910" elapsed="0.000091"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:03.601893" elapsed="0.000131"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:03.602168" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:03.602239" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:03.584693" elapsed="0.017651">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:03.602412" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:03.579126" elapsed="0.023395">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:03.602768" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:03.602619" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:03.602602" elapsed="0.000254"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:03.603048" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:03.602909" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:03.602894" elapsed="0.000232"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:03.576141" elapsed="0.027062">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:04.606230" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:04.605241" elapsed="0.001062"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:04.617249" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:04.616889" elapsed="0.000426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:04.617891" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:04.617526" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:39:04.628186" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:04.628395" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:04.628651" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:04.620909" elapsed="0.008263">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:04.618062" elapsed="0.011224">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:04.629553" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:04.629336" elapsed="0.000339"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:04.618031" elapsed="0.011679">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:04.630228" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:04.630422" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:04.630367" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:04.630342" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:04.630735" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:04.630834" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:04.610807" elapsed="0.020177">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:04.631087" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:04.606824" elapsed="0.024401">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:04.631552" elapsed="0.000073"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:04.631341" elapsed="0.000341"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:04.631317" elapsed="0.000400"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:04.632002" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:04.631796" elapsed="0.000287"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:04.631773" elapsed="0.000345"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:04.604134" elapsed="0.028098">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:05.634919" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:05.633900" elapsed="0.001086"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:05.649228" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:05.648970" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:05.649692" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:05.649429" 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-08-22T23:39:05.658610" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:05.658763" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:05.658922" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:05.651879" elapsed="0.007550">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:05.649809" elapsed="0.009731">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:05.659826" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:05.659608" elapsed="0.000310"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:05.649789" elapsed="0.010163">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:05.660466" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:05.660676" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:05.660622" elapsed="0.000112"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:05.660596" elapsed="0.000168"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:05.660959" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:05.661056" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:05.641012" elapsed="0.020186">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:05.661293" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:05.635468" elapsed="0.025954">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:05.661751" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:05.661532" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:05.661508" elapsed="0.000354"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:05.662131" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:05.661937" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:05.661915" elapsed="0.000325"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:05.632977" elapsed="0.029399">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:06.665618" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:06.664456" elapsed="0.001243"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:06.680110" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:06.679808" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:06.680575" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:06.680327" 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-08-22T23:39:06.689761" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:06.689945" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:06.690167" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:06.682838" elapsed="0.007776">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:06.680729" elapsed="0.009979">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:06.690928" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:06.690750" elapsed="0.000247"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:06.680701" elapsed="0.010323">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:06.691454" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:06.691616" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:06.691556" elapsed="0.000111"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:06.691537" elapsed="0.000152"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:06.691834" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:06.691914" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:06.671939" elapsed="0.020087">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:06.692098" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:06.666216" elapsed="0.025975">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:06.692414" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:06.692269" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:06.692253" elapsed="0.000239"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:06.692705" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:06.692545" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:06.692529" elapsed="0.000254"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:06.663363" elapsed="0.029497">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:07.695959" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:07.694948" elapsed="0.001087"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:07.707488" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:07.707228" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:07.707952" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:07.707705" 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-08-22T23:39:07.716035" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:07.716198" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:07.716376" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:07.710158" elapsed="0.006629">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:07.708083" elapsed="0.008791">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:07.717066" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:07.716910" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:07.708058" elapsed="0.009102">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:07.717534" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:07.717704" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:07.717663" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:07.717646" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:07.717911" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:07.717981" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:07.702243" elapsed="0.015843">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:07.718159" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:07.696533" elapsed="0.021720">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:07.718472" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:07.718331" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:07.718315" elapsed="0.000236"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:07.718764" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:07.718624" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:07.718608" elapsed="0.000234"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:07.693840" elapsed="0.025085">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:08.721425" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:08.720493" elapsed="0.000998"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:08.732801" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:08.732530" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:08.733256" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:08.732999" 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-08-22T23:39:08.741825" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:08.741968" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:08.742118" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:08.735415" elapsed="0.007056">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:08.733371" elapsed="0.009181">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:08.742756" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:08.742602" elapsed="0.000235"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:08.733351" elapsed="0.009510">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:08.743237" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:08.743372" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:08.743334" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:08.743317" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:08.743602" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:08.743675" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:08.727620" elapsed="0.016165">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:08.743855" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:08.721997" elapsed="0.021963">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:08.744182" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:08.744039" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:08.744023" elapsed="0.000238"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:08.744452" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:08.744315" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:08.744300" elapsed="0.000231"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:08.719560" elapsed="0.025063">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:09.747184" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:09.746242" elapsed="0.001007"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:09.760721" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:09.760446" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:09.761189" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:09.760937" 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-08-22T23:39:09.768928" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:09.769065" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:09.769218" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:09.763389" elapsed="0.006176">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:09.761305" elapsed="0.008360">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:09.769854" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:09.769699" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:09.761285" elapsed="0.008658">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:09.770318" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:09.770453" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:09.770415" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:09.770398" 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-08-22T23:39:09.770691" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:09.770762" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:09.753170" elapsed="0.017694">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:09.770932" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:09.747756" elapsed="0.023268">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:09.771242" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:09.771101" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:09.771085" elapsed="0.000236"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:09.771512" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:09.771374" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:09.771358" elapsed="0.000247"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:09.745335" elapsed="0.026346">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:10.774384" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:10.773412" elapsed="0.001043"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:10.785265" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:10.784911" elapsed="0.000421"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:10.785903" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:10.785542" elapsed="0.000423"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:39:10.796341" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:10.796547" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:10.796792" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:10.788987" elapsed="0.008306">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:10.786067" elapsed="0.011337">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:10.797691" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:10.797452" elapsed="0.000332"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:10.786038" elapsed="0.011780">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:10.798326" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:10.798514" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:10.798460" elapsed="0.000132"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:10.798436" elapsed="0.000203"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:10.798840" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:10.798938" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:10.778881" elapsed="0.020200">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:10.799174" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:10.774975" elapsed="0.024326">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:10.799625" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:10.799408" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:10.799385" elapsed="0.000352"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:10.800003" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:10.799810" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:10.799789" elapsed="0.000324"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:10.772416" elapsed="0.027803">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:11.802777" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:11.801835" elapsed="0.001007"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:11.813939" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:11.813562" elapsed="0.000445"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:11.814559" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:11.814218" 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-08-22T23:39:11.824281" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:11.824484" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:11.824726" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:11.817232" elapsed="0.007976">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:11.814861" elapsed="0.010458">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:11.825601" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:11.825367" elapsed="0.000331"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:11.814833" elapsed="0.010899">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:11.826249" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:11.826436" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:11.826383" elapsed="0.000112"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:11.826359" elapsed="0.000166"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:11.826741" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:11.826840" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:11.807486" elapsed="0.019496">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:11.827078" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:11.803318" elapsed="0.023889">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:11.827512" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:11.827315" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:11.827293" elapsed="0.000351"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:11.827927" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:11.827718" elapsed="0.000286"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:11.827696" elapsed="0.000341"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:11.800931" elapsed="0.027212">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:12.831048" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:12.830064" elapsed="0.001055"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:12.842564" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:12.842302" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:12.843046" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:12.842797" 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-08-22T23:39:12.852862" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:12.853039" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:12.853224" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:12.845450" elapsed="0.008185">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:12.843175" elapsed="0.010542">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:12.853918" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:12.853753" elapsed="0.000232"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:12.843150" elapsed="0.010860">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:12.854431" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:12.854569" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:12.854529" elapsed="0.000101"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:12.854512" elapsed="0.000140"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:12.854795" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:12.854866" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:12.837152" elapsed="0.017819">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:12.855039" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:12.831654" elapsed="0.023479">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:12.855358" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:12.855216" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:12.855199" elapsed="0.000244"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:12.855650" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:12.855497" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:12.855481" elapsed="0.000248"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:12.829021" elapsed="0.026784">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:13.858802" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:13.857769" elapsed="0.001106"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:13.870484" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:13.870216" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:13.870956" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:13.870709" 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-08-22T23:39:13.879895" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:13.880059" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:13.880236" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:13.873361" elapsed="0.007282">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:13.871082" elapsed="0.009644">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:13.880919" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:13.880762" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:13.871058" elapsed="0.009952">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:13.881390" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:13.881527" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:13.881488" elapsed="0.000108"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:13.881470" elapsed="0.000151"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:13.881766" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:13.881837" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:13.865013" elapsed="0.016927">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:13.882010" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:13.859371" elapsed="0.022732">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:13.882323" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:13.882181" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:13.882165" elapsed="0.000263"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:13.882677" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:13.882507" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:13.882490" elapsed="0.000268"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:13.856707" elapsed="0.026129">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:14.885892" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:14.884826" elapsed="0.001140"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:14.900279" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:14.900015" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:14.900752" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:14.900481" 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-08-22T23:39:14.910567" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:14.910822" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:14.911062" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:14.903190" elapsed="0.008418">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:14.900879" elapsed="0.010849">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:14.912021" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:14.911779" elapsed="0.000337"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:14.900855" elapsed="0.011295">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:14.912705" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:14.912898" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:14.912842" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:14.912819" elapsed="0.000170"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:14.913211" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:14.913312" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:14.892142" elapsed="0.021320">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:14.913600" elapsed="0.000032"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:14.886462" elapsed="0.027289">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:14.914140" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:14.913863" elapsed="0.000370"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:14.913839" elapsed="0.000428"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:14.914545" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:14.914346" elapsed="0.000309"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:14.914323" elapsed="0.000365"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:14.883734" elapsed="0.031064">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:15.917816" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:15.916828" elapsed="0.001063"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:15.928747" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:15.928463" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:15.929198" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:15.928949" 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-08-22T23:39:15.938485" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:15.938674" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:15.938856" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:15.931629" elapsed="0.007625">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:15.929327" elapsed="0.010028">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:15.939555" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:15.939392" elapsed="0.000256"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:15.929301" elapsed="0.010371">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:15.940072" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:15.940212" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:15.940171" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:15.940154" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:15.940422" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:15.940492" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:15.924025" elapsed="0.016589">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:15.940684" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:15.918383" elapsed="0.022395">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:15.941000" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:15.940856" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:15.940839" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:15.941287" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:15.941134" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:15.941119" elapsed="0.000254"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:15.915728" elapsed="0.025722">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:16.944377" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:16.943346" elapsed="0.001103"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:16.956385" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:16.956006" elapsed="0.000430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:16.956849" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:16.956606" 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-08-22T23:39:16.966118" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:16.966298" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:16.966528" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:16.959219" elapsed="0.007860">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:16.956974" elapsed="0.010219">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:16.967459" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:16.967242" elapsed="0.000310"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:16.956950" elapsed="0.010658">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:16.968142" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:16.968334" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:16.968278" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:16.968254" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:16.968644" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:16.968744" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:16.949783" elapsed="0.019104">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:16.968983" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:16.944976" elapsed="0.024136">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:16.969418" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:16.969221" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:16.969198" elapsed="0.000330"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:16.969819" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:16.969623" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:16.969600" elapsed="0.000328"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:16.942290" elapsed="0.027744">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:17.973269" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:17.972206" elapsed="0.001137"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:17.984294" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:17.984030" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:17.984779" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:17.984497" 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-08-22T23:39:17.994535" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:17.994722" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:17.994915" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:17.987266" elapsed="0.008054">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:17.984917" elapsed="0.010487">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:17.995637" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:17.995440" elapsed="0.000267"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:17.984886" elapsed="0.010845">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:17.996126" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:17.996267" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:17.996227" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:17.996209" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:17.996478" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:17.996549" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:17.979550" elapsed="0.017124">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:17.996745" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:17.973900" elapsed="0.022944">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:17.997086" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:17.996925" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:17.996908" elapsed="0.000260"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:17.997360" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:17.997220" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:17.997205" elapsed="0.000234"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:17.971041" elapsed="0.026474">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:19.000564" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:18.999529" elapsed="0.001145"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:19.011815" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:19.011529" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:19.012261" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:19.012016" 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-08-22T23:39:19.024747" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:19.025053" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:19.025385" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:19.014698" elapsed="0.011484">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:19.012387" elapsed="0.014004">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:19.026839" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:19.026467" elapsed="0.000519"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:19.012363" elapsed="0.014676">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:19.027894" elapsed="0.000056"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:19.028193" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:19.028107" elapsed="0.000178"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:19.028070" 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-08-22T23:39:19.028677" elapsed="0.000053"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:19.028838" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:19.007018" elapsed="0.022047">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:19.029216" elapsed="0.000034"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:19.001185" elapsed="0.028234">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:19.029933" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:19.029617" elapsed="0.000439"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:19.029554" elapsed="0.000554"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:19.030604" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:19.030272" elapsed="0.000457"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:19.030235" elapsed="0.000546"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:18.998381" elapsed="0.032568">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:20.034069" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:20.033073" elapsed="0.001072"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:20.045019" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:20.044761" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:20.045467" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:20.045222" 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-08-22T23:39:20.055440" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:20.055627" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:20.055812" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:20.047821" elapsed="0.008382">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:20.045604" elapsed="0.010682">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:20.056475" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:20.056320" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:20.045566" elapsed="0.011000">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:20.056958" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:20.057095" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:20.057055" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:20.057038" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:20.057303" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:20.057372" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:20.040321" elapsed="0.017155">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:20.057543" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:20.034666" elapsed="0.022986">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:20.057878" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:20.057730" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:20.057714" elapsed="0.000243"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:20.058147" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:20.058009" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:20.057994" elapsed="0.000231"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:20.031938" elapsed="0.026362">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:21.061277" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:21.060281" elapsed="0.001066"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:21.072220" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:21.071959" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:21.072682" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:21.072421" 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-08-22T23:39:21.086011" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:21.086192" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:21.086369" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:21.075035" elapsed="0.012181">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:21.072807" elapsed="0.014622">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:21.087918" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:21.087508" elapsed="0.000581"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:21.072783" elapsed="0.015362">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:21.089121" elapsed="0.000063"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:21.089509" elapsed="0.000046"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:21.089409" elapsed="0.000263"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:21.089366" 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-08-22T23:39:21.090056" elapsed="0.000051"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:21.090219" elapsed="0.000035"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:21.067606" elapsed="0.022851">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:21.090680" elapsed="0.000053"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:21.061865" elapsed="0.029065">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:21.091469" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:21.091115" elapsed="0.000517"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:21.091076" elapsed="0.000614"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:21.092177" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:21.091850" elapsed="0.000456"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:21.091804" elapsed="0.000555"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:21.059167" elapsed="0.033370">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:22.095860" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:22.094797" elapsed="0.001141"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:22.109517" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:22.109238" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:22.109996" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:22.109742" 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-08-22T23:39:22.118936" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:22.119110" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:22.119295" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:22.112190" elapsed="0.007520">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:22.110116" elapsed="0.009681">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:22.119991" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:22.119832" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:22.110094" elapsed="0.009986">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:22.120479" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:22.120635" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:22.120592" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:22.120561" elapsed="0.000140"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:22.120843" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:22.120912" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:22.102137" elapsed="0.018879">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:22.121084" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:22.096470" elapsed="0.024706">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:22.121397" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:22.121253" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:22.121237" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:22.121681" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:22.121529" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:22.121514" elapsed="0.000246"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:22.093541" elapsed="0.028294">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:23.125175" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:23.124110" elapsed="0.001140"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:23.136820" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:23.136528" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:23.137273" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:23.137026" 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-08-22T23:39:23.200044" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:23.200204" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:23.200397" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:23.192386" elapsed="0.008582">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:23.137399" elapsed="0.063689">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:23.201367" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:23.201138" elapsed="0.000322"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:23.137375" elapsed="0.064118">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:23.202111" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:23.202309" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:23.202253" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:23.202228" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:23.202616" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:23.202716" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:23.131846" elapsed="0.071017">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:23.202959" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:23.125812" elapsed="0.077277">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:23.203422" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:23.203216" elapsed="0.000285"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:23.203174" elapsed="0.000359"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:23.203829" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:23.203631" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:23.203608" elapsed="0.000332"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:23.122917" elapsed="0.081132">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:24.207864" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:24.206868" elapsed="0.001071"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:24.220425" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:24.220040" elapsed="0.000457"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:24.221404" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:24.220809" elapsed="0.000682"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:39:24.230336" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:24.230571" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:24.230879" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:24.223833" elapsed="0.007597">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:24.221628" elapsed="0.009926">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:24.231859" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:24.231635" elapsed="0.000318"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:24.221572" elapsed="0.010416">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:24.232522" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:24.232746" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:24.232690" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:24.232664" elapsed="0.000176"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:24.233069" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:24.233174" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:24.213638" elapsed="0.019688">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:24.233423" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:24.208400" elapsed="0.025157">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:24.233897" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:24.233694" elapsed="0.000283"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:24.233669" elapsed="0.000344"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:24.234288" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:24.234090" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:24.234067" elapsed="0.000335"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:24.205730" elapsed="0.028783">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:25.239528" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:25.238225" elapsed="0.001468"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:25.250520" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:25.250229" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:25.251031" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:25.250742" 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-08-22T23:39:25.260878" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:25.261151" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:25.261486" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:25.253446" elapsed="0.008641">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:25.251198" elapsed="0.010990">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:25.262417" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:25.262251" elapsed="0.000231"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:25.251160" elapsed="0.011347">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:25.262927" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:25.263097" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:25.263049" elapsed="0.000105"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:25.263026" elapsed="0.000149"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:25.263338" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:25.263415" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:25.245427" elapsed="0.018108">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:25.263640" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:25.240299" elapsed="0.023441">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:25.263965" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:25.263818" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:25.263802" elapsed="0.000269"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:25.264293" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:25.264129" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:25.264113" elapsed="0.000268"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:25.236573" elapsed="0.027887">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:26.267989" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:26.266776" elapsed="0.001297"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:26.280547" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:26.280150" elapsed="0.000492"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:26.281238" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:26.280871" 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-08-22T23:39:26.292157" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:26.292374" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:26.292659" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:26.284252" elapsed="0.008897">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:26.281425" elapsed="0.011815">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:26.293438" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:26.293281" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:26.281388" elapsed="0.012140">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:26.293930" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:26.294078" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:26.294034" elapsed="0.000095"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:26.294017" elapsed="0.000134"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:26.294294" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:26.294363" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:26.273341" elapsed="0.021131">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:26.294541" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:26.268621" elapsed="0.026032">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:26.294910" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:26.294732" elapsed="0.000236"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:26.294716" elapsed="0.000275"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:26.295203" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:26.295044" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:26.295029" elapsed="0.000252"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:26.265445" elapsed="0.029913">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:27.299571" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:27.298341" elapsed="0.001298"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:27.307245" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:27.306961" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:27.307723" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:27.307457" 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-08-22T23:39:27.317315" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:27.317498" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:27.317732" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:27.309928" elapsed="0.008220">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:27.307849" elapsed="0.010385">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:27.318433" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:27.318272" elapsed="0.000231"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:27.307823" elapsed="0.010707">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:27.319019" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:27.319166" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:27.319124" elapsed="0.000096"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:27.319106" elapsed="0.000139"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:27.319404" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:27.319477" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:27.302407" elapsed="0.017200">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:27.319694" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:27.299880" elapsed="0.019916">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:27.320037" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:27.319876" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:27.319859" elapsed="0.000273"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:27.320329" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:27.320188" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:27.320172" elapsed="0.000236"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:27.296891" elapsed="0.023596">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:28.323725" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:28.322473" elapsed="0.001331"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:28.337997" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:28.337727" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:28.338456" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:28.338203" 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-08-22T23:39:28.347604" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:28.347787" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:28.348017" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:28.340772" elapsed="0.007668">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:28.338598" elapsed="0.009932">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:28.348763" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:28.348571" elapsed="0.000259"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:28.338558" elapsed="0.010297">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:28.349276" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:28.349423" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:28.349380" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:28.349361" elapsed="0.000130"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:28.349656" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:28.349729" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:28.330117" elapsed="0.019723">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:28.349911" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:28.324314" elapsed="0.025691">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:28.350228" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:28.350083" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:28.350067" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:28.350498" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:28.350360" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:28.350344" elapsed="0.000246"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:28.321364" elapsed="0.029307">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:29.353711" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:29.352706" elapsed="0.001093"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:29.370356" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:29.369995" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:29.370895" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:29.370620" 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-08-22T23:39:29.380476" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:29.380684" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:29.380913" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:29.373177" elapsed="0.008175">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:29.371034" elapsed="0.010408">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:29.381671" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:29.381480" elapsed="0.000261"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:29.371004" elapsed="0.010762">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:29.382172" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:29.382321" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:29.382277" elapsed="0.000093"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:29.382258" elapsed="0.000134"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:29.382539" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:29.382646" elapsed="0.000018"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:29.361178" elapsed="0.021585">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:29.382834" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:29.354297" elapsed="0.028636">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:29.383169" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:29.383017" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:29.382999" elapsed="0.000254"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:29.383456" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:29.383310" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:29.383294" elapsed="0.000297"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:29.351567" elapsed="0.032125">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:30.386725" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:30.385711" elapsed="0.001090"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:30.398291" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:30.398027" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:30.398767" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:30.398496" 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-08-22T23:39:30.408269" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:30.408430" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:30.408662" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:30.401019" elapsed="0.008055">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:30.398892" elapsed="0.010267">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:30.409351" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:30.409195" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:30.398868" elapsed="0.010573">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:30.409840" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:30.409980" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:30.409939" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:30.409922" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:30.410190" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:30.410261" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:30.393153" elapsed="0.017214">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:30.410437" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:30.387301" elapsed="0.023230">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:30.410770" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:30.410627" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:30.410610" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:30.411041" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:30.410904" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:30.410889" elapsed="0.000231"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:30.384527" elapsed="0.026670">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:31.414236" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:31.413202" elapsed="0.001111"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:31.426533" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:31.426268" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:31.427002" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:31.426752" 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-08-22T23:39:31.439513" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:31.439891" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:31.440278" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:31.429861" elapsed="0.011297">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:31.427126" elapsed="0.014240">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:31.441870" elapsed="0.000115"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:31.441455" elapsed="0.000648"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:31.427102" elapsed="0.015061">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:31.442931" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:31.443137" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:31.443077" elapsed="0.000122"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:31.443051" elapsed="0.000178"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:31.443431" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:31.443530" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:31.420415" elapsed="0.023290">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:31.443805" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:31.414863" elapsed="0.029075">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:31.444251" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:31.444051" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:31.444027" elapsed="0.000333"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:31.444652" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:31.444434" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:31.444413" elapsed="0.000350"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:31.412106" elapsed="0.032768">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:32.447802" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:32.446744" elapsed="0.001131"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:32.460176" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:32.459805" elapsed="0.000440"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:32.460836" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:32.460459" 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-08-22T23:39:32.472147" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:32.472453" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:32.472848" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:32.463942" elapsed="0.009721">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:32.461006" elapsed="0.012842">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:32.474272" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:32.473928" elapsed="0.000493"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:32.460975" elapsed="0.013500">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:32.475335" elapsed="0.000058"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:32.475699" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:32.475604" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:32.475517" 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-08-22T23:39:32.476167" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:32.476325" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:32.453522" elapsed="0.023039">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:32.476751" elapsed="0.000036"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:32.448367" elapsed="0.028596">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:32.477457" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:32.477139" elapsed="0.000472"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:32.477103" elapsed="0.000565"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:32.478101" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:32.477790" elapsed="0.000436"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:32.477756" elapsed="0.000522"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:32.445697" elapsed="0.032753">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:33.481701" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:33.480653" elapsed="0.001126"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:33.494374" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:33.493990" elapsed="0.000456"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:33.495100" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:33.494730" elapsed="0.000438"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:39:33.506914" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:33.507094" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:33.507312" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:33.498899" elapsed="0.008926">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:33.495281" elapsed="0.012715">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:33.508266" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:33.508048" elapsed="0.000309"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:33.495247" elapsed="0.013144">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:33.508956" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:33.509153" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:33.509096" elapsed="0.000122"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:33.509072" elapsed="0.000175"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:33.509474" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:33.509594" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:33.487177" elapsed="0.022575">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:33.509849" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:33.482279" elapsed="0.027702">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:33.510290" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:33.510089" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:33.510067" elapsed="0.000332"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:33.510688" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:33.510473" elapsed="0.000293"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:33.510452" elapsed="0.000347"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:33.479452" elapsed="0.031457">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:34.513963" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:34.512952" elapsed="0.001084"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:34.525565" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:34.525296" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:34.526033" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:34.525787" 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-08-22T23:39:34.536312" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:34.536481" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:34.536698" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:34.528261" elapsed="0.008837">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:34.526157" elapsed="0.011028">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:34.537391" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:34.537222" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:34.526133" elapsed="0.011349">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:34.537905" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:34.538047" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:34.538006" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:34.537988" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:34.538255" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:34.538324" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:34.520341" elapsed="0.018090">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:34.538501" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:34.514528" elapsed="0.024089">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:34.538845" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:34.538697" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:34.538680" elapsed="0.000244"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:34.539114" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:34.538976" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:34.538961" elapsed="0.000230"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:34.511890" elapsed="0.027378">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:35.543044" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:35.541610" elapsed="0.001520"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:35.557698" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:35.557378" elapsed="0.000407"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:35.558229" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:35.557949" 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-08-22T23:39:35.568291" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:35.568460" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:35.568690" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:35.560547" elapsed="0.008572">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:35.558363" elapsed="0.010843">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:35.569404" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:35.569243" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:35.558336" elapsed="0.011158">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:35.569926" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:35.570100" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:35.570052" elapsed="0.000097"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:35.570027" elapsed="0.000143"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:35.570317" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:35.570388" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:35.549263" elapsed="0.021232">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:35.570567" elapsed="0.000048"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:35.543767" elapsed="0.026949">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:35.570943" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:35.570798" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:35.570781" elapsed="0.000242"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:35.571261" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:35.571104" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:35.571078" elapsed="0.000265"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:35.540330" elapsed="0.031091">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:36.574337" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:36.573367" elapsed="0.001042"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:36.585309" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:36.585029" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:36.585791" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:36.585523" 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-08-22T23:39:36.596077" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:36.596269" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:36.596465" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:36.588214" elapsed="0.008681">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:36.585914" elapsed="0.011070">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:36.597198" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:36.597023" elapsed="0.000243"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:36.585892" elapsed="0.011399">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:36.597721" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:36.597865" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:36.597824" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:36.597806" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:36.598076" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:36.598147" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:36.580703" elapsed="0.017553">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:36.598328" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:36.574925" elapsed="0.023499">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:36.598661" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:36.598503" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:36.598486" elapsed="0.000258"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:36.598938" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:36.598797" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:36.598782" elapsed="0.000236"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:36.572329" elapsed="0.026766">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:37.601017" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:37.600500" elapsed="0.000562"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:37.608463" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:37.608206" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:37.608925" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:37.608676" 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-08-22T23:39:37.618400" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:37.618564" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:37.618789" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:37.611329" elapsed="0.007857">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:37.609050" elapsed="0.010217">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:37.619457" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:37.619301" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:37.609027" elapsed="0.010520">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:37.619942" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:37.620081" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:37.620040" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:37.620023" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:37.620289" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:37.620359" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:37.603872" elapsed="0.016591">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:37.620533" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:37.601299" elapsed="0.019343">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:37.620865" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:37.620722" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:37.620705" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:37.621138" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:37.620999" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:37.620984" elapsed="0.000232"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:37.599899" elapsed="0.021395">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:38.624535" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:38.623539" elapsed="0.001121"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:38.635966" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:38.635558" elapsed="0.000475"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:38.637204" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:38.636494" elapsed="0.000816"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:39:38.650912" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:38.651130" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:38.651383" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:38.642393" elapsed="0.009548">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:38.637507" elapsed="0.014555">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:38.652347" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:38.652115" elapsed="0.000330"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:38.637461" elapsed="0.015020">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:38.653062" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:38.653266" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:38.653207" elapsed="0.000124"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:38.653181" elapsed="0.000182"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:38.653615" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:38.653721" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:38.629171" elapsed="0.024706">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:38.653979" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:38.625196" elapsed="0.028923">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:38.654448" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:38.654234" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:38.654211" elapsed="0.000354"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:38.654874" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:38.654667" elapsed="0.000288"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:38.654643" elapsed="0.000347"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:38.622464" elapsed="0.032640">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:39.658387" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:39.657382" elapsed="0.001080"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:39.669305" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:39.669044" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:39.669767" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:39.669503" 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-08-22T23:39:39.678946" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:39.679112" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:39.679307" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:39.672158" elapsed="0.007569">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:39.669891" elapsed="0.009924">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:39.680009" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:39.679854" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:39.669868" elapsed="0.010230">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:39.680468" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:39.680624" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:39.680566" elapsed="0.000106"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:39.680549" elapsed="0.000145"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:39.680838" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:39.680943" elapsed="0.000029"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:39.664551" elapsed="0.016519">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:39.681139" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:39.658996" elapsed="0.022236">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:39.681451" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:39.681308" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:39.681293" elapsed="0.000236"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:39.681744" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:39.681586" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:39.681567" elapsed="0.000264"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:39.656307" elapsed="0.025635">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:40.684961" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:40.683965" elapsed="0.001068"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:40.695435" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:40.695174" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:40.695901" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:40.695654" 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-08-22T23:39:40.706865" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:40.707076" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:40.707300" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:40.698303" elapsed="0.009533">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:40.696024" elapsed="0.011928">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:40.708217" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:40.708002" elapsed="0.000306"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:40.696001" elapsed="0.012340">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:40.708891" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:40.709082" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:40.709028" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:40.709003" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:40.709372" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:40.709468" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:40.689183" elapsed="0.020454">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:40.709736" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:40.685576" elapsed="0.024292">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:40.710177" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:40.709977" elapsed="0.000282"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:40.709954" elapsed="0.000377"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:40.710629" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:40.710413" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:40.710390" elapsed="0.000350"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:40.682895" elapsed="0.027952">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:41.714012" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:41.713011" elapsed="0.001076"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:41.724680" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:41.724402" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:41.725136" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:41.724887" 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-08-22T23:39:41.734732" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:41.734896" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:41.735090" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:41.727631" elapsed="0.007883">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:41.725265" elapsed="0.010334">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:41.735811" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:41.735654" elapsed="0.000245"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:41.725239" elapsed="0.010695">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:41.736645" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:41.736839" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:41.736784" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:41.736759" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:41.737129" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:41.737226" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:41.720102" elapsed="0.017270">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:41.737468" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:41.714584" elapsed="0.023034">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:41.737932" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:41.737732" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:41.737709" elapsed="0.000334"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:41.738310" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:41.738117" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:41.738095" elapsed="0.000323"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:41.711920" elapsed="0.026604">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:42.741954" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:42.740921" elapsed="0.001109"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:42.753751" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:42.753466" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:42.754198" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:42.753950" 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-08-22T23:39:42.770251" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:42.770635" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:42.771026" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:42.758344" elapsed="0.013586">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:42.754323" elapsed="0.017811">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:42.772654" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:42.772246" elapsed="0.000581"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:42.754298" elapsed="0.018586">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:42.773938" elapsed="0.000043"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:42.774150" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:42.774091" elapsed="0.000124"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:42.774064" elapsed="0.000183"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:42.774460" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:42.774559" elapsed="0.000028"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:42.748152" elapsed="0.026592">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:42.774846" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:42.742526" elapsed="0.032461">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:42.775305" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:42.775098" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:42.775075" elapsed="0.000357"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:42.775733" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:42.775508" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:42.775486" elapsed="0.000359"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:42.739723" elapsed="0.036233">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:43.779238" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:43.778161" elapsed="0.001151"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:43.791924" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:43.791485" elapsed="0.000516"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:43.792408" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:43.792160" 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-08-22T23:39:43.801716" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:43.801923" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:43.802169" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:43.794783" elapsed="0.007927">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:43.792531" elapsed="0.010295">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:43.803096" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:43.802876" elapsed="0.000312"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:43.792508" elapsed="0.010714">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:43.803764" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:43.803987" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:43.803930" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:43.803880" elapsed="0.000197"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:43.804274" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:43.804372" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:43.785432" elapsed="0.019085">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:43.804635" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:43.779950" elapsed="0.024820">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:43.805114" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:43.804889" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:43.804861" elapsed="0.000363"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:43.805490" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:43.805299" elapsed="0.000268"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:43.805278" elapsed="0.000349"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:43.777083" elapsed="0.028654">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:44.809699" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:44.808590" elapsed="0.001187"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:44.820767" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:44.820485" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:44.821212" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:44.820967" 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-08-22T23:39:44.830289" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:44.830467" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:44.830694" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:44.823649" elapsed="0.007561">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:44.821346" elapsed="0.009985">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:44.831633" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:44.831381" elapsed="0.000354"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:44.821318" elapsed="0.010450">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:44.832292" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:44.832483" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:44.832428" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:44.832404" elapsed="0.000179"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:44.832800" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:44.832898" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:44.814529" elapsed="0.018515">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:44.833138" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:44.810280" elapsed="0.022992">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:44.833575" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:44.833380" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:44.833357" elapsed="0.000352"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:44.833975" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:44.833785" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:44.833763" elapsed="0.000324"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:44.807426" elapsed="0.026766">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:45.837659" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:45.836574" elapsed="0.001172"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:45.849539" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:45.849267" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:45.850020" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:45.849767" 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-08-22T23:39:45.859778" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:45.859951" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:45.860153" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:45.852411" elapsed="0.008152">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:45.850147" elapsed="0.010519">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:45.860860" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:45.860704" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:45.850122" elapsed="0.010857">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:45.861421" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:45.861564" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:45.861522" elapsed="0.000106"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:45.861504" elapsed="0.000146"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:45.861794" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:45.861863" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:45.842951" elapsed="0.019020">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:45.862038" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:45.838249" elapsed="0.023881">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:45.862349" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:45.862206" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:45.862190" elapsed="0.000237"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:45.862634" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:45.862479" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:45.862464" elapsed="0.000249"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:45.835388" elapsed="0.027400">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:46.865862" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:46.864875" elapsed="0.001059"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:46.877272" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:46.877004" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:46.877747" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:46.877474" 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-08-22T23:39:46.886860" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:46.887035" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:46.887284" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:46.880272" elapsed="0.007547">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:46.877873" elapsed="0.010061">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:46.888242" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:46.887982" elapsed="0.000358"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:46.877850" elapsed="0.010525">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:46.888948" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:46.889181" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:46.889103" elapsed="0.000148"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:46.889076" 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-08-22T23:39:46.889486" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:46.889611" elapsed="0.000024"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:46.870907" elapsed="0.018858">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:46.889865" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:46.866425" elapsed="0.023573">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:46.890308" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:46.890109" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:46.890086" elapsed="0.000334"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:46.890711" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:46.890494" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:46.890472" elapsed="0.000351"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:46.863821" elapsed="0.027111">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:47.894038" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:47.893017" elapsed="0.001094"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:47.908903" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:47.908512" elapsed="0.000460"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:47.909570" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:47.909184" 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-08-22T23:39:47.918789" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:47.918952" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:47.919207" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:47.912080" elapsed="0.007691">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:47.909761" elapsed="0.010123">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:47.920160" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:47.919932" elapsed="0.000321"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:47.909730" elapsed="0.010556">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:47.920833" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:47.921026" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:47.920970" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:47.920946" elapsed="0.000172"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:47.921314" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:47.921412" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:47.899533" elapsed="0.022070">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:47.921714" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:47.894636" elapsed="0.027210">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:47.922198" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:47.921955" elapsed="0.000328"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:47.921933" elapsed="0.000384"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:47.922610" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:47.922392" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:47.922370" elapsed="0.000353"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:47.891965" elapsed="0.030866">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:48.925991" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:48.924982" elapsed="0.001082"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:48.937812" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:48.937515" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:48.938268" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:48.938023" 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-08-22T23:39:48.947410" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:48.947573" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:48.947811" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:48.940691" elapsed="0.007514">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:48.938394" elapsed="0.009893">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:48.948480" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:48.948323" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:48.938369" elapsed="0.010201">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:48.948973" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:48.949112" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:48.949072" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:48.949054" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:48.949358" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:48.949429" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:48.932114" elapsed="0.017421">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:48.949621" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:48.926550" elapsed="0.023166">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:48.949939" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:48.949795" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:48.949779" elapsed="0.000239"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:48.950277" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:48.950079" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:48.950056" elapsed="0.000331"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:48.923808" elapsed="0.026685">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:49.953527" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:49.952533" elapsed="0.001100"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:49.964974" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:49.964711" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:49.965427" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:49.965181" 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-08-22T23:39:49.974475" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:49.974659" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:49.974831" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:49.967840" elapsed="0.007385">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:49.965556" elapsed="0.009751">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:49.975537" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:49.975342" elapsed="0.000283"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:49.965534" elapsed="0.010116">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:49.976024" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:49.976240" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:49.976175" elapsed="0.000127"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:49.976146" elapsed="0.000185"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:49.976532" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:49.976654" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:49.960377" elapsed="0.016424">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:49.976899" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:49.954150" elapsed="0.022879">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:49.977344" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:49.977144" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:49.977121" elapsed="0.000334"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:49.977747" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:49.977529" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:49.977508" elapsed="0.000350"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:49.951461" elapsed="0.026502">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:39:50.981031" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:50.979898" elapsed="0.001209"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:50.992924" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:50.992646" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:50.993381" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:50.993132" 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-08-22T23:39:51.002895" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:39:51.003058" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:39:51.003235" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:39:50.995806" elapsed="0.007833">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:50.993507" elapsed="0.010214">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.003911" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:51.003756" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:50.993485" elapsed="0.010517">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.004375" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:51.004548" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:51.004473" elapsed="0.000141"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:51.004456" elapsed="0.000182"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.004783" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:51.004855" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:39:50.987185" elapsed="0.017775">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:51.005030" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:39:50.981665" elapsed="0.023481">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.005456" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:51.005258" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:51.005235" elapsed="0.000335"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.005881" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:51.005685" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:51.005662" elapsed="0.000331"/>
</if>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:39:50.978838" elapsed="0.027263">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<msg time="2026-08-22T23:39:51.006232" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>node2</arg>
<arg>${original_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:38:50.207691" elapsed="60.798677">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>node3</arg>
<arg>${original_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.006650" elapsed="0.000032"/>
</kw>
<doc>Check that the new device data is propagated in the cluster even when node 1 is down.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-08-22T23:38:49.966306" elapsed="61.040581">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</test>
<test id="s1-s6-t9" name="Restart_node1_After_Create_And_Dump_Its_Topology_Data" line="123">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:39:51.011934" elapsed="0.000301"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:39:51.011544" elapsed="0.000769"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:39:51.013654" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:51.013520" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.013501" elapsed="0.000221"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:39:51.018886" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:51.018779" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.018761" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:39:51.019983" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:39:51.019573" elapsed="0.000438"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:39:51.020474" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:39:51.020170" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:39:51.020545" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:39:51.020761" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:39:51.019176" elapsed="0.001610"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:39:51.026299" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:51.026191" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.026172" 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-08-22T23:39:51.027541" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:51.027436" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.027418" elapsed="0.000216"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:39:51.028088" level="INFO">${karaf_connection_index} = 46</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:39:51.027778" elapsed="0.000337"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:39:51.028498" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:39:51.028272" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:39:51.029329" 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-08-22T23:39:51.029068" elapsed="0.000912">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-08-22T23:39:51.030175" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-08-22T23:39:51.030220" 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-08-22T23:39:51.028698" elapsed="0.001546"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:39:51.031012" 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-08-22T23:39:51.030765" elapsed="0.000935">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-08-22T23:39:51.031901" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-08-22T23:39:51.031965" 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-08-22T23:39:51.030408" elapsed="0.001581"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-08-22T23:39:51.032991" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Restart_node1_After_Create_And_Dump_Its_Topology_Data"</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-08-22T23:39:51.032311" elapsed="0.000887">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Restart_node1_After_Create_And_Dump_Its_Topology_Data"</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:51.032064" elapsed="0.001201">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Restart_node1_After_Create_And_Dump_Its_Topology_Data"</status>
</branch>
<status status="FAIL" start="2026-08-22T23:39:51.032045" elapsed="0.001253">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Restart_node1_After_Create_And_Dump_Its_Topology_Data"</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-08-22T23:39:51.033456" 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-08-22T23:39:51.033711" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:51.033542" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:51.033525" elapsed="0.000263"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-08-22T23:39:51.033821" 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-08-22T23:39:51.036442" elapsed="0.000173"/>
</kw>
<msg time="2026-08-22T23:39:51.036677" 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-08-22T23:39:51.035343" elapsed="0.001491"/>
</kw>
<kw name="Open 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-08-22T23:39:51.037121" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.037461" 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-08-22T23:39:51.034721" elapsed="0.002971"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:39:51.034089" elapsed="0.003668"/>
</kw>
<arg>${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-08-22T23:39:51.027139" elapsed="0.010699">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Restart_node1_After_Create_And_Dump_Its_Topology_Data"</status>
</kw>
<msg time="2026-08-22T23:39:51.037939" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:39:51.037983" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Restart_node1_After_Create_And_Dump_Its_Topology_Data"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:39:51.026516" elapsed="0.011490"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:39:51.038188" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:51.038081" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.038063" 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-08-22T23:39:51.039121" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:51.039016" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.038998" elapsed="0.000189"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:39:51.039459" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:39:51.039561" level="INFO">${current_ssh_connection_object} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:39:51.039335" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:51.040016" level="INFO">{1: 46, 2: 35, 3: 36}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:51.039760" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:51.040461" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:51.040222" elapsed="0.000281"/>
</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-08-22T23:39:51.041047" elapsed="0.000262"/>
</kw>
<msg time="2026-08-22T23:39:51.041407" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:39:51.041452" level="INFO">${old_connection_index} = 46</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-08-22T23:39:51.040673" elapsed="0.000802"/>
</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-08-22T23:39:51.042303" elapsed="0.000195"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:39:51.043662" 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-08-22T23:39:51.043235" elapsed="0.001283">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-08-22T23:39:51.042761" elapsed="0.001873"/>
</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-08-22T23:39:51.045307" elapsed="0.000309"/>
</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-08-22T23:39:51.044810" elapsed="0.000894"/>
</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-08-22T23:39:51.041797" elapsed="0.003952"/>
</kw>
<status status="PASS" start="2026-08-22T23:39:51.041550" elapsed="0.004248"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.041531" elapsed="0.004292"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:39:51.046669" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:39:51.046339" elapsed="0.000356"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:39:51.046743" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:39:51.046930" level="INFO">${odl_ip} = 10.30.170.200</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:39:51.046023" elapsed="0.000932"/>
</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-08-22T23:39:51.047114" elapsed="0.000418"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:39:51.047823" level="INFO">index=47
host=10.30.170.200
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-08-22T23:39:51.047925" level="INFO">${karaf_connection_object} = index=47
host=10.30.170.200
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-08-22T23:39:51.047715" 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-08-22T23:39:51.048094" elapsed="0.002438"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:39:51.051065" level="INFO">Logging into '10.30.170.200:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:39:51.052957" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.200</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-08-22T23:39:51.050788" elapsed="0.002551">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.200</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-08-22T23:39:51.069527" elapsed="0.000429"/>
</kw>
<msg time="2026-08-22T23:39:51.070044" 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-08-22T23:39:51.068198" elapsed="0.001998"/>
</kw>
<kw name="Open 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-08-22T23:39:51.070373" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.070534" 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-08-22T23:39:51.054218" elapsed="0.016946"/>
</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-08-22T23:39:51.053642" elapsed="0.017571"/>
</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-08-22T23:39:51.038722" elapsed="0.032571">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.200</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-08-22T23:39:51.071644" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:39:51.071718" 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-08-22T23:39:51.025854" elapsed="0.045968">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.200</status>
</kw>
<msg time="2026-08-22T23:39:51.071934" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:39:51.071978" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.200</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:39:51.021167" elapsed="0.050834"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.072334" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:51.072081" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.072060" elapsed="0.000351"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:39:51.021026" elapsed="0.051410"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:39:51.077824" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:51.077717" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.077698" 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-08-22T23:39:51.079042" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:51.078936" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.078918" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:39:51.079556" level="INFO">${karaf_connection_index} = 35</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:39:51.079262" elapsed="0.000337"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:39:51.080008" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:39:51.079755" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:39:51.121774" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:39:51.080520" elapsed="0.041358"/>
</kw>
<msg time="2026-08-22T23:39:51.122060" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:39:51.122107" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:39:51.080190" elapsed="0.041954"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:39:51.150921" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "R "e "s "t "a "r "t "_ "n "o "d "e "1 "_ "A "f "t "e "r "_ "C "r "e "a "t "e "_ "A "n "d "_ "D "u "m "p "_ "I "t "s "_ "T "o "p "o "l "o "g "y "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:39:51.122669" elapsed="0.028360"/>
</kw>
<msg time="2026-08-22T23:39:51.151187" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:39:51.151247" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "R "e "s "t "a "r "t "_ "n "o "d "e "1 "_ "A "f "t "e "r "_ "C "r "e "a "t "e "_ "A ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:39:51.122311" elapsed="0.028974"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.151583" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:51.151361" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.151341" elapsed="0.000348"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:51.152125" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "R "e "s "t "a "r "t "_ "n "o "d "e "1 "_ "A "f "t "e "r "_ "C "r "e "a "t "e "_ "A "n "d "_ "D "u "m "p "_ "I "t "s "_ "T "o "p "o "l "o "g "y "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:51.151830" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.152491" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:51.152278" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.152260" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:39:51.152620" 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-08-22T23:39:51.155315" elapsed="0.000146"/>
</kw>
<msg time="2026-08-22T23:39:51.155521" 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-08-22T23:39:51.154256" 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-08-22T23:39:51.155943" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.156271" 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-08-22T23:39:51.153584" elapsed="0.002903"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:39:51.152881" elapsed="0.003670"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:39:51.078635" elapsed="0.078763"/>
</kw>
<msg time="2026-08-22T23:39:51.157492" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:39:51.157536" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "R "e "s "t "a "r "t "_ "n "o "d "e "1 "_ "A "f "t "e "r "_ "C "r "e "a "t "e "_ "A ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:39:51.078038" elapsed="0.079534"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:39:51.157777" elapsed="0.000052"/>
</return>
<status status="PASS" start="2026-08-22T23:39:51.157671" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.157652" elapsed="0.000236"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.158280" 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-08-22T23:39:51.158630" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:39:51.158703" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:39:51.077362" elapsed="0.081488"/>
</kw>
<msg time="2026-08-22T23:39:51.158945" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:39:51.158990" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "R "e "s "t "a "r "t "_ "n "o "d "e "1 "_ "A "f "t "e "r "_ "C "r "e "a "t "e "_ "A ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:39:51.072715" elapsed="0.086312"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.159350" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:51.159101" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.159084" elapsed="0.000343"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:39:51.072562" elapsed="0.086888"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:39:51.164933" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:51.164825" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.164806" 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-08-22T23:39:51.166167" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:51.166059" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.166041" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:39:51.166688" level="INFO">${karaf_connection_index} = 36</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:39:51.166374" elapsed="0.000341"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:39:51.167106" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:39:51.166869" elapsed="0.000263"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:39:51.208295" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:39:51.167679" elapsed="0.040740"/>
</kw>
<msg time="2026-08-22T23:39:51.208642" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:39:51.208693" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:39:51.167301" elapsed="0.041429"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:39:51.240065" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "R "e "s "t "a "r "t "_ "n "o "d "e "1 "_ "A "f "t "e "r "_ "C "r "e "a "t "e "_ "A "n "d "_ "D "u "m "p "_ "I "t "s "_ "T "o "p "o "l "o "g "y "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:39:51.209309" elapsed="0.030867"/>
</kw>
<msg time="2026-08-22T23:39:51.240339" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:39:51.240386" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "R "e "s "t "a "r "t "_ "n "o "d "e "1 "_ "A "f "t "e "r "_ "C "r "e "a "t "e "_ "A ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:39:51.208924" elapsed="0.031500"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.240771" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:51.240507" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.240484" elapsed="0.000369"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:51.241303" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "R "e "s "t "a "r "t "_ "n "o "d "e "1 "_ "A "f "t "e "r "_ "C "r "e "a "t "e "_ "A "n "d "_ "D "u "m "p "_ "I "t "s "_ "T "o "p "o "l "o "g "y "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:51.240996" 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-08-22T23:39:51.241684" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:51.241448" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.241430" elapsed="0.000337"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:39:51.241802" 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">
<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-08-22T23:39:51.244703" elapsed="0.000157"/>
</kw>
<msg time="2026-08-22T23:39:51.244922" 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-08-22T23:39:51.243554" elapsed="0.001502"/>
</kw>
<kw name="Open 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-08-22T23:39:51.245382" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.245746" 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-08-22T23:39:51.242688" elapsed="0.003256"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:39:51.242086" elapsed="0.003925"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:39:51.165732" elapsed="0.080385"/>
</kw>
<msg time="2026-08-22T23:39:51.246212" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:39:51.246259" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "R "e "s "t "a "r "t "_ "n "o "d "e "1 "_ "A "f "t "e "r "_ "C "r "e "a "t "e "_ "A ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:39:51.165150" elapsed="0.081148"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:39:51.246486" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:39:51.246376" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.246357" 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 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.247042" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.247374" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:39:51.247448" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:39:51.164471" elapsed="0.083087"/>
</kw>
<msg time="2026-08-22T23:39:51.247761" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:39:51.247807" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "R "e "s "t "a "r "t "_ "n "o "d "e "1 "_ "A "f "t "e "r "_ "C "r "e "a "t "e "_ "A ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:39:51.159735" elapsed="0.088111"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.248173" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:51.247922" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.247904" elapsed="0.000348"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:39:51.159575" elapsed="0.088701"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:39:51.020845" elapsed="0.227462"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:39:51.018386" elapsed="0.229986"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:39:51.013174" elapsed="0.235261"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:39:51.012521" elapsed="0.235961"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:39:51.008443" elapsed="0.240100"/>
</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-08-22T23:39:51.251867" level="INFO">${member_int} = 1</msg>
<var>${member_int}</var>
<arg>${member}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-08-22T23:39:51.251523" elapsed="0.000371"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:39:51.252338" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>${member_int}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:39:51.252048" elapsed="0.000317"/>
</kw>
<return>
<value>${index_list}</value>
<status status="PASS" start="2026-08-22T23:39:51.252410" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:39:51.252565" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>${member}</arg>
<status status="PASS" start="2026-08-22T23:39:51.251201" elapsed="0.001407"/>
</kw>
<kw name="Return_Member_IP" owner="ClusterManagement">
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-08-22T23:39:51.253459" level="INFO">${member_int} = 1</msg>
<var>${member_int}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-08-22T23:39:51.253141" elapsed="0.000344"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:39:51.253945" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:39:51.253657" elapsed="0.000315"/>
</kw>
<return>
<value>${member_ip}</value>
<status status="PASS" start="2026-08-22T23:39:51.254021" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:39:51.254174" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:39:51.252816" elapsed="0.001384"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:39:51.257013" level="INFO">${msg} = Starting ODL1 10.30.170.200</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-08-22T23:39:51.254360" elapsed="0.002688"/>
</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-08-22T23:39:51.264042" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:51.263927" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.263906" elapsed="0.000205"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:39:51.265123" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:39:51.264735" elapsed="0.000416"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:39:51.265642" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:39:51.265309" elapsed="0.000362"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:39:51.265717" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:39:51.265878" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:39:51.264336" elapsed="0.001569"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:39:51.271371" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:51.271260" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.271241" 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-08-22T23:39:51.272533" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:51.272424" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.272406" elapsed="0.000213"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:39:51.272990" level="INFO">${karaf_connection_index} = 47</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:39:51.272761" elapsed="0.000260"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:39:51.273355" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:39:51.273179" elapsed="0.000202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:39:51.274102" 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-08-22T23:39:51.273903" elapsed="0.000753">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-08-22T23:39:51.274771" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-08-22T23:39:51.274833" 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-08-22T23:39:51.273537" elapsed="0.001321"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:39:51.275548" 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-08-22T23:39:51.275364" elapsed="0.000709">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-08-22T23:39:51.276184" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-08-22T23:39:51.276230" 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-08-22T23:39:51.275025" elapsed="0.001229"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-08-22T23:39:51.277042" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL1 10.30.170.200"</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-08-22T23:39:51.276549" elapsed="0.000555">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL1 10.30.170.200"</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:51.276329" elapsed="0.000845">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL1 10.30.170.200"</status>
</branch>
<status status="FAIL" start="2026-08-22T23:39:51.276310" elapsed="0.000896">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL1 10.30.170.200"</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-08-22T23:39:51.277365" 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-08-22T23:39:51.277611" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:51.277453" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:51.277435" elapsed="0.000255"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-08-22T23:39:51.277723" 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-08-22T23:39:51.279424" elapsed="0.000230"/>
</kw>
<msg time="2026-08-22T23:39:51.279795" 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-08-22T23:39:51.278924" elapsed="0.000939"/>
</kw>
<kw name="Open 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-08-22T23:39:51.280023" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.280192" 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-08-22T23:39:51.278497" elapsed="0.001779"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:39:51.277979" elapsed="0.002345"/>
</kw>
<arg>${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-08-22T23:39:51.272121" elapsed="0.008285">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL1 10.30.170.200"</status>
</kw>
<msg time="2026-08-22T23:39:51.280508" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:39:51.280553" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL1 10.30.170.200"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:39:51.271609" elapsed="0.008972"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:39:51.280787" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:51.280677" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.280658" 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-08-22T23:39:51.281671" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:51.281540" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.281522" elapsed="0.000218"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:39:51.282013" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:39:51.282118" level="INFO">${current_ssh_connection_object} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:39:51.281890" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:51.282557" level="INFO">{1: 47, 2: 35, 3: 36}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:51.282295" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:51.283051" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:51.282778" 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-08-22T23:39:51.283660" elapsed="0.000192"/>
</kw>
<msg time="2026-08-22T23:39:51.283966" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:39:51.284015" level="INFO">${old_connection_index} = 47</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-08-22T23:39:51.283274" elapsed="0.000766"/>
</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-08-22T23:39:51.284874" elapsed="0.000142"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:39:51.285680" 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-08-22T23:39:51.285507" elapsed="0.000608">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-08-22T23:39:51.285180" elapsed="0.000997"/>
</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-08-22T23:39:51.286684" elapsed="0.000105"/>
</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-08-22T23:39:51.286344" elapsed="0.000492"/>
</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-08-22T23:39:51.284338" elapsed="0.002583"/>
</kw>
<status status="PASS" start="2026-08-22T23:39:51.284117" elapsed="0.002860"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.284098" elapsed="0.002905"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:39:51.287819" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:39:51.287529" elapsed="0.000316"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:39:51.287895" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:39:51.288049" level="INFO">${odl_ip} = 10.30.170.200</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:39:51.287205" elapsed="0.000869"/>
</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-08-22T23:39:51.288228" elapsed="0.000483"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:39:51.289164" level="INFO">index=48
host=10.30.170.200
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-08-22T23:39:51.289272" level="INFO">${karaf_connection_object} = index=48
host=10.30.170.200
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-08-22T23:39:51.288882" elapsed="0.000418"/>
</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-08-22T23:39:51.289449" elapsed="0.002275"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:39:51.292152" level="INFO">Logging into '10.30.170.200:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:39:51.293175" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.200</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-08-22T23:39:51.291888" elapsed="0.001681">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.200</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-08-22T23:39:51.297191" elapsed="0.000187"/>
</kw>
<msg time="2026-08-22T23:39:51.297421" 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-08-22T23:39:51.296741" elapsed="0.000741"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.297658" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.297819" 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-08-22T23:39:51.294398" elapsed="0.003502"/>
</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-08-22T23:39:51.293877" elapsed="0.004071"/>
</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-08-22T23:39:51.281245" elapsed="0.016782">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.200</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-08-22T23:39:51.298353" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:39:51.298426" 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-08-22T23:39:51.270915" elapsed="0.027614">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.200</status>
</kw>
<msg time="2026-08-22T23:39:51.298691" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:39:51.298738" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.200</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:39:51.266281" elapsed="0.032480"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.299114" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:51.298840" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.298820" elapsed="0.000371"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:39:51.266140" elapsed="0.033075"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:39:51.304497" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:51.304390" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.304372" 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-08-22T23:39:51.305654" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:51.305529" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.305510" elapsed="0.000210"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:39:51.306076" level="INFO">${karaf_connection_index} = 35</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:39:51.305860" elapsed="0.000241"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:39:51.306423" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:39:51.306252" elapsed="0.000195"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:39:51.340965" level="INFO">log: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 "1 "[C "1 "0 ". "3 "0 ". "1 "7 "0 ". "2 "0 "0 "[K"</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:39:51.306993" elapsed="0.034051"/>
</kw>
<msg time="2026-08-22T23:39:51.341148" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:39:51.341196" level="INFO">${message_write} = log: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 "1 "[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-08-22T23:39:51.306617" elapsed="0.034617"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:39:51.343663" 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-08-22T23:39:51.341772" elapsed="0.001949"/>
</kw>
<msg time="2026-08-22T23:39:51.343818" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:39:51.343872" 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-08-22T23:39:51.341402" elapsed="0.002502"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.344200" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:51.343981" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.343961" elapsed="0.000318"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:51.344696" 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-08-22T23:39:51.344420" elapsed="0.000326"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.345038" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:51.344814" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.344795" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:39:51.345151" 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-08-22T23:39:51.348512" elapsed="0.000230"/>
</kw>
<msg time="2026-08-22T23:39:51.348846" 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-08-22T23:39:51.347955" 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-08-22T23:39:51.349069" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.349232" 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-08-22T23:39:51.347571" elapsed="0.001743"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:39:51.345408" elapsed="0.003953"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:39:51.305232" elapsed="0.044227"/>
</kw>
<msg time="2026-08-22T23:39:51.349551" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:39:51.349615" 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-08-22T23:39:51.304729" elapsed="0.044917"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:39:51.349834" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:39:51.349725" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.349706" elapsed="0.000223"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.350321" 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-08-22T23:39:51.350678" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:39:51.350752" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:39:51.304054" elapsed="0.046810"/>
</kw>
<msg time="2026-08-22T23:39:51.350959" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:39:51.351004" 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-08-22T23:39:51.299474" elapsed="0.051558"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.351401" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:51.351149" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.351130" elapsed="0.000386"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:39:51.299339" elapsed="0.052202"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:39:51.356956" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:51.356847" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.356829" 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-08-22T23:39:51.358104" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:51.357999" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.357981" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:39:51.358523" level="INFO">${karaf_connection_index} = 36</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:39:51.358308" elapsed="0.000241"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:39:51.358889" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:39:51.358719" elapsed="0.000195"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:39:51.392240" level="INFO">log: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 "1 "[C "1 "0 ". "3 "0 ". "1 "7 "0 ". "2 "0 "0 "[K"</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:39:51.359394" elapsed="0.033028"/>
</kw>
<msg time="2026-08-22T23:39:51.392737" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:39:51.392857" level="INFO">${message_write} = log: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 "1 "[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-08-22T23:39:51.359067" elapsed="0.033872"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:39:51.397754" 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-08-22T23:39:51.394189" elapsed="0.003698"/>
</kw>
<msg time="2026-08-22T23:39:51.398103" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:39:51.398201" 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-08-22T23:39:51.393334" elapsed="0.004926"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.398954" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:51.398432" elapsed="0.000642"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.398389" elapsed="0.000741"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:51.400068" 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-08-22T23:39:51.399437" elapsed="0.000680"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.400397" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:51.400185" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.400166" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:39:51.400511" 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">
<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-08-22T23:39:51.402531" elapsed="0.000259"/>
</kw>
<msg time="2026-08-22T23:39:51.402899" 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-08-22T23:39:51.401924" 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="NOT RUN" start="2026-08-22T23:39:51.403132" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.403295" 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-08-22T23:39:51.401318" elapsed="0.002063"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:39:51.400808" elapsed="0.002622"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:39:51.357700" elapsed="0.045828"/>
</kw>
<msg time="2026-08-22T23:39:51.403699" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:39:51.403761" 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-08-22T23:39:51.357172" elapsed="0.046639"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:39:51.404027" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:39:51.403914" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.403892" 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-08-22T23:39:51.404521" 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-08-22T23:39:51.404895" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:39:51.404972" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:39:51.356491" elapsed="0.048593"/>
</kw>
<msg time="2026-08-22T23:39:51.405181" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:39:51.405226" 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-08-22T23:39:51.351827" elapsed="0.053428"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.405609" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:51.405333" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.405315" elapsed="0.000379"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:39:51.351687" elapsed="0.054032"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:39:51.265961" elapsed="0.139790"/>
</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-08-22T23:39:51.261783" elapsed="0.144029"/>
</kw>
<kw name="Start_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:39:51.412729" level="INFO">${base_command} = /tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/start</msg>
<var>${base_command}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/bin/start</arg>
<arg>${NODE_START_COMMAND}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:39:51.412336" elapsed="0.000421"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:39:51.413284" level="INFO">${command} = /tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/start</msg>
<var>${command}</var>
<arg>"""${export_java_home}""" != ""</arg>
<arg>export JAVA_HOME="${export_java_home}"; ${base_command}</arg>
<arg>${base_command}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:39:51.412923" elapsed="0.000387"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-08-22T23:39:51.413749" level="INFO">${epoch} = 1787441991.413676</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-08-22T23:39:51.413470" elapsed="0.000305"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:39:51.414333" level="INFO">${gc_filepath} = /tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log/gc_1787441991.413676.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-08-22T23:39:51.413937" elapsed="0.000423"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:39:51.414907" level="INFO">${gc_options} = -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log/gc_1787441991.413676.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-08-22T23:39:51.414522" elapsed="0.000412"/>
</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-08-22T23:39:51.416467" 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-08-22T23:39:51.416074" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:39:51.416983" 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-08-22T23:39:51.416681" elapsed="0.000356"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:39:51.417084" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:39:51.417240" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:39:51.415671" elapsed="0.001594"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:39:51.418306" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:39:51.418039" elapsed="0.000293"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:39:51.419169" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:39:51.419268" level="INFO">${current_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:39:51.419048" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:51.422760" elapsed="0.000081"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:51.422042" elapsed="0.000894"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:51.422023" elapsed="0.000942"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:39:51.423246" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:39:51.423408" level="INFO">${current_ssh_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:39:51.423116" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:51.424739" level="INFO">Attempting to execute command "/tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/start -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log/gc_1787441991.413676.log" on remote system "10.30.170.200" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:51.423641" elapsed="0.001166"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:39:51.425887" level="INFO">${conn_id} = 49</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:39:51.424984" elapsed="0.000931"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:39:51.427506" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:39:51.427850" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:39:51.426948" elapsed="0.001008"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:39:51.428290" elapsed="0.000773"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:39:51.430505" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:39:52.143119" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:39:51 UTC 2026

  System load:  0.02               Processes:             121
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:38:22 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:39:51.430180" elapsed="0.713113"/>
</kw>
<msg time="2026-08-22T23:39:52.143459" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:39:51.429421" elapsed="0.714153"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:39:51.426184" elapsed="0.717592"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:39:52.144440" level="INFO">Executing command '/tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/start -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log/gc_1787441991.413676.log'.</msg>
<msg time="2026-08-22T23:39:52.167780" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:39:52.168092" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:39:52.168194" 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-08-22T23:39:52.144052" elapsed="0.024196"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:39:52.168814" elapsed="0.000491"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:52.171123" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:52.169829" elapsed="0.001398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:39:52.171954" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:52.171475" elapsed="0.000720"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:52.171416" elapsed="0.000846"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:39:52.172966" elapsed="0.000062"/>
</return>
<status status="PASS" start="2026-08-22T23:39:52.172531" elapsed="0.000709"/>
</branch>
<status status="PASS" start="2026-08-22T23:39:52.172489" elapsed="0.000825"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:39:52.173413" 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">
<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-08-22T23:39:52.179889" elapsed="0.000215"/>
</kw>
<msg time="2026-08-22T23:39:52.180193" 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-08-22T23:39:52.178458" elapsed="0.001893"/>
</kw>
<kw name="Open 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-08-22T23:39:52.180798" elapsed="0.000067"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:52.181257" 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-08-22T23:39:52.174319" elapsed="0.007359"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:39:51.421389" elapsed="0.760437"/>
</kw>
<msg time="2026-08-22T23:39:52.181902" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:39:51.420519" elapsed="0.761457"/>
</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-08-22T23:39:51.419989" elapsed="0.762103"/>
</kw>
<msg time="2026-08-22T23:39:52.182151" 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-08-22T23:39:51.419446" elapsed="0.762759"/>
</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-08-22T23:39:52.185755" elapsed="0.000149"/>
</kw>
<msg time="2026-08-22T23:39:52.185947" 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-08-22T23:39:52.185232" 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="NOT RUN" start="2026-08-22T23:39:52.186205" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:52.186369" 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-08-22T23:39:52.182665" elapsed="0.003787"/>
</kw>
<msg time="2026-08-22T23:39:52.186546" 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-08-22T23:39:51.418640" elapsed="0.767932"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:52.187025" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:52.186768" elapsed="0.000300"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:39:52.187112" 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-08-22T23:39:51.417642" elapsed="0.769597"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:39:51.417451" elapsed="0.769826"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:39:51.417320" elapsed="0.769996"/>
</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-08-22T23:39:51.415146" elapsed="0.772231"/>
</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-08-22T23:39:52.198959" 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-08-22T23:39:52.198557" elapsed="0.000429"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:39:52.199444" 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-08-22T23:39:52.199145" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:39:52.199516" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:39:52.199690" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:39:52.198182" elapsed="0.001533"/>
</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-08-22T23:39:52.201310" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:39:52.201003" elapsed="0.000333"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:39:52.201383" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:39:52.201533" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-08-22T23:39:52.200640" elapsed="0.000918"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:52.209499" 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-08-22T23:39:52.209009" elapsed="0.000539"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:39:52.210223" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:39:52.209720" 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-08-22T23:39:52.216136" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', 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-08-22T23:39:52.212619" elapsed="0.005703">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:52.210339" elapsed="0.008325">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', 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-08-22T23:39:52.218860" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:52.218702" elapsed="0.000462"/>
</branch>
<status status="FAIL" start="2026-08-22T23:39:52.210320" elapsed="0.008872">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', 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-08-22T23:39:52.219698" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:39:52.219838" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:52.219799" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:52.219781" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:39:52.220045" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:39:52.220116" 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-08-22T23:39:52.204562" elapsed="0.015665">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', 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-08-22T23:39:52.220302" 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-08-22T23:39:52.201812" elapsed="0.018592">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', 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-08-22T23:39:52.220646" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-08-22T23:39:52.220779" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:39:52.220741" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:52.220724" elapsed="0.000118"/>
</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-08-22T23:39:52.221038" 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-08-22T23:39:52.221297" elapsed="0.000024"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="NOT RUN" start="2026-08-22T23:39:52.221366" 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-08-22T23:39:52.200242" elapsed="0.021230">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', 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-08-22T23:39:52.221620" elapsed="0.000020"/>
</continue>
<status status="NOT RUN" start="2026-08-22T23:39:52.221555" elapsed="0.000111"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:52.221538" elapsed="0.000150"/>
</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-08-22T23:39:52.221829" elapsed="0.000021"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-08-22T23:39:52.200008" elapsed="0.021913">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', 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-08-22T23:39:52.199814" elapsed="0.022169">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', 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-08-22T23:39:52.197777" elapsed="0.024306">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-08-22T23:39:52.197377" elapsed="0.024766">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<status status="FAIL" start="2026-08-22T23:39:52.197358" elapsed="0.024818">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', 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-08-22T23:39:52.222445" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:52.222244" elapsed="0.000256"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:52.222228" 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-08-22T23:39:52.222851" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:39:52.222576" elapsed="0.000334"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:39:52.222561" elapsed="0.000372"/>
</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-08-22T23:39:52.196957" elapsed="0.026059">ConnectionError: HTTPConnectionPool(host='10.30.170.200', 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.200', 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-08-22T23:40:02.240081" 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-08-22T23:40:02.239619" elapsed="0.000495"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:40:02.240608" 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-08-22T23:40:02.240283" elapsed="0.000354"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:40:02.240687" elapsed="0.000045"/>
</return>
<msg time="2026-08-22T23:40:02.240867" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:40:02.239150" elapsed="0.001743"/>
</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-08-22T23:40:02.242494" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:02.242186" elapsed="0.000335"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:40:02.242569" elapsed="0.000045"/>
</return>
<msg time="2026-08-22T23:40:02.242738" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-08-22T23:40:02.241758" elapsed="0.001006"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:02.250825" 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-08-22T23:40:02.250294" elapsed="0.000581"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:02.251557" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:02.251036" elapsed="0.000586"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:40:02.789812" level="INFO">GET Request : url=http://10.30.170.200: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:02.790185" level="INFO">GET Response : url=http://10.30.170.200: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': 'Sat, 22 Aug 2026 23:40:02 GMT', 'Expires': 'Sat, 22 Aug 2026 22:40:02 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787442002,"status":200} 
 </msg>
<msg time="2026-08-22T23:40:02.790706" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:02.253907" elapsed="0.537008"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:02.251694" elapsed="0.539817"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:02.792085" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:02.791632" elapsed="0.001275"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:02.251675" elapsed="0.541296"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:02.800701" 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787442002,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:02.798036" elapsed="0.002772"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:02.796067" elapsed="0.004794"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:02.796019" elapsed="0.004883"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:02.804735" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:02.802178" elapsed="0.002662"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:02.800988" elapsed="0.003905"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:02.800969" elapsed="0.003965"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:02.806349" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:02.805437" 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-08-22T23:40:02.807050" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:02.806535" elapsed="0.000605"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:02.808109" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:02.807517" elapsed="0.000639"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:02.807216" elapsed="0.000993"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:02.806515" elapsed="0.001730"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:02.809655" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:02.808786" 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-08-22T23:40:02.810269" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:02.809837" elapsed="0.000519"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:02.811242" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:02.810731" elapsed="0.000556"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:02.810394" elapsed="0.000945"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:02.809817" 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-08-22T23:40:02.811795" elapsed="0.000810"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:02.813668" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:02.812945" elapsed="0.000766"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:40:02.813971" 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-08-22T23:40:02.794146" elapsed="0.022643"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:40:02.816996" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:40:02.816862" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:02.816844" elapsed="0.000223"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:40:02.820347" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787442002,...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:40:02.817211" elapsed="0.003166"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:40:02.820430" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:40:02.820614" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787442002,...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:02.245527" elapsed="0.575115"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:02.821019" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:40:02.821182" level="INFO">${conf_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787442002,...</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-08-22T23:40:02.242972" elapsed="0.578236"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:02.822057" level="INFO">{
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787442002,
 "value": {
  "LocalShards": [
   "member-1-shard-default-config",
   "member-1-shard-inventory-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-08-22T23:40:02.821801" elapsed="0.000304"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:02.823456" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787442002, '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-08-22T23:40:02.822698" elapsed="0.000787"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-08-22T23:40:02.823535" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:40:02.823737" level="INFO">${manager_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787442002, '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-08-22T23:40:02.822311" elapsed="0.001453"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:40:02.824321" level="INFO">${value_object} = {'LocalShards': ['member-1-shard-default-config', 'member-1-shard-inventory-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-08-22T23:40:02.823915" elapsed="0.000433"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:40:02.824762" 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-08-22T23:40:02.824502" elapsed="0.000287"/>
</kw>
<return>
<value>${sync_status}</value>
<status status="PASS" start="2026-08-22T23:40:02.824838" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:40:02.824991" 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-08-22T23:40:02.821423" elapsed="0.003592"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-08-22T23:40:02.825193" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:40:02.825083" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:02.825065" 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-08-22T23:40:02.832947" 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-08-22T23:40:02.832426" elapsed="0.000609"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:02.833684" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:02.833190" elapsed="0.000540"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:40:02.844379" level="INFO">GET Request : url=http://10.30.170.200: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:02.844518" level="INFO">GET Response : url=http://10.30.170.200: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': 'Sat, 22 Aug 2026 23:40:02 GMT', 'Expires': 'Sat, 22 Aug 2026 22:40:02 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787442002,"status":200} 
 </msg>
<msg time="2026-08-22T23:40:02.844768" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:02.835994" elapsed="0.008863"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:02.833798" elapsed="0.011294"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:02.845278" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:02.845121" elapsed="0.000583"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:02.833780" elapsed="0.011959"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:02.852659" 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787442002,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:02.848968" elapsed="0.003871"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:02.847339" elapsed="0.005572"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:02.847312" elapsed="0.005653"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:02.856782" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:02.854271" elapsed="0.002612"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:02.853083" elapsed="0.003849"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:02.853057" elapsed="0.003914"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:02.858427" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:02.857471" 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-08-22T23:40:02.859065" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:02.858627" elapsed="0.000525"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:02.860052" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:02.859474" elapsed="0.000624"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:02.859189" elapsed="0.000960"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:02.858606" elapsed="0.001578"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:02.861547" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:02.860676" 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-08-22T23:40:02.862239" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:02.861813" elapsed="0.000513"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:02.863211" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:02.862706" elapsed="0.000550"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:02.862372" elapsed="0.000935"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:02.861793" elapsed="0.001548"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:40:02.863546" elapsed="0.000869"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:02.865333" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:02.864717" 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-08-22T23:40:02.865704" 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-08-22T23:40:02.846354" elapsed="0.022256"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:40:02.868840" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:40:02.868685" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:02.868666" elapsed="0.000243"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:40:02.872136" 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-08-22T23:40:02.869054" elapsed="0.003112"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:40:02.872218" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:40:02.872377" 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-08-22T23:40:02.828077" elapsed="0.044327"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:02.872461" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:40:02.872644" 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-08-22T23:40:02.825480" elapsed="0.047192"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:02.873498" level="INFO">{
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787442002,
 "value": {
  "LocalShards": [
   "member-1-shard-default-operational",
   "member-1-shard-inventory-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-08-22T23:40:02.873245" elapsed="0.000301"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:02.874875" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787442002, ...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:02.874114" elapsed="0.000790"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-08-22T23:40:02.874953" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:40:02.875112" level="INFO">${manager_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787442002, ...</msg>
<var>${manager_object}</var>
<arg>${shard_manager_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-08-22T23:40:02.873776" elapsed="0.001363"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:40:02.875515" level="INFO">${value_object} = {'LocalShards': ['member-1-shard-default-operational', 'member-1-shard-inventory-operational', 'member-1-shard-topology-operational'], '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-08-22T23:40:02.875289" elapsed="0.000253"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:40:02.875931" 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-08-22T23:40:02.875718" elapsed="0.000239"/>
</kw>
<return>
<value>${sync_status}</value>
<status status="PASS" start="2026-08-22T23:40:02.876004" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:40:02.876155" 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-08-22T23:40:02.872895" elapsed="0.003284"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="PASS" start="2026-08-22T23:40:02.876222" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:40:02.876369" 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-08-22T23:40:02.241367" elapsed="0.635027"/>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="PASS" start="2026-08-22T23:40:02.876603" elapsed="0.000037"/>
</continue>
<status status="PASS" start="2026-08-22T23:40:02.876464" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:02.876446" elapsed="0.000250"/>
</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-08-22T23:40:02.876888" elapsed="0.000025"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:40:02.241140" elapsed="0.635808"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:40:02.240953" elapsed="0.636031"/>
</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-08-22T23:40:02.238721" elapsed="0.638327"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:02.238350" elapsed="0.638732"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:02.238319" elapsed="0.638788"/>
</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-08-22T23:40:02.878676" 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-08-22T23:40:02.878252" elapsed="0.000451"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:40:02.879165" 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-08-22T23:40:02.878868" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:40:02.879235" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:40:02.879389" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:40:02.877879" elapsed="0.001535"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:02.880445" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:02.880149" elapsed="0.000323"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:40:02.880518" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:40:02.880681" 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-08-22T23:40:02.879808" elapsed="0.000899"/>
</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-08-22T23:40:02.934035" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:02.933572" elapsed="0.000516"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:40:02.935028" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:40:02.934749" elapsed="0.000365">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:40:02.935232" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:40:02.934347" elapsed="0.000935"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:40:02.936014" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:40:02.935543" elapsed="0.000523"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:40:02.936495" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:40:02.936752" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:40:02.936320" elapsed="0.000484"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:02.937352" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:02.937068" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:02.938542" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:02.938288" elapsed="0.000333"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:40:02.939058" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:40:02.938789" 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-08-22T23:40:02.939398" 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-08-22T23:40:02.939616" 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-08-22T23:40:02.939789" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-08-22T23:40:02.939267" elapsed="0.000578"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-08-22T23:40:02.939132" elapsed="0.000743"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:40:02.939918" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:40:02.940076" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:40:02.937963" elapsed="0.002138"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:02.937596" elapsed="0.002557"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:02.940408" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:02.940197" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:02.937528" elapsed="0.003041"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:02.941418" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:02.940863" elapsed="0.000608"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:40:02.941551" elapsed="0.000106"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:40:02.932271" elapsed="0.009563"/>
</kw>
<msg time="2026-08-22T23:40:02.941914" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:40:02.917754" elapsed="0.024228"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:02.964714" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:02.986619" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:03.008503" 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-08-22T23:40:03.008715" 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-08-22T23:40:03.008890" 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-08-22T23:40:03.010092" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:03.009150" elapsed="0.001073"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:03.009135" elapsed="0.001137"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:03.010472" elapsed="0.000067"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:03.010788" elapsed="0.000066"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:03.011087" elapsed="0.000066"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:40:03.009104" elapsed="0.002155"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:40:03.008966" elapsed="0.002322"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:03.011434" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:40:03.011512" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:40:03.011657" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:40:02.913472" elapsed="0.098213"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:40:03.013539" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:40:03.013043" elapsed="0.000719">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:40:03.013884" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:40:03.012435" elapsed="0.001474"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:03.014261" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:03.013980" elapsed="0.000456"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:03.015321" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:03.014753" elapsed="0.000651"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:03.014464" elapsed="0.001087"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:03.013962" elapsed="0.001628"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:40:03.028051" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:40:03.015746" elapsed="0.012332"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:40:03.028130" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:40:03.028287" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:40:03.012107" elapsed="0.016205"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:40:03.030208" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:40:03.029718" elapsed="0.000682">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-08-22T23:40:03.030524" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:40:03.028987" elapsed="0.001562"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-08-22T23:40:03.030813" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:40:03.030642" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:03.030623" elapsed="0.000276"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:03.031045" 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-08-22T23:40:03.031215" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-08-22T23:40:03.031279" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:40:03.033439" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:40:03.028663" elapsed="0.004803"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:03.035221" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:03.034739" elapsed="0.000530"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:03.035919" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:03.035422" elapsed="0.000542"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:40:03.569393" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:03.570191" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node01qvmfwmrbttfkv1u9f8so8roo0.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Fri, 21-Aug-2026 23:40:03 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":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cms-encrypted-data-format","cleartext-private-keys","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-netconf-monitoring_2010-10-04","revision":"2010-10-04","schema":"/rests/modules/ietf-netconf-monitoring?revision=2010-10-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring","conformance-type":"import"},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"odl-netconf-device_2025-12-05","revision":"2025-12-05","schema":"/rests/modules/odl-netconf-device?revision=2025-12-05","namespace":"urn:opendaylight:netconf:device","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-http-server_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-server?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["tcp-supported","tls-supported"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"netconf-keystore_2024-07-08","revision":"2024-07-08","schema":"/rests/modules/netconf-keystore?revision=2024-07-08","namespace":"urn:opendaylight:netconf:keystore","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","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-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"ietf-netconf-client_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-netconf-client?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-client","conformance-type":"import","feature":["ssh-listen","tls-listen","tls-initiate","central-netconf-client-supported","ssh-initiate"]},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":[... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-08-22T23:40:03.570988" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:03.038327" elapsed="0.532852"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:03.036032" elapsed="0.535733"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:03.572256" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:03.571842" elapsed="0.001139"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:03.036014" elapsed="0.537026"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:03.581885" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cms-encrypted-data-format","cleartext-private-keys","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-netconf-monitoring_2010-10-04","revision":"2010-10-04","schema":"/rests/modules/ietf-netconf-monitoring?revision=2010-10-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring","conformance-type":"import"},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"odl-netconf-device_2025-12-05","revision":"2025-12-05","schema":"/rests/modules/odl-netconf-device?revision=2025-12-05","namespace":"urn:opendaylight:netconf:device","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-http-server_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-server?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["tcp-supported","tls-supported"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"netconf-keystore_2024-07-08","revision":"2024-07-08","schema":"/rests/modules/netconf-keystore?revision=2024-07-08","namespace":"urn:opendaylight:netconf:keystore","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","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-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"ietf-netconf-client_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-netconf-client?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-client","conformance-type":"import","feature":["ssh-listen","tls-listen","tls-initiate","central-netconf-client-supported","ssh-initiate"]},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"netconf-node-optional_2022-12-25","revision":"2022-12-25","schema":"/rests/modules/netconf-node-optional?revision=2022-12-25","namespace":"urn:opendaylight:netconf-node-optional","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"netconf-node-topology_2025-12-05","revision":"2025-12-05","schema":"/rests/modules/netconf-node-topology?revision=2025-12-05","namespace":"urn:opendaylight:netconf-node-topology","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:03.578697" elapsed="0.003448"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:03.575984" elapsed="0.006214"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:03.575938" elapsed="0.006323"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:03.585996" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:03.583495" elapsed="0.002601"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:03.582357" elapsed="0.003789"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:03.582337" elapsed="0.003848"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:03.587728" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:03.586736" elapsed="0.001037"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:03.588353" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:03.587913" elapsed="0.000529"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:03.589308" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:03.588787" elapsed="0.000569"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:03.588481" elapsed="0.000926"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:03.587893" elapsed="0.001550"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:03.590874" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:03.589994" elapsed="0.000923"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:03.591493" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:03.591056" elapsed="0.000601"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:03.592501" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:03.591991" elapsed="0.000556"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:03.591701" elapsed="0.000914"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:03.591037" 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-08-22T23:40:03.592857" elapsed="0.000883"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:03.594682" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:03.594023" elapsed="0.000703"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:40:03.594984" elapsed="0.004313"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:40:03.574132" elapsed="0.025304"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:40:03.599665" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:40:03.599509" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:03.599489" elapsed="0.000248"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:40:03.605858" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:40:03.599882" elapsed="0.006007"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:40:03.605943" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:40:03.606110" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:03.033906" elapsed="0.572232"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:03.606202" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:40:03.606370" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-08-22T23:40:02.891133" elapsed="0.715265"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:03.606763" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:03.606482" elapsed="0.000398"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:03.606464" elapsed="0.000441"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:03.606940" elapsed="0.000026"/>
</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-08-22T23:40:02.884893" elapsed="0.722172"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:40:02.879636" elapsed="0.727470"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:40:02.879472" elapsed="0.727667"/>
</for>
<arg>${member_index_list}</arg>
<status status="PASS" start="2026-08-22T23:40:02.877435" elapsed="0.729762"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:02.877166" elapsed="0.730059"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:02.877148" elapsed="0.730100"/>
</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-08-22T23:40:03.607662" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:03.607304" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:03.607288" elapsed="0.000459"/>
</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-08-22T23:40:02.237798" elapsed="1.369997"/>
</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-08-22T23:39:52.187541" elapsed="11.420315"/>
</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-08-22T23:40:03.611245" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:40:03.610852" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:40:03.611785" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:40:03.611431" elapsed="0.000381"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:40:03.611859" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:40:03.612015" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:40:03.610419" elapsed="0.001621"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:40:03.613117" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:40:03.612847" elapsed="0.000296"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:40:03.613936" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:40:03.614036" level="INFO">${current_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:40:03.617826" level="INFO">${current_ssh_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:40:03.617539" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:03.618858" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.200" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:03.618002" elapsed="0.000903"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:40:03.620016" level="INFO">${conn_id} = 50</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:40:03.619098" elapsed="0.000946"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:40:03.621500" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:40:03.621816" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:40:03.620899" elapsed="0.001018"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:40:03.622235" elapsed="0.000871"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:40:03.624697" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:40:03.971107" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:39:51 UTC 2026

  System load:  0.02               Processes:             121
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:39:52 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:40:03.624281" elapsed="0.347081"/>
</kw>
<msg time="2026-08-22T23:40:03.971498" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:40:03.623433" elapsed="0.348288"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:40:03.620263" elapsed="0.351676"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:40:03.972572" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-08-22T23:40:03.985239" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-08-22T23:40:03.985743" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:40:03.985846" 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-08-22T23:40:03.972213" elapsed="0.013684"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:40:03.986267" elapsed="0.000509"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:03.988174" 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-08-22T23:40:03.987236" elapsed="0.001041"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:40:03.988882" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:40:03.988469" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:03.988412" elapsed="0.000640"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:40:03.989465" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-08-22T23:40:03.989173" elapsed="0.000470"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:03.989139" elapsed="0.000562"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:40:03.989779" 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-08-22T23:40:03.996366" elapsed="0.000347"/>
</kw>
<msg time="2026-08-22T23:40:03.996799" 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-08-22T23:40:03.994796" elapsed="0.002155"/>
</kw>
<kw name="Open 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-08-22T23:40:03.997365" elapsed="0.000072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:03.997899" elapsed="0.000076"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:40:03.990494" elapsed="0.007687"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:40:03.615965" elapsed="0.382351"/>
</kw>
<msg time="2026-08-22T23:40:03.998392" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:40:03.615321" elapsed="0.383162"/>
</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-08-22T23:40:03.614765" elapsed="0.383861"/>
</kw>
<msg time="2026-08-22T23:40:03.998688" 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-08-22T23:40:03.614214" elapsed="0.384655"/>
</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-08-22T23:40:04.002678" elapsed="0.000148"/>
</kw>
<msg time="2026-08-22T23:40:04.002869" 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-08-22T23:40:04.002167" elapsed="0.000765"/>
</kw>
<kw name="Open 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-08-22T23:40:04.003104" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:04.003267" 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-08-22T23:40:03.999322" elapsed="0.004027"/>
</kw>
<msg time="2026-08-22T23:40:04.003442" 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-08-22T23:40:03.613354" elapsed="0.390114"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:04.003907" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:04.003658" elapsed="0.000290"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:40:04.003991" 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-08-22T23:40:03.612399" elapsed="0.391719"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:40:03.612226" elapsed="0.391931"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:40:04.005180" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:40:04.004906" elapsed="0.000300"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:40:04.006000" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:40:04.006101" level="INFO">${current_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:40:04.005874" elapsed="0.000254"/>
</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-08-22T23:40:04.009319" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:04.008708" elapsed="0.000762"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:04.008689" elapsed="0.000809"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:40:04.009782" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:40:04.009940" level="INFO">${current_ssh_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:40:04.009669" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:04.010965" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.12" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:04.010119" elapsed="0.000895"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:40:04.011923" level="INFO">${conn_id} = 51</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:40:04.011186" elapsed="0.000764"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:40:04.013443" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:40:04.013782" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:40:04.012823" elapsed="0.001059"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:40:04.014193" elapsed="0.000722"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:40:04.016480" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:40:04.597164" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:40:04 UTC 2026

  System load:  0.1                Processes:             124
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:38:23 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:40:04.016122" elapsed="0.581430"/>
</kw>
<msg time="2026-08-22T23:40:04.597736" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:40:04.015266" elapsed="0.582803"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:40:04.012164" elapsed="0.586161"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:40:04.599155" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-08-22T23:40:04.611767" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-08-22T23:40:04.612080" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:40:04.612170" 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-08-22T23:40:04.598672" elapsed="0.013534"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:40:04.612466" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:04.613771" 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-08-22T23:40:04.613118" elapsed="0.000724"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:40:04.614217" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:40:04.613969" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:04.613929" elapsed="0.000401"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:40:04.614632" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-08-22T23:40:04.614410" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:04.614387" elapsed="0.000376"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:40:04.614812" 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">
<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-08-22T23:40:04.621157" elapsed="0.000336"/>
</kw>
<msg time="2026-08-22T23:40:04.621608" 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-08-22T23:40:04.619502" elapsed="0.002275"/>
</kw>
<kw name="Open 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-08-22T23:40:04.622216" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:04.622698" elapsed="0.000071"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:40:04.615321" elapsed="0.007657"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:40:04.008061" elapsed="0.615061"/>
</kw>
<msg time="2026-08-22T23:40:04.623202" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:40:04.007377" elapsed="0.615920"/>
</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-08-22T23:40:04.006794" elapsed="0.616623"/>
</kw>
<msg time="2026-08-22T23:40:04.623479" 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-08-22T23:40:04.006279" elapsed="0.617285"/>
</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-08-22T23:40:04.627271" elapsed="0.000145"/>
</kw>
<msg time="2026-08-22T23:40:04.627459" 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-08-22T23:40:04.626783" 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="NOT RUN" start="2026-08-22T23:40:04.627745" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:04.627912" 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-08-22T23:40:04.624030" elapsed="0.003964"/>
</kw>
<msg time="2026-08-22T23:40:04.628091" 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-08-22T23:40:04.005420" elapsed="0.622697"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:04.628564" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:04.628315" elapsed="0.000310"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:40:04.628668" 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-08-22T23:40:04.004448" elapsed="0.624430"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:40:04.004264" elapsed="0.624653"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:40:04.629957" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:40:04.629677" elapsed="0.000306"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:40:04.630777" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:40:04.630879" level="INFO">${current_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:40:04.630650" elapsed="0.000256"/>
</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-08-22T23:40:04.634391" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:04.633775" elapsed="0.000768"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:04.633755" elapsed="0.000816"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:40:04.634869" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:40:04.635028" level="INFO">${current_ssh_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:40:04.634758" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:04.636051" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.79" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:04.635206" elapsed="0.000892"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:40:04.637006" 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-08-22T23:40:04.636268" elapsed="0.000765"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:40:04.638521" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:40:04.638823" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:40:04.637895" elapsed="0.001026"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:40:04.639228" elapsed="0.000775"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:40:04.641561" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:40:05.242450" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:40:04 UTC 2026

  System load:  0.04               Processes:             125
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:38:24 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:40:04.641201" elapsed="0.601513"/>
</kw>
<msg time="2026-08-22T23:40:05.242846" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:40:04.640352" elapsed="0.602680"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:40:04.637264" elapsed="0.605988"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:40:05.243904" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-08-22T23:40:05.255657" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-08-22T23:40:05.255965" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:40:05.256031" 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-08-22T23:40:05.243516" elapsed="0.012547"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:40:05.256293" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:05.257608" 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-08-22T23:40:05.256914" elapsed="0.000858"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:40:05.258150" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:40:05.257902" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:05.257861" elapsed="0.000401"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:40:05.258655" elapsed="0.000066"/>
</return>
<status status="PASS" start="2026-08-22T23:40:05.258339" elapsed="0.000464"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:05.258317" elapsed="0.000544"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:40:05.258942" 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-08-22T23:40:05.267599" elapsed="0.000230"/>
</kw>
<msg time="2026-08-22T23:40:05.267888" 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-08-22T23:40:05.266381" 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-08-22T23:40:05.268296" elapsed="0.000047"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:05.268621" elapsed="0.000048"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:40:05.259744" elapsed="0.009066"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:40:04.633116" elapsed="0.635790"/>
</kw>
<msg time="2026-08-22T23:40:05.268958" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:40:04.632434" elapsed="0.636586"/>
</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-08-22T23:40:04.631837" elapsed="0.637259"/>
</kw>
<msg time="2026-08-22T23:40:05.269136" 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-08-22T23:40:04.631057" elapsed="0.638138"/>
</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-08-22T23:40:05.272556" elapsed="0.000164"/>
</kw>
<msg time="2026-08-22T23:40:05.272763" 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-08-22T23:40:05.272067" elapsed="0.000758"/>
</kw>
<kw name="Open 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-08-22T23:40:05.272980" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:05.273140" 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-08-22T23:40:05.269499" elapsed="0.003721"/>
</kw>
<msg time="2026-08-22T23:40:05.273338" 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-08-22T23:40:04.630198" elapsed="0.643167"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:05.273811" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:05.273545" elapsed="0.000308"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:40:05.273895" 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-08-22T23:40:04.629217" elapsed="0.644803"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:40:04.629028" elapsed="0.645031"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:40:03.612094" elapsed="1.662006"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-08-22T23:40:03.608121" elapsed="1.666045"/>
</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-08-22T23:39:51.406070" elapsed="13.868151"/>
</kw>
<arg>1</arg>
<doc>Convenience keyword that starts the specified member of the cluster.</doc>
<status status="PASS" start="2026-08-22T23:39:51.248799" elapsed="14.025495"/>
</kw>
<kw name="Get_Topology">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Topology_Core">
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:05.282972" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:05.282677" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:05.283422" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:05.283173" 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-08-22T23:40:05.335168" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:05.335881" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Fri, 21-Aug-2026 23:40:05 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '4698'} 
 body={"network-topology:topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}},"node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"unavailable-capabilities":{"unavailable-capability":[{"failure-reason":"missing-source","capability":"(urn:ietf:params:xml:ns:netconf:notification:1.0?revision=2008-07-14)notifications"}]},"keepalive-delay":0,"tcp-only":false,"clustered-connection-status":{"netconf-master-node":"pekko://opendaylight-cluster-data@127.0.0.1:2550"},"negotiated-ssh-transport-parameters":{"encryption-alg":"chacha20-poly1305","host-key-alg":"rsa-sha2-512","mac-alg":"none","key-exchange-alg":"sntrup761x25519-sha512"},"session-id":2,"connection-status":"connected","login-password-unencrypted":{"username":"admin","password":"topsecret"},"available-capabilities":{"available-capability":[{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:notification:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:exi:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:candidate:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.1"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.0"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people?revision=2014-08-18)people"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)ietf-yang-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?revision=2010-10-04)ietf-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car?revision=2014-08-18)car"},{"capability-origin":"device-advertised","capability":"(ns:main?revision=2014-01-21)main"},{"capability-origin":"device-advertised","capability":"(ns:augment:main:a?revision=2014-01-21)augment-main-a"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:netconf:monitoring?revision=2022-07-18)odl-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:netconf:base:1.0?revision=2011-06-01)ietf-netconf"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring-extension?revision=2013-12-10)ietf-netconf-monitoring-extension"},{"capability-origin":"device-advertised","capability":"(org:opendaylight:coretutorials:ncmount:example:l2fib?revision=2016-03-07)ncmount-l2fib"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people?revision=2014-08-18)car-people"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-purchase?revision=2014-08-18)car-purchase"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:test:netconf:crud?revision=2014-10-18)test"},{"capability-origin":"device-advertised","capability":"(https://example.com/ns/example-action?revision=2016-07-07)example-action"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2013-07-15)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2010-09-24)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:yang:extension:yang-ext?revision=2013-07-09)yang-ext"}]},"host":"10.30.171.196"}}]}]} 
 </msg>
<msg time="2026-08-22T23:40:05.336255" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:05.285628" elapsed="0.050696"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:05.283538" elapsed="0.052915"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:05.337035" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:05.336534" elapsed="0.000665"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:05.283519" elapsed="0.053735"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:05.343230" level="INFO">{"network-topology:topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}},"node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"unavailable-capabilities":{"unavailable-capability":[{"failure-reason":"missing-source","capability":"(urn:ietf:params:xml:ns:netconf:notification:1.0?revision=2008-07-14)notifications"}]},"keepalive-delay":0,"tcp-only":false,"clustered-connection-status":{"netconf-master-node":"pekko://opendaylight-cluster-data@127.0.0.1:2550"},"negotiated-ssh-transport-parameters":{"encryption-alg":"chacha20-poly1305","host-key-alg":"rsa-sha2-512","mac-alg":"none","key-exchange-alg":"sntrup761x25519-sha512"},"session-id":2,"connection-status":"connected","login-password-unencrypted":{"username":"admin","password":"topsecret"},"available-capabilities":{"available-capability":[{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:notification:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:exi:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:candidate:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.1"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.0"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people?revision=2014-08-18)people"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)ietf-yang-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?revision=2010-10-04)ietf-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car?revision=2014-08-18)car"},{"capability-origin":"device-advertised","capability":"(ns:main?revision=2014-01-21)main"},{"capability-origin":"device-advertised","capability":"(ns:augment:main:a?revision=2014-01-21)augment-main-a"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:netconf:monitoring?revision=2022-07-18)odl-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:netconf:base:1.0?revision=2011-06-01)ietf-netconf"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring-extension?revision=2013-12-10)ietf-netconf-monitoring-extension"},{"capability-origin":"device-advertised","capability":"(org:opendaylight:coretutorials:ncmount:example:l2fib?revision=2016-03-07)ncmount-l2fib"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people?revision=2014-08-18)car-people"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-purchase?revision=2014-08-18)car-purchase"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:test:netconf:crud?revision=2014-10-18)test"},{"capability-origin":"device-advertised","capability":"(https://example.com/ns/example-action?revision=2016-07-07)example-action"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2013-07-15)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2010-09-24)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:yang:extension:yang-ext?revision=2013-07-09)yang-ext"}]},"host":"10.30.171.196"}}]}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:05.339420" elapsed="0.003997"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:05.339080" elapsed="0.004393"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:05.339050" elapsed="0.004459"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:05.347145" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:05.343924" elapsed="0.003268"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:05.343610" elapsed="0.003618"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:05.343565" elapsed="0.003688"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:05.347870" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:05.347440" 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-08-22T23:40:05.348222" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:05.347969" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:05.348806" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:05.348475" elapsed="0.000357"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:05.348307" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:05.347951" elapsed="0.000940"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:05.349435" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:05.349051" 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-08-22T23:40:05.349814" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:05.349549" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:05.350382" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:05.350068" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:05.349899" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:05.349531" 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-08-22T23:40:05.350639" elapsed="0.000359"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:05.351496" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:05.351176" 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-08-22T23:40:05.351694" 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-08-22T23:40:05.338299" elapsed="0.015927"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:40:05.354413" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:40:05.354297" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:05.354279" elapsed="0.000209"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:40:05.358596" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "netconf-node-topology:netconf-node": {
      "available-capabilities": {
       "available-capability": [
        {
         "capability"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:40:05.354655" elapsed="0.003973"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:40:05.358683" elapsed="0.000040"/>
</return>
<msg time="2026-08-22T23:40:05.358861" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "netconf-node-topology:netconf-node": {
      "available-capabilities": {
       "available-capability": [
        {
         "capability"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:05.278152" elapsed="0.080736"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:05.358946" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:40:05.359103" level="INFO">${config_topology} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "netconf-node-topology:netconf-node": {
      "available-capabilities": {
       "available-capability": [
        {
         "capability"...</msg>
<var>${config_topology}</var>
<arg>${config_topology_url}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:40:05.275693" elapsed="0.083437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:05.359553" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "netconf-node-topology:netconf-node": {
      "available-capabilities": {
       "available-capability": [
        {
         "capability": "(https://example.com/ns/example-action?revision=2016-07-07)example-action",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(ns:augment:main:a?revision=2014-01-21)augment-main-a",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(ns:main?revision=2014-01-21)main",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(org:opendaylight:coretutorials:ncmount:example:l2fib?revision=2016-03-07)ncmount-l2fib",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:ietf:params:xml:ns:netconf:base:1.0?revision=2011-06-01)ietf-netconf",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2010-09-24)ietf-inet-types",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2013-07-15)ietf-inet-types",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring-extension?revision=2013-12-10)ietf-netconf-monitoring-extension",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?revision=2010-10-04)ietf-netconf-monitoring",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)ietf-yang-types",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people?revision=2014-08-18)car-people",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-purchase?revision=2014-08-18)car-purchase",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car?revision=2014-08-18)car",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people?revision=2014-08-18)people",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:opendaylight:params:xml:ns:yang:netconf:monitoring?revision=2022-07-18)odl-netconf-monitoring",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:opendaylight:test:netconf:crud?revision=2014-10-18)test",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:opendaylight:yang:extension:yang-ext?revision=2013-07-09)yang-ext",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "urn:ietf:params:netconf:base:1.0",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "urn:ietf:params:netconf:base:1.1",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "urn:ietf:params:netconf:capability:candidate:1.0",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "urn:ietf:params:netconf:capability:exi:1.0",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "urn:ietf:params:netconf:capability:notification:1.0",
         "capability-origin": "device-advertised"
        }
       ]
      },
      "clustered-connection-status": {
       "netconf-master-node": "pekko://opendaylight-cluster-data@127.0.0.1:2550"
      },
      "connection-status": "connected",
      "host": "10.30.171.196",
      "keepalive-delay": 0,
      "login-password-unencrypted": {
       "password": "topsecret",
       "username": "admin"
      },
      "negotiated-ssh-transport-parameters": {
       "encryption-alg": "chacha20-poly1305",
       "host-key-alg": "rsa-sha2-512",
       "key-exchange-alg": "sntrup761x25519-sha512",
       "mac-alg": "none"
      },
      "port": 17830,
      "session-id": 2,
      "tcp-only": false,
      "unavailable-capabilities": {
       "unavailable-capability": [
        {
         "capability": "(urn:ietf:params:xml:ns:netconf:notification:1.0?revision=2008-07-14)notifications",
         "failure-reason": "missing-source"
        }
       ]
      }
     },
     "node-id": "netconf-test-device"
    }
   ],
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "encryption": {
       "encryption-alg": [
        "AEAD_AES_128_GCM",
        "AEAD_AES_256_GCM",
        "aes128-cbc",
        "aes128-ctr",
        "aes192-cbc",
        "aes192-ctr",
        "aes256-cbc",
        "aes256-ctr",
        "chacha20-poly1305"
       ]
      },
      "host-key": {
       "host-key-alg": [
        "ecdsa-sha2-nistp256",
        "ecdsa-sha2-nistp384",
        "ecdsa-sha2-nistp521",
        "rsa-sha2-256",
        "rsa-sha2-512",
        "ssh-ed25519",
        "ssh-rsa"
       ]
      },
      "key-exchange": {
       "key-exchange-alg": [
        "curve25519-sha256",
        "curve448-sha512",
        "diffie-hellman-group-exchange-sha256",
        "diffie-hellman-group14-sha256",
        "diffie-hellman-group15-sha512",
        "diffie-hellman-group16-sha512",
        "diffie-hellman-group17-sha512",
        "diffie-hellman-group18-sha512",
        "ecdh-sha2-nistp256",
        "ecdh-sha2-nistp384",
        "ecdh-sha2-nistp521",
        "mlkem1024nistp384-sha384",
        "mlkem768nistp256-sha256",
        "mlkem768x25519-sha256",
        "sntrup761x25519-sha512"
       ]
      },
      "mac": {
       "mac-alg": [
        "hmac-sha1",
        "hmac-sha2-256",
        "hmac-sha2-512"
       ]
      }
     }
    }
   }
  }
 ]
}
</msg>
<arg>${config_topology}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:05.359292" elapsed="0.000428"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:05.368110" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:05.367847" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:05.368601" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:05.368335" 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-08-22T23:40:05.386103" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:05.386296" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '4698'} 
 body={"network-topology:topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}},"node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"unavailable-capabilities":{"unavailable-capability":[{"failure-reason":"missing-source","capability":"(urn:ietf:params:xml:ns:netconf:notification:1.0?revision=2008-07-14)notifications"}]},"keepalive-delay":0,"tcp-only":false,"clustered-connection-status":{"netconf-master-node":"pekko://opendaylight-cluster-data@127.0.0.1:2550"},"negotiated-ssh-transport-parameters":{"encryption-alg":"chacha20-poly1305","host-key-alg":"rsa-sha2-512","mac-alg":"none","key-exchange-alg":"sntrup761x25519-sha512"},"session-id":2,"connection-status":"connected","login-password-unencrypted":{"username":"admin","password":"topsecret"},"available-capabilities":{"available-capability":[{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:notification:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:exi:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:candidate:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.1"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.0"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people?revision=2014-08-18)people"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)ietf-yang-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?revision=2010-10-04)ietf-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car?revision=2014-08-18)car"},{"capability-origin":"device-advertised","capability":"(ns:main?revision=2014-01-21)main"},{"capability-origin":"device-advertised","capability":"(ns:augment:main:a?revision=2014-01-21)augment-main-a"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:netconf:monitoring?revision=2022-07-18)odl-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:netconf:base:1.0?revision=2011-06-01)ietf-netconf"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring-extension?revision=2013-12-10)ietf-netconf-monitoring-extension"},{"capability-origin":"device-advertised","capability":"(org:opendaylight:coretutorials:ncmount:example:l2fib?revision=2016-03-07)ncmount-l2fib"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people?revision=2014-08-18)car-people"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-purchase?revision=2014-08-18)car-purchase"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:test:netconf:crud?revision=2014-10-18)test"},{"capability-origin":"device-advertised","capability":"(https://example.com/ns/example-action?revision=2016-07-07)example-action"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2013-07-15)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2010-09-24)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:yang:extension:yang-ext?revision=2013-07-09)yang-ext"}]},"host":"10.30.171.196"}}]}]} 
 </msg>
<msg time="2026-08-22T23:40:05.386430" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:05.370844" elapsed="0.015648"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:05.368718" elapsed="0.017930"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:05.387061" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:05.386713" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:05.368697" elapsed="0.018561"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:05.395916" level="INFO">{"network-topology:topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}},"node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"unavailable-capabilities":{"unavailable-capability":[{"failure-reason":"missing-source","capability":"(urn:ietf:params:xml:ns:netconf:notification:1.0?revision=2008-07-14)notifications"}]},"keepalive-delay":0,"tcp-only":false,"clustered-connection-status":{"netconf-master-node":"pekko://opendaylight-cluster-data@127.0.0.1:2550"},"negotiated-ssh-transport-parameters":{"encryption-alg":"chacha20-poly1305","host-key-alg":"rsa-sha2-512","mac-alg":"none","key-exchange-alg":"sntrup761x25519-sha512"},"session-id":2,"connection-status":"connected","login-password-unencrypted":{"username":"admin","password":"topsecret"},"available-capabilities":{"available-capability":[{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:notification:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:exi:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:candidate:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.1"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.0"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people?revision=2014-08-18)people"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)ietf-yang-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?revision=2010-10-04)ietf-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car?revision=2014-08-18)car"},{"capability-origin":"device-advertised","capability":"(ns:main?revision=2014-01-21)main"},{"capability-origin":"device-advertised","capability":"(ns:augment:main:a?revision=2014-01-21)augment-main-a"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:netconf:monitoring?revision=2022-07-18)odl-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:netconf:base:1.0?revision=2011-06-01)ietf-netconf"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring-extension?revision=2013-12-10)ietf-netconf-monitoring-extension"},{"capability-origin":"device-advertised","capability":"(org:opendaylight:coretutorials:ncmount:example:l2fib?revision=2016-03-07)ncmount-l2fib"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people?revision=2014-08-18)car-people"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-purchase?revision=2014-08-18)car-purchase"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:test:netconf:crud?revision=2014-10-18)test"},{"capability-origin":"device-advertised","capability":"(https://example.com/ns/example-action?revision=2016-07-07)example-action"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2013-07-15)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2010-09-24)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:yang:extension:yang-ext?revision=2013-07-09)yang-ext"}]},"host":"10.30.171.196"}}]}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:05.389679" elapsed="0.006532"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:05.389123" elapsed="0.007177"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:05.389081" elapsed="0.007282"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:05.400352" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:05.397081" elapsed="0.003318"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:05.396501" elapsed="0.003946"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:05.396460" elapsed="0.004014"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:05.401068" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:05.400665" 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-08-22T23:40:05.401415" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:05.401176" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:05.401999" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:05.401693" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:05.401498" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:05.401158" elapsed="0.000925"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:05.402620" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:05.402241" 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-08-22T23:40:05.402952" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:05.402718" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:05.403506" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:05.403192" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:05.403034" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:05.402700" 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-08-22T23:40:05.403779" elapsed="0.000369"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:05.404624" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:05.404311" 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-08-22T23:40:05.404806" elapsed="0.002539"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:40:05.388114" elapsed="0.019298"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:40:05.407633" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:40:05.407484" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:05.407466" elapsed="0.000240"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:40:05.411882" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "netconf-node-topology:netconf-node": {
      "available-capabilities": {
       "available-capability": [
        {
         "capability"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:40:05.407852" elapsed="0.004061"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:40:05.411965" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:40:05.412136" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "netconf-node-topology:netconf-node": {
      "available-capabilities": {
       "available-capability": [
        {
         "capability"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:05.363025" elapsed="0.049137"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:05.412219" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:40:05.412373" level="INFO">${operational_topology} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "netconf-node-topology:netconf-node": {
      "available-capabilities": {
       "available-capability": [
        {
         "capability"...</msg>
<var>${operational_topology}</var>
<arg>${operational_topology_url}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:40:05.359954" elapsed="0.052445"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:05.412859" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "netconf-node-topology:netconf-node": {
      "available-capabilities": {
       "available-capability": [
        {
         "capability": "(https://example.com/ns/example-action?revision=2016-07-07)example-action",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(ns:augment:main:a?revision=2014-01-21)augment-main-a",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(ns:main?revision=2014-01-21)main",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(org:opendaylight:coretutorials:ncmount:example:l2fib?revision=2016-03-07)ncmount-l2fib",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:ietf:params:xml:ns:netconf:base:1.0?revision=2011-06-01)ietf-netconf",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2010-09-24)ietf-inet-types",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2013-07-15)ietf-inet-types",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring-extension?revision=2013-12-10)ietf-netconf-monitoring-extension",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?revision=2010-10-04)ietf-netconf-monitoring",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)ietf-yang-types",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people?revision=2014-08-18)car-people",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-purchase?revision=2014-08-18)car-purchase",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car?revision=2014-08-18)car",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people?revision=2014-08-18)people",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:opendaylight:params:xml:ns:yang:netconf:monitoring?revision=2022-07-18)odl-netconf-monitoring",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:opendaylight:test:netconf:crud?revision=2014-10-18)test",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "(urn:opendaylight:yang:extension:yang-ext?revision=2013-07-09)yang-ext",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "urn:ietf:params:netconf:base:1.0",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "urn:ietf:params:netconf:base:1.1",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "urn:ietf:params:netconf:capability:candidate:1.0",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "urn:ietf:params:netconf:capability:exi:1.0",
         "capability-origin": "device-advertised"
        },
        {
         "capability": "urn:ietf:params:netconf:capability:notification:1.0",
         "capability-origin": "device-advertised"
        }
       ]
      },
      "clustered-connection-status": {
       "netconf-master-node": "pekko://opendaylight-cluster-data@127.0.0.1:2550"
      },
      "connection-status": "connected",
      "host": "10.30.171.196",
      "keepalive-delay": 0,
      "login-password-unencrypted": {
       "password": "topsecret",
       "username": "admin"
      },
      "negotiated-ssh-transport-parameters": {
       "encryption-alg": "chacha20-poly1305",
       "host-key-alg": "rsa-sha2-512",
       "key-exchange-alg": "sntrup761x25519-sha512",
       "mac-alg": "none"
      },
      "port": 17830,
      "session-id": 2,
      "tcp-only": false,
      "unavailable-capabilities": {
       "unavailable-capability": [
        {
         "capability": "(urn:ietf:params:xml:ns:netconf:notification:1.0?revision=2008-07-14)notifications",
         "failure-reason": "missing-source"
        }
       ]
      }
     },
     "node-id": "netconf-test-device"
    }
   ],
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "encryption": {
       "encryption-alg": [
        "AEAD_AES_128_GCM",
        "AEAD_AES_256_GCM",
        "aes128-cbc",
        "aes128-ctr",
        "aes192-cbc",
        "aes192-ctr",
        "aes256-cbc",
        "aes256-ctr",
        "chacha20-poly1305"
       ]
      },
      "host-key": {
       "host-key-alg": [
        "ecdsa-sha2-nistp256",
        "ecdsa-sha2-nistp384",
        "ecdsa-sha2-nistp521",
        "rsa-sha2-256",
        "rsa-sha2-512",
        "ssh-ed25519",
        "ssh-rsa"
       ]
      },
      "key-exchange": {
       "key-exchange-alg": [
        "curve25519-sha256",
        "curve448-sha512",
        "diffie-hellman-group-exchange-sha256",
        "diffie-hellman-group14-sha256",
        "diffie-hellman-group15-sha512",
        "diffie-hellman-group16-sha512",
        "diffie-hellman-group17-sha512",
        "diffie-hellman-group18-sha512",
        "ecdh-sha2-nistp256",
        "ecdh-sha2-nistp384",
        "ecdh-sha2-nistp521",
        "mlkem1024nistp384-sha384",
        "mlkem768nistp256-sha256",
        "mlkem768x25519-sha256",
        "sntrup761x25519-sha512"
       ]
      },
      "mac": {
       "mac-alg": [
        "hmac-sha1",
        "hmac-sha2-256",
        "hmac-sha2-512"
       ]
      }
     }
    }
   }
  }
 ]
}
</msg>
<arg>${operational_topology}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:05.412559" elapsed="0.000443"/>
</kw>
<return>
<value>${config_topology}</value>
<value>${operational_topology}</value>
<status status="PASS" start="2026-08-22T23:40:05.413047" elapsed="0.000028"/>
</return>
<arg>${session}</arg>
<doc>Get both versions of topology (config and operational), log them and return them for further processing.</doc>
<status status="PASS" start="2026-08-22T23:40:05.275306" elapsed="0.137905"/>
</kw>
<msg time="2026-08-22T23:40:05.413371" level="INFO">${result} = ['{\n "network-topology:topology": [\n  {\n   "node": [\n    {\n     "netconf-node-topology:netconf-node": {\n      "available-capabilities": {\n       "available-capability": [\n        {\n         "...</msg>
<var>${result}</var>
<arg>${DEVICE_BOOT_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Get_Topology_Core</arg>
<arg>${session}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:40:05.274789" elapsed="0.138610"/>
</kw>
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:40:05.413452" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:40:05.413684" level="INFO">${config_topology} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "netconf-node-topology:netconf-node": {
      "available-capabilities": {
       "available-capability": [
        {
         "capability"...</msg>
<msg time="2026-08-22T23:40:05.413733" level="INFO">${operational_topology} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "netconf-node-topology:netconf-node": {
      "available-capabilities": {
       "available-capability": [
        {
         "capability"...</msg>
<var>${config_topology}</var>
<var>${operational_topology}</var>
<arg>session=node1</arg>
<doc>Repeatedly try to get the topologies using Get_Topology_Core until either the request succeeds or boot timeout period expires.</doc>
<status status="PASS" start="2026-08-22T23:40:05.274458" elapsed="0.139300"/>
</kw>
<doc>Simulate node 1 restarted by admin just after device data is created and the change propagated in the cluster, fail if node 1 fails to boot.</doc>
<status status="PASS" start="2026-08-22T23:39:51.007388" elapsed="14.406498"/>
</test>
<test id="s1-s6-t10" name="Check_New_Device_Data_Is_Visible_On_node1" 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-08-22T23:40:05.417307" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:40:05.417035" elapsed="0.000569"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:40:05.418627" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:40:05.418494" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:05.418473" elapsed="0.000222"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:40:05.423673" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:40:05.423547" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:05.423529" elapsed="0.000221"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:40:05.424779" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:40:05.424362" elapsed="0.000445"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:40:05.425299" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:40:05.424974" elapsed="0.000351"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:40:05.425371" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:40:05.425541" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:40:05.423986" elapsed="0.001610"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:40:05.431320" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:40:05.431211" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:05.431192" 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-08-22T23:40:05.432573" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:40:05.432468" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:05.432450" elapsed="0.000225"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:40:05.433139" level="INFO">${karaf_connection_index} = 48</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:40:05.432821" elapsed="0.000345"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:40:05.433613" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:40:05.433337" elapsed="0.000311"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:40:05.434421" 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-08-22T23:40:05.434138" elapsed="0.001057">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-08-22T23:40:05.435387" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-08-22T23:40:05.435433" 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-08-22T23:40:05.433806" elapsed="0.001653"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:40:05.436317" 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-08-22T23:40:05.436059" elapsed="0.000935">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-08-22T23:40:05.437182" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-08-22T23:40:05.437228" 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-08-22T23:40:05.435661" elapsed="0.001591"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-08-22T23:40:05.438282" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_New_Device_Data_Is_Visible_On_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-08-22T23:40:05.437610" elapsed="0.000736">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_New_Device_Data_Is_Visible_On_node1"</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:05.437327" elapsed="0.001094">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_New_Device_Data_Is_Visible_On_node1"</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:05.437308" elapsed="0.001145">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_New_Device_Data_Is_Visible_On_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-08-22T23:40:05.438641" 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-08-22T23:40:05.438871" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:05.438731" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:05.438714" elapsed="0.000242"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-08-22T23:40:05.438989" 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-08-22T23:40:05.441636" elapsed="0.000154"/>
</kw>
<msg time="2026-08-22T23:40:05.441857" 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-08-22T23:40:05.440460" 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-08-22T23:40:05.442267" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:05.442648" 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-08-22T23:40:05.439842" 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-08-22T23:40:05.439266" elapsed="0.003636"/>
</kw>
<arg>${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-08-22T23:40:05.432168" elapsed="0.010824">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_New_Device_Data_Is_Visible_On_node1"</status>
</kw>
<msg time="2026-08-22T23:40:05.443096" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:40:05.443141" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_New_Device_Data_Is_Visible_On_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-08-22T23:40:05.431546" elapsed="0.011619"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:40:05.443350" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:40:05.443241" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:05.443222" 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-08-22T23:40:05.444485" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:40:05.444374" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:05.444355" elapsed="0.000197"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:40:05.444901" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:40:05.445007" level="INFO">${current_ssh_connection_object} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:40:05.444763" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:05.445449" level="INFO">{1: 48, 2: 35, 3: 36}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:05.445183" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:05.445991" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:05.445731" elapsed="0.000304"/>
</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-08-22T23:40:05.446599" elapsed="0.000268"/>
</kw>
<msg time="2026-08-22T23:40:05.446978" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:40:05.447025" level="INFO">${old_connection_index} = 48</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-08-22T23:40:05.446199" elapsed="0.000887"/>
</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-08-22T23:40:05.447939" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:40:05.449234" 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-08-22T23:40:05.448822" elapsed="0.001345">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-08-22T23:40:05.448306" elapsed="0.001960"/>
</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-08-22T23:40:05.450925" elapsed="0.000285"/>
</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-08-22T23:40:05.450437" elapsed="0.000857"/>
</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-08-22T23:40:05.447397" elapsed="0.003944"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:05.447174" elapsed="0.004217"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:05.447155" elapsed="0.004261"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:40:05.452307" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:40:05.451965" elapsed="0.000375"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:40:05.452388" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:40:05.452539" level="INFO">${odl_ip} = 10.30.170.200</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:40:05.451645" 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-08-22T23:40:05.452783" elapsed="0.000451"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:40:05.453521" level="INFO">index=53
host=10.30.170.200
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-08-22T23:40:05.453729" level="INFO">${karaf_connection_object} = index=53
host=10.30.170.200
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-08-22T23:40:05.453411" elapsed="0.000348"/>
</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-08-22T23:40:05.453917" elapsed="0.002316"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:40:05.456683" level="INFO">Logging into '10.30.170.200:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:40:05.975621" 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-08-22T23:40:05.456394" elapsed="0.519401"/>
</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-08-22T23:40:05.990951" elapsed="0.000423"/>
</kw>
<msg time="2026-08-22T23:40:05.991464" 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-08-22T23:40:05.989101" elapsed="0.002546"/>
</kw>
<kw name="Open 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-08-22T23:40:05.991812" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:05.991975" 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-08-22T23:40:05.977393" elapsed="0.014669"/>
</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-08-22T23:40:05.976622" elapsed="0.015487"/>
</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-08-22T23:40:05.443871" elapsed="0.548289"/>
</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-08-22T23:40:05.993106" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:40:05.992976" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:05.992948" elapsed="0.000234"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:40:05.993560" level="INFO">${karaf_connection_index} = 53</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:40:05.993326" elapsed="0.000300"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:40:05.993954" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:40:05.993781" elapsed="0.000199"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:40:06.083480" 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 "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:40:05.994497" elapsed="0.089060"/>
</kw>
<msg time="2026-08-22T23:40:06.083675" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:40:06.083720" 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 "n "e "t "c "o "n "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:40:05.994135" elapsed="0.089621"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:40:06.150350" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "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-08-22T23:40:06.084256" elapsed="0.066177"/>
</kw>
<msg time="2026-08-22T23:40:06.150531" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:40:06.150590" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:40:06.083920" elapsed="0.066709"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:06.150946" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:06.150723" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:06.150685" elapsed="0.000339"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:06.151418" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "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-08-22T23:40:06.151163" elapsed="0.000323"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:06.151795" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:06.151552" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:06.151534" elapsed="0.000339"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:40:06.151906" 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-08-22T23:40:06.154340" elapsed="0.000430"/>
</kw>
<msg time="2026-08-22T23:40:06.154857" 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-08-22T23:40:06.153056" elapsed="0.001947"/>
</kw>
<kw name="Open 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-08-22T23:40:06.155161" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:06.155320" 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-08-22T23:40:06.152678" elapsed="0.002722"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:40:06.152159" elapsed="0.003287"/>
</kw>
<msg time="2026-08-22T23:40:06.155571" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</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-08-22T23:40:05.992634" elapsed="0.163000"/>
</kw>
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:40:06.155680" 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-08-22T23:40:05.430868" elapsed="0.724937"/>
</kw>
<msg time="2026-08-22T23:40:06.155902" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:40:06.155945" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:40:05.426005" elapsed="0.729977"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:06.156346" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:06.156097" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:06.156078" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:40:05.425862" elapsed="0.730586"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:40:06.163876" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:40:06.163767" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:06.163748" 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-08-22T23:40:06.165091" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:40:06.164984" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:06.164965" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:40:06.165609" level="INFO">${karaf_connection_index} = 35</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:40:06.165297" elapsed="0.000340"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:40:06.166003" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:40:06.165791" elapsed="0.000238"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:40:06.208204" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:40:06.166515" elapsed="0.041801"/>
</kw>
<msg time="2026-08-22T23:40:06.208479" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:40:06.208525" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:40:06.166184" elapsed="0.042378"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:40:06.239564" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "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-08-22T23:40:06.209103" elapsed="0.030577"/>
</kw>
<msg time="2026-08-22T23:40:06.239838" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:40:06.239884" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:40:06.208755" elapsed="0.031165"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:06.240213" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:06.239996" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:06.239977" elapsed="0.000313"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:06.240742" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "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-08-22T23:40:06.240427" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:06.241087" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:06.240878" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:06.240860" elapsed="0.000303"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:40:06.241195" 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-08-22T23:40:06.243731" elapsed="0.000148"/>
</kw>
<msg time="2026-08-22T23:40:06.243938" 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-08-22T23:40:06.242638" 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-08-22T23:40:06.244338" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:06.244685" 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-08-22T23:40:06.242000" elapsed="0.002868"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:40:06.241447" elapsed="0.003483"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:40:06.164682" elapsed="0.080385"/>
</kw>
<msg time="2026-08-22T23:40:06.245159" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:40:06.245203" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:40:06.164092" elapsed="0.081149"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:40:06.245424" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:40:06.245317" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:06.245298" 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-08-22T23:40:06.245943" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:06.246277" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:40:06.246349" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:40:06.163406" elapsed="0.083053"/>
</kw>
<msg time="2026-08-22T23:40:06.246552" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:40:06.246621" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:40:06.156766" elapsed="0.089894"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:06.247002" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:06.246737" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:06.246719" elapsed="0.000361"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:40:06.156626" elapsed="0.090477"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:40:06.252745" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:40:06.252635" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:06.252614" 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-08-22T23:40:06.253955" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:40:06.253849" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:06.253831" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:40:06.254456" level="INFO">${karaf_connection_index} = 36</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:40:06.254162" elapsed="0.000320"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:40:06.254884" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:40:06.254653" elapsed="0.000259"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:40:06.291574" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:40:06.255403" elapsed="0.036481"/>
</kw>
<msg time="2026-08-22T23:40:06.292280" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:40:06.292393" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:40:06.255073" elapsed="0.037410"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:40:06.323394" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "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-08-22T23:40:06.293829" elapsed="0.029720"/>
</kw>
<msg time="2026-08-22T23:40:06.323764" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:40:06.323812" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:40:06.292951" elapsed="0.030898"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:06.324239" elapsed="0.000099"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:06.323953" elapsed="0.000423"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:06.323923" elapsed="0.000480"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:06.324924" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "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-08-22T23:40:06.324555" 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-08-22T23:40:06.325280" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:06.325063" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:06.325044" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:40:06.325397" 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-08-22T23:40:06.328402" elapsed="0.000245"/>
</kw>
<msg time="2026-08-22T23:40:06.328735" 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-08-22T23:40:06.327000" elapsed="0.001918"/>
</kw>
<kw name="Open 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-08-22T23:40:06.329296" elapsed="0.000104"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:06.329789" 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-08-22T23:40:06.326304" elapsed="0.003740"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:40:06.325733" elapsed="0.004402"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:40:06.253527" elapsed="0.076748"/>
</kw>
<msg time="2026-08-22T23:40:06.330408" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:40:06.330471" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:40:06.252962" elapsed="0.077562"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:40:06.330815" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:40:06.330664" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:06.330637" elapsed="0.000294"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:06.331529" 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-08-22T23:40:06.331957" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:40:06.332030" 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-08-22T23:40:06.252279" elapsed="0.079862"/>
</kw>
<msg time="2026-08-22T23:40:06.332239" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:40:06.332284" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:40:06.247358" elapsed="0.084965"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:06.332700" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:06.332398" elapsed="0.000359"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:06.332381" elapsed="0.000400"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:40:06.247224" elapsed="0.085581"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:40:05.425662" elapsed="0.907176"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:40:05.423168" elapsed="0.909732"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:40:05.418200" elapsed="0.914758"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:40:05.417760" elapsed="0.915243"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:40:05.414842" elapsed="0.918216"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:06.334656" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:06.334249" elapsed="0.000434"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:06.342302" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:06.342044" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:06.342768" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:06.342501" 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-08-22T23:40:06.390164" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:06.390457" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:06.390741" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:06.345024" elapsed="0.045777"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:06.342882" elapsed="0.048014"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:06.391319" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:06.390955" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:06.342863" elapsed="0.048651"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:06.399348" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:06.393846" elapsed="0.005610"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:06.393319" elapsed="0.006179"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:06.393279" elapsed="0.006244"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:06.402135" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:06.399818" elapsed="0.002362"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:06.399595" elapsed="0.002621"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:06.399563" elapsed="0.002678"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:06.402810" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:06.402403" 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-08-22T23:40:06.403162" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:06.402908" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:06.403733" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:06.403406" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:06.403245" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:06.402890" elapsed="0.000928"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:06.404341" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:06.403976" 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-08-22T23:40:06.404687" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:06.404439" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:06.405220" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:06.404924" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:06.404769" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:06.404421" 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-08-22T23:40:06.405449" elapsed="0.000360"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:06.406265" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:06.405971" 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-08-22T23:40:06.406481" 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-08-22T23:40:06.392344" elapsed="0.016576"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:06.409095" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-08-22T23:40:06.408990" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:06.408971" 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-08-22T23:40:06.409351" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:06.409425" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:40:06.411922" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:06.337668" elapsed="0.074284"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:06.412014" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:40:06.412166" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:06.334897" elapsed="0.077296"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:06.412862" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:06.412478" elapsed="0.000477">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:06.412265" elapsed="0.000766">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:06.412248" elapsed="0.000818">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:06.413283" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:06.413136" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:06.413120" elapsed="0.000245"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:06.333879" elapsed="0.079569">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:07.416414" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:07.415411" elapsed="0.001075"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:07.429125" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:07.428864" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:07.429647" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:07.429324" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:40:07.454996" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:07.455141" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:07.455241" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:07.431880" elapsed="0.023388"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:07.429777" elapsed="0.025606"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:07.455568" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:07.455413" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:07.429751" elapsed="0.025930"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:07.459417" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:07.456754" elapsed="0.002713"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:07.456474" elapsed="0.003030"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:07.456456" elapsed="0.003074"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:07.462213" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:07.459827" elapsed="0.002432"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:07.459604" elapsed="0.002691"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:07.459570" elapsed="0.002750"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:07.462910" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:07.462497" 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-08-22T23:40:07.463247" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:07.463010" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:07.463866" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:07.463494" elapsed="0.000400"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:07.463332" elapsed="0.000600"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:07.462992" elapsed="0.000962"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:07.464480" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:07.464112" 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-08-22T23:40:07.464858" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:07.464594" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:07.465396" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:07.465099" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:07.464941" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:07.464561" elapsed="0.000920"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:40:07.465650" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:07.466463" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:07.466166" 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-08-22T23:40:07.466659" 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-08-22T23:40:07.456048" elapsed="0.013068"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:07.469299" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:40:07.469189" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:07.469170" 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-08-22T23:40:07.469542" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:07.469631" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:40:07.472001" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:07.422922" elapsed="0.049108"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:07.472092" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:40:07.472245" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:07.417044" elapsed="0.055228"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:07.472995" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:07.472549" elapsed="0.000526">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:07.472343" elapsed="0.000805">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:07.472325" elapsed="0.000858">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:07.473401" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:07.473255" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:07.473238" elapsed="0.000244"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:07.414300" elapsed="0.059266">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:08.476725" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:08.475707" elapsed="0.001093"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:08.487936" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:08.487666" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:08.488391" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:08.488143" 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-08-22T23:40:08.518677" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:08.518980" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:08.519201" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:08.490666" elapsed="0.028593"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:08.488519" elapsed="0.030839"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:08.519798" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:08.519420" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:08.488491" elapsed="0.031507"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:08.528420" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:08.522408" elapsed="0.006137"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:08.521857" elapsed="0.006798"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:08.521813" elapsed="0.006901"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:08.532528" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:08.529347" elapsed="0.003229"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:08.528842" elapsed="0.003785"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:08.528804" elapsed="0.003848"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:08.533237" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:08.532834" 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-08-22T23:40:08.533613" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:08.533337" elapsed="0.000338"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:08.534207" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:08.533863" elapsed="0.000377"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:08.533700" elapsed="0.000695"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:08.533320" elapsed="0.001099"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:08.534974" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:08.534598" 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-08-22T23:40:08.535308" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:08.535073" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:08.535868" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:08.535552" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:08.535391" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:08.535054" 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-08-22T23:40:08.536106" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:08.536949" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:08.536641" 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-08-22T23:40:08.537130" 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-08-22T23:40:08.520825" elapsed="0.018916"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:08.539930" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:40:08.539814" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:08.539795" 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-08-22T23:40:08.540180" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:08.540253" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:40:08.542762" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:08.482963" elapsed="0.059829"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:08.542854" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:40:08.543009" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:08.477297" elapsed="0.065746"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:08.543716" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:08.543333" elapsed="0.000464">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:08.543120" elapsed="0.000751">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:08.543102" elapsed="0.000803">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:08.544122" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:08.543975" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:08.543958" elapsed="0.000242"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:08.474546" elapsed="0.069736">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:09.549896" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:09.548727" elapsed="0.001257"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:09.559387" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:09.559052" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:09.559895" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:09.559635" 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-08-22T23:40:09.583410" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:09.583833" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:09.584069" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:09.562219" elapsed="0.021908"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:09.560041" elapsed="0.024185"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:09.584683" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:09.584299" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:09.560005" elapsed="0.024882"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:09.592855" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:09.587337" elapsed="0.005569"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:09.586787" elapsed="0.006155"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:09.586740" elapsed="0.006227"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:09.595693" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:09.593268" elapsed="0.002480"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:09.593023" elapsed="0.002762"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:09.593007" elapsed="0.002802"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:09.596504" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:09.596021" 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-08-22T23:40:09.596897" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:09.596628" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:09.597447" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:09.597144" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:09.596980" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:09.596609" elapsed="0.000922"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:09.598080" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:09.597711" 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-08-22T23:40:09.598407" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:09.598176" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:09.598963" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:09.598665" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:09.598490" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:09.598159" 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-08-22T23:40:09.599208" elapsed="0.000421"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:09.600142" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:09.599794" 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-08-22T23:40:09.600325" 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-08-22T23:40:09.585745" elapsed="0.017137"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:09.603143" elapsed="0.000055"/>
</return>
<status status="PASS" start="2026-08-22T23:40:09.603022" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:09.603003" elapsed="0.000261"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:09.603436" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:09.603508" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:40:09.605868" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:09.554558" elapsed="0.051340"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:09.605960" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:40:09.606115" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:09.550817" elapsed="0.055325"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:09.606841" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:09.606423" elapsed="0.000527">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:09.606214" elapsed="0.000820">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:09.606197" elapsed="0.000872">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:09.607290" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:09.607140" elapsed="0.000236"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:09.607124" elapsed="0.000305"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:09.546289" elapsed="0.061300">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:10.610538" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:10.609559" elapsed="0.001079"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:10.623468" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:10.623107" elapsed="0.000428"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:10.624117" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:10.623774" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:40:10.650919" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:10.651219" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:10.651440" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:10.626886" elapsed="0.024611"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:10.624290" elapsed="0.027337"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:10.652034" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:10.651691" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:10.624256" elapsed="0.027972"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:10.660492" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:10.654738" elapsed="0.005951"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:10.654208" elapsed="0.006562"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:10.654165" elapsed="0.006662"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:10.663916" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:10.661450" elapsed="0.002513"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:10.660955" elapsed="0.003043"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:10.660917" elapsed="0.003107"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:10.664644" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:10.664204" 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-08-22T23:40:10.664980" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:10.664744" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:10.665528" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:10.665226" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:10.665063" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:10.664726" elapsed="0.000902"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:10.666148" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:10.665785" 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-08-22T23:40:10.666474" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:10.666245" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:10.667021" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:10.666727" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:10.666554" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:10.666228" 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-08-22T23:40:10.667256" elapsed="0.000370"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:10.668083" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:10.667788" 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-08-22T23:40:10.668262" 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-08-22T23:40:10.653082" elapsed="0.017630"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:10.670893" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:40:10.670784" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:10.670764" 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-08-22T23:40:10.671134" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:10.671204" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:40:10.673534" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:10.616776" elapsed="0.056788"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:10.673641" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:40:10.673794" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:10.611125" elapsed="0.062696"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:10.674460" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:10.674099" elapsed="0.000455">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:10.673892" elapsed="0.000793">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:10.673875" elapsed="0.000848">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:10.674943" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:10.674796" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:10.674778" elapsed="0.000247"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:10.608494" elapsed="0.066614">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:11.678044" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:11.677057" elapsed="0.001057"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:11.689349" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:11.689087" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:11.689815" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:11.689551" 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-08-22T23:40:11.714459" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:11.714635" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:11.714735" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:11.692015" elapsed="0.022745"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:11.689938" elapsed="0.024865"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:11.714985" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:11.714832" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:11.689914" elapsed="0.025156"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:11.718537" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:11.716111" elapsed="0.002478"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:11.715866" elapsed="0.002772"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:11.715848" elapsed="0.002816"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:11.721266" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:11.718940" elapsed="0.002372"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:11.718720" elapsed="0.002627"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:11.718703" elapsed="0.002669"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:11.721958" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:11.721545" 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-08-22T23:40:11.722287" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:11.722055" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:11.722849" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:11.722526" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:11.722368" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:11.722037" elapsed="0.000897"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:11.723452" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:11.723091" 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-08-22T23:40:11.723861" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:11.723548" elapsed="0.000381"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:11.724408" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:11.724111" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:11.723953" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:11.723530" 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-08-22T23:40:11.724660" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:11.725495" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:11.725170" 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-08-22T23:40:11.725691" elapsed="0.002300"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:40:11.715426" elapsed="0.012628"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:11.728231" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:40:11.728123" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:11.728105" 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-08-22T23:40:11.728471" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:11.728541" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:40:11.730886" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:11.684277" elapsed="0.046638"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:11.730983" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:40:11.731132" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:11.678640" elapsed="0.052519"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:11.731825" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:11.731434" elapsed="0.000470">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:11.731228" elapsed="0.000746">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:11.731212" elapsed="0.000797">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:11.732222" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:11.732078" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:11.732061" elapsed="0.000240"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:11.675968" elapsed="0.056414">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:12.735584" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:12.734569" elapsed="0.001116"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:12.746914" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:12.746617" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:12.747365" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:12.747117" 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-08-22T23:40:12.770323" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:12.770666" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:12.770890" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:12.749708" elapsed="0.021239"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:12.747564" elapsed="0.023478"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:12.771448" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:12.771105" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:12.747538" elapsed="0.024139"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:12.779171" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:12.773968" elapsed="0.005253"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:12.773442" elapsed="0.005814"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:12.773401" elapsed="0.005879"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:12.781874" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:12.779553" elapsed="0.002368"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:12.779336" elapsed="0.002619"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:12.779319" elapsed="0.002661"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:12.782587" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:12.782156" 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-08-22T23:40:12.782943" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:12.782707" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:12.783481" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:12.783182" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:12.783024" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:12.782687" elapsed="0.000877"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:12.784103" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:12.783742" 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-08-22T23:40:12.784425" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:12.784198" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:12.784979" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:12.784684" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:12.784506" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:12.784181" 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-08-22T23:40:12.785211" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:12.786035" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:12.785736" 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-08-22T23:40:12.786212" 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-08-22T23:40:12.772471" elapsed="0.016251"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:12.788900" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:40:12.788790" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:12.788772" 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-08-22T23:40:12.789143" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:12.789248" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:40:12.791586" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:12.742076" elapsed="0.049552"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:12.791695" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:40:12.791849" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:12.736180" elapsed="0.055695"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:12.792515" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:12.792150" elapsed="0.000466">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:12.791945" elapsed="0.000749">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:12.791929" elapsed="0.000800">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:12.792945" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:12.792800" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:12.792783" elapsed="0.000243"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:12.733497" elapsed="0.059613">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:13.796465" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:13.795120" elapsed="0.001420"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:13.808061" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:13.807795" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:13.808507" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:13.808261" 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-08-22T23:40:13.833563" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:13.833748" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:13.833848" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:13.810741" elapsed="0.023134"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:13.808650" elapsed="0.025269"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:13.834102" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:13.833948" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:13.808624" elapsed="0.025567"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:13.839513" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:13.835212" elapsed="0.004353"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:13.834993" elapsed="0.004626"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:13.834975" elapsed="0.004672"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:13.842372" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:13.839994" elapsed="0.002426"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:13.839769" elapsed="0.002686"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:13.839752" elapsed="0.002728"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:13.843079" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:13.842676" 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-08-22T23:40:13.843413" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:13.843178" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:13.844013" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:13.843676" elapsed="0.000365"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:13.843497" elapsed="0.000581"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:13.843160" elapsed="0.000940"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:13.844677" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:13.844257" 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-08-22T23:40:13.845009" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:13.844775" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:13.845543" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:13.845248" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:13.845091" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:13.844758" 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-08-22T23:40:13.845797" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:13.846622" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:13.846308" 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-08-22T23:40:13.846804" 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-08-22T23:40:13.834553" elapsed="0.014746"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:13.849493" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:40:13.849372" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:13.849353" 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-08-22T23:40:13.849799" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:13.849873" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:40:13.852346" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:13.802784" elapsed="0.049591"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:13.852619" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:40:13.852782" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:13.797100" elapsed="0.055709"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:13.853458" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:13.853089" elapsed="0.000449">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:13.852881" elapsed="0.000757">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:13.852864" elapsed="0.000811">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:13.853953" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:13.853805" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:13.853787" elapsed="0.000248"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:13.794029" elapsed="0.060089">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:14.857521" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:14.856382" elapsed="0.001258"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:14.869290" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:14.869015" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:14.869836" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:14.869549" 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-08-22T23:40:14.898186" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:14.898512" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:14.898813" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:14.872294" elapsed="0.026594"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:14.870075" elapsed="0.028936"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:14.899565" elapsed="0.000097"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:14.899080" elapsed="0.000690"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:14.869940" elapsed="0.029880"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:14.908156" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:14.902308" elapsed="0.005968"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:14.901779" elapsed="0.006581"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:14.901734" elapsed="0.006686"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:14.911338" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:14.908928" elapsed="0.002461"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:14.908587" elapsed="0.002838"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:14.908533" elapsed="0.002917"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:14.912170" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:14.911667" 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-08-22T23:40:14.912539" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:14.912273" elapsed="0.000349"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:14.913136" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:14.912822" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:14.912651" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:14.912254" elapsed="0.000969"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:14.913802" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:14.913383" 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-08-22T23:40:14.914144" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:14.913906" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:14.914728" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:14.914388" elapsed="0.000367"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:14.914227" elapsed="0.000639"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:14.913887" 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-08-22T23:40:14.915046" elapsed="0.000363"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:14.915967" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:14.915574" 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-08-22T23:40:14.916152" elapsed="0.002409"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:40:14.900727" elapsed="0.017924"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:14.918870" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-08-22T23:40:14.918734" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:14.918709" 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-08-22T23:40:14.919150" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:14.919225" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:40:14.921685" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:14.862775" elapsed="0.058942"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:14.921778" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:40:14.921935" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:14.858164" elapsed="0.063798"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:14.922702" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:14.922289" elapsed="0.000498">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:14.922041" elapsed="0.000822">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:14.922017" elapsed="0.000882">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:14.923128" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:14.922973" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:14.922955" elapsed="0.000267"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:14.855174" elapsed="0.068145">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:15.926919" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:15.925888" elapsed="0.001105"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:15.938037" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:15.937765" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:15.938492" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:15.938243" 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-08-22T23:40:15.963309" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:15.963811" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:15.964042" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:15.940867" elapsed="0.023233"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:15.938664" elapsed="0.025537"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:15.964723" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:15.964265" elapsed="0.000610"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:15.938640" elapsed="0.026423"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:15.971537" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:15.967370" elapsed="0.004264"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:15.966877" elapsed="0.004810"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:15.966837" elapsed="0.004885"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:15.975432" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:15.972131" elapsed="0.003365"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:15.971803" elapsed="0.003743"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:15.971779" elapsed="0.003806"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:15.976417" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:15.975843" 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-08-22T23:40:15.977009" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:15.976650" elapsed="0.000418"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:15.977555" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:15.977254" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:15.977093" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:15.976616" elapsed="0.001043"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:15.978180" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:15.977817" 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-08-22T23:40:15.978509" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:15.978277" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:15.979154" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:15.978855" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:15.978689" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:15.978260" 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-08-22T23:40:15.979391" elapsed="0.000375"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:15.980246" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:15.979928" 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-08-22T23:40:15.980427" 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-08-22T23:40:15.965892" elapsed="0.017157"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:15.983230" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:40:15.983120" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:15.983101" 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-08-22T23:40:15.983476" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:15.983547" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:40:15.986009" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:15.933308" elapsed="0.052731"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:15.986139" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:40:15.986296" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:15.927495" elapsed="0.058828"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:15.986987" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:15.986618" elapsed="0.000454">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:15.986393" elapsed="0.000753">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:15.986376" elapsed="0.000805">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:15.987398" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:15.987251" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:15.987235" elapsed="0.000243"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:15.924701" elapsed="0.062861">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:16.990855" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:16.989768" elapsed="0.001167"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:17.003059" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:17.002631" elapsed="0.000497"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:17.003717" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:17.003343" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:40:17.026636" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:17.026802" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:17.026903" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:17.005959" elapsed="0.020969"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:17.003858" elapsed="0.023114"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:17.027173" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:17.027017" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:17.003832" elapsed="0.023433"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:17.030926" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:17.028305" elapsed="0.002671"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:17.028083" elapsed="0.002929"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:17.028064" elapsed="0.002973"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:17.033660" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:17.031333" elapsed="0.002373"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:17.031110" elapsed="0.002632"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:17.031092" elapsed="0.002675"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:17.034338" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:17.033943" 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-08-22T23:40:17.034763" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:17.034505" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:17.035365" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:17.035007" elapsed="0.000386"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:17.034846" elapsed="0.000585"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:17.034486" elapsed="0.000967"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:17.035993" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:17.035626" 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-08-22T23:40:17.036320" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:17.036091" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:17.036877" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:17.036558" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:17.036401" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:17.036073" 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-08-22T23:40:17.037114" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:17.037944" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:17.037641" 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-08-22T23:40:17.038122" elapsed="0.002536"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:40:17.027655" elapsed="0.013072"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:17.040914" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-08-22T23:40:17.040802" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:17.040778" 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-08-22T23:40:17.041171" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:17.041244" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:40:17.043616" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:16.996533" elapsed="0.047114"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:17.043707" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:40:17.043859" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:16.991469" elapsed="0.052416"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:17.044526" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:17.044164" elapsed="0.000459">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:17.043955" elapsed="0.000742">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:17.043938" elapsed="0.000794">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:17.044948" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:17.044802" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:17.044785" elapsed="0.000242"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:16.988573" elapsed="0.056536">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:18.048518" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:18.047352" elapsed="0.001278"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:18.060453" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:18.060190" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:18.060923" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:18.060671" 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-08-22T23:40:18.084146" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:18.084479" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:18.084746" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:18.063150" elapsed="0.021655"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:18.061051" elapsed="0.023854"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:18.085309" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:18.084967" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:18.061025" elapsed="0.024477"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:18.093346" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:18.088026" elapsed="0.005370"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:18.087395" elapsed="0.006037"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:18.087353" elapsed="0.006104"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:18.096144" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:18.093752" elapsed="0.002447"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:18.093514" elapsed="0.002727"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:18.093497" elapsed="0.002771"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:18.096885" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:18.096451" 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-08-22T23:40:18.097219" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:18.096985" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:18.097778" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:18.097458" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:18.097300" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:18.096967" elapsed="0.000896"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:18.098381" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:18.098018" 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-08-22T23:40:18.098727" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:18.098479" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:18.099257" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:18.098963" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:18.098808" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:18.098461" 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-08-22T23:40:18.099492" elapsed="0.000372"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:18.100419" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:18.100075" 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-08-22T23:40:18.100688" elapsed="0.002361"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:40:18.086365" elapsed="0.016749"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:18.103297" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:40:18.103184" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:18.103166" 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-08-22T23:40:18.103542" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:18.103632" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:40:18.105988" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:18.054959" elapsed="0.051058"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:18.106078" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:40:18.106228" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:18.049180" elapsed="0.057074"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:18.106920" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:18.106534" elapsed="0.000470">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:18.106324" elapsed="0.000755">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:18.106308" elapsed="0.000805">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:18.107329" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:18.107182" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:18.107166" elapsed="0.000242"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:18.046208" elapsed="0.061284">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:19.109225" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:19.108728" elapsed="0.000537"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:19.121853" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:19.121554" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:19.122358" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:19.122067" elapsed="0.000353"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:40:19.145568" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:19.145833" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:19.145980" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:19.124729" elapsed="0.021280"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:19.122510" elapsed="0.023634"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:19.146364" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:19.146179" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:19.122483" elapsed="0.023988"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:19.150977" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:19.147940" elapsed="0.003108"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:19.147632" elapsed="0.003489"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:19.147603" elapsed="0.003559"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:19.153915" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:19.151538" elapsed="0.002426"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:19.151245" elapsed="0.002755"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:19.151220" elapsed="0.002805"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:19.154684" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:19.154208" 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-08-22T23:40:19.155030" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:19.154788" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:19.155729" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:19.155320" elapsed="0.000440"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:19.155113" elapsed="0.000690"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:19.154769" elapsed="0.001061"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:19.156369" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:19.155994" 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-08-22T23:40:19.156728" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:19.156469" elapsed="0.000338"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:19.157324" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:19.156998" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:19.156835" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:19.156450" 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-08-22T23:40:19.157634" elapsed="0.000457"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:19.158715" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:19.158297" 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-08-22T23:40:19.158956" elapsed="0.002789"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:40:19.147017" elapsed="0.014795"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:19.162004" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-08-22T23:40:19.161884" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:19.161866" 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-08-22T23:40:19.162259" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:19.162332" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:40:19.164698" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:19.113252" elapsed="0.051476"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:19.164790" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:40:19.164946" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:19.109502" elapsed="0.055470"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:19.165704" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:19.165251" elapsed="0.000535">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:19.165043" elapsed="0.000821">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:19.165026" elapsed="0.000873">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:19.166117" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:19.165970" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:19.165953" elapsed="0.000273"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:19.108078" elapsed="0.058236">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:20.170224" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:20.169046" elapsed="0.001266"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:20.182331" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:20.182054" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:20.183009" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:20.182533" 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-08-22T23:40:20.210029" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:20.210418" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:20.210728" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:20.185356" elapsed="0.025437"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:20.183158" elapsed="0.027750"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:20.211385" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:20.210981" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:20.183122" elapsed="0.028494"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:20.218927" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:20.214174" elapsed="0.004804"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:20.213641" elapsed="0.005373"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:20.213562" elapsed="0.005479"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:20.221716" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:20.219323" elapsed="0.002444"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:20.219098" elapsed="0.002704"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:20.219081" elapsed="0.002746"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:20.222494" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:20.222030" 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-08-22T23:40:20.222856" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:20.222611" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:20.223408" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:20.223101" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:20.222940" elapsed="0.000635"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:20.222576" elapsed="0.001040"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:20.224151" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:20.223777" 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-08-22T23:40:20.224482" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:20.224250" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:20.225042" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:20.224741" elapsed="0.000370"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:20.224565" elapsed="0.000586"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:20.224232" 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-08-22T23:40:20.225336" elapsed="0.000378"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:20.226219" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:20.225881" 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-08-22T23:40:20.226405" elapsed="0.003485"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:40:20.212511" elapsed="0.017479"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:20.230266" elapsed="0.000066"/>
</return>
<status status="PASS" start="2026-08-22T23:40:20.230099" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:20.230072" 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-08-22T23:40:20.230698" elapsed="0.000037"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:20.230812" elapsed="0.000024"/>
</return>
<msg time="2026-08-22T23:40:20.234261" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:20.177485" elapsed="0.056819"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:20.234395" elapsed="0.000041"/>
</return>
<msg time="2026-08-22T23:40:20.234633" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:20.171096" elapsed="0.063579"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:20.235654" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:20.235091" elapsed="0.000693">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:20.234783" elapsed="0.001111">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:20.234757" elapsed="0.001191">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:20.236279" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:20.236056" elapsed="0.000308"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:20.236031" elapsed="0.000371"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:20.167548" elapsed="0.068978">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:21.239755" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:21.238691" elapsed="0.001142"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:21.252804" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:21.252415" elapsed="0.000456"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:21.253468" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:21.253086" elapsed="0.000447"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:40:21.279404" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:21.279763" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:21.279991" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:21.255877" elapsed="0.024172"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:21.253661" elapsed="0.026488"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:21.280550" elapsed="0.000088"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:21.280209" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:21.253628" elapsed="0.027157"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:21.286896" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:21.282789" elapsed="0.004191"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:21.282445" elapsed="0.004594"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:21.282418" elapsed="0.004672"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:21.290812" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:21.287521" elapsed="0.003349"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:21.287183" elapsed="0.003724"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:21.287158" elapsed="0.003774"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:21.291558" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:21.291113" 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-08-22T23:40:21.291935" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:21.291678" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:21.292509" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:21.292182" elapsed="0.000356"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:21.292021" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:21.291659" elapsed="0.000957"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:21.293179" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:21.292776" 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-08-22T23:40:21.293514" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:21.293277" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:21.294148" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:21.293823" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:21.293624" elapsed="0.000589"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:21.293259" 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-08-22T23:40:21.294396" elapsed="0.000384"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:21.295279" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:21.294949" 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-08-22T23:40:21.295462" 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-08-22T23:40:21.281607" elapsed="0.016435"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:21.298309" elapsed="0.000047"/>
</return>
<status status="PASS" start="2026-08-22T23:40:21.298190" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:21.298169" 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-08-22T23:40:21.298565" elapsed="0.000040"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:21.298658" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:40:21.301041" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:21.246111" elapsed="0.054961"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:21.301135" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:40:21.301293" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:21.240515" elapsed="0.060806"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:21.302030" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:21.301630" elapsed="0.000482">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:21.301393" elapsed="0.000792">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:21.301376" elapsed="0.000843">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:21.302435" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:21.302289" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:21.302272" elapsed="0.000243"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:21.237524" elapsed="0.065091">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:22.305713" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:22.304653" elapsed="0.001134"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:22.318077" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:22.317695" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:22.318528" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:22.318282" 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-08-22T23:40:22.349374" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:22.349573" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:22.349748" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:22.320756" elapsed="0.029029"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:22.318668" elapsed="0.031179"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:22.350247" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:22.349903" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:22.318644" elapsed="0.031801"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:22.358235" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:22.352921" elapsed="0.005364"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:22.352387" elapsed="0.005934"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:22.352345" elapsed="0.006001"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:22.361010" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:22.358640" elapsed="0.002416"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:22.358403" elapsed="0.002689"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:22.358387" elapsed="0.002730"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:22.361746" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:22.361296" 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-08-22T23:40:22.362081" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:22.361846" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:22.362658" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:22.362325" elapsed="0.000360"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:22.362164" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:22.361827" elapsed="0.000921"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:22.363270" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:22.362905" 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-08-22T23:40:22.363615" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:22.363367" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:22.364155" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:22.363857" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:22.363699" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:22.363349" 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-08-22T23:40:22.364390" elapsed="0.000369"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:22.365215" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:22.364920" 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-08-22T23:40:22.365440" 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-08-22T23:40:22.351270" elapsed="0.016667"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:22.368114" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:40:22.368007" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:22.367989" 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-08-22T23:40:22.368351" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:22.368422" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:40:22.370754" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:22.311547" elapsed="0.059236"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:22.370844" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:40:22.370994" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:22.306284" elapsed="0.064736"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:22.371670" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:22.371294" elapsed="0.000453">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:22.371089" elapsed="0.000780">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:22.371073" elapsed="0.000833">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:22.372132" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:22.371980" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:22.371963" elapsed="0.000251"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:22.303558" elapsed="0.068736">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:23.375347" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:23.374341" elapsed="0.001079"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:23.385684" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:23.385400" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:23.386136" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:23.385886" 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-08-22T23:40:23.409949" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:23.410255" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:23.410478" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:23.388475" elapsed="0.022060"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:23.386262" elapsed="0.024411"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:23.411081" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:23.410735" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:23.386239" elapsed="0.025036"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:23.423425" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:23.413739" elapsed="0.009803"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:23.413176" elapsed="0.010485"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:23.413133" elapsed="0.010587"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:23.428114" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:23.424418" elapsed="0.003768"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:23.423854" elapsed="0.004385"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:23.423815" elapsed="0.004461"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:23.429152" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:23.428531" elapsed="0.000659"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:23.429639" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:23.429289" elapsed="0.000433"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:23.430400" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:23.429978" elapsed="0.000460"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:23.429756" elapsed="0.000732"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:23.429264" elapsed="0.001254"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:23.431264" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:23.430755" 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-08-22T23:40:23.431842" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:23.431398" elapsed="0.000527"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:23.432663" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:23.432224" elapsed="0.000476"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:23.431958" elapsed="0.000792"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:23.431373" elapsed="0.001406"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:40:23.432972" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:23.433790" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:23.433479" 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-08-22T23:40:23.433966" elapsed="0.002324"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:40:23.412140" elapsed="0.024217"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:23.436539" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:40:23.436429" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:23.436410" 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-08-22T23:40:23.436797" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:23.436870" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:40:23.439169" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:23.379473" elapsed="0.059725"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:23.439258" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:40:23.439409" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:23.375964" elapsed="0.063471"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:23.440114" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:23.439729" elapsed="0.000464">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:23.439505" elapsed="0.000758">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:23.439488" elapsed="0.000809">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:23.440514" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:23.440368" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:23.440351" elapsed="0.000261"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:23.373224" elapsed="0.067473">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:24.443858" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:24.442803" elapsed="0.001131"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:24.455659" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:24.455372" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:24.456115" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:24.455864" 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-08-22T23:40:24.481669" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:24.482115" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:24.482411" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:24.459254" elapsed="0.023239"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:24.456319" elapsed="0.026362"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:24.483157" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:24.482778" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:24.456294" elapsed="0.027033"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:24.488706" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:24.485145" elapsed="0.003633"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:24.484798" elapsed="0.004031"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:24.484767" elapsed="0.004098"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:24.492247" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:24.489300" elapsed="0.002995"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:24.488948" elapsed="0.003390"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:24.488924" elapsed="0.003448"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:24.493074" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:24.492600" 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-08-22T23:40:24.493505" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:24.493197" elapsed="0.000384"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:24.494170" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:24.493854" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:24.493630" elapsed="0.000606"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:24.493175" elapsed="0.001082"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:24.494912" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:24.494444" elapsed="0.000496"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:24.495329" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:24.495031" elapsed="0.000371"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:24.496012" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:24.495659" elapsed="0.000388"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:24.495432" elapsed="0.000652"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:24.495008" elapsed="0.001099"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:40:24.496300" elapsed="0.000456"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:24.497281" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:24.496965" 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-08-22T23:40:24.497484" elapsed="0.002401"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:40:24.484110" elapsed="0.015841"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:24.500133" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:40:24.500021" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:24.500002" 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-08-22T23:40:24.500376" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:24.500628" elapsed="0.000018"/>
</return>
<msg time="2026-08-22T23:40:24.503028" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:24.450364" elapsed="0.052693"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:24.503119" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:40:24.503274" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:24.444462" elapsed="0.058839"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:24.503999" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:24.503625" elapsed="0.000459">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:24.503373" elapsed="0.000787">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:24.503356" elapsed="0.000839">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:24.504412" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:24.504265" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:24.504248" elapsed="0.000257"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:24.441673" elapsed="0.062936">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:25.507523" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:25.506442" elapsed="0.001184"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:25.519999" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:25.519728" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:25.520476" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:25.520206" 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-08-22T23:40:25.543380" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:25.543708" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:25.543939" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:25.522737" elapsed="0.021261"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:25.520625" elapsed="0.023476"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:25.544516" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:25.544165" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:25.520596" elapsed="0.024152"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:25.552360" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:25.547161" elapsed="0.005250"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:25.546566" elapsed="0.005882"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:25.546524" elapsed="0.005949"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:25.555310" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:25.552887" elapsed="0.002470"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:25.552661" elapsed="0.002732"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:25.552642" elapsed="0.002776"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:25.556047" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:25.555622" 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-08-22T23:40:25.556386" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:25.556147" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:25.556966" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:25.556657" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:25.556470" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:25.556129" elapsed="0.000926"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:25.557598" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:25.557214" 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-08-22T23:40:25.557933" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:25.557699" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:25.558474" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:25.558176" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:25.558017" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:25.557681" 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-08-22T23:40:25.558733" elapsed="0.000381"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:25.559611" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:25.559279" 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-08-22T23:40:25.559891" 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-08-22T23:40:25.545560" elapsed="0.016930"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:25.562696" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-08-22T23:40:25.562563" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:25.562544" elapsed="0.000254"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:25.562948" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:25.563038" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:40:25.565427" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:25.514321" elapsed="0.051135"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:25.565519" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:40:25.565690" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:25.508126" elapsed="0.057591"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:25.566373" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:25.566002" elapsed="0.000456">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:25.565791" elapsed="0.000747">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:25.565774" elapsed="0.000827">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:25.566883" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:25.566731" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:25.566712" elapsed="0.000256"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:25.505398" elapsed="0.061704">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:26.570192" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:26.569187" elapsed="0.001078"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:26.580949" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:26.580688" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:26.581394" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:26.581149" 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-08-22T23:40:26.610195" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:26.610496" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:26.610759" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:26.583646" elapsed="0.027173"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:26.581519" elapsed="0.029401"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:26.611325" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:26.610981" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:26.581495" elapsed="0.030126"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:26.618551" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:26.613992" elapsed="0.004653"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:26.613458" elapsed="0.005239"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:26.613417" elapsed="0.005315"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:26.622487" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:26.619124" elapsed="0.003429"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:26.618814" elapsed="0.003811"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:26.618790" elapsed="0.003871"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:26.623469" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:26.622906" 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-08-22T23:40:26.624007" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:26.623675" elapsed="0.000391"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:26.624562" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:26.624254" elapsed="0.000361"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:26.624092" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:26.623648" elapsed="0.001028"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:26.625205" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:26.624837" 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-08-22T23:40:26.625536" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:26.625304" elapsed="0.000361"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:26.626161" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:26.625857" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:26.625693" elapsed="0.000603"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:26.625286" 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-08-22T23:40:26.626480" elapsed="0.000385"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:26.627371" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:26.627029" 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-08-22T23:40:26.627593" elapsed="0.002331"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:40:26.612467" elapsed="0.017524"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:26.630236" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:40:26.630123" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:26.630103" 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-08-22T23:40:26.630478" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:26.630549" elapsed="0.000022"/>
</return>
<msg time="2026-08-22T23:40:26.633041" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:26.574829" elapsed="0.058241"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:26.633131" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:40:26.633283" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:26.570796" elapsed="0.062514"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:26.633968" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:26.633605" elapsed="0.000443">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:26.633380" elapsed="0.000740">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:26.633363" elapsed="0.000790">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:26.634369" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:26.634223" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:26.634207" elapsed="0.000241"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:26.568076" elapsed="0.066454">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:27.637525" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:27.636542" elapsed="0.001084"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:27.649436" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:27.648909" elapsed="0.000597"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:27.649957" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:27.649701" 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-08-22T23:40:27.674799" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:27.675261" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:27.675551" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:27.652257" elapsed="0.023389"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:27.650091" elapsed="0.025670"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:27.676227" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:27.675831" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:27.650064" elapsed="0.026362"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:27.682984" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:27.678915" elapsed="0.004140"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:27.678365" elapsed="0.004743"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:27.678321" elapsed="0.004822"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:27.687002" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:27.683623" elapsed="0.003447"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:27.683222" elapsed="0.003899"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:27.683199" elapsed="0.003956"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:27.688033" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:27.687402" elapsed="0.000659"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:27.688370" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:27.688132" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:27.688940" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:27.688633" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:27.688453" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:27.688114" elapsed="0.000912"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:27.689546" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:27.689183" 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-08-22T23:40:27.689894" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:27.689662" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:27.690430" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:27.690134" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:27.689975" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:27.689644" elapsed="0.000868"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:40:27.690682" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:27.691520" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:27.691199" 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-08-22T23:40:27.691724" elapsed="0.002332"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:40:27.677321" elapsed="0.016801"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:27.694308" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-08-22T23:40:27.694194" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:27.694175" 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-08-22T23:40:27.694558" elapsed="0.000038"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:27.694648" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:40:27.697022" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:27.642470" elapsed="0.054581"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:27.697168" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:40:27.697325" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:27.638124" elapsed="0.059228"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:27.698025" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:27.697653" elapsed="0.000453">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:27.697423" elapsed="0.000757">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:27.697406" elapsed="0.000809">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:27.698434" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:27.698286" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:27.698269" elapsed="0.000245"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:27.635458" elapsed="0.063157">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:28.701701" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:28.700684" elapsed="0.001092"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:28.713524" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:28.713239" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:28.714016" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:28.713757" 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-08-22T23:40:28.772837" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:28.773179" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:28.773454" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:28.717508" elapsed="0.056011"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:28.714188" elapsed="0.059485"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:28.774175" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:28.773748" elapsed="0.000586"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:28.714152" elapsed="0.060236"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:28.780257" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:28.776729" elapsed="0.003599"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:28.776371" elapsed="0.004007"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:28.776341" elapsed="0.004072"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:28.784103" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:28.780823" elapsed="0.003345"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:28.780492" elapsed="0.003725"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:28.780469" elapsed="0.003782"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:28.785082" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:28.784492" 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-08-22T23:40:28.785670" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:28.785314" elapsed="0.000439"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:28.786437" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:28.786012" elapsed="0.000464"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:28.785787" elapsed="0.000740"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:28.785287" elapsed="0.001270"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:28.787350" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:28.786798" 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-08-22T23:40:28.787835" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:28.787489" elapsed="0.000427"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:28.788423" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:28.788128" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:28.787951" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:28.787464" 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-08-22T23:40:28.788675" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:28.789487" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:28.789189" 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-08-22T23:40:28.789681" 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-08-22T23:40:28.775484" elapsed="0.016735"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:28.792402" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:40:28.792290" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:28.792272" 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-08-22T23:40:28.792666" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:28.792739" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:40:28.795057" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:28.707186" elapsed="0.087900"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:28.795217" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:40:28.795389" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:28.702308" elapsed="0.093109"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:28.796092" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:28.795722" elapsed="0.000449">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:28.795490" elapsed="0.000755">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:28.795473" elapsed="0.000806">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:28.796498" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:28.796351" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:28.796333" elapsed="0.000244"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:28.699541" elapsed="0.097137">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:29.799778" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:29.798775" elapsed="0.001076"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:29.811143" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:29.810882" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:29.811607" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:29.811344" 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-08-22T23:40:29.833106" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:29.833425" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:29.833702" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:29.813832" elapsed="0.019937"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:29.811732" elapsed="0.022144"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:29.834355" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:29.833940" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:29.811709" elapsed="0.022866"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:29.842860" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:29.836946" elapsed="0.006027"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:29.836409" elapsed="0.006645"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:29.836366" elapsed="0.006743"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:29.845753" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:29.843390" elapsed="0.002409"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:29.843169" elapsed="0.002666"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:29.843153" elapsed="0.002707"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:29.846454" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:29.846035" 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-08-22T23:40:29.846805" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:29.846553" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:29.847348" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:29.847047" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:29.846887" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:29.846535" elapsed="0.000899"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:29.847969" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:29.847605" 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-08-22T23:40:29.848297" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:29.848067" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:29.848850" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:29.848535" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:29.848378" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:29.848049" 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-08-22T23:40:29.849085" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:29.849907" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:29.849610" 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-08-22T23:40:29.850203" 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-08-22T23:40:29.835420" elapsed="0.017220"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:29.852820" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:40:29.852712" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:29.852693" 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-08-22T23:40:29.853059" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:29.853135" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:40:29.855482" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:29.805902" elapsed="0.049609"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:29.855571" elapsed="0.000044"/>
</return>
<msg time="2026-08-22T23:40:29.855741" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:29.800348" elapsed="0.055420"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:29.856411" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:29.856050" elapsed="0.000439">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:29.855839" elapsed="0.000722">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:29.855821" elapsed="0.000792">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:29.856832" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:29.856686" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:29.856669" elapsed="0.000243"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:29.797637" elapsed="0.059357">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:30.859944" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:30.858960" elapsed="0.001076"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:30.871981" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:30.871605" elapsed="0.000438"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:30.872460" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:30.872210" 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-08-22T23:40:30.898472" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:30.898720" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:30.898882" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:30.874793" elapsed="0.024118"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:30.872607" elapsed="0.026460"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:30.899344" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:30.899109" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:30.872563" elapsed="0.026874"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:30.903279" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:30.900657" elapsed="0.002672"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:30.900394" elapsed="0.002971"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:30.900372" elapsed="0.003018"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:30.906148" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:30.903684" elapsed="0.002532"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:30.903446" elapsed="0.002823"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:30.903430" elapsed="0.002874"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:30.907163" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:30.906557" 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-08-22T23:40:30.907701" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:30.907307" elapsed="0.000481"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:30.908678" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:30.908061" elapsed="0.000658"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:30.907824" elapsed="0.000950"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:30.907281" elapsed="0.001525"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:30.909625" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:30.909064" 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-08-22T23:40:30.910109" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:30.909768" elapsed="0.000426"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:30.910916" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:30.910458" elapsed="0.000496"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:30.910229" elapsed="0.000777"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:30.909742" 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-08-22T23:40:30.911259" elapsed="0.000533"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:30.912453" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:30.912030" 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-08-22T23:40:30.912736" 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-08-22T23:40:30.899892" elapsed="0.015703"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:30.915784" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:40:30.915671" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:30.915652" 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-08-22T23:40:30.916027" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:30.916099" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:40:30.918459" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:30.865013" elapsed="0.053475"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:30.918549" elapsed="0.000045"/>
</return>
<msg time="2026-08-22T23:40:30.918722" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:30.860564" elapsed="0.058184"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:30.919496" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:30.919029" elapsed="0.000545">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:30.918819" elapsed="0.000848">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:30.918802" elapsed="0.000901">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:30.919921" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:30.919774" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:30.919757" elapsed="0.000251"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:30.857907" elapsed="0.062183">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:31.922992" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:31.921971" elapsed="0.001091"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:31.934062" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:31.933799" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:31.934508" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:31.934265" 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-08-22T23:40:31.960376" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:31.960710" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:31.960935" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:31.936742" elapsed="0.024252"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:31.934646" elapsed="0.026448"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:31.961505" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:31.961155" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:31.934621" elapsed="0.027117"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:31.969500" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:31.964079" elapsed="0.005567"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:31.963550" elapsed="0.006177"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:31.963477" elapsed="0.006307"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:31.973822" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:31.970402" elapsed="0.003467"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:31.969910" elapsed="0.003995"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:31.969872" elapsed="0.004057"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:31.974496" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:31.974102" 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-08-22T23:40:31.974849" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:31.974610" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:31.975397" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:31.975092" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:31.974931" elapsed="0.000619"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:31.974576" elapsed="0.001002"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:31.976120" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:31.975754" 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-08-22T23:40:31.976453" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:31.976221" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:31.977007" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:31.976709" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:31.976534" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:31.976203" 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-08-22T23:40:31.977240" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:31.978065" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:31.977769" 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-08-22T23:40:31.978242" 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-08-22T23:40:31.962537" elapsed="0.018242"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:31.980958" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:40:31.980850" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:31.980831" 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-08-22T23:40:31.981199" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:31.981269" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:40:31.983696" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:31.928098" elapsed="0.055627"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:31.983785" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:40:31.983937" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:31.923630" elapsed="0.060333"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:31.984620" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:31.984241" elapsed="0.000459">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:31.984034" elapsed="0.000736">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:31.984016" elapsed="0.000788">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:31.985020" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:31.984874" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:31.984858" elapsed="0.000243"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:31.920967" elapsed="0.064215">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:32.988143" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:32.987129" elapsed="0.001086"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:32.998966" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:32.998701" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:32.999412" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:32.999167" 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-08-22T23:40:33.021629" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:33.021987" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:33.022210" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:33.001629" elapsed="0.020638"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:32.999534" elapsed="0.022829"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:33.022803" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:33.022424" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:32.999512" elapsed="0.023488"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:33.031995" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:33.025288" elapsed="0.006758"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:33.024794" elapsed="0.007288"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:33.024753" elapsed="0.007355"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:33.034774" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:33.032393" elapsed="0.002428"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:33.032169" elapsed="0.002688"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:33.032152" elapsed="0.002730"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:33.035682" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:33.035242" 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-08-22T23:40:33.036020" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:33.035783" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:33.036567" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:33.036264" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:33.036104" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:33.035764" elapsed="0.000906"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:33.037195" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:33.036828" 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-08-22T23:40:33.037523" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:33.037292" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:33.038107" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:33.037809" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:33.037623" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:33.037274" 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-08-22T23:40:33.038342" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:33.039166" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:33.038870" 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-08-22T23:40:33.039346" 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-08-22T23:40:33.023822" elapsed="0.017992"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:33.042044" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:40:33.041933" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:33.041914" 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-08-22T23:40:33.042286" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:33.042359" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:40:33.044748" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:32.992827" elapsed="0.051952"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:33.044840" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:40:33.044990" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:32.988889" elapsed="0.056128"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:33.045673" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:33.045292" elapsed="0.000461">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:33.045086" elapsed="0.000767">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:33.045070" elapsed="0.000818">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:33.046104" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:33.045959" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:33.045942" elapsed="0.000242"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:32.986089" elapsed="0.060177">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:34.050225" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:34.048993" elapsed="0.001325"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:34.061983" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:34.061699" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:34.062440" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:34.062189" 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-08-22T23:40:34.088550" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:34.089054" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:34.089392" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:34.064775" elapsed="0.024680"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:34.062605" elapsed="0.027030"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:34.090226" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:34.089730" elapsed="0.000641"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:34.062549" elapsed="0.027866"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:34.097815" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:34.093223" elapsed="0.004663"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:34.092729" elapsed="0.005204"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:34.092683" elapsed="0.005282"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:34.101511" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:34.098340" elapsed="0.003234"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:34.098040" elapsed="0.003599"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:34.098018" elapsed="0.003655"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:34.102616" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:34.101951" 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-08-22T23:40:34.103109" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:34.102762" elapsed="0.000435"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:34.103969" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:34.103463" elapsed="0.000547"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:34.103231" elapsed="0.000833"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:34.102733" elapsed="0.001360"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:34.104888" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:34.104321" 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-08-22T23:40:34.105353" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:34.105022" elapsed="0.000422"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:34.106230" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:34.105748" elapsed="0.000524"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:34.105485" elapsed="0.000844"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:34.104998" 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-08-22T23:40:34.106608" elapsed="0.000392"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:34.107615" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:34.107175" elapsed="0.000478"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:40:34.107876" elapsed="0.003262"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:40:34.091383" elapsed="0.019869"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:34.111547" elapsed="0.000094"/>
</return>
<status status="PASS" start="2026-08-22T23:40:34.111371" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:34.111341" elapsed="0.000394"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:34.113671" elapsed="0.000165"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:34.114043" elapsed="0.000063"/>
</return>
<msg time="2026-08-22T23:40:34.120505" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:34.055228" elapsed="0.065384"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:34.120749" elapsed="0.000068"/>
</return>
<msg time="2026-08-22T23:40:34.121023" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:34.050924" elapsed="0.070140"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:34.122427" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:34.121599" elapsed="0.000955">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:34.121219" elapsed="0.001644">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:34.121181" elapsed="0.001753">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:34.123260" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:34.123044" elapsed="0.000309"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:34.123019" elapsed="0.000367"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:34.047515" elapsed="0.076001">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:35.126897" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:35.125809" elapsed="0.001177"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:35.138820" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:35.138539" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:35.139269" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:35.139024" 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-08-22T23:40:35.162926" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:35.163246" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:35.163498" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:35.141508" elapsed="0.022064"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:35.139395" elapsed="0.024344"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:35.164197" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:35.163808" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:35.139370" elapsed="0.025042"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:35.170192" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:35.166619" elapsed="0.003645"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:35.166289" elapsed="0.004029"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:35.166263" elapsed="0.004100"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:35.174290" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:35.170790" elapsed="0.003547"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:35.170444" elapsed="0.003928"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:35.170421" elapsed="0.003977"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:35.174999" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:35.174571" 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-08-22T23:40:35.175340" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:35.175099" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:35.175906" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:35.175601" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:35.175422" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:35.175081" elapsed="0.000909"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:35.176514" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:35.176146" 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-08-22T23:40:35.177020" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:35.176629" elapsed="0.000451"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:35.177569" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:35.177267" elapsed="0.000373"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:35.177105" elapsed="0.000573"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:35.176610" elapsed="0.001090"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:40:35.177875" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:35.178722" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:35.178396" 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-08-22T23:40:35.178904" 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-08-22T23:40:35.165278" elapsed="0.016172"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:35.181678" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:40:35.181521" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:35.181503" 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-08-22T23:40:35.181932" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:35.182004" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:40:35.184416" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:35.134024" elapsed="0.050422"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:35.184506" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:40:35.184673" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:35.127532" elapsed="0.057168"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:35.185339" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:35.184977" elapsed="0.000440">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:35.184771" elapsed="0.000718">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:35.184754" elapsed="0.000769">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:35.185782" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:35.185609" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:35.185591" elapsed="0.000272"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:35.124526" elapsed="0.061420">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:36.188951" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:36.187981" elapsed="0.001040"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:36.200424" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:36.200159" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:36.200893" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:36.200642" 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-08-22T23:40:36.227275" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:36.227629" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:36.227884" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:36.203292" elapsed="0.024656"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:36.201146" elapsed="0.026915"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:36.228527" elapsed="0.000085"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:36.228129" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:36.201120" elapsed="0.027657"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:36.237180" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:36.231458" elapsed="0.005775"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:36.230803" elapsed="0.006466"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:36.230755" elapsed="0.006540"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:36.240023" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:36.237615" elapsed="0.002456"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:36.237353" elapsed="0.002761"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:36.237336" elapsed="0.002805"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:36.240788" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:36.240331" 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-08-22T23:40:36.241127" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:36.240889" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:36.241704" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:36.241385" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:36.241210" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:36.240871" elapsed="0.000918"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:36.242312" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:36.241946" 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-08-22T23:40:36.242653" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:36.242407" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:36.243189" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:36.242893" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:36.242736" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:36.242390" 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-08-22T23:40:36.243456" elapsed="0.000369"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:36.244286" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:36.243987" 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-08-22T23:40:36.244468" elapsed="0.002400"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:40:36.229706" elapsed="0.017229"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:36.247119" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:40:36.247007" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:36.246988" 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-08-22T23:40:36.247380" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:36.247523" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:40:36.249890" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:36.195152" elapsed="0.054768"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:36.249980" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:40:36.250133" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:36.189510" elapsed="0.060649"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:36.250823" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:36.250438" elapsed="0.000465">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:36.250229" elapsed="0.000747">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:36.250212" elapsed="0.000799">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:36.251229" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:36.251081" elapsed="0.000233"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:36.251065" elapsed="0.000273"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:36.186875" elapsed="0.064725">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:37.255059" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:37.253935" elapsed="0.001201"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:37.266559" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:37.266291" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:37.267033" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:37.266783" 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-08-22T23:40:37.290999" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:37.291327" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:37.291610" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:37.269322" elapsed="0.022357"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:37.267159" elapsed="0.024676"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:37.292354" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:37.291937" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:37.267133" elapsed="0.025438"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:37.301304" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:37.295349" elapsed="0.006018"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:37.294794" elapsed="0.006613"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:37.294746" elapsed="0.006686"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:37.304222" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:37.301825" elapsed="0.002445"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:37.301591" elapsed="0.002715"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:37.301558" elapsed="0.002773"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:37.304999" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:37.304516" 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-08-22T23:40:37.305343" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:37.305100" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:37.305918" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:37.305608" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:37.305427" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:37.305081" elapsed="0.000924"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:37.306531" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:37.306164" 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-08-22T23:40:37.306882" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:37.306648" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:37.307427" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:37.307122" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:37.306965" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:37.306629" 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-08-22T23:40:37.307680" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:37.308528" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:37.308219" 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-08-22T23:40:37.308880" elapsed="0.002405"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:40:37.293615" elapsed="0.017744"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:37.311555" elapsed="0.000055"/>
</return>
<status status="PASS" start="2026-08-22T23:40:37.311437" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:37.311417" 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-08-22T23:40:37.311825" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:37.311899" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:40:37.314332" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:37.261618" elapsed="0.052745"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:37.314426" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:40:37.314599" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:37.255713" elapsed="0.058916"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:37.315307" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:37.314918" elapsed="0.000475">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:37.314704" elapsed="0.000764">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:37.314686" elapsed="0.000817">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:37.315801" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:37.315650" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:37.315631" elapsed="0.000252"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:37.252540" elapsed="0.063432">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:38.319238" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:38.317991" elapsed="0.001304"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:38.329702" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:38.329407" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:38.330202" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:38.329913" 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-08-22T23:40:38.355572" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:38.355934" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:38.356183" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:38.332423" elapsed="0.023817"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:38.330330" elapsed="0.026018"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:38.356856" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:38.356416" elapsed="0.000589"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:38.330304" elapsed="0.026750"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:38.365366" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:38.359705" elapsed="0.005772"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:38.359129" elapsed="0.006428"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:38.359071" elapsed="0.006572"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:38.369375" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:38.366315" elapsed="0.003109"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:38.365770" elapsed="0.003691"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:38.365734" elapsed="0.003752"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:38.370122" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:38.369699" 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-08-22T23:40:38.370495" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:38.370245" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:38.371075" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:38.370765" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:38.370595" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:38.370226" elapsed="0.000937"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:38.371709" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:38.371321" 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-08-22T23:40:38.372043" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:38.371809" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:38.372615" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:38.372287" elapsed="0.000356"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:38.372126" elapsed="0.000633"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:38.371791" 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-08-22T23:40:38.372942" elapsed="0.000361"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:38.373805" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:38.373472" 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-08-22T23:40:38.373989" elapsed="0.002566"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:40:38.357944" elapsed="0.018700"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:38.376836" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:40:38.376720" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:38.376701" 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-08-22T23:40:38.377088" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:38.377162" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:40:38.379761" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:38.323850" elapsed="0.055941"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:38.379854" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:40:38.380013" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:38.319666" elapsed="0.060375"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:38.380747" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:38.380327" elapsed="0.000508">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:38.380114" elapsed="0.000799">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:38.380096" elapsed="0.000852">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:38.381171" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:38.381020" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:38.381002" elapsed="0.000249"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:38.316924" elapsed="0.064414">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:39.384386" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:39.383352" elapsed="0.001109"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:39.396421" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:39.396159" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:39.396889" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:39.396639" 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-08-22T23:40:39.419001" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:39.419233" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:39.419335" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:39.399078" elapsed="0.020283"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:39.397011" elapsed="0.022416"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:39.419631" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:39.419456" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:39.396989" elapsed="0.022736"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:39.423343" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:39.420761" elapsed="0.002634"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:39.420525" elapsed="0.002932"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:39.420506" elapsed="0.002982"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:39.426109" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:39.423796" elapsed="0.002359"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:39.423552" elapsed="0.002638"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:39.423534" elapsed="0.002681"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:39.426806" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:39.426394" 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-08-22T23:40:39.427142" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:39.426905" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:39.427728" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:39.427384" elapsed="0.000371"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:39.427224" elapsed="0.000569"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:39.426887" elapsed="0.000927"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:39.428337" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:39.427970" 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-08-22T23:40:39.428683" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:39.428436" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:39.429214" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:39.428920" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:39.428765" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:39.428418" 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-08-22T23:40:39.429452" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:39.430277" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:39.429982" 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-08-22T23:40:39.430455" elapsed="0.002332"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:40:39.420091" elapsed="0.012760"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:39.433029" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:40:39.432920" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:39.432902" 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-08-22T23:40:39.433267" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:39.433343" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:40:39.435697" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:39.391071" elapsed="0.044655"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:39.435822" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:40:39.435978" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:39.385029" elapsed="0.050976"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:39.436686" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:39.436294" elapsed="0.000470">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:39.436076" elapsed="0.000761">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:39.436059" elapsed="0.000812">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:39.437088" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:39.436941" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:39.436924" elapsed="0.000243"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:39.382262" elapsed="0.054992">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:40.440237" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:40.439255" elapsed="0.001054"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:40.455063" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:40.454801" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:40.455522" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:40.455266" 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-08-22T23:40:41.065273" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:41.065645" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:41.065933" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:40.457750" elapsed="0.608268"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:40.455659" elapsed="0.610485"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:41.066740" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:41.066228" elapsed="0.000681"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:40.455636" elapsed="0.611325"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:41.074786" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:41.069514" elapsed="0.005324"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:41.068937" elapsed="0.005937"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:41.068892" elapsed="0.006008"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:41.077720" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:41.075181" elapsed="0.002588"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:41.074958" elapsed="0.002847"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:41.074941" elapsed="0.002890"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:41.078414" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:41.078008" 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-08-22T23:40:41.078847" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:41.078601" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:41.079400" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:41.079093" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:41.078930" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:41.078566" elapsed="0.000920"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:41.080040" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:41.079660" 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-08-22T23:40:41.080371" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:41.080139" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:41.080940" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:41.080641" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:41.080453" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:41.080121" 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-08-22T23:40:41.081177" elapsed="0.000382"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:41.082047" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:41.081750" 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-08-22T23:40:41.082235" 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-08-22T23:40:41.067870" elapsed="0.016798"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:41.084848" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:40:41.084738" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:41.084720" 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-08-22T23:40:41.085090" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:41.085161" elapsed="0.000023"/>
</return>
<msg time="2026-08-22T23:40:41.087544" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:40.446497" elapsed="0.641076"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:41.087651" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:40:41.087804" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:40.440990" elapsed="0.646841"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:41.088518" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:41.088155" elapsed="0.000458">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:41.087942" elapsed="0.000745">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:41.087923" elapsed="0.000798">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:41.088939" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:41.088791" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:41.088773" elapsed="0.000244"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:40.438188" elapsed="0.650910">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:42.093732" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:42.092408" elapsed="0.001417"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:42.104133" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:42.103786" elapsed="0.000420"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:42.104781" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:42.104411" 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-08-22T23:40:42.125402" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:42.125765" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:42.125993" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:42.107332" elapsed="0.018718"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:42.104953" elapsed="0.021195"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:42.126650" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:42.126209" elapsed="0.000591"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:42.104913" elapsed="0.021934"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:42.133600" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:42.129145" elapsed="0.004527"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:42.128651" elapsed="0.005071"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:42.128607" elapsed="0.005150"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:42.137412" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:42.134144" elapsed="0.003335"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:42.133836" elapsed="0.003693"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:42.133813" elapsed="0.003751"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:42.139499" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:42.137832" elapsed="0.001706"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:42.139921" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:42.139645" elapsed="0.000335"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:42.140478" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:42.140171" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:42.140005" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:42.139619" elapsed="0.000946"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:42.141104" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:42.140740" 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-08-22T23:40:42.141430" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:42.141201" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:42.141981" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:42.141683" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:42.141511" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:42.141183" 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-08-22T23:40:42.142226" elapsed="0.000400"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:42.143102" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:42.142790" 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-08-22T23:40:42.143397" 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-08-22T23:40:42.127677" elapsed="0.018290"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:42.146150" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-08-22T23:40:42.146040" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:42.146021" 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-08-22T23:40:42.146455" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:42.146529" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:40:42.149027" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:42.099499" elapsed="0.049557"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:42.149117" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:40:42.149272" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:42.094915" elapsed="0.054384"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:42.149964" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:42.149594" elapsed="0.000447">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:42.149371" elapsed="0.000747">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:42.149353" elapsed="0.000801">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:42.150444" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:42.150224" elapsed="0.000284"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:42.150207" elapsed="0.000325"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:42.090878" elapsed="0.059754">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:43.152745" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:43.152103" elapsed="0.000691"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:43.162791" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:43.162439" elapsed="0.000413"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:43.163395" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:43.163056" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:40:43.195729" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:43.196015" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:43.196238" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:43.166417" elapsed="0.029869"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:43.163552" elapsed="0.032927"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:43.196871" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:43.196534" elapsed="0.000441"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:43.163523" elapsed="0.033485"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:43.205146" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:43.198888" elapsed="0.006315"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:43.198491" elapsed="0.006752"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:43.198457" elapsed="0.006814"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:43.208915" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:43.205631" elapsed="0.003345"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:43.205332" elapsed="0.003691"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:43.205313" elapsed="0.003743"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:43.209833" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:43.209290" 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-08-22T23:40:43.210266" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:43.209960" elapsed="0.000379"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:43.211011" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:43.210574" elapsed="0.000474"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:43.210370" elapsed="0.000726"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:43.209937" elapsed="0.001190"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:43.211882" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:43.211399" 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-08-22T23:40:43.212226" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:43.211982" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:43.212840" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:43.212472" elapsed="0.000396"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:43.212311" elapsed="0.000594"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:43.211964" 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-08-22T23:40:43.213101" elapsed="0.000433"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:43.214050" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:43.213733" 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-08-22T23:40:43.214246" 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-08-22T23:40:43.197691" elapsed="0.019033"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:43.216914" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:40:43.216798" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:43.216779" 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-08-22T23:40:43.217188" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:43.217291" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:40:43.219909" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:43.156533" elapsed="0.063419"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:43.220038" elapsed="0.000044"/>
</return>
<msg time="2026-08-22T23:40:43.220243" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:43.153104" elapsed="0.067169"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:43.221046" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:43.220606" elapsed="0.000522">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:43.220347" elapsed="0.000875">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:43.220329" elapsed="0.000935">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:43.221509" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:43.221359" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:43.221340" elapsed="0.000274"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:43.151362" elapsed="0.070341">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:44.224942" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:44.223876" elapsed="0.001138"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:44.236936" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:44.236667" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:44.237394" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:44.237139" 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-08-22T23:40:44.258806" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:44.259118" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:44.259339" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:44.239645" elapsed="0.019752"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:44.237541" elapsed="0.021954"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:44.259937" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:44.259556" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:44.237514" elapsed="0.022621"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:44.268220" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:44.262496" elapsed="0.005851"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:44.262003" elapsed="0.006424"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:44.261962" elapsed="0.006497"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:44.271114" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:44.268754" elapsed="0.002406"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:44.268516" elapsed="0.002680"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:44.268499" elapsed="0.002721"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:44.271847" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:44.271395" 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-08-22T23:40:44.272206" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:44.271947" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:44.272788" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:44.272455" elapsed="0.000361"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:44.272289" elapsed="0.000640"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:44.271929" elapsed="0.001024"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:44.273481" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:44.273113" 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-08-22T23:40:44.273831" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:44.273595" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:44.274366" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:44.274070" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:44.273912" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:44.273561" 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-08-22T23:40:44.274615" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:44.275428" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:44.275133" 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-08-22T23:40:44.275624" elapsed="0.002383"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:40:44.261017" elapsed="0.017055"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:44.278252" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:40:44.278143" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:44.278125" 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-08-22T23:40:44.278497" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:44.278569" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:40:44.280934" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:44.230229" elapsed="0.050735"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:44.281027" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:40:44.281180" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:44.225512" elapsed="0.055696"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:44.281870" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:44.281487" elapsed="0.000462">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:44.281279" elapsed="0.000742">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:44.281263" elapsed="0.000793">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:44.282277" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:44.282129" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:44.282111" elapsed="0.000249"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:44.222756" elapsed="0.059686">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:45.285978" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:45.284979" elapsed="0.001087"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:45.297736" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:45.297448" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:45.298194" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:45.297942" 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-08-22T23:40:45.320264" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:45.320681" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:45.320927" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:45.300440" elapsed="0.020549"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:45.298319" elapsed="0.022786"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:45.321537" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:45.321171" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:45.298295" elapsed="0.023494"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:45.329790" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:45.324212" elapsed="0.005628"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:45.323701" elapsed="0.006175"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:45.323657" elapsed="0.006244"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:45.332552" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:45.330178" elapsed="0.002425"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:45.329957" elapsed="0.002696"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:45.329940" elapsed="0.002738"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:45.333400" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:45.332864" 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-08-22T23:40:45.333770" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:45.333503" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:45.334317" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:45.334015" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:45.333855" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:45.333483" elapsed="0.000920"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:45.334962" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:45.334593" 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-08-22T23:40:45.335289" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:45.335060" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:45.335857" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:45.335537" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:45.335381" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:45.335042" 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-08-22T23:40:45.336095" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:45.336964" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:45.336633" 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-08-22T23:40:45.337176" 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-08-22T23:40:45.322660" elapsed="0.017224"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:45.340135" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-08-22T23:40:45.340018" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:45.339998" 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-08-22T23:40:45.340391" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:45.340465" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:40:45.342865" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:45.292972" elapsed="0.049923"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:45.342955" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:40:45.343107" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:45.286801" elapsed="0.056332"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:45.343800" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:45.343412" elapsed="0.000470">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:45.343204" elapsed="0.000754">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:45.343187" elapsed="0.000806">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:45.344210" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:45.344063" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:45.344046" elapsed="0.000244"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:45.283861" elapsed="0.060513">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:46.347430" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:46.346392" elapsed="0.001117"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:46.357781" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:46.357499" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:46.358231" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:46.357984" 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-08-22T23:40:46.378172" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:46.378327" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:46.378427" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:46.360504" elapsed="0.017971"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:46.358355" elapsed="0.020229"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:46.379033" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:46.378690" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:46.358331" elapsed="0.020901"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:46.387865" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:46.381882" elapsed="0.006096"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:46.381314" elapsed="0.006746"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:46.381271" elapsed="0.006846"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:46.391631" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:46.388839" elapsed="0.002842"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:46.388245" elapsed="0.003472"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:46.388206" elapsed="0.003536"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:46.392320" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:46.391919" 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-08-22T23:40:46.392699" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:46.392421" elapsed="0.000339"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:46.393255" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:46.392946" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:46.392785" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:46.392402" elapsed="0.000940"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:46.393890" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:46.393502" 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-08-22T23:40:46.394220" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:46.393989" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:46.394775" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:46.394459" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:46.394302" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:46.393971" 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-08-22T23:40:46.395013" elapsed="0.000382"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:46.395875" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:46.395562" 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-08-22T23:40:46.396055" elapsed="0.002372"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:40:46.380128" elapsed="0.018367"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:46.398696" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:40:46.398567" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:46.398548" 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-08-22T23:40:46.398936" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:46.399009" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:40:46.401615" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:46.353110" elapsed="0.048538"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:46.401709" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:40:46.401875" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:46.348037" elapsed="0.053866"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:46.402551" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:46.402186" elapsed="0.000466">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:46.401975" elapsed="0.000788">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:46.401958" elapsed="0.000843">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:46.403023" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:46.402873" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:46.402855" elapsed="0.000249"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:46.345309" elapsed="0.057879">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:47.406162" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:47.405183" elapsed="0.001050"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:47.419899" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:47.419501" elapsed="0.000508"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:47.420563" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:47.420226" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:40:47.441393" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:47.441674" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:47.441900" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:47.422787" elapsed="0.019172"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:47.420705" elapsed="0.021354"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:47.442459" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:47.442120" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:47.420682" elapsed="0.022011"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:47.450592" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:47.445023" elapsed="0.005710"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:47.444495" elapsed="0.006320"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:47.444420" elapsed="0.006451"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:47.455188" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:47.451489" elapsed="0.003747"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:47.450995" elapsed="0.004276"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:47.450958" elapsed="0.004339"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:47.455887" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:47.455470" 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-08-22T23:40:47.456227" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:47.455987" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:47.456811" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:47.456472" elapsed="0.000367"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:47.456312" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:47.455969" elapsed="0.000929"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:47.457421" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:47.457055" 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-08-22T23:40:47.457850" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:47.457519" elapsed="0.000392"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:47.458398" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:47.458097" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:47.457937" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:47.457501" 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-08-22T23:40:47.458654" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:47.459468" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:47.459171" 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-08-22T23:40:47.459664" 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-08-22T23:40:47.443482" elapsed="0.018638"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:47.462302" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:40:47.462192" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:47.462173" 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-08-22T23:40:47.462542" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:47.462633" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:40:47.465022" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:47.412405" elapsed="0.052646"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:47.465128" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:40:47.465281" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:47.406773" elapsed="0.058535"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:47.465974" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:47.465607" elapsed="0.000446">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:47.465379" elapsed="0.000746">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:47.465362" elapsed="0.000798">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:47.466373" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:47.466231" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:47.466214" elapsed="0.000240"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:47.404147" elapsed="0.062394">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:48.469559" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:48.468491" elapsed="0.001175"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:48.481667" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:48.481390" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:48.482119" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:48.481872" 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-08-22T23:40:48.502157" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:48.502311" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:48.502411" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:48.484400" elapsed="0.018037"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:48.482310" elapsed="0.020169"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:48.502875" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:48.502507" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:48.482284" elapsed="0.020786"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:48.511001" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:48.505360" elapsed="0.005753"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:48.504869" elapsed="0.006327"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:48.504826" elapsed="0.006426"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:48.515809" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:48.511941" elapsed="0.003924"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:48.511377" elapsed="0.004526"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:48.511339" elapsed="0.004588"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:48.516519" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:48.516104" 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-08-22T23:40:48.516897" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:48.516640" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:48.517474" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:48.517164" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:48.516985" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:48.516621" elapsed="0.000943"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:48.518152" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:48.517741" 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-08-22T23:40:48.518483" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:48.518250" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:48.519086" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:48.518745" elapsed="0.000367"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:48.518566" elapsed="0.000583"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:48.518232" 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-08-22T23:40:48.519324" elapsed="0.000391"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:48.520211" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:48.519893" 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-08-22T23:40:48.520395" 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-08-22T23:40:48.503883" elapsed="0.019201"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:48.523265" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:40:48.523154" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:48.523136" 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-08-22T23:40:48.523505" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:48.523642" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:40:48.525950" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:48.476236" elapsed="0.049742"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:48.526079" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:40:48.526231" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:48.470163" elapsed="0.056094"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:48.527145" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:48.526534" elapsed="0.000690">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:48.526328" elapsed="0.000970">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:48.526311" elapsed="0.001021">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:48.527547" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:48.527401" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:48.527384" elapsed="0.000262"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:48.467405" elapsed="0.060323">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:49.530852" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:49.529806" elapsed="0.001120"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:49.541785" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:49.541498" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:49.542242" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:49.541989" 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-08-22T23:40:49.565470" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:49.565711" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:49.565866" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:49.544566" elapsed="0.021341"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:49.542370" elapsed="0.023601"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:49.566236" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:49.566013" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:49.542345" elapsed="0.024018"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:49.573569" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:49.567883" elapsed="0.005842"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:49.567516" elapsed="0.006297"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:49.567487" elapsed="0.006400"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:49.578310" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:49.574729" elapsed="0.003629"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:49.574166" elapsed="0.004229"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:49.574121" elapsed="0.004299"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:49.579041" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:49.578618" 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-08-22T23:40:49.579383" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:49.579142" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:49.579997" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:49.579661" elapsed="0.000365"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:49.579468" elapsed="0.000596"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:49.579123" elapsed="0.000963"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:49.580667" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:49.580247" elapsed="0.000454"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:49.581026" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:49.580774" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:49.581572" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:49.581271" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:49.581110" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:49.580755" 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-08-22T23:40:49.581842" elapsed="0.000362"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:49.582698" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:49.582368" 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-08-22T23:40:49.582902" elapsed="0.002372"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:40:49.566914" elapsed="0.018427"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:49.585524" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:40:49.585412" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:49.585394" 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-08-22T23:40:49.585788" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:49.585860" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:40:49.588170" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:49.535556" elapsed="0.052643"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:49.588260" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:40:49.588410" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:49.531434" elapsed="0.057017"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:49.589118" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:49.588755" elapsed="0.000441">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:49.588523" elapsed="0.000745">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:49.588506" elapsed="0.000796">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:49.589559" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:49.589411" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:49.589393" elapsed="0.000264"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:49.528638" elapsed="0.061105">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:50.592833" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:50.591833" elapsed="0.001087"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:50.604755" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:50.604463" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:50.605210" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:50.604963" 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-08-22T23:40:50.626934" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:50.627236" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:50.627461" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:50.607416" elapsed="0.020103"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:50.605336" elapsed="0.022353"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:50.628109" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:50.627755" elapsed="0.000579"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:50.605310" elapsed="0.023078"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:50.636469" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:50.630777" elapsed="0.005790"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:50.630248" elapsed="0.006377"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:50.630208" elapsed="0.006443"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:50.639254" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:50.636932" elapsed="0.002368"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:50.636710" elapsed="0.002624"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:50.636693" elapsed="0.002666"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:50.639972" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:50.639539" 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-08-22T23:40:50.640305" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:50.640070" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:50.640886" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:50.640563" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:50.640401" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:50.640053" elapsed="0.000916"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:50.641484" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:50.641124" 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-08-22T23:40:50.641829" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:50.641585" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:50.642359" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:50.642066" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:50.641910" elapsed="0.000609"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:50.641564" 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-08-22T23:40:50.642714" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:50.643539" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:50.643233" 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-08-22T23:40:50.643740" 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-08-22T23:40:50.629247" elapsed="0.016906"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:50.646338" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:40:50.646226" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:50.646207" 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-08-22T23:40:50.646584" elapsed="0.000036"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:50.646671" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:40:50.649198" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:50.599057" elapsed="0.050171"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:50.649289" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:40:50.649440" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:50.593413" elapsed="0.056053"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:50.650136" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:50.649765" elapsed="0.000453">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:50.649536" elapsed="0.000756">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:50.649519" elapsed="0.000807">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:50.650541" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:50.650396" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:50.650379" elapsed="0.000269"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:50.590760" elapsed="0.059973">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:51.653805" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:51.652806" elapsed="0.001181"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:51.664525" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:51.664256" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:51.665014" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:51.664754" 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-08-22T23:40:51.687290" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:51.687618" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:51.687770" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:51.667311" elapsed="0.020496"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:51.665138" elapsed="0.022732"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:51.688128" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:51.687911" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:51.665115" elapsed="0.023139"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:51.694781" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:51.689725" elapsed="0.005171"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:51.689392" elapsed="0.005589"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:51.689365" elapsed="0.005674"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:51.699928" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:51.695706" elapsed="0.004269"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:51.695168" elapsed="0.004843"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:51.695130" elapsed="0.004906"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:51.700654" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:51.700217" 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-08-22T23:40:51.700992" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:51.700754" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:51.701538" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:51.701236" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:51.701075" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:51.700736" elapsed="0.000910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:51.702169" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:51.701802" 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-08-22T23:40:51.702524" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:51.702266" elapsed="0.000341"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:51.703114" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:51.702812" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:51.702638" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:51.702248" elapsed="0.000950"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:40:51.703349" elapsed="0.000369"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:51.704184" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:51.703882" 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-08-22T23:40:51.704364" 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-08-22T23:40:51.688789" elapsed="0.018222"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:51.707198" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:40:51.707085" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:51.707065" 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-08-22T23:40:51.707466" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:51.707538" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:40:51.709878" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:51.658605" elapsed="0.051302"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:51.710019" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:40:51.710175" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:51.654542" elapsed="0.055660"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:51.710911" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:51.710484" elapsed="0.000508">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:51.710274" elapsed="0.000793">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:51.710256" elapsed="0.000846">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:51.711319" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:51.711173" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:51.711157" elapsed="0.000244"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:51.651738" elapsed="0.059747">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:52.714555" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:52.713530" elapsed="0.001127"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:52.726344" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:52.726084" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:52.726836" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:52.726567" 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-08-22T23:40:52.747172" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:52.747458" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:52.747714" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:52.729028" elapsed="0.018746"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:52.726960" elapsed="0.020912"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:52.748275" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:52.747933" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:52.726936" elapsed="0.021536"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:52.757584" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:52.750842" elapsed="0.006820"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:52.750299" elapsed="0.007400"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:52.750258" elapsed="0.007467"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:52.760335" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:52.758006" elapsed="0.002376"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:52.757784" elapsed="0.002633"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:52.757766" elapsed="0.002676"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:52.761036" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:52.760638" 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-08-22T23:40:52.761433" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:52.761195" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:52.762003" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:52.761698" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:52.761515" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:52.761176" elapsed="0.000912"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:52.762626" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:52.762243" 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-08-22T23:40:52.763701" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:52.762725" elapsed="0.001037"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:52.764244" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:52.763945" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:52.763786" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:52.762707" elapsed="0.001621"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:40:52.764476" elapsed="0.000372"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:52.765303" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:52.765009" 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-08-22T23:40:52.765481" 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-08-22T23:40:52.749327" elapsed="0.018828"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:52.768335" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:40:52.768225" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:52.768207" 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-08-22T23:40:52.768604" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:52.768686" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:40:52.771028" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:52.720708" elapsed="0.050348"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:52.771117" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:40:52.771267" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:52.715156" elapsed="0.056138"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:52.771947" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:52.771569" elapsed="0.000456">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:52.771363" elapsed="0.000735">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:52.771347" elapsed="0.000785">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:52.772345" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:52.772202" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:52.772184" elapsed="0.000242"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:52.712453" elapsed="0.060054">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:53.775484" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:53.774509" elapsed="0.001047"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:53.786554" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:53.786290" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:53.787042" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:53.786795" 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-08-22T23:40:53.806248" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:53.806447" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:53.806618" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:53.789277" elapsed="0.017381"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:53.787163" elapsed="0.019556"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:53.806971" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:53.806758" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:53.787140" elapsed="0.019952"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:53.811939" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:53.808515" elapsed="0.003492"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:53.808206" elapsed="0.003852"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:53.808181" elapsed="0.003912"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:53.815813" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:53.812478" elapsed="0.003400"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:53.812171" elapsed="0.003758"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:53.812148" elapsed="0.003817"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:53.816778" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:53.816207" 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-08-22T23:40:53.817245" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:53.816918" elapsed="0.000408"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:53.818071" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:53.817645" elapsed="0.000464"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:53.817360" elapsed="0.000801"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:53.816893" elapsed="0.001299"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:53.818880" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:53.818410" 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-08-22T23:40:53.819210" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:53.818979" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:53.819762" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:53.819448" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:53.819292" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:53.818961" elapsed="0.000886"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:40:53.819995" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:53.820821" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:53.820504" 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-08-22T23:40:53.821058" 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-08-22T23:40:53.807614" elapsed="0.015896"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:53.823707" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:40:53.823583" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:53.823562" 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-08-22T23:40:53.823950" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:53.824023" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:40:53.826451" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:53.780151" elapsed="0.046329"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:53.826541" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:40:53.826717" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:53.776087" elapsed="0.050657"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:53.827385" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:53.827023" elapsed="0.000440">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:53.826814" elapsed="0.000722">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:53.826798" elapsed="0.000773">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:53.827808" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:53.827661" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:53.827644" elapsed="0.000246"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:53.773423" elapsed="0.054549">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:54.830489" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:54.829517" elapsed="0.001045"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:54.843126" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:54.842765" elapsed="0.000428"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:54.843765" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:54.843411" 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-08-22T23:40:54.864648" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:54.864912" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:54.865129" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:54.845943" elapsed="0.019245"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:54.843880" elapsed="0.021487"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:54.865809" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:54.865430" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:54.843860" elapsed="0.022148"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:54.873119" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:54.868388" elapsed="0.004801"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:54.867889" elapsed="0.005350"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:54.867846" elapsed="0.005430"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:54.877029" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:54.873695" elapsed="0.003400"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:54.873355" elapsed="0.003790"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:54.873332" elapsed="0.003848"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:54.877965" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:54.877408" 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-08-22T23:40:54.878571" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:54.878104" elapsed="0.000576"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:54.879387" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:54.878956" elapsed="0.000468"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:54.878715" elapsed="0.000761"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:54.878079" elapsed="0.001428"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:54.880263" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:54.879753" 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-08-22T23:40:54.880751" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:54.880400" elapsed="0.000432"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:54.881510" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:54.881096" elapsed="0.000450"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:54.880866" elapsed="0.000754"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:54.880375" elapsed="0.001276"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:40:54.881860" elapsed="0.000482"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:54.883019" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:54.882567" 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-08-22T23:40:54.883267" 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-08-22T23:40:54.866889" elapsed="0.019006"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:54.886070" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-08-22T23:40:54.885964" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:54.885946" 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-08-22T23:40:54.886301" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:54.886373" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:40:54.888712" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:54.836570" elapsed="0.052171"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:54.888801" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:40:54.888953" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:54.831152" elapsed="0.057828"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:54.889692" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:54.889273" elapsed="0.000492">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:54.889049" elapsed="0.000786">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:54.889033" elapsed="0.000837">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:54.890087" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:54.889940" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:54.889923" elapsed="0.000245"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:54.828642" elapsed="0.061607">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:55.893163" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:55.892194" elapsed="0.001037"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:55.906023" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:55.905663" elapsed="0.000428"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:55.906666" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:55.906302" 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-08-22T23:40:55.926930" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:55.927105" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:55.927206" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:55.909190" elapsed="0.018042"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:55.906870" 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-08-22T23:40:55.927458" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:55.927305" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:55.906806" elapsed="0.020742"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:55.935735" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:55.929763" elapsed="0.006025"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:55.929233" elapsed="0.006591"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:55.929191" elapsed="0.006659"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:55.938499" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:55.936131" elapsed="0.002416"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:55.935907" elapsed="0.002693"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:55.935890" elapsed="0.002737"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:55.939227" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:55.938807" 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-08-22T23:40:55.939566" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:55.939329" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:55.940134" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:55.939830" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:55.939668" elapsed="0.000590"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:55.939310" elapsed="0.000972"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:55.940832" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:55.940442" 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-08-22T23:40:55.941167" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:55.940932" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:55.941730" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:55.941411" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:55.941251" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:55.940914" 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-08-22T23:40:55.941971" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:55.942804" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:55.942489" 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-08-22T23:40:55.942986" elapsed="0.002407"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:40:55.928246" elapsed="0.017213"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:55.945664" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:40:55.945530" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:55.945512" 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-08-22T23:40:55.945912" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:55.945984" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:40:55.948367" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:55.899343" elapsed="0.049053"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:55.948458" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:40:55.948630" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:55.893761" elapsed="0.054897"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:55.949297" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:55.948937" elapsed="0.000436">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:55.948729" elapsed="0.000716">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:55.948712" elapsed="0.000768">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:55.949716" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:55.949551" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:55.949534" elapsed="0.000271"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:55.891161" elapsed="0.058728">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:56.952889" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:56.951891" elapsed="0.001069"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:56.965952" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:56.965558" elapsed="0.000463"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:56.966652" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:56.966274" elapsed="0.000443"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:40:56.987553" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:56.987891" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:56.988110" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:56.968889" elapsed="0.019278"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:56.966795" elapsed="0.021470"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:56.988699" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:56.988323" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:56.966772" elapsed="0.022128"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:56.996002" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:56.991338" elapsed="0.004732"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:56.990823" elapsed="0.005296"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:56.990779" elapsed="0.005375"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:56.999813" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:56.996553" elapsed="0.003323"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:56.996230" elapsed="0.003695"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:56.996207" elapsed="0.003751"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:57.000775" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:57.000192" 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-08-22T23:40:57.001260" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:57.000919" elapsed="0.000430"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:57.002100" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:57.001652" elapsed="0.000487"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:57.001383" elapsed="0.000807"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:57.000893" elapsed="0.001327"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:57.002937" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:57.002485" 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-08-22T23:40:57.003264" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:57.003033" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:57.003820" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:57.003502" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:57.003346" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:57.003015" 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-08-22T23:40:57.004052" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:57.004887" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:57.004566" 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-08-22T23:40:57.005066" elapsed="0.002343"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:40:56.989724" elapsed="0.017749"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:57.007731" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:40:57.007613" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:57.007578" 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-08-22T23:40:57.007980" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:57.008051" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:40:57.010391" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:56.959072" elapsed="0.051353"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:57.010486" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:40:57.010656" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:56.953637" elapsed="0.057045"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:57.011329" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:57.010968" elapsed="0.000442">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:57.010757" elapsed="0.000726">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:57.010740" elapsed="0.000777">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:57.011751" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:57.011604" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:57.011570" elapsed="0.000260"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:56.950806" elapsed="0.061110">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:58.014109" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:58.013445" elapsed="0.000716"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:58.024344" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:58.023960" elapsed="0.000457"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:58.025167" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:58.024699" 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-08-22T23:40:58.045555" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:58.045791" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:58.046044" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:58.027709" elapsed="0.018394"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:58.025343" elapsed="0.020861"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:58.046652" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:58.046266" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:58.025306" elapsed="0.021553"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:58.055485" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:58.049428" elapsed="0.006242"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:58.048920" elapsed="0.006855"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:58.048875" elapsed="0.006974"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:58.060873" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:58.056781" elapsed="0.004158"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:58.056015" elapsed="0.004973"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:58.055964" elapsed="0.005059"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:58.061863" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:58.061268" 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-08-22T23:40:58.062327" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:58.062005" elapsed="0.000404"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:58.063161" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:58.062712" elapsed="0.000486"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:58.062446" elapsed="0.000800"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:58.061979" elapsed="0.001295"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:58.063994" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:58.063494" elapsed="0.000535"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:58.064419" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:58.064118" elapsed="0.000373"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:58.065178" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:58.064797" elapsed="0.000414"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:58.064524" elapsed="0.000734"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:58.064095" 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-08-22T23:40:58.065485" elapsed="0.000506"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:58.066603" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:58.066203" 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-08-22T23:40:58.066897" 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-08-22T23:40:58.047702" elapsed="0.022797"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:58.070779" elapsed="0.000050"/>
</return>
<status status="PASS" start="2026-08-22T23:40:58.070623" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:58.070573" elapsed="0.000340"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:58.071116" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:58.071220" elapsed="0.000023"/>
</return>
<msg time="2026-08-22T23:40:58.074447" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:58.018393" elapsed="0.056094"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:58.074569" elapsed="0.000060"/>
</return>
<msg time="2026-08-22T23:40:58.074802" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:58.014485" elapsed="0.060355"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:58.075720" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:58.075224" elapsed="0.000603">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:58.074940" elapsed="0.001054">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:58.074916" elapsed="0.001129">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:58.076329" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:58.076135" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:58.076113" elapsed="0.000322"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:58.012699" elapsed="0.063849">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:59.078837" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:59.078190" elapsed="0.000695"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:59.089207" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:59.088843" elapsed="0.000432"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:59.089859" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:59.089487" elapsed="0.000437"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:40:59.111363" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:40:59.111573" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:40:59.111745" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:40:59.092330" elapsed="0.019451"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:59.090028" elapsed="0.021814"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:59.112093" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:59.111880" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:59.089997" elapsed="0.022217"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:59.117381" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:59.113678" elapsed="0.003774"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:59.113338" elapsed="0.004165"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:59.113313" elapsed="0.004227"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:40:59.121304" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:40:59.117957" elapsed="0.003413"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:59.117644" elapsed="0.003776"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:59.117619" elapsed="0.003837"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:59.122290" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:59.121720" 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-08-22T23:40:59.122819" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:59.122432" elapsed="0.000470"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:59.123615" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:59.123167" elapsed="0.000489"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:59.122944" elapsed="0.000765"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:59.122406" elapsed="0.001333"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:40:59.124470" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:59.123960" 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-08-22T23:40:59.125043" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:59.124632" elapsed="0.000496"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:40:59.125836" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:40:59.125386" elapsed="0.000488"/>
</kw>
<status status="PASS" start="2026-08-22T23:40:59.125163" elapsed="0.000764"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:59.124605" 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-08-22T23:40:59.126166" elapsed="0.000572"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:40:59.127214" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:40:59.126908" 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-08-22T23:40:59.127395" 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-08-22T23:40:59.112746" elapsed="0.017078"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:40:59.130003" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:40:59.129894" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:40:59.129876" 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-08-22T23:40:59.130243" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:40:59.130332" elapsed="0.000019"/>
</return>
<msg time="2026-08-22T23:40:59.132735" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:40:59.082708" elapsed="0.050060"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:40:59.132830" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:40:59.132982" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:40:59.079221" elapsed="0.053788"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:40:59.133665" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:40:59.133287" elapsed="0.000454">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:40:59.133081" elapsed="0.000731">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:40:59.133064" elapsed="0.000783">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:40:59.134065" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:40:59.133918" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:40:59.133901" elapsed="0.000245"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:40:59.077375" elapsed="0.056852">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:00.137080" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:00.136101" elapsed="0.001050"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:00.148364" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:00.148104" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:00.148828" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:00.148565" 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-08-22T23:41:00.170448" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:00.170674" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:00.170842" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:00.151175" elapsed="0.019724"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:00.149022" elapsed="0.021974"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:00.171530" elapsed="0.000122"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:00.171055" elapsed="0.000704"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:00.148997" elapsed="0.022813"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:00.179658" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:00.174107" elapsed="0.005666"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:00.173612" elapsed="0.006203"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:00.173541" elapsed="0.006300"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:00.182504" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:00.180187" elapsed="0.002363"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:00.179896" elapsed="0.002704"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:00.179880" elapsed="0.002745"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:00.183209" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:00.182798" 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-08-22T23:41:00.183539" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:00.183307" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:00.184096" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:00.183798" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:00.183638" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:00.183290" elapsed="0.000890"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:00.184720" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:00.184332" 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-08-22T23:41:00.185048" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:00.184820" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:00.185610" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:00.185283" elapsed="0.000356"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:00.185129" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:00.184802" 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-08-22T23:41:00.185846" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:00.186671" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:00.186356" 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-08-22T23:41:00.186848" 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-08-22T23:41:00.172634" elapsed="0.016614"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:00.189424" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:41:00.189317" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:00.189298" 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-08-22T23:41:00.189678" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:00.189804" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:41:00.192139" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:00.141921" elapsed="0.050248"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:00.192230" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:41:00.192383" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:00.137671" elapsed="0.054739"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:00.193213" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:00.192709" elapsed="0.000579">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:00.192481" elapsed="0.000879">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:00.192464" elapsed="0.000931">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:00.193629" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:00.193465" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:00.193448" elapsed="0.000264"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:00.135054" elapsed="0.058740">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:01.196794" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:01.195807" elapsed="0.001056"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:01.209186" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:01.208925" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:01.209649" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:01.209384" 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-08-22T23:41:01.230654" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:01.230964" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:01.231190" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:01.211852" elapsed="0.019397"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:01.209772" elapsed="0.021575"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:01.231846" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:01.231407" elapsed="0.000594"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:01.209748" elapsed="0.022301"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:01.239881" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:01.234347" elapsed="0.005593"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:01.233856" elapsed="0.006121"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:01.233815" elapsed="0.006186"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:01.242658" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:01.240332" elapsed="0.002373"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:01.240111" elapsed="0.002629"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:01.240092" elapsed="0.002673"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:01.243342" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:01.242945" 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-08-22T23:41:01.243733" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:01.243439" elapsed="0.000363"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:01.244317" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:01.244014" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:01.243832" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:01.243421" elapsed="0.000980"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:01.244937" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:01.244554" 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-08-22T23:41:01.245262" elapsed="0.000089"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:01.245033" elapsed="0.000356"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:01.245893" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:01.245572" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:01.245413" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:01.245016" 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-08-22T23:41:01.246127" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:01.246955" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:01.246654" 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-08-22T23:41:01.247132" 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-08-22T23:41:01.232866" elapsed="0.016804"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:01.249849" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:41:01.249740" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:01.249722" 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-08-22T23:41:01.250089" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:01.250161" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:41:01.252494" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:01.203266" elapsed="0.049257"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:01.252598" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:41:01.252752" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:01.197357" elapsed="0.055421"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:01.253424" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:01.253060" elapsed="0.000442">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:01.252850" elapsed="0.000725">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:01.252833" elapsed="0.000795">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:01.253880" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:01.253733" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:01.253715" elapsed="0.000245"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:01.194718" elapsed="0.059324">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:02.256809" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:02.255848" elapsed="0.001032"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:02.268156" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:02.267893" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:02.268620" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:02.268356" 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-08-22T23:41:02.289953" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:02.290233" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:02.290451" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:02.270798" elapsed="0.019713"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:02.268743" elapsed="0.021899"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:02.291039" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:02.290702" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:02.268721" elapsed="0.022506"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:02.300130" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:02.293518" elapsed="0.006682"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:02.293031" elapsed="0.007220"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:02.292990" elapsed="0.007297"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:02.304033" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:02.300698" elapsed="0.003383"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:02.300366" elapsed="0.003751"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:02.300342" elapsed="0.003799"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:02.304734" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:02.304313" 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-08-22T23:41:02.305069" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:02.304834" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:02.305656" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:02.305314" elapsed="0.000371"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:02.305154" elapsed="0.000568"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:02.304817" elapsed="0.000927"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:02.306265" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:02.305901" 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-08-22T23:41:02.306612" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:02.306364" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:02.307159" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:02.306854" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:02.306696" elapsed="0.000592"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:02.306346" 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-08-22T23:41:02.307477" elapsed="0.000377"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:02.308318" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:02.308017" 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-08-22T23:41:02.308496" 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-08-22T23:41:02.292062" elapsed="0.019060"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:02.311299" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:41:02.311193" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:02.311175" 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-08-22T23:41:02.311572" elapsed="0.000038"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:02.311662" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:41:02.314030" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:02.261834" elapsed="0.052224"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:02.314119" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:41:02.314270" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:02.257365" elapsed="0.056931"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:02.314951" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:02.314573" elapsed="0.000455">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:02.314367" elapsed="0.000733">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:02.314350" elapsed="0.000784">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:02.315348" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:02.315204" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:02.315188" elapsed="0.000240"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:02.254818" elapsed="0.060718">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:03.317830" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:03.317180" elapsed="0.000706"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:03.390359" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:03.389927" elapsed="0.000501"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:03.390874" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:03.390619" 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-08-22T23:41:03.412361" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:03.412653" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:03.412787" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:03.393215" elapsed="0.019606"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:03.391046" elapsed="0.021832"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:03.413117" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:03.412917" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:03.391015" elapsed="0.022197"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:03.416921" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:03.414419" elapsed="0.002553"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:03.414190" elapsed="0.002818"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:03.414169" elapsed="0.002864"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:03.419851" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:03.417312" elapsed="0.002591"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:03.417090" elapsed="0.002849"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:03.417073" elapsed="0.002891"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:03.420571" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:03.420143" 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-08-22T23:41:03.420928" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:03.420689" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:03.421479" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:03.421172" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:03.421010" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:03.420671" elapsed="0.000895"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:03.422112" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:03.421742" 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-08-22T23:41:03.422442" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:03.422211" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:03.423056" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:03.422698" elapsed="0.000416"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:03.422523" elapsed="0.000636"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:03.422192" 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-08-22T23:41:03.423356" elapsed="0.000385"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:03.424221" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:03.423906" 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-08-22T23:41:03.424401" elapsed="0.002335"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:41:03.413653" elapsed="0.013151"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:03.426990" elapsed="0.000076"/>
</return>
<status status="PASS" start="2026-08-22T23:41:03.426876" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:03.426857" 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-08-22T23:41:03.427283" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:03.427354" elapsed="0.000014"/>
</return>
<msg time="2026-08-22T23:41:03.429851" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:03.321080" elapsed="0.108801"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:03.429983" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:41:03.430144" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:03.318232" elapsed="0.111939"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:03.430877" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:03.430458" elapsed="0.000503">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:03.430245" elapsed="0.000810">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:03.430228" elapsed="0.000871">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:03.431326" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:03.431175" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:03.431157" elapsed="0.000266"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:03.316320" elapsed="0.115203">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:04.434699" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:04.433655" elapsed="0.001120"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:04.446827" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:04.446536" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:04.447283" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:04.447033" 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-08-22T23:41:04.476437" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:04.476625" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:04.476730" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:04.449518" elapsed="0.027238"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:04.447413" elapsed="0.029388"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:04.476990" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:04.476832" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:04.447387" elapsed="0.029693"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:04.480849" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:04.478157" elapsed="0.002743"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:04.477907" elapsed="0.003030"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:04.477889" elapsed="0.003074"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:04.483615" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:04.481253" elapsed="0.002410"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:04.481023" elapsed="0.002676"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:04.481006" elapsed="0.002718"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:04.484326" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:04.483908" 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-08-22T23:41:04.484814" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:04.484549" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:04.485366" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:04.485061" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:04.484900" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:04.484527" elapsed="0.000926"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:04.485998" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:04.485630" 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-08-22T23:41:04.486359" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:04.486125" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:04.486914" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:04.486615" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:04.486441" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:04.486106" 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-08-22T23:41:04.487152" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:04.487988" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:04.487682" 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-08-22T23:41:04.488168" elapsed="0.002346"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:41:04.477460" elapsed="0.013133"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:04.490779" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:41:04.490667" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:04.490648" 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-08-22T23:41:04.491024" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:04.491096" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:41:04.493428" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:04.441018" elapsed="0.052439"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:04.493518" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:41:04.493686" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:04.435279" elapsed="0.058433"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:04.494398" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:04.493992" elapsed="0.000514">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:04.493784" elapsed="0.000826">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:04.493767" elapsed="0.000880">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:04.494868" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:04.494721" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:04.494702" elapsed="0.000245"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:04.432509" elapsed="0.062521">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:05.498238" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:05.497211" elapsed="0.001100"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:05.509702" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:05.509421" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:05.510155" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:05.509904" 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-08-22T23:41:05.530791" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:05.531085" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:05.531305" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:05.512361" elapsed="0.019003"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:05.510279" elapsed="0.021184"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:05.531905" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:05.531525" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:05.510255" elapsed="0.021850"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:05.540019" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:05.534445" elapsed="0.005683"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:05.533948" elapsed="0.006262"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:05.533907" elapsed="0.006359"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:05.543254" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:05.540948" elapsed="0.002352"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:05.540392" elapsed="0.002943"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:05.540355" elapsed="0.003005"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:05.543968" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:05.543537" 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-08-22T23:41:05.544301" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:05.544066" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:05.544877" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:05.544542" elapsed="0.000363"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:05.544382" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:05.544048" elapsed="0.000914"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:05.545479" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:05.545118" 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-08-22T23:41:05.545825" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:05.545575" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:05.546359" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:05.546067" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:05.545906" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:05.545558" 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-08-22T23:41:05.546617" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:05.547433" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:05.547129" 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-08-22T23:41:05.547694" elapsed="0.002340"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:41:05.532963" elapsed="0.017138"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:05.550283" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:41:05.550172" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:05.550154" 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-08-22T23:41:05.550527" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:05.550615" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:41:05.552952" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:05.504465" elapsed="0.048517"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:05.553043" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:41:05.553194" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:05.498840" elapsed="0.054380"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:05.553881" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:05.553498" elapsed="0.000463">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:05.553290" elapsed="0.000744">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:05.553273" elapsed="0.000794">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:05.554281" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:05.554136" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:05.554119" elapsed="0.000242"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:05.496053" elapsed="0.058390">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:06.557738" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:06.556536" elapsed="0.001278"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:06.568880" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:06.568613" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:06.569332" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:06.569083" 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-08-22T23:41:06.590629" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:06.590844" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:06.591026" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:06.571560" elapsed="0.019524"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:06.569456" elapsed="0.022041"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:06.591979" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:06.591566" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:06.569432" elapsed="0.022744"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:06.600127" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:06.594528" elapsed="0.005652"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:06.594025" elapsed="0.006191"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:06.593981" elapsed="0.006260"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:06.602870" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:06.600519" elapsed="0.002398"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:06.600298" elapsed="0.002654"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:06.600281" elapsed="0.002696"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:06.603639" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:06.603178" 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-08-22T23:41:06.603994" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:06.603741" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:06.604606" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:06.604253" elapsed="0.000383"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:06.604092" elapsed="0.000582"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:06.603722" elapsed="0.000974"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:06.605222" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:06.604854" 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-08-22T23:41:06.605549" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:06.605319" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:06.606103" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:06.605808" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:06.605650" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:06.605301" 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-08-22T23:41:06.606339" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:06.607246" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:06.606870" 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-08-22T23:41:06.607432" 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-08-22T23:41:06.593011" elapsed="0.017022"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:06.610216" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:41:06.610105" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:06.610086" 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-08-22T23:41:06.610470" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:06.610541" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:41:06.612907" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:06.562750" elapsed="0.050186"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:06.612997" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:41:06.613150" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:06.558307" elapsed="0.054871"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:06.613904" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:06.613465" elapsed="0.000520">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:06.613248" elapsed="0.000811">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:06.613231" elapsed="0.000862">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:06.614308" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:06.614161" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:06.614145" elapsed="0.000242"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:06.555413" elapsed="0.059056">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:07.617836" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:07.616563" elapsed="0.001361"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:07.630824" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:07.630348" elapsed="0.000547"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:07.631351" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:07.631087" 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-08-22T23:41:07.655165" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:07.655495" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:07.655779" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:07.634197" elapsed="0.021647"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:07.631495" elapsed="0.024462"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:07.656425" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:07.656032" elapsed="0.000582"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:07.631462" elapsed="0.025209"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:07.665866" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:07.659309" elapsed="0.006683"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:07.658739" elapsed="0.007298"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:07.658692" elapsed="0.007376"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:07.668699" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:07.666355" elapsed="0.002391"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:07.666130" elapsed="0.002653"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:07.666113" elapsed="0.002695"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:07.669442" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:07.668991" 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-08-22T23:41:07.669801" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:07.669543" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:07.670355" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:07.670045" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:07.669884" elapsed="0.000601"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:07.669525" elapsed="0.000983"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:07.671060" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:07.670684" 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-08-22T23:41:07.671390" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:07.671157" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:07.671949" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:07.671646" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:07.671472" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:07.671139" 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-08-22T23:41:07.672186" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:07.673027" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:07.672720" 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-08-22T23:41:07.673208" 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-08-22T23:41:07.657645" elapsed="0.018001"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:07.675833" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:41:07.675718" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:07.675700" 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-08-22T23:41:07.676078" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:07.676149" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:41:07.678472" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:07.622747" elapsed="0.055754"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:07.678564" elapsed="0.000042"/>
</return>
<msg time="2026-08-22T23:41:07.678734" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:07.618310" elapsed="0.060450"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:07.679413" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:07.679042" elapsed="0.000453">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:07.678833" elapsed="0.000735">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:07.678816" elapsed="0.000804">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:07.679841" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:07.679693" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:07.679676" elapsed="0.000246"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:07.615366" elapsed="0.064641">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:08.682185" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:08.681537" elapsed="0.000695"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:08.692563" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:08.692232" elapsed="0.000413"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:08.693163" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:08.692846" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:41:08.721918" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:08.722184" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:08.722384" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:08.696171" elapsed="0.026249"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:08.693323" elapsed="0.029176"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:08.722880" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:08.722551" elapsed="0.000415"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:08.693290" elapsed="0.029705"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:08.728016" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:08.724553" elapsed="0.003527"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:08.724222" elapsed="0.003902"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:08.724190" elapsed="0.003967"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:08.731684" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:08.728514" elapsed="0.003231"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:08.728228" elapsed="0.003562"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:08.728207" elapsed="0.003615"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:08.732667" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:08.732061" 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-08-22T23:41:08.733103" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:08.732794" elapsed="0.000382"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:08.733886" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:08.733441" elapsed="0.000479"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:08.733209" elapsed="0.000757"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:08.732771" elapsed="0.001223"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:08.734688" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:08.734204" 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-08-22T23:41:08.735109" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:08.734811" elapsed="0.000371"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:08.735887" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:08.735489" elapsed="0.000432"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:08.735213" elapsed="0.000753"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:08.734789" 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-08-22T23:41:08.736198" elapsed="0.000468"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:08.737262" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:08.736878" 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-08-22T23:41:08.737496" elapsed="0.003427"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:41:08.723607" elapsed="0.017406"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:08.741340" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-08-22T23:41:08.741193" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:08.741168" 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-08-22T23:41:08.741688" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:08.741783" elapsed="0.000020"/>
</return>
<msg time="2026-08-22T23:41:08.745028" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:08.686092" elapsed="0.058975"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:08.745148" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:41:08.745347" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:08.682675" elapsed="0.062707"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:08.746253" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:08.745775" elapsed="0.000581">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:08.745476" elapsed="0.000973">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:08.745453" elapsed="0.001039">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:08.746768" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:08.746593" elapsed="0.000239"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:08.746557" elapsed="0.000302"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:08.680770" elapsed="0.066186">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:09.750831" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:09.749632" elapsed="0.001284"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:09.763559" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:09.763283" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:09.764032" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:09.763783" 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-08-22T23:41:09.789776" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:09.790017" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:09.790130" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:09.766299" elapsed="0.023858"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:09.764164" elapsed="0.026039"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:09.790399" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:09.790233" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:09.764136" elapsed="0.026355"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:09.794469" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:09.791786" elapsed="0.002753"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:09.791513" elapsed="0.003098"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:09.791494" elapsed="0.003154"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:09.798335" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:09.795077" elapsed="0.003325"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:09.794734" elapsed="0.003717"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:09.794705" elapsed="0.003780"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:09.799411" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:09.798791" 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-08-22T23:41:09.799912" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:09.799549" elapsed="0.000461"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:09.800831" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:09.800316" elapsed="0.000553"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:09.800046" elapsed="0.000876"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:09.799525" elapsed="0.001436"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:09.802141" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:09.801253" elapsed="0.000923"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:09.802482" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:09.802248" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:09.803058" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:09.802751" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:09.802565" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:09.802230" 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-08-22T23:41:09.803300" elapsed="0.000380"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:09.804176" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:09.803844" 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-08-22T23:41:09.804358" elapsed="0.002598"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:41:09.790921" elapsed="0.016105"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:09.807216" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-08-22T23:41:09.807098" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:09.807078" 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-08-22T23:41:09.807475" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:09.807547" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:41:09.809979" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:09.758003" elapsed="0.052006"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:09.810072" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:41:09.810224" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:09.751444" elapsed="0.058806"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:09.810972" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:09.810531" elapsed="0.000545">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:09.810320" elapsed="0.000880">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:09.810303" elapsed="0.000934">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:09.811481" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:09.811323" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:09.811293" elapsed="0.000272"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:09.748163" elapsed="0.063509">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:10.815478" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:10.814306" elapsed="0.001258"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:10.827447" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:10.827148" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:10.827928" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:10.827673" 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-08-22T23:41:10.856630" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:10.857028" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:10.857271" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:10.830204" elapsed="0.027127"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:10.828077" elapsed="0.029361"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:10.857953" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:10.857514" elapsed="0.000611"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:10.828040" elapsed="0.030138"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:10.866474" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:10.860560" elapsed="0.006052"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:10.860061" elapsed="0.006684"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:10.860017" elapsed="0.006789"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:10.869925" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:10.867427" elapsed="0.002543"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:10.866933" elapsed="0.003071"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:10.866895" elapsed="0.003134"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:10.870789" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:10.870240" 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-08-22T23:41:10.871132" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:10.870889" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:10.871700" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:10.871378" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:10.871216" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:10.870871" elapsed="0.000917"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:10.872311" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:10.871946" 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-08-22T23:41:10.872766" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:10.872407" elapsed="0.000418"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:10.873307" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:10.873009" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:10.872849" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:10.872389" 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-08-22T23:41:10.873612" elapsed="0.000427"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:10.874641" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:10.874238" 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-08-22T23:41:10.874853" elapsed="0.002330"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:41:10.859064" elapsed="0.018189"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:10.877445" elapsed="0.000053"/>
</return>
<status status="PASS" start="2026-08-22T23:41:10.877326" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:10.877307" elapsed="0.000254"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:10.877727" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:10.877799" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:41:10.880130" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:10.822034" elapsed="0.058127"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:10.880222" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:41:10.880372" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:10.816135" elapsed="0.064263"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:10.881095" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:10.880692" elapsed="0.000514">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:10.880469" elapsed="0.000823">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:10.880452" elapsed="0.000875">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:10.881550" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:10.881399" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:10.881382" elapsed="0.000266"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:10.812915" elapsed="0.068824">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:11.884805" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:11.883742" elapsed="0.001137"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:11.897131" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:11.896775" elapsed="0.000406"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:11.897659" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:11.897342" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:41:11.920637" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:11.920836" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:11.920976" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:11.899942" elapsed="0.021071"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:11.897858" elapsed="0.023219"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:11.921484" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:11.921136" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:11.897832" elapsed="0.023887"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:11.929339" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:11.924031" elapsed="0.005359"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:11.923505" elapsed="0.005922"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:11.923462" elapsed="0.005991"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:11.932204" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:11.929747" elapsed="0.002506"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:11.929510" elapsed="0.002779"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:11.929493" elapsed="0.002821"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:11.932903" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:11.932492" 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-08-22T23:41:11.933245" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:11.933004" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:11.933809" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:11.933489" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:11.933328" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:11.932985" elapsed="0.000910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:11.934415" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:11.934051" 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-08-22T23:41:11.934766" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:11.934511" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:11.935335" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:11.935006" elapsed="0.000356"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:11.934849" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:11.934493" 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-08-22T23:41:11.935571" elapsed="0.000370"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:11.936424" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:11.936100" 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-08-22T23:41:11.936617" elapsed="0.002283"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:41:11.922524" elapsed="0.016447"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:11.939154" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:41:11.939040" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:11.939022" 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-08-22T23:41:11.939395" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:11.939502" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:41:11.941817" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:11.890263" elapsed="0.051583"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:11.941907" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:41:11.942059" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:11.885378" elapsed="0.056707"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:11.942739" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:11.942361" elapsed="0.000462">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:11.942156" elapsed="0.000743">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:11.942139" elapsed="0.000795">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:11.943148" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:11.943003" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:11.942987" elapsed="0.000242"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:11.882648" elapsed="0.060666">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:12.946466" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:12.945357" elapsed="0.001184"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:12.960329" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:12.960025" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:12.960812" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:12.960547" 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-08-22T23:41:12.985349" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:12.985537" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:12.985673" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:12.963042" elapsed="0.022658"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:12.960938" elapsed="0.024806"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:12.985929" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:12.985774" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:12.960913" elapsed="0.025103"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:12.989439" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:12.987034" elapsed="0.002466"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:12.986813" elapsed="0.002724"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:12.986794" elapsed="0.002768"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:12.992233" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:12.989923" elapsed="0.002357"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:12.989703" elapsed="0.002612"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:12.989685" elapsed="0.002654"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:12.992939" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:12.992513" 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-08-22T23:41:12.993275" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:12.993039" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:12.993863" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:12.993543" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:12.993357" elapsed="0.000569"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:12.993021" elapsed="0.000927"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:12.994463" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:12.994103" 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-08-22T23:41:12.994804" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:12.994559" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:12.995333" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:12.995040" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:12.994884" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:12.994542" 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-08-22T23:41:12.995564" elapsed="0.000365"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:12.996387" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:12.996091" 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-08-22T23:41:12.996567" elapsed="0.002349"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:41:12.986374" elapsed="0.012607"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:12.999173" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:41:12.999053" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:12.999034" 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-08-22T23:41:12.999418" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:12.999489" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:41:13.001988" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:12.955353" elapsed="0.046664"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:13.002078" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:41:13.002230" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:12.947143" elapsed="0.055113"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:13.002927" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:13.002540" elapsed="0.000465">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:13.002328" elapsed="0.000750">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:13.002311" elapsed="0.000802">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:13.003380" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:13.003233" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:13.003216" elapsed="0.000244"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:12.944264" elapsed="0.059279">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:14.006815" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:14.005700" elapsed="0.001193"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:14.019360" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:14.018996" elapsed="0.000420"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:14.019851" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:14.019591" 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-08-22T23:41:14.051983" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:14.052249" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:14.052447" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:14.022147" elapsed="0.030342"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:14.019983" elapsed="0.032592"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:14.052967" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:14.052653" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:14.019956" elapsed="0.033150"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:14.059197" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:14.054905" elapsed="0.004371"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:14.054488" elapsed="0.004844"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:14.054456" elapsed="0.004916"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:14.063612" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:14.059822" elapsed="0.003862"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:14.059461" elapsed="0.004276"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:14.059435" elapsed="0.004339"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:14.064669" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:14.064043" 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-08-22T23:41:14.065173" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:14.064816" elapsed="0.000438"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:14.065960" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:14.065512" elapsed="0.000486"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:14.065289" elapsed="0.000760"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:14.064789" elapsed="0.001290"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:14.066870" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:14.066304" 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-08-22T23:41:14.067276" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:14.067008" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:14.067830" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:14.067514" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:14.067357" elapsed="0.000607"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:14.066982" 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-08-22T23:41:14.068141" elapsed="0.000359"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:14.068986" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:14.068682" 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-08-22T23:41:14.069177" elapsed="0.002342"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:41:14.053761" elapsed="0.017840"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:14.071788" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:41:14.071675" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:14.071656" 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-08-22T23:41:14.072033" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:14.072104" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:41:14.074440" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:14.012648" elapsed="0.061821"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:14.074530" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:41:14.074700" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:14.007438" elapsed="0.067288"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:14.075402" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:14.075035" elapsed="0.000447">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:14.074823" elapsed="0.000730">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:14.074804" elapsed="0.000800">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:14.075823" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:14.075676" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:14.075660" elapsed="0.000242"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:14.004490" elapsed="0.071495">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:15.079546" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:15.078445" elapsed="0.001213"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:15.092476" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:15.092197" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:15.092966" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:15.092699" 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-08-22T23:41:15.118740" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:15.119197" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:15.119458" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:15.095233" elapsed="0.024299"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:15.093093" elapsed="0.026595"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:15.120254" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:15.119758" elapsed="0.000651"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:15.093067" elapsed="0.027391"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:15.128486" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:15.122935" elapsed="0.005601"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:15.122382" elapsed="0.006190"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:15.122339" elapsed="0.006277"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:15.131207" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:15.128897" elapsed="0.002356"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:15.128674" elapsed="0.002615"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:15.128657" elapsed="0.002657"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:15.131983" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:15.131506" 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-08-22T23:41:15.132321" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:15.132084" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:15.132892" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:15.132570" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:15.132403" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:15.132066" elapsed="0.000912"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:15.133503" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:15.133135" 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-08-22T23:41:15.133858" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:15.133622" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:15.134392" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:15.134096" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:15.133939" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:15.133602" 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-08-22T23:41:15.134644" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:15.135463" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:15.135159" 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-08-22T23:41:15.135658" 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-08-22T23:41:15.121353" elapsed="0.016751"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:15.138288" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:41:15.138176" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:15.138157" 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-08-22T23:41:15.138537" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:15.138643" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:41:15.141042" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:15.085729" elapsed="0.055344"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:15.141223" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:41:15.141382" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:15.080657" elapsed="0.060754"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:15.142125" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:15.141738" elapsed="0.000473">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:15.141503" elapsed="0.000784">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:15.141481" elapsed="0.000840">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:15.142546" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:15.142398" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:15.142380" elapsed="0.000263"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:15.077263" elapsed="0.065467">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:16.145882" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:16.144819" elapsed="0.001137"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:16.158057" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:16.157786" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:16.158512" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:16.158262" 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-08-22T23:41:16.181383" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:16.181733" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:16.181967" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:16.160777" elapsed="0.021249"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:16.158656" elapsed="0.023470"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:16.182533" elapsed="0.000084"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:16.182188" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:16.158630" elapsed="0.024137"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:16.188773" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:16.185180" elapsed="0.003664"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:16.184559" elapsed="0.004335"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:16.184518" elapsed="0.004412"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:16.192917" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:16.189563" elapsed="0.003449"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:16.189218" elapsed="0.003846"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:16.189185" elapsed="0.003914"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:16.193944" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:16.193354" 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-08-22T23:41:16.194517" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:16.194179" elapsed="0.000444"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:16.195322" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:16.194890" elapsed="0.000470"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:16.194659" elapsed="0.000754"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:16.194152" elapsed="0.001292"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:16.196229" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:16.195688" 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-08-22T23:41:16.196757" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:16.196368" elapsed="0.000476"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:16.197551" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:16.197133" elapsed="0.000460"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:16.196880" elapsed="0.000752"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:16.196342" 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-08-22T23:41:16.197809" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:16.198653" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:16.198331" 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-08-22T23:41:16.198834" 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-08-22T23:41:16.183565" elapsed="0.017858"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:16.201624" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:41:16.201495" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:16.201476" 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-08-22T23:41:16.201873" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:16.201947" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:41:16.204322" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:16.151607" elapsed="0.052745"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:16.204413" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:41:16.204565" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:16.146463" elapsed="0.058144"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:16.205345" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:16.204907" elapsed="0.000522">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:16.204680" elapsed="0.000824">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:16.204663" elapsed="0.000876">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:16.205778" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:16.205630" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:16.205611" elapsed="0.000249"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:16.143685" elapsed="0.062258">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:17.209293" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:17.208279" elapsed="0.001088"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:17.221429" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:17.221067" elapsed="0.000428"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:17.222122" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:17.221765" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:41:17.245042" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:17.245338" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:17.245559" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:17.224368" elapsed="0.021285"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:17.222289" elapsed="0.023466"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:17.246160" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:17.245817" elapsed="0.000621"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:17.222258" elapsed="0.024248"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:17.254752" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:17.248854" elapsed="0.006010"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:17.248329" elapsed="0.006617"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:17.248288" elapsed="0.006714"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:17.258837" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:17.255484" elapsed="0.003419"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:17.255127" elapsed="0.003826"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:17.255089" elapsed="0.003899"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:17.259800" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:17.259224" 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-08-22T23:41:17.260273" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:17.259941" elapsed="0.000413"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:17.261062" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:17.260634" elapsed="0.000466"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:17.260388" elapsed="0.000763"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:17.259914" elapsed="0.001267"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:17.261938" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:17.261402" 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-08-22T23:41:17.262401" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:17.262076" elapsed="0.000404"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:17.263205" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:17.262787" elapsed="0.000454"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:17.262513" elapsed="0.000772"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:17.262050" 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-08-22T23:41:17.263465" elapsed="0.000365"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:17.264291" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:17.263993" 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-08-22T23:41:17.264532" 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-08-22T23:41:17.247353" elapsed="0.019592"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:17.267146" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:41:17.267015" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:17.266996" 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-08-22T23:41:17.267390" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:17.267461" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:41:17.269803" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:17.215042" elapsed="0.054790"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:17.269893" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:41:17.270044" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:17.209927" elapsed="0.060144"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:17.270744" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:17.270349" elapsed="0.000512">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:17.270142" elapsed="0.000811">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:17.270125" elapsed="0.000865">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:17.271216" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:17.271062" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:17.271045" elapsed="0.000257"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:17.207165" elapsed="0.064220">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:18.274412" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:18.273378" elapsed="0.001109"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:18.285359" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:18.285095" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:18.285827" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:18.285562" 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-08-22T23:41:18.313281" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:18.313575" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:18.313843" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:18.288033" elapsed="0.025868"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:18.285950" elapsed="0.028151"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:18.314514" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:18.314165" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:18.285926" elapsed="0.028824"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:18.322466" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:18.317216" elapsed="0.005300"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:18.316665" elapsed="0.005886"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:18.316620" elapsed="0.005960"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:18.325175" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:18.322874" elapsed="0.002348"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:18.322652" elapsed="0.002606"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:18.322635" elapsed="0.002647"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:18.325869" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:18.325457" 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-08-22T23:41:18.326204" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:18.325968" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:18.326763" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:18.326444" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:18.326285" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:18.325950" elapsed="0.000897"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:18.327365" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:18.327002" 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-08-22T23:41:18.327708" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:18.327461" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:18.328240" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:18.327946" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:18.327790" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:18.327443" 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-08-22T23:41:18.328472" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:18.329347" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:18.329000" 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-08-22T23:41:18.329533" 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-08-22T23:41:18.315646" elapsed="0.016307"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:18.332134" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:41:18.332025" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:18.332006" 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-08-22T23:41:18.332375" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:18.332447" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:41:18.334810" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:18.280544" elapsed="0.054295"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:18.334899" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:41:18.335050" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:18.275018" elapsed="0.060059"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:18.335776" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:18.335355" elapsed="0.000498">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:18.335148" elapsed="0.000778">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:18.335131" elapsed="0.000830">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:18.336178" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:18.336031" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:18.336014" elapsed="0.000245"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:18.272284" elapsed="0.064057">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:19.339786" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:19.338732" elapsed="0.001130"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:19.352781" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:19.352389" elapsed="0.000460"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:19.353375" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:19.353062" elapsed="0.000358"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:41:19.376303" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:19.376680" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:19.376911" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:19.355592" elapsed="0.021378"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:19.353505" elapsed="0.023562"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:19.377474" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:19.377128" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:19.353476" elapsed="0.024231"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:19.383957" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:19.380033" elapsed="0.003994"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:19.379505" elapsed="0.004571"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:19.379464" elapsed="0.004646"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:19.387764" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:19.384492" elapsed="0.003337"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:19.384186" elapsed="0.003692"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:19.384164" elapsed="0.003747"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:19.388891" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:19.388153" elapsed="0.000778"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:19.389368" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:19.389033" elapsed="0.000403"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:19.389945" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:19.389643" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:19.389459" elapsed="0.000685"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:19.389008" elapsed="0.001162"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:19.390718" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:19.390328" 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-08-22T23:41:19.391044" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:19.390815" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:19.391580" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:19.391281" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:19.391125" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:19.390797" 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-08-22T23:41:19.391833" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:19.392676" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:19.392347" 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-08-22T23:41:19.392856" 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-08-22T23:41:19.378507" elapsed="0.016930"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:19.395640" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-08-22T23:41:19.395506" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:19.395489" elapsed="0.000254"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:19.395891" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:19.395961" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:41:19.398325" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:19.346152" elapsed="0.052202"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:19.398414" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:41:19.398565" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:19.340405" elapsed="0.058202"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:19.399269" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:19.398899" elapsed="0.000456">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:19.398681" elapsed="0.000749">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:19.398664" elapsed="0.000800">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:19.399697" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:19.399533" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:19.399516" elapsed="0.000263"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:19.337510" elapsed="0.062352">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:20.403308" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:20.402260" elapsed="0.001123"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:20.415373" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:20.415102" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:20.415845" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:20.415581" 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-08-22T23:41:20.436522" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:20.436882" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:20.437108" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:20.418070" elapsed="0.019097"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:20.415975" elapsed="0.021291"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:20.437708" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:20.437329" elapsed="0.000640"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:20.415949" elapsed="0.022100"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:20.446362" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:20.440385" elapsed="0.006029"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:20.439896" elapsed="0.006555"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:20.439854" elapsed="0.006623"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:20.449091" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:20.446787" elapsed="0.002350"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:20.446536" elapsed="0.002637"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:20.446519" elapsed="0.002678"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:20.449818" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:20.449379" 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-08-22T23:41:20.450168" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:20.449917" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:20.450735" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:20.450413" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:20.450251" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:20.449899" elapsed="0.000922"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:20.451350" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:20.450980" 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-08-22T23:41:20.451694" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:20.451446" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:20.452228" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:20.451933" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:20.451777" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:20.451428" 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-08-22T23:41:20.452465" elapsed="0.000372"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:20.453309" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:20.452998" 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-08-22T23:41:20.453490" elapsed="0.002434"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:41:20.438913" elapsed="0.017077"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:20.456233" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-08-22T23:41:20.456119" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:20.456100" 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-08-22T23:41:20.456480" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:20.456550" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:41:20.458957" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:20.408503" elapsed="0.050483"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:20.459047" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:41:20.459197" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:20.404116" elapsed="0.055107"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:20.459894" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:20.459499" elapsed="0.000481">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:20.459293" elapsed="0.000764">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:20.459276" elapsed="0.000815">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:20.460307" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:20.460160" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:20.460143" elapsed="0.000244"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:20.401043" elapsed="0.059427">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:21.463951" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:21.462925" elapsed="0.001117"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:21.476994" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:21.476722" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:21.477447" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:21.477197" 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-08-22T23:41:21.499766" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:21.500095" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:21.500327" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:21.479773" elapsed="0.020615"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:21.477679" elapsed="0.022810"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:21.500984" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:21.500553" elapsed="0.000586"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:21.477653" elapsed="0.023535"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:21.509325" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:21.503712" elapsed="0.005732"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:21.503171" elapsed="0.006356"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:21.503127" elapsed="0.006444"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:21.513314" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:21.509990" elapsed="0.003395"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:21.509676" elapsed="0.003760"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:21.509652" elapsed="0.003819"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:21.514311" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:21.513738" 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-08-22T23:41:21.514819" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:21.514456" elapsed="0.000447"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:21.515608" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:21.515162" elapsed="0.000487"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:21.514938" elapsed="0.000763"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:21.514431" elapsed="0.001300"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:21.516459" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:21.515951" 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-08-22T23:41:21.516942" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:21.516617" elapsed="0.000405"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:21.517756" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:21.517308" elapsed="0.000485"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:21.517055" elapsed="0.000789"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:21.516569" elapsed="0.001305"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:41:21.518085" elapsed="0.000459"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:21.519043" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:21.518724" 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-08-22T23:41:21.519223" 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-08-22T23:41:21.502044" elapsed="0.019649"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:21.521877" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:41:21.521765" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:21.521746" 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-08-22T23:41:21.522123" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:21.522194" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:41:21.524507" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:21.470172" elapsed="0.054365"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:21.524614" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:41:21.524768" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:21.464576" elapsed="0.060218"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:21.525496" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:21.525077" elapsed="0.000505">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:21.524864" elapsed="0.000858">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:21.524847" elapsed="0.000914">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:21.525984" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:21.525832" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:21.525815" elapsed="0.000251"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:21.461735" elapsed="0.064416">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:22.529239" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:22.528229" elapsed="0.001084"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:22.543158" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:22.542895" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:22.543629" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:22.543363" 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-08-22T23:41:22.574169" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:22.574410" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:22.574526" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:22.545843" elapsed="0.028709"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:22.543752" elapsed="0.030863"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:22.574803" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:22.574644" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:22.543729" elapsed="0.031163"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:22.579033" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:22.575926" elapsed="0.003162"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:22.575704" elapsed="0.003426"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:22.575685" elapsed="0.003473"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:22.582397" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:22.579482" elapsed="0.002967"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:22.579224" elapsed="0.003264"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:22.579202" elapsed="0.003315"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:22.583213" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:22.582745" 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-08-22T23:41:22.583665" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:22.583350" elapsed="0.000381"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:22.584296" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:22.583962" elapsed="0.000363"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:22.583759" elapsed="0.000606"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:22.583314" elapsed="0.001079"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:22.585058" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:22.584583" 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-08-22T23:41:22.585545" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:22.585166" elapsed="0.000507"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:22.586244" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:22.585902" elapsed="0.000372"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:22.585707" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:22.585146" 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-08-22T23:41:22.586546" elapsed="0.000451"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:22.587517" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:22.587181" 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-08-22T23:41:22.587754" 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-08-22T23:41:22.575250" elapsed="0.015310"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:22.590762" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:41:22.590651" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:22.590632" 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-08-22T23:41:22.591004" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:22.591075" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:41:22.593544" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:22.538532" elapsed="0.055046"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:22.593654" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:41:22.593806" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:22.529917" elapsed="0.063916"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:22.594500" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:22.594110" elapsed="0.000476">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:22.593903" elapsed="0.000772">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:22.593886" elapsed="0.000823">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:22.594924" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:22.594780" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:22.594764" elapsed="0.000239"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:22.527138" elapsed="0.067947">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:23.598333" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:23.597243" elapsed="0.001170"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:23.610628" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:23.610326" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:23.611086" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:23.610836" 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-08-22T23:41:23.635872" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:23.636085" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:23.636303" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:23.613412" elapsed="0.022929"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:23.611312" elapsed="0.025097"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:23.636691" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:23.636449" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:23.611285" elapsed="0.025532"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:23.642067" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:23.638296" elapsed="0.003843"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:23.637984" elapsed="0.004207"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:23.637958" elapsed="0.004270"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:23.646003" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:23.642644" elapsed="0.003425"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:23.642308" elapsed="0.003810"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:23.642285" elapsed="0.003869"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:23.646826" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:23.646396" 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-08-22T23:41:23.647163" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:23.646925" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:23.647725" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:23.647406" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:23.647246" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:23.646907" elapsed="0.000904"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:23.648335" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:23.647969" 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-08-22T23:41:23.648682" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:23.648432" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:23.649219" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:23.648923" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:23.648766" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:23.648414" 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-08-22T23:41:23.649461" elapsed="0.000386"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:23.650313" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:23.650010" 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-08-22T23:41:23.650495" 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-08-22T23:41:23.637325" elapsed="0.015634"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:23.653143" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:41:23.653030" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:23.653012" 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-08-22T23:41:23.653390" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:23.653523" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:41:23.655943" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:23.604017" elapsed="0.051956"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:23.656034" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:41:23.656186" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:23.598974" elapsed="0.057238"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:23.656883" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:23.656491" elapsed="0.000477">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:23.656282" elapsed="0.000761">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:23.656265" elapsed="0.000812">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:23.657295" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:23.657147" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:23.657130" elapsed="0.000245"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:23.596106" elapsed="0.061353">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:24.660738" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:24.659709" elapsed="0.001103"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:24.672842" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:24.672560" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:24.673297" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:24.673047" 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-08-22T23:41:24.719713" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:24.720075" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:24.720314" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:24.675546" elapsed="0.044834"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:24.673426" elapsed="0.047070"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:24.720951" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:24.720563" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:24.673400" elapsed="0.047744"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:24.728902" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:24.723495" elapsed="0.005483"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:24.722996" elapsed="0.006036"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:24.722953" elapsed="0.006117"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:24.733156" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:24.729617" elapsed="0.003608"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:24.729258" elapsed="0.004020"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:24.729230" elapsed="0.004085"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:24.734222" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:24.733609" 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-08-22T23:41:24.734746" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:24.734369" elapsed="0.000464"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:24.735557" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:24.735107" elapsed="0.000512"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:24.734869" elapsed="0.000806"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:24.734342" elapsed="0.001366"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:24.736495" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:24.735938" 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-08-22T23:41:24.736848" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:24.736611" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:24.737384" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:24.737087" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:24.736930" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:24.736576" 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-08-22T23:41:24.737640" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:24.738470" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:24.738154" 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-08-22T23:41:24.738668" elapsed="0.002374"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:41:24.722004" elapsed="0.019111"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:24.741310" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-08-22T23:41:24.741194" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:24.741174" 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-08-22T23:41:24.741562" elapsed="0.000046"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:24.741661" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:41:24.744022" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:24.667016" elapsed="0.077036"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:24.744115" elapsed="0.000057"/>
</return>
<msg time="2026-08-22T23:41:24.744305" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:24.661315" elapsed="0.083017"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:24.745028" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:24.744645" elapsed="0.000469">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:24.744412" elapsed="0.000778">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:24.744392" elapsed="0.000832">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:24.745507" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:24.745357" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:24.745338" elapsed="0.000269"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:24.658447" elapsed="0.087253">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:25.748993" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:25.747794" elapsed="0.001275"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:25.761406" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:25.761140" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:25.761888" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:25.761638" 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-08-22T23:41:25.783226" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:25.783521" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:25.783784" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:25.764120" elapsed="0.019724"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:25.762014" elapsed="0.021929"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:25.784343" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:25.784003" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:25.761988" elapsed="0.022552"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:25.791355" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:25.787004" elapsed="0.004419"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:25.786471" elapsed="0.005002"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:25.786430" elapsed="0.005078"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:25.795298" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:25.791918" elapsed="0.003445"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:25.791610" elapsed="0.003802"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:25.791564" elapsed="0.003883"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:25.796276" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:25.795714" 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-08-22T23:41:25.796777" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:25.796415" elapsed="0.000502"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:25.797623" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:25.797189" elapsed="0.000463"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:25.796957" elapsed="0.000732"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:25.796390" elapsed="0.001321"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:25.798236" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:25.797869" 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-08-22T23:41:25.798567" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:25.798335" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:25.799130" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:25.798834" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:25.798674" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:25.798317" 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-08-22T23:41:25.799445" elapsed="0.000376"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:25.800286" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:25.799985" 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-08-22T23:41:25.800471" 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-08-22T23:41:25.785478" elapsed="0.017647"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:25.803308" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:41:25.803196" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:25.803178" 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-08-22T23:41:25.803562" elapsed="0.000038"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:25.803654" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:41:25.806163" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:25.755763" elapsed="0.050429"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:25.806254" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:41:25.806407" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:25.749613" elapsed="0.056821"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:25.807104" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:25.806735" elapsed="0.000454">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:25.806505" elapsed="0.000757">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:25.806488" elapsed="0.000809">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:25.807530" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:25.807368" elapsed="0.000239"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:25.807351" elapsed="0.000282"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:25.746659" elapsed="0.061061">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:26.810736" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:26.809737" elapsed="0.001072"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:26.822044" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:26.821782" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:26.822524" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:26.822274" 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-08-22T23:41:26.849077" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:26.849458" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:26.849570" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:26.824769" elapsed="0.024846"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:26.822670" elapsed="0.026991"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:26.849845" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:26.849689" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:26.822643" elapsed="0.027290"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:26.853572" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:26.850975" elapsed="0.002665"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:26.850751" elapsed="0.002925"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:26.850733" elapsed="0.002968"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:26.856286" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:26.853980" elapsed="0.002352"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:26.853759" elapsed="0.002609"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:26.853742" elapsed="0.002651"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:26.857017" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:26.856615" 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-08-22T23:41:26.857350" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:26.857117" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:26.857914" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:26.857612" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:26.857432" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:26.857099" elapsed="0.000900"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:26.858535" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:26.858159" 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-08-22T23:41:26.858889" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:26.858656" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:26.859426" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:26.859128" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:26.858970" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:26.858638" 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-08-22T23:41:26.859681" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:26.860491" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:26.860197" 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-08-22T23:41:26.860703" elapsed="0.002321"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:41:26.850301" elapsed="0.012788"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:26.863268" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:41:26.863158" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:26.863140" 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-08-22T23:41:26.863513" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:26.863601" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:41:26.865942" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:26.815579" elapsed="0.050392"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:26.866093" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:41:26.866251" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:26.811302" elapsed="0.054977"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:26.866936" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:26.866557" elapsed="0.000456">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:26.866350" elapsed="0.000734">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:26.866333" elapsed="0.000785">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:26.867336" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:26.867190" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:26.867173" elapsed="0.000244"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:26.808653" elapsed="0.058846">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:27.870652" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:27.869613" elapsed="0.001114"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:27.881239" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:27.880973" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:27.881719" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:27.881442" 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-08-22T23:41:27.902743" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:27.902962" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:27.903103" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:27.884438" elapsed="0.018701"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:27.881846" elapsed="0.021450"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:27.903573" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:27.903346" elapsed="0.000357"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:27.881821" elapsed="0.021933"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:27.911571" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:27.906062" elapsed="0.005586"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:27.905537" elapsed="0.006148"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:27.905496" elapsed="0.006214"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:27.914298" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:27.911991" elapsed="0.002353"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:27.911767" elapsed="0.002612"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:27.911750" elapsed="0.002653"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:27.915127" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:27.914629" 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-08-22T23:41:27.915654" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:27.915373" elapsed="0.000341"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:27.916209" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:27.915902" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:27.915738" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:27.915343" elapsed="0.000951"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:27.916841" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:27.916456" 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-08-22T23:41:27.917167" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:27.916938" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:27.917719" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:27.917404" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:27.917249" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:27.916921" 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-08-22T23:41:27.917956" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:27.918800" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:27.918468" 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-08-22T23:41:27.918979" 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-08-22T23:41:27.904560" elapsed="0.016899"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:27.921660" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-08-22T23:41:27.921529" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:27.921511" 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-08-22T23:41:27.921907" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:27.921978" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:41:27.924364" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:27.874972" elapsed="0.049421"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:27.924454" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:41:27.924626" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:27.871358" elapsed="0.053296"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:27.925305" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:27.924934" elapsed="0.000455">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:27.924725" elapsed="0.000739">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:27.924708" elapsed="0.000790">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:27.925732" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:27.925568" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:27.925549" elapsed="0.000263"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:27.868422" elapsed="0.057473">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:28.929027" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:28.927936" elapsed="0.001182"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:28.939626" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:28.939342" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:28.940082" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:28.939832" 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-08-22T23:41:28.960186" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:28.960480" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:28.960736" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:28.942312" elapsed="0.018484"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:28.940207" elapsed="0.020686"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:28.961370" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:28.960953" elapsed="0.000575"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:28.940182" elapsed="0.021395"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:28.969445" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:28.963979" elapsed="0.005570"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:28.963401" elapsed="0.006210"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:28.963360" elapsed="0.006279"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:28.972206" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:28.969917" elapsed="0.002335"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:28.969694" elapsed="0.002593"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:28.969678" elapsed="0.002633"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:28.972915" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:28.972487" 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-08-22T23:41:28.973266" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:28.973013" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:28.973829" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:28.973510" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:28.973347" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:28.972995" elapsed="0.000918"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:28.974428" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:28.974067" 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-08-22T23:41:28.974773" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:28.974525" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:28.975301" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:28.975009" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:28.974854" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:28.974507" 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-08-22T23:41:28.975533" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:28.976364" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:28.976064" 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-08-22T23:41:28.976653" 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-08-22T23:41:28.962423" elapsed="0.016766"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:28.979367" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:41:28.979260" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:28.979241" 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-08-22T23:41:28.979631" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:28.979704" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:41:28.982023" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:28.933475" elapsed="0.048577"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:28.982112" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:41:28.982262" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:28.929578" elapsed="0.052710"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:28.982941" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:28.982564" elapsed="0.000454">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:28.982357" elapsed="0.000733">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:28.982341" elapsed="0.000783">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:28.983339" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:28.983194" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:28.983177" elapsed="0.000241"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:28.926836" elapsed="0.056663">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:29.986476" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:29.985443" elapsed="0.001107"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:29.998193" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:29.997927" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:29.998717" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:29.998440" 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-08-22T23:41:30.021140" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:30.021682" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:30.022048" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:30.000926" elapsed="0.021187"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:29.998846" elapsed="0.025221"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:30.024772" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:30.024163" elapsed="0.000775"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:29.998820" elapsed="0.026184"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:30.030895" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:30.027828" elapsed="0.003122"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:30.027441" elapsed="0.003548"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:30.027386" elapsed="0.003629"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:30.033665" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:30.031305" elapsed="0.002408"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:30.031074" elapsed="0.002675"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:30.031057" elapsed="0.002717"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:30.034491" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:30.033992" 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-08-22T23:41:30.034852" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:30.034608" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:30.035410" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:30.035101" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:30.034937" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:30.034574" elapsed="0.000926"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:30.036039" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:30.035674" 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-08-22T23:41:30.036365" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:30.036137" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:30.036941" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:30.036621" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:30.036448" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:30.036119" 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-08-22T23:41:30.037181" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:30.038083" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:30.037762" 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-08-22T23:41:30.038264" 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-08-22T23:41:30.026107" elapsed="0.014624"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:30.040922" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-08-22T23:41:30.040803" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:30.040784" 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-08-22T23:41:30.041181" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:30.041255" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:41:30.043905" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:29.993487" elapsed="0.050450"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:30.044017" elapsed="0.000039"/>
</return>
<msg time="2026-08-22T23:41:30.044194" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:29.987089" elapsed="0.057134"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:30.046568" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:30.044526" elapsed="0.002204">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:30.044298" elapsed="0.002568">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:30.044279" elapsed="0.002661">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:30.047407" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:30.047097" elapsed="0.000379"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:30.047051" elapsed="0.000456"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:29.984378" elapsed="0.063275">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:31.050737" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:31.049746" elapsed="0.001088"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:31.063151" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:31.062748" elapsed="0.000471"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:31.063740" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:31.063431" elapsed="0.000353"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:41:31.088052" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:31.088205" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:31.088304" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:31.065945" elapsed="0.022385"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:31.063862" elapsed="0.024513"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:31.088559" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:31.088404" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:31.063838" elapsed="0.024840"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:31.092170" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:31.089697" elapsed="0.002522"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:31.089457" elapsed="0.002798"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:31.089439" elapsed="0.002842"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:31.094919" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:31.092556" elapsed="0.002410"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:31.092337" elapsed="0.002679"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:31.092320" elapsed="0.002721"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:31.095633" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:31.095220" 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-08-22T23:41:31.095971" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:31.095734" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:31.096516" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:31.096213" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:31.096054" elapsed="0.000613"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:31.095716" elapsed="0.000975"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:31.097224" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:31.096851" 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-08-22T23:41:31.097554" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:31.097323" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:31.098119" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:31.097819" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:31.097658" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:31.097305" 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-08-22T23:41:31.098356" elapsed="0.000372"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:31.099210" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:31.098890" 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-08-22T23:41:31.099389" 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-08-22T23:41:31.089037" elapsed="0.012885"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:31.102131" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:41:31.102019" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:31.101999" 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-08-22T23:41:31.102372" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:31.102445" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:41:31.104833" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:31.056367" elapsed="0.048497"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:31.104925" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:41:31.105078" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:31.051333" elapsed="0.053772"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:31.105763" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:31.105384" elapsed="0.000456">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:31.105176" elapsed="0.000734">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:31.105159" elapsed="0.000786">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:31.106163" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:31.106017" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:31.106000" elapsed="0.000245"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:31.048655" elapsed="0.057672">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:32.109418" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:32.108340" elapsed="0.001150"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:32.122211" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:32.121947" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:32.122678" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:32.122411" 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-08-22T23:41:32.146080" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:32.146242" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:32.146354" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:32.124897" elapsed="0.021483"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:32.122798" elapsed="0.023626"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:32.146636" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:32.146453" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:32.122775" elapsed="0.023951"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:32.150238" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:32.147798" elapsed="0.002489"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:32.147530" elapsed="0.002793"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:32.147512" elapsed="0.002836"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:32.153152" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:32.150640" elapsed="0.002559"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:32.150404" elapsed="0.002832"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:32.150387" elapsed="0.002873"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:32.153869" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:32.153438" 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-08-22T23:41:32.154205" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:32.153968" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:32.154773" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:32.154450" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:32.154288" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:32.153950" elapsed="0.000910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:32.155412" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:32.155018" 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-08-22T23:41:32.155760" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:32.155510" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:32.156297" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:32.156001" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:32.155843" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:32.155492" 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-08-22T23:41:32.156530" elapsed="0.000371"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:32.157358" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:32.157063" 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-08-22T23:41:32.157538" 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-08-22T23:41:32.147103" elapsed="0.012939"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:32.160269" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:41:32.160159" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:32.160139" 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-08-22T23:41:32.160509" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:32.160599" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:41:32.163113" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:32.116764" elapsed="0.046380"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:32.163206" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:41:32.163359" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:32.110141" elapsed="0.053244"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:32.164085" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:32.163679" elapsed="0.000485">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:32.163456" elapsed="0.000781">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:32.163439" elapsed="0.000834">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:32.164490" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:32.164345" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:32.164328" elapsed="0.000243"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:32.107216" elapsed="0.057456">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:33.167492" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:33.166453" elapsed="0.001111"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:33.179420" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:33.179157" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:33.179885" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:33.179638" 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-08-22T23:41:33.203648" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:33.203796" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:33.203896" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:33.182080" elapsed="0.021841"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:33.180007" elapsed="0.023958"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:33.204147" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:33.203993" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:33.179985" elapsed="0.024249"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:33.207921" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:33.205319" elapsed="0.002651"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:33.205096" elapsed="0.002910"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:33.205078" elapsed="0.002954"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:33.210653" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:33.208314" elapsed="0.002386"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:33.208089" elapsed="0.002646"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:33.208072" elapsed="0.002688"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:33.211402" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:33.210945" elapsed="0.000488"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:33.211769" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:33.211507" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:33.212313" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:33.212010" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:33.211852" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:33.211488" elapsed="0.000910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:33.212936" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:33.212553" 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-08-22T23:41:33.213264" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:33.213034" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:33.213822" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:33.213501" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:33.213345" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:33.213016" 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-08-22T23:41:33.214057" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:33.214908" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:33.214564" 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-08-22T23:41:33.215087" elapsed="0.002327"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:41:33.204610" elapsed="0.012868"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:33.217674" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:41:33.217548" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:33.217529" 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-08-22T23:41:33.217916" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:33.217988" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:41:33.220307" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:33.173664" elapsed="0.046672"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:33.220397" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:41:33.220547" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:33.168099" elapsed="0.052475"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:33.221229" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:33.220872" elapsed="0.000435">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:33.220663" elapsed="0.000752">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:33.220645" elapsed="0.000808">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:33.221688" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:33.221524" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:33.221507" elapsed="0.000263"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:33.165428" elapsed="0.056424">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:34.224469" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:34.223527" elapsed="0.001010"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:34.235478" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:34.235223" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:34.235941" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:34.235696" 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-08-22T23:41:34.255068" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:34.255202" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:34.255301" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:34.238138" elapsed="0.017190"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:34.236057" elapsed="0.019316"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:34.255555" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:34.255401" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:34.236037" elapsed="0.019709"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:34.263867" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:34.258145" elapsed="0.005835"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:34.257617" elapsed="0.006447"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:34.257545" elapsed="0.006575"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:34.268145" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:34.264776" elapsed="0.003416"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:34.264248" elapsed="0.003979"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:34.264210" elapsed="0.004042"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:34.268829" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:34.268421" 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-08-22T23:41:34.269163" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:34.268929" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:34.269732" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:34.269406" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:34.269246" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:34.268911" elapsed="0.000921"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:34.270353" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:34.269990" 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-08-22T23:41:34.270752" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:34.270451" elapsed="0.000361"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:34.271300" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:34.270997" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:34.270837" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:34.270433" 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-08-22T23:41:34.271537" elapsed="0.000370"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:34.272359" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:34.272069" 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-08-22T23:41:34.272538" 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-08-22T23:41:34.256567" elapsed="0.018392"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:34.275137" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-08-22T23:41:34.275030" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:34.275011" 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-08-22T23:41:34.275375" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:34.275448" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:41:34.277784" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:34.229082" elapsed="0.048731"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:34.277886" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:41:34.278039" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:34.225058" elapsed="0.053008"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:34.278715" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:34.278344" elapsed="0.000445">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:34.278137" elapsed="0.000721">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:34.278120" elapsed="0.000773">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:34.279110" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:34.278964" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:34.278947" elapsed="0.000243"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:34.222565" elapsed="0.056707">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:35.281314" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:35.280851" elapsed="0.000498"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:35.288996" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:35.288736" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:35.289440" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:35.289197" 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-08-22T23:41:35.312921" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:35.313072" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:35.313173" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:35.291725" elapsed="0.021475"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:35.289641" elapsed="0.023602"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:35.313424" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:35.313272" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:35.289615" elapsed="0.023897"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:35.316980" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:35.314536" elapsed="0.002493"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:35.314314" elapsed="0.002751"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:35.314295" elapsed="0.002795"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:35.319685" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:35.317363" elapsed="0.002368"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:35.317146" elapsed="0.002620"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:35.317129" elapsed="0.002661"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:35.320350" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:35.319964" 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-08-22T23:41:35.320712" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:35.320447" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:35.321259" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:35.320956" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:35.320796" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:35.320429" elapsed="0.000915"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:35.321881" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:35.321498" 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-08-22T23:41:35.322259" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:35.322026" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:35.322819" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:35.322496" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:35.322341" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:35.322007" 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-08-22T23:41:35.323052" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:35.323872" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:35.323560" 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-08-22T23:41:35.324049" 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-08-22T23:41:35.313893" elapsed="0.012701"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:35.326779" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:41:35.326670" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:35.326650" 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-08-22T23:41:35.327015" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:35.327121" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:41:35.329446" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:35.284360" elapsed="0.045115"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:35.329535" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:41:35.329705" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:35.281592" elapsed="0.048142"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:35.330369" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:35.330011" elapsed="0.000435">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:35.329805" elapsed="0.000713">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:35.329788" elapsed="0.000764">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:35.330790" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:35.330640" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:35.330622" elapsed="0.000247"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:35.280012" elapsed="0.050937">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:36.333438" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:36.332531" elapsed="0.000971"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:36.344304" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:36.344006" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:36.344786" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:36.344519" 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-08-22T23:41:36.365673" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:36.365933" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:36.366150" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:36.346947" elapsed="0.019260"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:36.344899" elapsed="0.021406"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:36.366761" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:36.366364" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:36.344881" elapsed="0.022082"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:36.375426" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:36.369298" elapsed="0.006238"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:36.368807" elapsed="0.006844"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:36.368766" elapsed="0.006944"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:36.378449" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:36.376077" elapsed="0.002419"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:36.375850" elapsed="0.002682"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:36.375831" elapsed="0.002727"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:36.379127" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:36.378741" 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-08-22T23:41:36.379475" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:36.379240" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:36.380039" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:36.379734" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:36.379558" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:36.379222" elapsed="0.000903"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:36.380663" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:36.380282" 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-08-22T23:41:36.380993" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:36.380760" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:36.381529" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:36.381232" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:36.381074" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:36.380742" 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-08-22T23:41:36.381781" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:36.382568" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:36.382290" 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-08-22T23:41:36.382764" 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-08-22T23:41:36.367829" elapsed="0.017390"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:36.385397" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-08-22T23:41:36.385289" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:36.385271" 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-08-22T23:41:36.385644" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:36.385718" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:41:36.388099" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:36.338027" elapsed="0.050102"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:36.388189" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:41:36.388340" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:36.334013" elapsed="0.054353"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:36.389013" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:36.388660" elapsed="0.000424">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:36.388437" elapsed="0.000715">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:36.388420" elapsed="0.000767">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:36.389441" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:36.389293" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:36.389275" elapsed="0.000248"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:36.331666" elapsed="0.057956">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:37.392124" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:37.391194" elapsed="0.000994"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:37.402761" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:37.402486" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:37.403226" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:37.402978" 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-08-22T23:41:37.432120" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:37.432336" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:37.432517" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:37.405436" elapsed="0.027129"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:37.403340" elapsed="0.029349"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:37.432956" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:37.432741" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:37.403321" elapsed="0.029754"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:37.437888" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:37.434519" elapsed="0.003437"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:37.434213" elapsed="0.003792"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:37.434187" elapsed="0.003984"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:37.441816" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:37.438557" elapsed="0.003323"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:37.438250" elapsed="0.003678"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:37.438227" elapsed="0.003727"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:37.442487" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:37.442113" 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-08-22T23:41:37.442842" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:37.442601" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:37.443378" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:37.443079" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:37.442923" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:37.442568" elapsed="0.000893"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:37.443993" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:37.443633" 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-08-22T23:41:37.444317" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:37.444089" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:37.444861" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:37.444551" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:37.444397" elapsed="0.000577"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:37.444072" 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-08-22T23:41:37.445149" elapsed="0.000362"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:37.445997" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:37.445711" 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-08-22T23:41:37.446180" elapsed="0.002311"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:41:37.433577" elapsed="0.014979"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:37.448762" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-08-22T23:41:37.448641" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:37.448622" 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-08-22T23:41:37.448993" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:37.449065" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:41:37.451394" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:37.396535" elapsed="0.054889"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:37.451485" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:41:37.451661" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:37.392698" elapsed="0.058991"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:37.452323" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:37.451972" elapsed="0.000422">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:37.451760" elapsed="0.000702">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:37.451743" elapsed="0.000754">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:37.452728" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:37.452567" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:37.452550" elapsed="0.000260"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:37.390277" elapsed="0.062614">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:38.456035" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:38.454812" elapsed="0.001304"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:38.467977" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:38.467713" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:38.468429" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:38.468180" 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-08-22T23:41:38.496167" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:38.496557" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:38.496811" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:38.470663" elapsed="0.026208"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:38.468550" elapsed="0.028419"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:38.497367" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:38.497029" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:38.468528" 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-08-22T23:41:38.505005" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:38.499897" elapsed="0.005158"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:38.499358" elapsed="0.005733"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:38.499317" elapsed="0.005799"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:38.507809" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:38.505417" elapsed="0.002440"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:38.505172" elapsed="0.002721"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:38.505156" elapsed="0.002761"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:38.508491" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:38.508090" 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-08-22T23:41:38.508841" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:38.508605" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:38.509381" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:38.509082" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:38.508924" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:38.508572" elapsed="0.000894"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:38.509997" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:38.509636" 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-08-22T23:41:38.510324" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:38.510094" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:38.510876" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:38.510561" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:38.510404" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:38.510076" 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-08-22T23:41:38.511107" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:38.511946" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:38.511650" 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-08-22T23:41:38.512122" 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-08-22T23:41:38.498380" elapsed="0.016238"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:38.514797" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:41:38.514688" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:38.514670" 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-08-22T23:41:38.515046" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:38.515116" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:41:38.517444" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:38.462839" elapsed="0.054634"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:38.517591" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:41:38.517748" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:38.456662" elapsed="0.061112"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:38.518413" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:38.518053" elapsed="0.000436">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:38.517844" elapsed="0.000716">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:38.517827" elapsed="0.000786">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:38.518829" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:38.518684" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:38.518667" elapsed="0.000242"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:38.453757" elapsed="0.065234">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:39.522005" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:39.520965" elapsed="0.001111"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:39.533633" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:39.533330" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:39.534083" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:39.533836" 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-08-22T23:41:39.554346" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:39.554712" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:39.554937" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:39.536262" elapsed="0.018734"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:39.534206" elapsed="0.020887"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:39.555494" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:39.555153" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:39.534183" elapsed="0.021541"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:39.561800" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:39.558019" elapsed="0.003851"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:39.557666" elapsed="0.004254"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:39.557610" elapsed="0.004345"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:39.565676" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:39.562338" elapsed="0.003409"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:39.562033" elapsed="0.003752"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:39.562010" elapsed="0.003800"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:39.566400" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:39.565988" 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-08-22T23:41:39.566847" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:39.566593" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:39.567411" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:39.567095" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:39.566931" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:39.566557" elapsed="0.000941"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:39.568049" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:39.567674" 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-08-22T23:41:39.568389" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:39.568150" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:39.568964" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:39.568652" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:39.568474" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:39.568131" 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-08-22T23:41:39.569202" elapsed="0.000417"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:39.570096" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:39.569792" 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-08-22T23:41:39.570288" 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-08-22T23:41:39.556511" elapsed="0.016294"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:39.572994" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:41:39.572880" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:39.572860" 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-08-22T23:41:39.573242" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:39.573316" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:41:39.575702" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:39.528078" elapsed="0.047655"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:39.575799" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:41:39.575952" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:39.522567" elapsed="0.053412"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:39.576633" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:39.576257" elapsed="0.000453">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:39.576050" elapsed="0.000730">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:39.576033" elapsed="0.000781">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:39.577032" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:39.576886" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:39.576867" elapsed="0.000245"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:39.519894" elapsed="0.057325">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:40.580490" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:40.579442" elapsed="0.001123"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:40.592459" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:40.592190" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:40.592933" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:40.592679" 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-08-22T23:41:40.612794" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:40.613101" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:40.613322" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:40.595215" elapsed="0.018163"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:40.593063" elapsed="0.020414"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:40.613919" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:40.613540" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:40.593036" 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-08-22T23:41:40.620004" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:40.616276" elapsed="0.003802"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:40.615923" elapsed="0.004209"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:40.615895" elapsed="0.004273"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:40.624042" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:40.620606" elapsed="0.003484"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:40.620252" elapsed="0.003874"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:40.620227" elapsed="0.003924"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:40.624761" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:40.624332" 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-08-22T23:41:40.625098" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:40.624860" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:40.625660" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:40.625339" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:40.625180" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:40.624842" elapsed="0.000904"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:40.626269" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:40.625903" 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-08-22T23:41:40.626613" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:40.626367" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:40.627180" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:40.626851" elapsed="0.000361"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:40.626695" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:40.626348" elapsed="0.000932"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:41:40.627438" elapsed="0.000378"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:40.628288" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:40.627981" 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-08-22T23:41:40.628527" elapsed="0.002340"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:41:40.614944" elapsed="0.015990"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:40.631154" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-08-22T23:41:40.631007" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:40.630988" 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-08-22T23:41:40.631409" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:40.631482" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:41:40.633834" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:40.587011" elapsed="0.046853"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:40.633925" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:41:40.634078" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:40.581142" elapsed="0.052963"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:40.634774" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:40.634383" elapsed="0.000480">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:40.634175" elapsed="0.000763">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:40.634158" elapsed="0.000815">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:40.635227" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:40.635043" elapsed="0.000253"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:40.635026" elapsed="0.000298"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:40.578225" elapsed="0.057198">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:41.638480" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:41.637392" elapsed="0.001161"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:41.651422" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:41.651159" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:41.651895" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:41.651641" 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-08-22T23:41:41.671509" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:41.671693" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:41.671816" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:41.654108" elapsed="0.017736"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:41.652014" elapsed="0.020028"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:41.672467" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:41.672108" elapsed="0.000581"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:41.651992" elapsed="0.020755"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:41.680847" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:41.675125" elapsed="0.005915"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:41.674618" elapsed="0.006510"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:41.674539" elapsed="0.006648"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:41.684199" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:41.681837" elapsed="0.002408"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:41.681315" elapsed="0.002967"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:41.681277" elapsed="0.003029"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:41.684916" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:41.684479" 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-08-22T23:41:41.685256" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:41.685020" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:41.685830" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:41.685503" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:41.685340" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:41.685002" elapsed="0.000916"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:41.686437" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:41.686075" 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-08-22T23:41:41.686783" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:41.686534" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:41.687341" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:41.687044" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:41.686867" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:41.686516" 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-08-22T23:41:41.687597" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:41.688410" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:41.688113" 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-08-22T23:41:41.688607" elapsed="0.002412"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:41:41.673572" elapsed="0.017512"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:41.691266" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:41:41.691155" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:41.691137" 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-08-22T23:41:41.691508" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:41.691596" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:41:41.694297" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:41.645804" elapsed="0.048522"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:41.694388" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:41:41.694541" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:41.639088" elapsed="0.055479"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:41.695281" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:41.694874" elapsed="0.000485">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:41.694664" elapsed="0.000769">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:41.694646" elapsed="0.000822">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:41.695699" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:41.695537" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:41.695521" elapsed="0.000260"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:41.636309" elapsed="0.059555">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:42.699079" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:42.698071" elapsed="0.001081"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:42.710890" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:42.710620" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:42.711341" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:42.711094" 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-08-22T23:41:42.730243" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:42.730400" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:42.730500" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:42.713559" elapsed="0.016966"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:42.711472" elapsed="0.019097"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:42.730780" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:42.730624" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:42.711446" elapsed="0.019421"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:42.738923" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:42.733155" elapsed="0.005818"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:42.732657" elapsed="0.006352"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:42.732614" elapsed="0.006420"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:42.741636" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:42.739315" elapsed="0.002368"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:42.739092" elapsed="0.002626"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:42.739075" elapsed="0.002667"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:42.742324" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:42.741919" 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-08-22T23:41:42.742673" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:42.742423" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:42.743216" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:42.742919" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:42.742755" elapsed="0.000589"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:42.742405" elapsed="0.000962"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:42.743907" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:42.743526" 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-08-22T23:41:42.744234" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:42.744004" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:42.744785" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:42.744470" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:42.744315" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:42.743986" 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-08-22T23:41:42.745021" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:42.745844" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:42.745528" 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-08-22T23:41:42.746023" 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-08-22T23:41:42.731690" elapsed="0.016751"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:42.748638" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:41:42.748512" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:42.748494" 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-08-22T23:41:42.748885" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:42.748956" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:41:42.751287" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:42.705259" elapsed="0.046057"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:42.751376" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:41:42.751525" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:42.699681" elapsed="0.051870"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:42.752206" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:42.751849" elapsed="0.000435">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:42.751640" elapsed="0.000717">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:42.751622" elapsed="0.000769">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:42.752622" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:42.752462" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:42.752445" elapsed="0.000258"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:42.696825" elapsed="0.055960">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:43.755786" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:43.754746" elapsed="0.001113"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:43.768107" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:43.767844" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:43.768565" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:43.768311" 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-08-22T23:41:43.786988" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:43.787296" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:43.787553" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:43.770789" elapsed="0.016856"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:43.768711" elapsed="0.019036"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:43.788156" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:43.787811" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:43.768682" elapsed="0.019675"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:43.796181" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:43.790732" elapsed="0.005499"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:43.790203" elapsed="0.006066"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:43.790161" elapsed="0.006134"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:43.798940" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:43.796573" elapsed="0.002415"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:43.796352" elapsed="0.002673"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:43.796335" elapsed="0.002715"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:43.799669" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:43.799222" 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-08-22T23:41:43.800040" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:43.799769" elapsed="0.000329"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:43.800595" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:43.800280" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:43.800122" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:43.799751" elapsed="0.000931"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:43.801203" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:43.800837" 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-08-22T23:41:43.801530" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:43.801299" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:43.802086" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:43.801790" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:43.801631" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:43.801281" 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-08-22T23:41:43.802322" elapsed="0.000568"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:43.803385" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:43.803056" 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-08-22T23:41:43.803566" 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-08-22T23:41:43.789183" elapsed="0.016803"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:43.806208" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:41:43.806096" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:43.806077" 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-08-22T23:41:43.806450" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:43.806521" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:41:43.809033" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:43.762153" elapsed="0.046910"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:43.809125" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:41:43.809277" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:43.756501" elapsed="0.052802"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:43.809975" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:43.809604" elapsed="0.000450">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:43.809373" elapsed="0.000755">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:43.809356" elapsed="0.000806">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:43.810377" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:43.810232" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:43.810215" elapsed="0.000242"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:43.753699" elapsed="0.056840">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:44.813808" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:44.812760" elapsed="0.001127"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:44.825488" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:44.825222" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:44.825959" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:44.825707" 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-08-22T23:41:44.844199" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:44.844359" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:44.844461" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:44.828194" elapsed="0.016293"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:44.826089" elapsed="0.018483"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:44.844791" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:44.844630" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:44.826060" elapsed="0.018838"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:44.853000" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:44.847347" elapsed="0.005703"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:44.846850" elapsed="0.006237"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:44.846807" elapsed="0.006305"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:44.855761" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:44.853391" elapsed="0.002417"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:44.853169" elapsed="0.002675"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:44.853152" elapsed="0.002717"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:44.856457" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:44.856048" 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-08-22T23:41:44.856833" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:44.856591" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:44.857383" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:44.857079" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:44.856918" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:44.856558" elapsed="0.000912"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:44.858014" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:44.857643" 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-08-22T23:41:44.858343" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:44.858112" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:44.858935" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:44.858630" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:44.858441" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:44.858094" 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-08-22T23:41:44.859172" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:44.860008" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:44.859703" 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-08-22T23:41:44.860188" elapsed="0.002539"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:41:44.845735" elapsed="0.017058"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:44.862976" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:41:44.862866" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:44.862847" 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-08-22T23:41:44.863222" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:44.863294" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:41:44.865767" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:44.820814" elapsed="0.044982"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:44.865858" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:41:44.866018" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:44.814399" elapsed="0.051646"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:44.866728" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:44.866333" elapsed="0.000486">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:44.866123" elapsed="0.000820">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:44.866099" elapsed="0.000882">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:44.867212" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:44.867059" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:44.867042" elapsed="0.000252"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:44.811496" elapsed="0.055883">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:45.870478" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:45.869398" elapsed="0.001156"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:45.886537" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:45.886274" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:45.887003" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:45.886754" 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-08-22T23:41:45.906218" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:45.906416" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:45.906601" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:45.889213" elapsed="0.017429"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:45.887130" elapsed="0.019574"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:45.906962" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:45.906744" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:45.887104" elapsed="0.019980"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:45.914386" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:45.908528" elapsed="0.006003"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:45.908220" elapsed="0.006434"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:45.908194" elapsed="0.006532"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:45.919608" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:45.915396" elapsed="0.004261"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:45.914865" elapsed="0.004838"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:45.914826" elapsed="0.004903"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:45.920312" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:45.919910" 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-08-22T23:41:45.920661" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:45.920409" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:45.921204" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:45.920905" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:45.920745" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:45.920391" elapsed="0.000898"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:45.922034" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:45.921444" 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-08-22T23:41:45.922424" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:45.922133" elapsed="0.000350"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:45.922988" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:45.922684" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:45.922508" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:45.922115" 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-08-22T23:41:45.923226" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:45.924058" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:45.923757" 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-08-22T23:41:45.924237" elapsed="0.002351"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:41:45.907626" elapsed="0.019030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:45.926840" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-08-22T23:41:45.926729" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:45.926710" 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-08-22T23:41:45.927094" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:45.927166" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:41:45.929483" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:45.876824" elapsed="0.052689"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:45.929572" elapsed="0.000043"/>
</return>
<msg time="2026-08-22T23:41:45.929767" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:45.871095" elapsed="0.058698"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:45.930433" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:45.930070" elapsed="0.000442">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:45.929864" elapsed="0.000741">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:45.929847" elapsed="0.000795">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:45.930859" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:45.930714" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:45.930697" elapsed="0.000241"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:45.868310" elapsed="0.062710">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:46.933856" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:46.932895" elapsed="0.001031"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:46.946995" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:46.946538" elapsed="0.000532"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:46.947520" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:46.947271" 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-08-22T23:41:46.967553" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:41:46.967787" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:41:46.967933" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:41:46.949833" elapsed="0.018137"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:46.947740" 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-08-22T23:41:46.968292" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:46.968072" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:46.947715" elapsed="0.020699"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:46.975201" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:46.969896" elapsed="0.005415"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:46.969562" elapsed="0.005827"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:46.969536" elapsed="0.005909"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:46.980132" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:46.976093" elapsed="0.004085"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:46.975569" elapsed="0.004644"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:46.975531" elapsed="0.004707"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:46.980826" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:46.980414" 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-08-22T23:41:46.981163" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:46.980924" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:46.981718" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:46.981403" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:46.981244" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:46.980906" elapsed="0.000897"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:46.982318" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:46.981958" 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-08-22T23:41:46.982674" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:46.982413" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:46.983217" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:46.982923" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:46.982765" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:46.982396" 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-08-22T23:41:46.983450" elapsed="0.000364"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:41:46.984279" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:46.983980" 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-08-22T23:41:46.984455" 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-08-22T23:41:46.968961" elapsed="0.017923"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:41:46.987064" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:41:46.986953" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:46.986935" 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-08-22T23:41:46.987303" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:41:46.987420" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:41:46.989762" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:41:46.939761" elapsed="0.050030"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:41:46.989851" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:41:46.990005" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:41:46.934413" elapsed="0.055618"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:41:46.990711" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:41:46.990311" elapsed="0.000485">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:41:46.990102" elapsed="0.000766">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:41:46.990085" elapsed="0.000818">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:46.991118" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:46.990972" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:41:46.990956" elapsed="0.000242"/>
</if>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:41:46.931890" elapsed="0.059390">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<msg time="2026-08-22T23:41:46.991377" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 1 minute 40 seconds. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${DEVICE_BOOT_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>node1</arg>
<arg>${original_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:40:06.333268" elapsed="100.658209">Keyword 'Check_Config_Data' failed after retrying for 1 minute 40 seconds. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:46.992738" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:46.992305" elapsed="0.000461"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-08-22T23:41:46.992983" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:41:46.992840" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:46.992822" elapsed="0.000224"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:41:46.993208" elapsed="0.000212"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:41:46.994455" level="FAIL">'5761' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:41:46.994119" elapsed="0.000396">'5761' does not contain '-'</status>
</kw>
<msg time="2026-08-22T23:41:46.994625" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:41:46.993596" elapsed="0.001055"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:41:46.995190" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=5761</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:41:46.994852" elapsed="0.000365"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:41:46.995685" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5761</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:41:46.995376" elapsed="0.000336"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:41:46.996160" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:41:46.995865" elapsed="0.000322"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-08-22T23:41:46.996737" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5761

Keyword 'Check_Config_Data' failed after retrying for 1 minute 40 seconds. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-08-22T23:41:46.996352" elapsed="0.000484"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:46.997235" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5761</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:46.996991" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-08-22T23:41:46.997942" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=5761'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-08-22T23:41:46.997598" elapsed="0.000392"/>
</kw>
<status status="PASS" start="2026-08-22T23:41:46.997346" elapsed="0.000677"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:46.997328" elapsed="0.000720"/>
</if>
<arg>5761</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:41:46.991951" elapsed="0.006144"/>
</kw>
<doc>Check that the created device data is propagated to node 1 as well.</doc>
<tag>critical</tag>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=5761</tag>
<status status="FAIL" start="2026-08-22T23:40:05.414216" elapsed="101.583924">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5761

Keyword 'Check_Config_Data' failed after retrying for 1 minute 40 seconds. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</test>
<test id="s1-s6-t11" name="Kill_node2_Before_Modify" line="139">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:41:47.001606" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:41:47.001328" 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-08-22T23:41:47.002888" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:41:47.002780" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.002761" 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-08-22T23:41:47.008021" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:41:47.007916" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.007897" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:41:47.009086" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:41:47.008706" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:41:47.009570" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:41:47.009270" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:41:47.009660" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:41:47.009816" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:41:47.008316" 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-08-22T23:41:47.015757" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:41:47.015648" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.015627" 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-08-22T23:41:47.017031" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:41:47.016923" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.016905" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:41:47.017545" level="INFO">${karaf_connection_index} = 53</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:41:47.017243" elapsed="0.000330"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:41:47.017983" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:41:47.017753" elapsed="0.000257"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:41:47.080743" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:41:47.018501" elapsed="0.062481"/>
</kw>
<msg time="2026-08-22T23:41:47.081207" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:41:47.081277" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:41:47.018167" elapsed="0.063149"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:41:47.115448" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "2 "_ "B "e "f "o "r "e "_ "M "o "d "i "f "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-08-22T23:41:47.082153" elapsed="0.033535"/>
</kw>
<msg time="2026-08-22T23:41:47.115927" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:41:47.115975" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "2 "_ "B "e "f "o "r "e "_ "M "o "d "i "f "y "[K"
[?1l&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-08-22T23:41:47.081601" elapsed="0.034414"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:47.116510" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:47.116168" elapsed="0.000404"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.116104" elapsed="0.000530"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:47.117171" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "2 "_ "B "e "f "o "r "e "_ "M "o "d "i "f "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-08-22T23:41:47.116787" 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-08-22T23:41:47.117528" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:47.117309" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.117290" elapsed="0.000346"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:41:47.117675" 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-08-22T23:41:47.120494" elapsed="0.000182"/>
</kw>
<msg time="2026-08-22T23:41:47.120739" 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-08-22T23:41:47.119316" elapsed="0.001558"/>
</kw>
<kw name="Open 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-08-22T23:41:47.121149" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:47.121483" 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-08-22T23:41:47.118563" elapsed="0.003134"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:41:47.117989" elapsed="0.003774"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:41:47.016618" elapsed="0.105244"/>
</kw>
<msg time="2026-08-22T23:41:47.121961" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:41:47.122006" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "2 "_ "B "e "f "o "r "e "_ "M "o "d "i "f "y "[K"
[?1l&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-08-22T23:41:47.015981" elapsed="0.106069"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:41:47.122237" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:41:47.122130" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.122111" 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-08-22T23:41:47.122808" 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-08-22T23:41:47.123155" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:41:47.123226" 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-08-22T23:41:47.015282" elapsed="0.108058"/>
</kw>
<msg time="2026-08-22T23:41:47.123440" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:41:47.123485" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "2 "_ "B "e "f "o "r "e "_ "M "o "d "i "f "y "[K"
[?1l&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-08-22T23:41:47.010412" elapsed="0.113113"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:47.123943" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:47.123689" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.123670" elapsed="0.000352"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:41:47.010271" elapsed="0.113775"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:41:47.129751" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:41:47.129640" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.129620" 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-08-22T23:41:47.131187" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:41:47.131073" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.131047" elapsed="0.000212"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:41:47.131742" level="INFO">${karaf_connection_index} = 35</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:41:47.131415" elapsed="0.000354"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:41:47.132146" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:41:47.131931" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:41:47.166901" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:41:47.132691" elapsed="0.034341"/>
</kw>
<msg time="2026-08-22T23:41:47.167208" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:41:47.167255" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:41:47.132326" elapsed="0.034967"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:41:47.185630" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "2 "_ "B "e "f "o "r "e "_ "M "o "d "i "f "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-08-22T23:41:47.167883" elapsed="0.017849"/>
</kw>
<msg time="2026-08-22T23:41:47.185892" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:41:47.185938" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "2 "_ "B "e "f "o "r "e "_ "M "o "d "i "f "y "[K"
[?1l&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-08-22T23:41:47.167486" elapsed="0.018491"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:47.186304" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:47.186064" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.186041" elapsed="0.000344"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:47.186880" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "2 "_ "B "e "f "o "r "e "_ "M "o "d "i "f "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-08-22T23:41:47.186524" 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-08-22T23:41:47.187227" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:47.187014" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.186996" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:41:47.187341" 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-08-22T23:41:47.190092" elapsed="0.000152"/>
</kw>
<msg time="2026-08-22T23:41:47.190306" 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-08-22T23:41:47.188928" 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-08-22T23:41:47.190732" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:47.191096" 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-08-22T23:41:47.188223" 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-08-22T23:41:47.187651" elapsed="0.003695"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:41:47.130545" elapsed="0.060900"/>
</kw>
<msg time="2026-08-22T23:41:47.191543" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:41:47.191626" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "2 "_ "B "e "f "o "r "e "_ "M "o "d "i "f "y "[K"
[?1l&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-08-22T23:41:47.129972" elapsed="0.061696"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:41:47.191931" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:41:47.191820" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.191801" 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-08-22T23:41:47.192418" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:47.192774" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:41:47.192846" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:41:47.129274" elapsed="0.063688"/>
</kw>
<msg time="2026-08-22T23:41:47.193059" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:41:47.193104" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "2 "_ "B "e "f "o "r "e "_ "M "o "d "i "f "y "[K"
[?1l&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-08-22T23:41:47.124374" elapsed="0.068769"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:47.193468" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:47.193221" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.193203" elapsed="0.000344"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:41:47.124232" elapsed="0.069340"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:41:47.199308" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:41:47.199198" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.199178" 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-08-22T23:41:47.200636" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:41:47.200499" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.200481" elapsed="0.000224"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:41:47.201157" level="INFO">${karaf_connection_index} = 36</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:41:47.200848" elapsed="0.000337"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:41:47.201558" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:41:47.201340" elapsed="0.000260"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:41:47.237395" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:41:47.202089" elapsed="0.035539"/>
</kw>
<msg time="2026-08-22T23:41:47.237854" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:41:47.237902" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:41:47.201758" elapsed="0.036182"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:41:47.257875" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "2 "_ "B "e "f "o "r "e "_ "M "o "d "i "f "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-08-22T23:41:47.238663" elapsed="0.019486"/>
</kw>
<msg time="2026-08-22T23:41:47.258403" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:41:47.258451" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "2 "_ "B "e "f "o "r "e "_ "M "o "d "i "f "y "[K"
[?1l&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-08-22T23:41:47.238196" elapsed="0.020295"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:47.259027" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:47.258649" elapsed="0.000439"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.258612" elapsed="0.000504"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:47.259689" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "2 "_ "B "e "f "o "r "e "_ "M "o "d "i "f "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-08-22T23:41:47.259271" 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-08-22T23:41:47.260054" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:47.259832" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.259813" elapsed="0.000400"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:41:47.260253" 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-08-22T23:41:47.263002" elapsed="0.000157"/>
</kw>
<msg time="2026-08-22T23:41:47.263221" 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-08-22T23:41:47.261856" 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-08-22T23:41:47.263652" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:47.263981" 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-08-22T23:41:47.261179" 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-08-22T23:41:47.260572" 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-08-22T23:41:47.200191" elapsed="0.064142"/>
</kw>
<msg time="2026-08-22T23:41:47.264431" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:41:47.264476" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "2 "_ "B "e "f "o "r "e "_ "M "o "d "i "f "y "[K"
[?1l&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-08-22T23:41:47.199531" elapsed="0.064985"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:41:47.264727" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:41:47.264618" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.264597" 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-08-22T23:41:47.265219" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:47.265561" elapsed="0.000133"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:41:47.265745" 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-08-22T23:41:47.198803" elapsed="0.067056"/>
</kw>
<msg time="2026-08-22T23:41:47.265957" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:41:47.266001" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "2 "_ "B "e "f "o "r "e "_ "M "o "d "i "f "y "[K"
[?1l&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-08-22T23:41:47.193949" elapsed="0.072093"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:47.266370" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:47.266120" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.266102" elapsed="0.000346"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:41:47.193810" elapsed="0.072662"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:41:47.009903" elapsed="0.256605"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:41:47.007546" elapsed="0.259026"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:41:47.002442" elapsed="0.264211"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:41:47.002021" elapsed="0.264681"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:41:46.999182" elapsed="0.267577"/>
</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-08-22T23:41:47.272122" 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-08-22T23:41:47.271795" elapsed="0.000355"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:41:47.272606" 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-08-22T23:41:47.272302" elapsed="0.000331"/>
</kw>
<return>
<value>${index_list}</value>
<status status="PASS" start="2026-08-22T23:41:47.272679" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:41:47.272832" level="INFO">${index_list} = [2]</msg>
<var>${index_list}</var>
<arg>${member}</arg>
<status status="PASS" start="2026-08-22T23:41:47.271456" elapsed="0.001400"/>
</kw>
<kw name="Return_Member_IP" owner="ClusterManagement">
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-08-22T23:41:47.273743" 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-08-22T23:41:47.273413" elapsed="0.000356"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:41:47.274196" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:41:47.273922" elapsed="0.000300"/>
</kw>
<return>
<value>${member_ip}</value>
<status status="PASS" start="2026-08-22T23:41:47.274269" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:41:47.274418" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:41:47.273048" elapsed="0.001394"/>
</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-08-22T23:41:47.281229" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:41:47.281114" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.281095" elapsed="0.000201"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:41:47.282309" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:41:47.281920" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:41:47.282815" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:41:47.282493" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:41:47.282886" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:41:47.283071" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:41:47.281520" 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-08-22T23:41:47.288512" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:41:47.288404" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.288385" 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-08-22T23:41:47.289682" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:41:47.289558" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.289540" elapsed="0.000287"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:41:47.290194" level="INFO">${karaf_connection_index} = 53</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:41:47.289973" elapsed="0.000247"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:41:47.290554" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:41:47.290375" elapsed="0.000223"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:41:47.336755" 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 "2 "[K"</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:41:47.291108" elapsed="0.045797"/>
</kw>
<msg time="2026-08-22T23:41:47.337070" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:41:47.337117" 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-08-22T23:41:47.290755" elapsed="0.046401"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:41:47.340929" 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-08-22T23:41:47.337898" elapsed="0.003091"/>
</kw>
<msg time="2026-08-22T23:41:47.341088" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:41:47.341133" 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-08-22T23:41:47.337411" elapsed="0.003750"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:47.341506" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:47.341254" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.341226" elapsed="0.000380"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:47.342013" 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-08-22T23:41:47.341754" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:47.342341" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:47.342128" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.342110" elapsed="0.000387"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:41:47.342536" 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-08-22T23:41:47.344459" elapsed="0.000233"/>
</kw>
<msg time="2026-08-22T23:41:47.344797" 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-08-22T23:41:47.343826" elapsed="0.001042"/>
</kw>
<kw name="Open 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-08-22T23:41:47.345026" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:47.345187" 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-08-22T23:41:47.343424" elapsed="0.001846"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:41:47.342858" elapsed="0.002459"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:41:47.289259" elapsed="0.056156"/>
</kw>
<msg time="2026-08-22T23:41:47.345510" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:41:47.345553" 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-08-22T23:41:47.288749" elapsed="0.056849"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:41:47.345789" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:41:47.345679" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.345660" 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-08-22T23:41:47.346285" 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-08-22T23:41:47.346649" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:41:47.346722" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:41:47.288069" elapsed="0.058763"/>
</kw>
<msg time="2026-08-22T23:41:47.346927" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:41:47.346976" 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-08-22T23:41:47.283483" elapsed="0.063591"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:47.347430" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:47.347160" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.347141" elapsed="0.000368"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:41:47.283341" elapsed="0.064193"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:41:47.353088" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:41:47.352980" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.352962" 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-08-22T23:41:47.354242" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:41:47.354137" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.354119" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:41:47.354688" level="INFO">${karaf_connection_index} = 35</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:41:47.354450" elapsed="0.000264"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:41:47.355052" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:41:47.354869" elapsed="0.000208"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:41:47.387385" 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 "2 "[K"</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:41:47.355567" elapsed="0.031894"/>
</kw>
<msg time="2026-08-22T23:41:47.387561" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:41:47.387677" 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-08-22T23:41:47.355236" elapsed="0.032482"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:41:47.390395" 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-08-22T23:41:47.388225" elapsed="0.002228"/>
</kw>
<msg time="2026-08-22T23:41:47.390550" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:41:47.390611" 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-08-22T23:41:47.387887" elapsed="0.002752"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:47.390934" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:47.390716" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.390696" elapsed="0.000318"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:47.391437" 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-08-22T23:41:47.391182" 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-08-22T23:41:47.391785" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:47.391553" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.391535" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:41:47.391898" 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-08-22T23:41:47.393559" elapsed="0.000221"/>
</kw>
<msg time="2026-08-22T23:41:47.393878" 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-08-22T23:41:47.393029" elapsed="0.000915"/>
</kw>
<kw name="Open 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-08-22T23:41:47.394100" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:47.394259" 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-08-22T23:41:47.392675" elapsed="0.001664"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:41:47.392159" elapsed="0.002227"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:41:47.353834" elapsed="0.040647"/>
</kw>
<msg time="2026-08-22T23:41:47.394572" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:41:47.394635" 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-08-22T23:41:47.353308" elapsed="0.041355"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:41:47.394844" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:41:47.394739" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.394721" 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-08-22T23:41:47.395331" 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-08-22T23:41:47.395687" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:41:47.395762" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:41:47.352636" elapsed="0.043233"/>
</kw>
<msg time="2026-08-22T23:41:47.395960" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:41:47.396004" 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-08-22T23:41:47.347829" elapsed="0.048202"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:47.396351" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:47.396106" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.396089" elapsed="0.000377"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:41:47.347689" elapsed="0.048800"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:41:47.401889" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:41:47.401779" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.401760" 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-08-22T23:41:47.403039" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:41:47.402934" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.402915" elapsed="0.000211"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:41:47.403489" level="INFO">${karaf_connection_index} = 36</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:41:47.403270" elapsed="0.000246"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:41:47.403859" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:41:47.403688" elapsed="0.000197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:41:47.435782" 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 "2 "[K"</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:41:47.404376" elapsed="0.031482"/>
</kw>
<msg time="2026-08-22T23:41:47.435961" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:41:47.436008" 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-08-22T23:41:47.404045" elapsed="0.032000"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:41:47.439027" 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-08-22T23:41:47.436550" elapsed="0.002556"/>
</kw>
<msg time="2026-08-22T23:41:47.439207" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:41:47.439250" 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-08-22T23:41:47.436213" elapsed="0.003065"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:47.439567" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:47.439352" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.439333" elapsed="0.000331"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:47.440077" 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-08-22T23:41:47.439807" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:47.440615" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:47.440371" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.440175" elapsed="0.000523"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:41:47.440732" 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-08-22T23:41:47.442446" elapsed="0.000216"/>
</kw>
<msg time="2026-08-22T23:41:47.442762" 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-08-22T23:41:47.441880" elapsed="0.000947"/>
</kw>
<kw name="Open 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-08-22T23:41:47.442983" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:47.443163" 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-08-22T23:41:47.441491" elapsed="0.001755"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:41:47.440991" elapsed="0.002301"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:41:47.402632" elapsed="0.040758"/>
</kw>
<msg time="2026-08-22T23:41:47.443481" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:41:47.443525" 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-08-22T23:41:47.402108" elapsed="0.041444"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:41:47.443796" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:41:47.443687" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.443668" 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-08-22T23:41:47.444267" 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-08-22T23:41:47.444629" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:41:47.444703" 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-08-22T23:41:47.401425" elapsed="0.043394"/>
</kw>
<msg time="2026-08-22T23:41:47.444912" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:41:47.444960" 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-08-22T23:41:47.396773" elapsed="0.048216"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:47.445316" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:47.445065" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.445047" elapsed="0.000347"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:41:47.396633" elapsed="0.048785"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:41:47.283159" elapsed="0.162289"/>
</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-08-22T23:41:47.279000" elapsed="0.166507"/>
</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-08-22T23:41:47.447270" 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-08-22T23:41:47.446842" elapsed="0.000456"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:41:47.447798" 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-08-22T23:41:47.447459" elapsed="0.000367"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:41:47.447872" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:41:47.448028" 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-08-22T23:41:47.446421" elapsed="0.001632"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:41:47.449066" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:41:47.448672" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:41:47.449553" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:41:47.449249" elapsed="0.000364"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:41:47.449662" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:41:47.449817" 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-08-22T23:41:47.448273" elapsed="0.001569"/>
</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-08-22T23:41:47.451323" 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-08-22T23:41:47.450926" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:41:47.451841" 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-08-22T23:41:47.451507" elapsed="0.000361"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:41:47.451915" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:41:47.452072" 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-08-22T23:41:47.450528" elapsed="0.001568"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:41:47.453494" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:41:47.453169" elapsed="0.000352"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:41:47.454298" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:41:47.454398" level="INFO">${current_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:41:47.454168" elapsed="0.000257"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:47.457883" elapsed="0.000078"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:47.457175" elapsed="0.000879"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:47.457151" elapsed="0.000932"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:41:47.458358" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:41:47.458529" level="INFO">${current_ssh_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:41:47.458237" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:47.459747" 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.12" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:47.458760" elapsed="0.001053"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:41:47.460790" 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-08-22T23:41:47.459988" elapsed="0.000830"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:41:47.462407" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:41:47.462759" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:41:47.461849" elapsed="0.001012"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:41:47.463208" elapsed="0.000764"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:41:47.465273" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:41:48.056265" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:41:47 UTC 2026

  System load:  0.02               Processes:             121
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:40:04 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:41:47.464931" elapsed="0.591497"/>
</kw>
<msg time="2026-08-22T23:41:48.056599" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:41:47.464272" elapsed="0.592446"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:41:47.461094" elapsed="0.595797"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:41:48.057603" level="INFO">Executing command 'ps axf | grep org.apache.karaf | grep -v grep | awk '{print "kill -9 " $1}' | sh'.</msg>
<msg time="2026-08-22T23:41:48.080163" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:41:48.080470" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:41:48.080569" 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-08-22T23:41:48.057191" elapsed="0.023469"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:41:48.081156" elapsed="0.000490"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:48.083244" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:48.082057" elapsed="0.001284"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:41:48.084043" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:41:48.083553" elapsed="0.000651"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:48.083503" 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-08-22T23:41:48.084720" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-08-22T23:41:48.084445" elapsed="0.000460"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:48.084419" elapsed="0.000528"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:41:48.085000" 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-08-22T23:41:48.091154" elapsed="0.000221"/>
</kw>
<msg time="2026-08-22T23:41:48.091468" 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-08-22T23:41:48.089527" elapsed="0.002139"/>
</kw>
<kw name="Open 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-08-22T23:41:48.092084" elapsed="0.000048"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:48.092445" elapsed="0.000047"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:41:48.085478" elapsed="0.007195"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:41:47.456523" elapsed="0.636247"/>
</kw>
<msg time="2026-08-22T23:41:48.092825" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:41:47.455826" elapsed="0.637052"/>
</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-08-22T23:41:47.455252" elapsed="0.637710"/>
</kw>
<msg time="2026-08-22T23:41:48.093003" 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-08-22T23:41:47.454594" elapsed="0.638457"/>
</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-08-22T23:41:48.096633" elapsed="0.000148"/>
</kw>
<msg time="2026-08-22T23:41:48.096824" 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-08-22T23:41:48.096043" 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="NOT RUN" start="2026-08-22T23:41:48.097060" elapsed="0.000113"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:48.097338" 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-08-22T23:41:48.093345" elapsed="0.004077"/>
</kw>
<msg time="2026-08-22T23:41:48.097517" 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-08-22T23:41:47.453755" elapsed="0.643788"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:48.098014" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:48.097759" elapsed="0.000300"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:41:48.098102" 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-08-22T23:41:47.452744" elapsed="0.645486"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:41:47.452291" elapsed="0.645977"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:41:47.452153" elapsed="0.646151"/>
</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-08-22T23:41:47.450047" elapsed="0.648318"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:41:48.098850" 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-08-22T23:41:48.098520" elapsed="0.000357"/>
</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-08-22T23:41:48.099028" elapsed="0.000216"/>
</kw>
<if>
<branch type="IF" condition="not ${confirm}">
<return>
<value>${updated_index_list}</value>
<status status="NOT RUN" start="2026-08-22T23:41:48.099428" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:41:48.099320" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:48.099300" elapsed="0.000197"/>
</if>
<kw name="Sleep" owner="BuiltIn">
<msg time="2026-08-22T23:41:49.100200" level="INFO">Slept 1 second.</msg>
<msg time="2026-08-22T23:41:49.100346" 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-08-22T23:41:48.099652" elapsed="1.000831"/>
</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-08-22T23:41:49.104331" 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-08-22T23:41:49.103563" elapsed="0.000832"/>
</kw>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:41:49.106316" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:41:49.105879" elapsed="0.000475"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:41:49.107858" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:41:49.108001" level="INFO">${current_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:41:49.107679" elapsed="0.000366"/>
</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-08-22T23:41:49.113803" elapsed="0.000070"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:49.112665" elapsed="0.001279"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:49.112556" elapsed="0.001496"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:41:49.114996" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:41:49.115418" level="INFO">${current_ssh_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:41:49.114441" elapsed="0.001124"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:49.117088" level="INFO">Attempting to execute command "ps axf | grep org.apache.karaf | grep -v grep | wc -l" on remote system "10.30.170.12" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:49.116124" elapsed="0.001268"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:41:49.118835" level="INFO">${conn_id} = 55</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:41:49.117885" elapsed="0.001055"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:41:49.120526" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:41:49.120631" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:41:49.120238" elapsed="0.000421"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:41:49.120881" elapsed="0.000340"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:41:49.122233" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:41:49.448116" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:41:47 UTC 2026

  System load:  0.02               Processes:             121
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:41:48 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:41:49.121904" elapsed="0.326309"/>
</kw>
<msg time="2026-08-22T23:41:49.448278" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:41:49.121439" elapsed="0.326909"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:41:49.119315" elapsed="0.329219"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:41:49.449298" level="INFO">Executing command 'ps axf | grep org.apache.karaf | grep -v grep | wc -l'.</msg>
<msg time="2026-08-22T23:41:49.471737" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:41:49.472436" level="INFO">${stdout} = 0</msg>
<msg time="2026-08-22T23:41:49.472878" 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-08-22T23:41:49.448861" elapsed="0.024239"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:41:49.473759" elapsed="0.001142"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:49.477480" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:49.476295" elapsed="0.001852"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:41:49.479238" elapsed="0.000066"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:41:49.478634" elapsed="0.000770"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:49.478501" elapsed="0.001053"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:41:49.480394" elapsed="0.000095"/>
</return>
<status status="PASS" start="2026-08-22T23:41:49.479986" elapsed="0.000578"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:49.479889" elapsed="0.000837"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:41:49.480884" 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">
<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-08-22T23:41:49.487319" elapsed="0.000317"/>
</kw>
<msg time="2026-08-22T23:41:49.487703" 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-08-22T23:41:49.486280" elapsed="0.001598"/>
</kw>
<kw name="Open 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-08-22T23:41:49.488380" elapsed="0.000062"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:49.488839" elapsed="0.000054"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:41:49.481883" elapsed="0.007190"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:41:49.110815" elapsed="0.378628"/>
</kw>
<msg time="2026-08-22T23:41:49.489635" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:41:49.109793" elapsed="0.379923"/>
</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-08-22T23:41:49.109000" elapsed="0.380836"/>
</kw>
<msg time="2026-08-22T23:41:49.489896" 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-08-22T23:41:49.108262" elapsed="0.381703"/>
</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-08-22T23:41:49.494067" elapsed="0.000173"/>
</kw>
<msg time="2026-08-22T23:41:49.494283" 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-08-22T23:41:49.493479" 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-08-22T23:41:49.494505" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:49.494705" 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-08-22T23:41:49.490395" elapsed="0.004394"/>
</kw>
<msg time="2026-08-22T23:41:49.494953" 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-08-22T23:41:49.106673" elapsed="0.388318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:49.495447" level="INFO">0</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:49.495188" elapsed="0.000305"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:41:49.495544" elapsed="0.000054"/>
</return>
<msg time="2026-08-22T23:41:49.495728" 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-08-22T23:41:49.104875" elapsed="0.390885"/>
</kw>
<return>
<value>${count}</value>
<status status="PASS" start="2026-08-22T23:41:49.495812" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:41:49.495964" 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-08-22T23:41:49.102618" elapsed="0.393372"/>
</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-08-22T23:41:49.496147" elapsed="0.000359"/>
</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-08-22T23:41:49.101647" elapsed="0.394926"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:41:49.101173" elapsed="0.395452"/>
</iter>
<var>${index}</var>
<value>@{kill_index_list}</value>
<status status="PASS" start="2026-08-22T23:41:49.100718" elapsed="0.395943"/>
</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-08-22T23:41:49.499897" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:41:49.499484" elapsed="0.000440"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:41:49.500440" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:41:49.500128" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:41:49.500512" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:41:49.500697" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:41:49.499104" elapsed="0.001623"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:41:49.501802" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:41:49.501511" elapsed="0.000318"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:41:49.502569" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:41:49.502709" level="INFO">${current_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:41:49.502450" 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-08-22T23:41:49.506153" elapsed="0.000078"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:49.505437" elapsed="0.000888"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:49.505417" elapsed="0.000938"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:41:49.506692" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:41:49.506856" level="INFO">${current_ssh_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:41:49.506548" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:49.508094" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.200" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:49.507063" elapsed="0.001097"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:41:49.509115" level="INFO">${conn_id} = 56</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:41:49.508335" elapsed="0.000808"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:41:49.510880" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:41:49.511152" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:41:49.510159" elapsed="0.001094"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:41:49.511547" elapsed="0.000635"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:41:49.513753" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:41:50.097794" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:41:49 UTC 2026

  System load:  0.13               Processes:             122
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:40:03 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:41:49.513392" elapsed="0.584645"/>
</kw>
<msg time="2026-08-22T23:41:50.098283" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:41:49.512485" elapsed="0.585998"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:41:49.509408" elapsed="0.589433"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:41:50.100084" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-08-22T23:41:50.112804" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-08-22T23:41:50.112995" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:41:50.113098" 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-08-22T23:41:50.099349" elapsed="0.013805"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:41:50.113703" elapsed="0.000464"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:50.115912" 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-08-22T23:41:50.114701" elapsed="0.001356"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:41:50.116700" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:41:50.116264" elapsed="0.000674"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:50.116213" elapsed="0.000785"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:41:50.117479" elapsed="0.000063"/>
</return>
<status status="PASS" start="2026-08-22T23:41:50.117124" elapsed="0.000656"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:50.117085" elapsed="0.000757"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:41:50.117922" 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-08-22T23:41:50.125272" elapsed="0.000164"/>
</kw>
<msg time="2026-08-22T23:41:50.125499" 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-08-22T23:41:50.124140" elapsed="0.001501"/>
</kw>
<kw name="Open 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-08-22T23:41:50.125984" elapsed="0.000054"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:50.126325" elapsed="0.000046"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:41:50.118873" elapsed="0.007656"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:41:49.504826" elapsed="0.621844"/>
</kw>
<msg time="2026-08-22T23:41:50.126727" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:41:49.504163" elapsed="0.622622"/>
</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-08-22T23:41:49.503631" elapsed="0.623239"/>
</kw>
<msg time="2026-08-22T23:41:50.126911" 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-08-22T23:41:49.502892" elapsed="0.624068"/>
</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-08-22T23:41:50.130669" elapsed="0.000172"/>
</kw>
<msg time="2026-08-22T23:41:50.130895" 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-08-22T23:41:50.129842" elapsed="0.001127"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:50.131139" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:50.131305" 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-08-22T23:41:50.127270" elapsed="0.004122"/>
</kw>
<msg time="2026-08-22T23:41:50.131493" 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-08-22T23:41:49.502043" elapsed="0.629477"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:50.132205" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:50.131916" elapsed="0.000335"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:41:50.132300" 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-08-22T23:41:49.501106" elapsed="0.631333"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:41:49.500929" elapsed="0.631548"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:41:50.133516" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:41:50.133240" elapsed="0.000370"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:41:50.134384" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:41:50.134601" level="INFO">${current_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:41:50.134245" elapsed="0.000388"/>
</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-08-22T23:41:50.137986" elapsed="0.000078"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:50.137224" elapsed="0.000932"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:50.137200" elapsed="0.000986"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:41:50.138454" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:41:50.138628" level="INFO">${current_ssh_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:41:50.138337" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:50.139804" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.12" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:50.138827" elapsed="0.001042"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:41:50.140876" 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-08-22T23:41:50.140049" elapsed="0.000855"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:41:50.142818" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:41:50.143091" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:41:50.142233" elapsed="0.000960"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:41:50.143496" elapsed="0.000645"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:41:50.145510" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:41:50.471057" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:41:47 UTC 2026

  System load:  0.02               Processes:             121
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:41:49 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:41:50.145183" elapsed="0.326045"/>
</kw>
<msg time="2026-08-22T23:41:50.471388" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:41:50.144455" elapsed="0.327061"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:41:50.141175" elapsed="0.330547"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:41:50.472373" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-08-22T23:41:50.485205" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-08-22T23:41:50.485400" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:41:50.485463" 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-08-22T23:41:50.472004" elapsed="0.013490"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:41:50.485825" elapsed="0.000382"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:50.487921" 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-08-22T23:41:50.486667" elapsed="0.001392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:41:50.488726" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:41:50.488273" elapsed="0.000697"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:50.488217" elapsed="0.000814"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:41:50.489506" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-08-22T23:41:50.489155" elapsed="0.000666"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:50.489120" elapsed="0.000762"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:41:50.489959" 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-08-22T23:41:50.496916" elapsed="0.000151"/>
</kw>
<msg time="2026-08-22T23:41:50.497129" 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-08-22T23:41:50.495983" elapsed="0.001260"/>
</kw>
<kw name="Open 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-08-22T23:41:50.497543" elapsed="0.000070"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:50.497897" elapsed="0.000047"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:41:50.490847" elapsed="0.007253"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:41:50.136571" elapsed="0.361626"/>
</kw>
<msg time="2026-08-22T23:41:50.498251" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:41:50.135878" elapsed="0.362424"/>
</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-08-22T23:41:50.135314" elapsed="0.363081"/>
</kw>
<msg time="2026-08-22T23:41:50.498438" 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-08-22T23:41:50.134794" elapsed="0.363691"/>
</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-08-22T23:41:50.502438" elapsed="0.000176"/>
</kw>
<msg time="2026-08-22T23:41:50.502658" 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-08-22T23:41:50.501705" elapsed="0.001016"/>
</kw>
<kw name="Open 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-08-22T23:41:50.502874" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:50.503033" 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-08-22T23:41:50.498916" elapsed="0.004197"/>
</kw>
<msg time="2026-08-22T23:41:50.503204" 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-08-22T23:41:50.133831" elapsed="0.369397"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:50.503670" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:50.503404" elapsed="0.000308"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:41:50.503755" 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-08-22T23:41:50.132809" elapsed="0.371070"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:41:50.132609" elapsed="0.371307"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:41:50.504949" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:41:50.504656" elapsed="0.000320"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:41:50.505737" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:41:50.505838" level="INFO">${current_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:41:50.505614" 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-08-22T23:41:50.510127" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:50.509417" elapsed="0.000877"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:50.509396" elapsed="0.000926"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:41:50.510611" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:41:50.510768" level="INFO">${current_ssh_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:41:50.510473" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:50.512025" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.79" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:50.511025" elapsed="0.001064"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:41:50.513043" level="INFO">${conn_id} = 58</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:41:50.512261" elapsed="0.000809"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:41:50.514748" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:41:50.515013" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:41:50.514100" elapsed="0.001012"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:41:50.515404" elapsed="0.000714"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:41:50.517421" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:41:51.151653" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:41:50 UTC 2026

  System load:  0.07               Processes:             121
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:40:05 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:41:50.517082" elapsed="0.634736"/>
</kw>
<msg time="2026-08-22T23:41:51.151959" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:41:50.516422" elapsed="0.635654"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:41:50.513334" elapsed="0.638935"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:41:51.152949" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-08-22T23:41:51.165276" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-08-22T23:41:51.165618" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:41:51.165731" 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-08-22T23:41:51.152547" elapsed="0.013241"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:41:51.166280" elapsed="0.000492"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:51.168678" 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-08-22T23:41:51.167191" elapsed="0.001648"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:41:51.169480" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:41:51.169059" elapsed="0.000708"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:51.169002" elapsed="0.000827"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:41:51.170311" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-08-22T23:41:51.169954" elapsed="0.000672"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:51.169919" elapsed="0.000774"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:41:51.170787" 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">
<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-08-22T23:41:51.177243" elapsed="0.000210"/>
</kw>
<msg time="2026-08-22T23:41:51.177538" 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-08-22T23:41:51.175823" elapsed="0.001899"/>
</kw>
<kw name="Open 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-08-22T23:41:51.178125" elapsed="0.000066"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:51.178568" 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-08-22T23:41:51.171608" elapsed="0.007258"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:41:50.508816" elapsed="0.670182"/>
</kw>
<msg time="2026-08-22T23:41:51.179140" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:41:50.508140" elapsed="0.671088"/>
</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-08-22T23:41:50.507598" elapsed="0.671743"/>
</kw>
<msg time="2026-08-22T23:41:51.179397" 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-08-22T23:41:50.506016" elapsed="0.673446"/>
</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-08-22T23:41:51.184160" elapsed="0.000145"/>
</kw>
<msg time="2026-08-22T23:41:51.184347" 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-08-22T23:41:51.183487" elapsed="0.000921"/>
</kw>
<kw name="Open 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-08-22T23:41:51.184561" elapsed="0.000037"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:51.184738" 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-08-22T23:41:51.179909" elapsed="0.004910"/>
</kw>
<msg time="2026-08-22T23:41:51.184912" 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-08-22T23:41:50.505194" elapsed="0.679744"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:51.185368" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:41:51.185117" elapsed="0.000293"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:41:51.185454" 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-08-22T23:41:50.504200" elapsed="0.681395"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:41:50.504017" elapsed="0.681619"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:41:49.500793" elapsed="1.684884"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-08-22T23:41:49.496875" elapsed="1.688866"/>
</kw>
<return>
<value>${updated_index_list}</value>
<status status="PASS" start="2026-08-22T23:41:51.185782" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:41:51.185946" 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-08-22T23:41:47.445872" elapsed="3.740099"/>
</kw>
<return>
<value>${updated_index_list}</value>
<status status="PASS" start="2026-08-22T23:41:51.186024" elapsed="0.000027"/>
</return>
<arg>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-08-22T23:41:47.267039" elapsed="3.919114"/>
</kw>
<doc>Simulate node 2 crashes just before device data is modified, fail if node 2 survives.</doc>
<status status="PASS" start="2026-08-22T23:41:46.998522" elapsed="4.187754"/>
</test>
<test id="s1-s6-t12" name="Modify_Device_Data_With_node2_Down" line="143">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:41:51.190042" elapsed="0.000227"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:41:51.189752" 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-08-22T23:41:51.191350" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:41:51.191239" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:51.191220" 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-08-22T23:41:51.196352" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:41:51.196246" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:51.196228" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:41:51.197414" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:41:51.197030" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:41:51.197921" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:41:51.197612" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:41:51.197993" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:41:51.198148" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:41:51.196655" 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-08-22T23:41:51.203685" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:41:51.203560" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:51.203542" 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-08-22T23:41:51.204903" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:41:51.204797" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:51.204779" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:41:51.205420" level="INFO">${karaf_connection_index} = 53</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:41:51.205117" elapsed="0.000329"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:41:51.205838" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:41:51.205620" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:41:51.262220" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:41:51.206376" elapsed="0.055951"/>
</kw>
<msg time="2026-08-22T23:41:51.262511" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:41:51.262557" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:41:51.206022" elapsed="0.056588"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:41:51.293781" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "n "o "d "e "2 "_ "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-08-22T23:41:51.263132" elapsed="0.030755"/>
</kw>
<msg time="2026-08-22T23:41:51.294048" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:41:51.294094" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "n "o "d "e ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:41:51.262785" elapsed="0.031346"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:51.294445" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:51.294215" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:51.294192" elapsed="0.000334"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:41:51.295023" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "n "o "d "e "2 "_ "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-08-22T23:41:51.294690" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:51.295381" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:51.295167" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:51.295149" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:41:51.295495" 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-08-22T23:41:51.298090" elapsed="0.000153"/>
</kw>
<msg time="2026-08-22T23:41:51.298304" 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-08-22T23:41:51.296990" 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-08-22T23:41:51.298728" elapsed="0.000094"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:51.299080" 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-08-22T23:41:51.296343" elapsed="0.002943"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:41:51.295800" 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-08-22T23:41:51.204477" elapsed="0.094985"/>
</kw>
<msg time="2026-08-22T23:41:51.299557" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:41:51.299637" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "n "o "d "e ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:41:51.203902" elapsed="0.095775"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:41:51.299906" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:41:51.299800" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:51.299780" 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-08-22T23:41:51.300394" 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-08-22T23:41:51.300747" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:41:51.300820" 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-08-22T23:41:51.203218" elapsed="0.097713"/>
</kw>
<msg time="2026-08-22T23:41:51.301024" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:41:51.301068" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "n "o "d "e ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:41:51.198640" elapsed="0.102464"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:41:51.301429" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:41:51.301180" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:51.301162" elapsed="0.000344"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:41:51.198462" elapsed="0.103068"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:41:51.307017" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:41:51.306910" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:51.306891" 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-08-22T23:41:51.308222" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:41:51.308114" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:41:51.308096" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:41:51.308756" level="INFO">${karaf_connection_index} = 35</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:41:51.308431" elapsed="0.000351"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:41:51.309158" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:41:51.308938" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:41:51.309949" 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-08-22T23:41:51.309686" elapsed="0.001049">OSError: Socket is closed</status>
</kw>
<msg time="2026-08-22T23:41:51.310924" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-08-22T23:41:51.310971" 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-08-22T23:41:51.309339" elapsed="0.001655"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:42:01.312133" 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-08-22T23:41:51.311500" elapsed="10.001517">No match found for 'opendaylight-user.*root.*&gt;' in 10 seconds
Output:
.</status>
</kw>
<msg time="2026-08-22T23:42:01.313289" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-08-22T23:42:01.313343" 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-08-22T23:41:51.311162" elapsed="10.002207"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-08-22T23:42:01.314624" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Modify_Device_Data_With_node2_Down"</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-08-22T23:42:01.313858" elapsed="0.000833">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Modify_Device_Data_With_node2_Down"</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:01.313490" elapsed="0.001276">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Modify_Device_Data_With_node2_Down"</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:01.313457" elapsed="0.001346">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Modify_Device_Data_With_node2_Down"</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-08-22T23:42:01.314986" 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-08-22T23:42:01.315228" elapsed="0.000096"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:01.315081" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:01.315061" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-08-22T23:42:01.315426" 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-08-22T23:42:01.318388" elapsed="0.000162"/>
</kw>
<msg time="2026-08-22T23:42:01.318649" 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-08-22T23:42:01.317087" elapsed="0.001701"/>
</kw>
<kw name="Open 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-08-22T23:42:01.319080" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:01.319427" 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-08-22T23:42:01.316382" elapsed="0.003267"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:42:01.315765" elapsed="0.003954"/>
</kw>
<arg>${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-08-22T23:41:51.307809" elapsed="10.011998">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Modify_Device_Data_With_node2_Down"</status>
</kw>
<msg time="2026-08-22T23:42:01.319923" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:42:01.319978" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Modify_Device_Data_With_node2_Down"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:41:51.307233" elapsed="10.012771"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:42:01.320201" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:42:01.320087" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:01.320066" elapsed="0.000204"/>
</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-08-22T23:42:01.321172" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:42:01.321064" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:01.321043" elapsed="0.000197"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:42:01.321520" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:42:01.321703" level="INFO">${current_ssh_connection_object} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:42:01.321393" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:01.322195" level="INFO">{1: 53, 2: 35, 3: 36}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:01.321912" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:01.322666" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:01.322393" elapsed="0.000318"/>
</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-08-22T23:42:01.323244" elapsed="0.000274"/>
</kw>
<msg time="2026-08-22T23:42:01.323641" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:42:01.323689" level="INFO">${old_connection_index} = 35</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-08-22T23:42:01.322869" elapsed="0.000843"/>
</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-08-22T23:42:01.324539" elapsed="0.000218"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:42:01.325890" 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-08-22T23:42:01.325415" elapsed="0.001506">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-08-22T23:42:01.324923" elapsed="0.002100"/>
</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-08-22T23:42:01.327713" 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-08-22T23:42:01.327206" elapsed="0.000957"/>
</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-08-22T23:42:01.324019" elapsed="0.004193"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:01.323790" elapsed="0.004474"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:01.323770" elapsed="0.004520"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:42:01.329215" level="INFO">${ip_address} = 10.30.170.12</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:42:01.328890" elapsed="0.000353"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:42:01.329293" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:42:01.329449" level="INFO">${odl_ip} = 10.30.170.12</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:42:01.328499" elapsed="0.000975"/>
</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-08-22T23:42:01.329697" elapsed="0.000473"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:42:01.330453" level="INFO">index=59
host=10.30.170.12
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-08-22T23:42:01.330556" level="INFO">${karaf_connection_object} = index=59
host=10.30.170.12
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:42:01.330342" elapsed="0.000311"/>
</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-08-22T23:42:01.330807" elapsed="0.002364"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:42:01.333634" level="INFO">Logging into '10.30.170.12:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:42:01.336032" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.12</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-08-22T23:42:01.333343" elapsed="0.003084">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.12</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-08-22T23:42:01.354230" elapsed="0.000505"/>
</kw>
<msg time="2026-08-22T23:42:01.354826" 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-08-22T23:42:01.352159" elapsed="0.002816"/>
</kw>
<kw name="Open 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-08-22T23:42:01.355135" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:01.355298" 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-08-22T23:42:01.337247" elapsed="0.018133"/>
</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-08-22T23:42:01.336724" elapsed="0.018703"/>
</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-08-22T23:42:01.320750" elapsed="0.034759">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.12</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-08-22T23:42:01.355876" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:42:01.355950" 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-08-22T23:41:51.306529" elapsed="10.049527">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.12</status>
</kw>
<msg time="2026-08-22T23:42:01.356166" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:42:01.356211" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.12</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:41:51.301901" elapsed="10.054333"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:01.356669" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:01.356314" elapsed="0.000415"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:01.356295" elapsed="0.000458"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:41:51.301760" elapsed="10.055018"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:42:01.362387" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:42:01.362275" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:01.362255" 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-08-22T23:42:01.363641" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:42:01.363502" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:01.363483" elapsed="0.000228"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:42:01.364197" level="INFO">${karaf_connection_index} = 36</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:42:01.363893" elapsed="0.000330"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:42:01.364614" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:42:01.364379" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:42:01.401021" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:42:01.365153" elapsed="0.035993"/>
</kw>
<msg time="2026-08-22T23:42:01.401351" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:42:01.401399" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:42:01.364816" elapsed="0.036622"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:42:01.421608" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "n "o "d "e "2 "_ "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-08-22T23:42:01.401974" elapsed="0.019741"/>
</kw>
<msg time="2026-08-22T23:42:01.421876" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:42:01.421922" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "n "o "d "e ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:42:01.401629" elapsed="0.020330"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:01.422260" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:01.422039" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:01.422019" elapsed="0.000319"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:01.422817" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "n "o "d "e "2 "_ "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-08-22T23:42:01.422479" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:01.423168" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:01.422951" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:01.422932" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:42:01.423278" 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-08-22T23:42:01.425858" elapsed="0.000149"/>
</kw>
<msg time="2026-08-22T23:42:01.426067" 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-08-22T23:42:01.424748" elapsed="0.001447"/>
</kw>
<kw name="Open 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-08-22T23:42:01.426465" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:01.426824" 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-08-22T23:42:01.424099" elapsed="0.002910"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:42:01.423538" 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="PASS" start="2026-08-22T23:42:01.363198" elapsed="0.063972"/>
</kw>
<msg time="2026-08-22T23:42:01.427261" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:42:01.427305" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "n "o "d "e ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:42:01.362630" elapsed="0.064712"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:42:01.427524" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:42:01.427418" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:01.427399" elapsed="0.000243"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:01.428040" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:01.428367" elapsed="0.000062"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:42:01.428479" 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-08-22T23:42:01.361927" elapsed="0.066705"/>
</kw>
<msg time="2026-08-22T23:42:01.428747" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:42:01.428795" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "n "o "d "e ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:42:01.357057" elapsed="0.071776"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:01.429160" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:01.428909" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:01.428891" elapsed="0.000348"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:42:01.356917" elapsed="0.072346"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:41:51.198279" elapsed="10.231014"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:41:51.195887" elapsed="10.233468"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:41:51.190944" elapsed="10.238472"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:41:51.190478" elapsed="10.238989"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:41:51.187314" elapsed="10.242209"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:42:01.430170" level="INFO">${mapping} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>RESTCONF_ROOT=${RESTCONF_ROOT}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:42:01.429731" elapsed="0.000467"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:01.464669" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:01.464246" elapsed="0.000453"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:01.465467" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:01.465217" elapsed="0.000316">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:01.465644" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:01.464863" elapsed="0.000806"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:01.466227" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:01.465832" elapsed="0.000422"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:42:01.466552" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:42:01.466726" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:42:01.466415" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:01.467160" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:01.466908" 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-08-22T23:42:01.468171" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:01.467910" elapsed="0.000308"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:42:01.468685" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:42:01.468392" elapsed="0.000319"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:42:01.469410" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:42:01.469066" elapsed="0.000370"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:42:01.470402" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:42:01.470038" elapsed="0.000391"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:42:01.470481" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:42:01.470656" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:42:01.469688" elapsed="0.000994"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:42:01.470833" elapsed="0.000281"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:42:01.468935" elapsed="0.002221"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:42:01.471762" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:42:01.471408" elapsed="0.000381"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:42:01.473016" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:42:01.472673" elapsed="0.000370"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:42:01.473095" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:42:01.473256" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:42:01.471974" elapsed="0.001310"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:42:01.473435" elapsed="0.000306"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:42:01.471277" elapsed="0.002506"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:42:01.468764" elapsed="0.005054"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:42:01.473861" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:01.474021" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:42:01.467570" elapsed="0.006477"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:01.467274" elapsed="0.006804"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:01.474252" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:01.474103" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:01.467256" elapsed="0.007085"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:01.475115" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:01.474484" elapsed="0.000660"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:42:01.475193" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:42:01.463615" elapsed="0.011716"/>
</kw>
<msg time="2026-08-22T23:42:01.475386" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:42:01.450938" elapsed="0.024496"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:01.487685" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:01.499981" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:01.512187" elapsed="0.000069"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:01.512426" 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-08-22T23:42:01.512616" 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-08-22T23:42:01.512982" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:01.512840" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:01.512825" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:01.513199" 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-08-22T23:42:01.513363" 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-08-22T23:42:01.513525" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:42:01.512797" elapsed="0.000795"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:42:01.512694" elapsed="0.000926"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:01.513767" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:01.513843" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:01.513961" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:42:01.446611" elapsed="0.067377"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:01.540611" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:01.540205" elapsed="0.000443"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:01.541352" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:01.541146" elapsed="0.000284">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:01.541534" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:01.540812" elapsed="0.000748"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:01.542127" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:01.541738" elapsed="0.000417"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:42:01.542458" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:42:01.542600" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:42:01.542314" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:01.543028" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:01.542782" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:42:01.543438" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:01.543142" elapsed="0.000357"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:01.544237" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:01.543758" elapsed="0.000507"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:01.543558" elapsed="0.000744"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:01.543123" elapsed="0.001201"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:01.544950" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:01.544486" elapsed="0.000493"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:42:01.545030" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:42:01.539557" elapsed="0.005599"/>
</kw>
<msg time="2026-08-22T23:42:01.545208" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:42:01.526874" elapsed="0.018381"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:01.557559" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:01.569708" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:01.581841" 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-08-22T23:42:01.582032" 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-08-22T23:42:01.582202" 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-08-22T23:42:01.582559" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:01.582420" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:01.582405" 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-08-22T23:42:01.582792" 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-08-22T23:42:01.582954" 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-08-22T23:42:01.583114" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:42:01.582377" elapsed="0.000789"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:42:01.582275" 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-08-22T23:42:01.583368" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:01.583447" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:42:01.583565" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:42:01.524192" elapsed="0.059456"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:01.584891" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:01.584656" elapsed="0.000298">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:01.585046" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:01.584304" elapsed="0.000766"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:01.585384" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:01.585140" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:01.585943" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:01.585648" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:01.585466" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:01.585122" elapsed="0.000905"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:01.588352" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:01.586174" elapsed="0.002204"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:42:01.588429" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:42:01.588597" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:42:01.583982" elapsed="0.004642"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:01.590006" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:01.589751" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:01.590437" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:01.590200" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:01.590891" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:01.590644" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:01.591350" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:01.591082" elapsed="0.000311"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:42:01.592218" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:42:01.592022" elapsed="0.000225"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:42:01.592604" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:42:01.592405" elapsed="0.000226"/>
</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-08-22T23:42:01.592775" elapsed="0.000198"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:01.593571" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:01.593156" elapsed="0.000479"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:42:01.593679" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:42:01.593836" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:42:01.591612" elapsed="0.002249"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:42:01.621568" level="INFO">PUT Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Content-Length': '81', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:42:01.621766" level="INFO">PUT Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:42:01.621931" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:42:01.596083" elapsed="0.026208">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:01.593930" elapsed="0.028448">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</branch>
<branch type="ELSE">
<kw name="PUT 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 PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:01.622567" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:01.622412" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-08-22T23:42:01.593913" elapsed="0.028764">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:01.623067" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:01.623200" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:42:01.623162" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:01.623145" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:01.623405" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:01.623472" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:42:01.588950" elapsed="0.034644">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:01.623671" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:42:01.435630" elapsed="0.188135">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:01.624047" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:01.623869" elapsed="0.000245"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:01.623853" elapsed="0.000284"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:01.624170" elapsed="0.000014"/>
</return>
<arg>${directory_with_template_folders}${/}datamod1</arg>
<arg>${mapping}</arg>
<arg>session=node3</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:42:01.431083" elapsed="0.193179">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:02.663530" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:02.663124" elapsed="0.000441"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:02.664411" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:02.664110" elapsed="0.000386">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:02.664694" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:02.663760" elapsed="0.000959"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:02.665276" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:02.664883" elapsed="0.000420"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:42:02.665662" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:42:02.665837" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:42:02.665463" elapsed="0.000401"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:02.666272" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:02.666020" 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-08-22T23:42:02.667555" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:02.667288" elapsed="0.000334"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:42:02.668060" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:42:02.667784" elapsed="0.000302"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:42:02.668824" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:42:02.668457" elapsed="0.000393"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:42:02.669828" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:42:02.669397" elapsed="0.000459"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:42:02.669909" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:42:02.670075" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:42:02.669037" elapsed="0.001064"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:42:02.670253" elapsed="0.000294"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:42:02.668323" elapsed="0.002282"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:42:02.671191" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:42:02.670854" elapsed="0.000364"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:42:02.672129" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:42:02.671775" elapsed="0.000381"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:42:02.672207" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:02.672358" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:42:02.671399" elapsed="0.000984"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:42:02.672531" elapsed="0.000295"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:42:02.670725" elapsed="0.002142"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:42:02.668142" elapsed="0.004759"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:42:02.672946" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:02.673118" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:42:02.666959" elapsed="0.006186"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:02.666398" elapsed="0.006779"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:02.673349" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:02.673203" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:02.666374" elapsed="0.007053"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:02.674201" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:02.673611" elapsed="0.000618"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:42:02.674278" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:42:02.662484" elapsed="0.011918"/>
</kw>
<msg time="2026-08-22T23:42:02.674495" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:42:02.649790" elapsed="0.024755"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:02.687043" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:02.699506" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:02.712008" 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-08-22T23:42:02.712201" 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-08-22T23:42:02.712390" 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-08-22T23:42:02.712772" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:02.712627" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:02.712612" 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-08-22T23:42:02.712988" 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-08-22T23:42:02.713167" 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-08-22T23:42:02.713346" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:42:02.712567" elapsed="0.000833"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:42:02.712464" 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-08-22T23:42:02.713569" elapsed="0.000040"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:02.713665" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:42:02.713785" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:42:02.645472" elapsed="0.068340"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:02.740214" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:02.739824" elapsed="0.000452"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:02.741026" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:02.740791" elapsed="0.000301">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:02.741201" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:02.740442" elapsed="0.000784"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:02.741789" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:02.741386" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:42:02.742110" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:42:02.742251" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:42:02.741974" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:02.742698" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:02.742437" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:42:02.743102" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:02.742813" elapsed="0.000347"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:02.743657" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:02.743346" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:02.743185" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:02.742794" elapsed="0.000960"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:02.744347" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:02.743899" elapsed="0.000477"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:42:02.744425" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:42:02.739187" elapsed="0.005365"/>
</kw>
<msg time="2026-08-22T23:42:02.744620" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:42:02.726568" elapsed="0.018100"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:02.758694" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:02.770964" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:02.783241" 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-08-22T23:42:02.783482" 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-08-22T23:42:02.783686" 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-08-22T23:42:02.784059" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:02.783917" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:02.783902" 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-08-22T23:42:02.784292" 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-08-22T23:42:02.784455" 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-08-22T23:42:02.784646" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:42:02.783872" elapsed="0.000830"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:42:02.783765" elapsed="0.000964"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:02.784873" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:02.784951" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:42:02.785074" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:42:02.723873" elapsed="0.061228"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:02.786401" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:02.786137" elapsed="0.000330">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:02.786561" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:02.785788" elapsed="0.000812"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:02.786919" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:02.786672" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:02.787483" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:02.787175" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:02.787000" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:02.786654" elapsed="0.000911"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:02.789938" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:02.787729" elapsed="0.002236"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:42:02.790016" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:42:02.790169" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:42:02.785444" elapsed="0.004750"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:02.791552" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:02.791303" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:02.792005" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:02.791766" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:02.792445" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:02.792201" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:02.792931" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:02.792686" elapsed="0.000289"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:42:02.793865" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:42:02.793649" elapsed="0.000243"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:42:02.794220" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:42:02.794043" 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-08-22T23:42:02.794393" elapsed="0.000219"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:02.795013" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:02.794767" elapsed="0.000306"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:42:02.795117" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:42:02.795273" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:42:02.793211" 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="PUT On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:42:02.807643" level="INFO">PUT Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Content-Length': '81', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:42:02.807860" level="INFO">PUT Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:42:02.808018" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:42:02.797678" elapsed="0.010881">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:02.795368" elapsed="0.013338">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</branch>
<branch type="ELSE">
<kw name="PUT 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 PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:02.808972" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:02.808755" elapsed="0.000314"/>
</branch>
<status status="FAIL" start="2026-08-22T23:42:02.795350" elapsed="0.013754">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:02.809658" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:02.809843" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:42:02.809791" elapsed="0.000110"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:02.809768" elapsed="0.000164"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:02.810130" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:02.810244" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:42:02.790512" elapsed="0.019880">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:02.810495" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:42:02.634525" elapsed="0.176122">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:02.811110" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:02.810858" elapsed="0.000346"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:02.810834" elapsed="0.000421"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:02.811303" elapsed="0.000021"/>
</return>
<arg>${directory_with_template_folders}${/}datamod1</arg>
<arg>${mapping}</arg>
<arg>session=node3</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:42:02.625250" elapsed="0.186191">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:03.853770" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:03.853339" elapsed="0.000472"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:03.854665" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:03.854337" elapsed="0.000418">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:03.854855" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:03.853992" elapsed="0.000888"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:03.855438" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:03.855047" elapsed="0.000419"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:42:03.855794" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:42:03.855971" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:42:03.855644" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:03.856432" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:03.856154" 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-08-22T23:42:03.857807" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:03.857258" elapsed="0.000596"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:42:03.858307" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:42:03.858022" elapsed="0.000311"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:42:03.859140" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:42:03.858752" elapsed="0.000414"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:42:03.860095" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:42:03.859729" elapsed="0.000393"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:42:03.860181" elapsed="0.000040"/>
</return>
<msg time="2026-08-22T23:42:03.860381" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:42:03.859357" elapsed="0.001051"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:42:03.860567" elapsed="0.000323"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:42:03.858611" elapsed="0.002321"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:42:03.861512" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:42:03.861179" elapsed="0.000361"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:42:03.862437" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:42:03.862090" elapsed="0.000375"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:42:03.862606" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:42:03.862764" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:42:03.861748" elapsed="0.001041"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:42:03.862940" elapsed="0.000279"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:42:03.861048" elapsed="0.002214"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:42:03.858398" elapsed="0.004899"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:42:03.863342" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:03.863501" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:42:03.856924" elapsed="0.006604"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:03.856607" elapsed="0.006953"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:03.863781" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:03.863629" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:03.856548" elapsed="0.007312"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:03.864667" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:03.864004" elapsed="0.000693"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:42:03.864746" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:42:03.852711" elapsed="0.012168"/>
</kw>
<msg time="2026-08-22T23:42:03.864935" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:42:03.839859" elapsed="0.025126"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:03.877343" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:03.889653" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:03.901885" 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-08-22T23:42:03.902082" 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-08-22T23:42:03.902253" 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-08-22T23:42:03.902637" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:03.902476" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:03.902462" 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-08-22T23:42:03.902861" 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-08-22T23:42:03.903070" 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-08-22T23:42:03.903236" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:42:03.902433" elapsed="0.000855"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:42:03.902330" 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-08-22T23:42:03.903458" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:03.903534" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:42:03.903672" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:42:03.835490" elapsed="0.068211"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:03.930747" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:03.930205" elapsed="0.000572"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:03.931511" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:03.931282" elapsed="0.000309">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:03.931689" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:03.930939" elapsed="0.000775"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:03.932294" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:03.931902" elapsed="0.000419"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:42:03.932632" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:42:03.932829" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:42:03.932480" elapsed="0.000377"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:03.933263" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:03.933015" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:42:03.933696" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:03.933378" elapsed="0.000378"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:03.934221" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:03.933925" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:03.933781" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:03.933359" elapsed="0.000946"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:03.934909" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:03.934450" elapsed="0.000488"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:42:03.934987" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:42:03.929551" elapsed="0.005563"/>
</kw>
<msg time="2026-08-22T23:42:03.935201" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:42:03.916638" elapsed="0.018613"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:03.947539" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:03.959892" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:03.972411" 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-08-22T23:42:03.972620" 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-08-22T23:42:03.972794" 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-08-22T23:42:03.973154" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:03.973013" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:03.972998" elapsed="0.000234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:03.973370" 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-08-22T23:42:03.973534" 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-08-22T23:42:03.973713" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:42:03.972970" elapsed="0.000796"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:42:03.972868" elapsed="0.000924"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:03.973934" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:03.974008" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:42:03.974127" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:42:03.913975" elapsed="0.060179"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:03.975419" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:03.975173" elapsed="0.000308">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:03.975607" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:03.974829" elapsed="0.000806"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:03.975994" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:03.975707" elapsed="0.000346"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:03.976557" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:03.976254" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:03.976078" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:03.975688" elapsed="0.000972"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:03.978990" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:03.976811" elapsed="0.002206"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:42:03.979069" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:42:03.979224" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:42:03.974488" elapsed="0.004761"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:03.980678" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:03.980412" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:03.981113" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:03.980875" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:03.981550" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:03.981306" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:03.982000" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:03.981757" elapsed="0.000286"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:42:03.982858" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:42:03.982661" elapsed="0.000223"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:42:03.983208" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:42:03.983033" elapsed="0.000201"/>
</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-08-22T23:42:03.983379" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:03.984026" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:03.983769" elapsed="0.000302"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:42:03.984113" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:42:03.984268" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:42:03.982242" elapsed="0.002051"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:42:03.995258" level="INFO">PUT Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Content-Length': '81', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:42:03.995443" level="INFO">PUT Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:42:03.995548" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:42:03.986627" elapsed="0.009330">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:03.984366" elapsed="0.011679">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</branch>
<branch type="ELSE">
<kw name="PUT 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 PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:03.996234" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:03.996080" elapsed="0.000274"/>
</branch>
<status status="FAIL" start="2026-08-22T23:42:03.984347" elapsed="0.012036">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:03.996779" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:03.996912" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:42:03.996874" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:03.996857" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:03.997119" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:03.997187" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:42:03.979616" elapsed="0.017677">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:03.997368" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:42:03.824361" elapsed="0.173102">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:03.997772" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:03.997572" elapsed="0.000268"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:03.997554" elapsed="0.000311"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:03.997899" elapsed="0.000014"/>
</return>
<arg>${directory_with_template_folders}${/}datamod1</arg>
<arg>${mapping}</arg>
<arg>session=node3</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:42:03.813756" elapsed="0.184237">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:05.033348" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:05.032922" elapsed="0.000475"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:05.034258" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:05.033953" elapsed="0.000395">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:05.034453" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:05.033602" elapsed="0.000876"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:05.035057" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:05.034666" elapsed="0.000419"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:42:05.035395" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:42:05.035643" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:42:05.035246" elapsed="0.000424"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:05.036086" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:05.035832" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:05.037251" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:05.036987" elapsed="0.000311"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:42:05.037762" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:42:05.037459" elapsed="0.000330"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:42:05.038552" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:42:05.038189" elapsed="0.000412"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:42:05.039506" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:42:05.039141" elapsed="0.000391"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:42:05.039607" elapsed="0.000043"/>
</return>
<msg time="2026-08-22T23:42:05.039798" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:42:05.038794" elapsed="0.001029"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:42:05.039978" elapsed="0.000313"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:42:05.038050" elapsed="0.002282"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:42:05.040973" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:42:05.040641" elapsed="0.000358"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:42:05.041889" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:42:05.041525" elapsed="0.000391"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:42:05.041967" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:42:05.042118" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:42:05.041184" elapsed="0.000959"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:42:05.042291" elapsed="0.000275"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:42:05.040456" elapsed="0.002175"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:42:05.037855" elapsed="0.004812"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:42:05.042715" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:05.042876" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:42:05.036659" elapsed="0.006243"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:05.036313" elapsed="0.006621"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:05.043117" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:05.042962" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:05.036280" elapsed="0.006917"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:05.043995" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:05.043346" elapsed="0.000677"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:42:05.044073" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:42:05.032231" elapsed="0.011969"/>
</kw>
<msg time="2026-08-22T23:42:05.044256" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:42:05.018948" elapsed="0.025358"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:05.056838" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:05.070503" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:05.083192" 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-08-22T23:42:05.083473" 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-08-22T23:42:05.083686" 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-08-22T23:42:05.084189" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:05.084026" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:05.084003" elapsed="0.000276"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:05.084454" 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-08-22T23:42:05.084645" 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-08-22T23:42:05.084812" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:42:05.083949" elapsed="0.000917"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:42:05.083789" 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-08-22T23:42:05.085046" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:05.085133" elapsed="0.000022"/>
</return>
<msg time="2026-08-22T23:42:05.085338" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:42:05.014663" elapsed="0.070707"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:05.112180" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:05.111732" elapsed="0.000484"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:05.113182" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:05.112892" elapsed="0.000377">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:05.113364" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:05.112387" elapsed="0.001005"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:05.113961" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:05.113559" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:42:05.114294" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:42:05.114541" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:42:05.114148" elapsed="0.000421"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:05.115005" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:05.114750" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:42:05.115459" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:05.115140" elapsed="0.000380"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:05.116010" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:05.115711" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:05.115549" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:05.115113" elapsed="0.000997"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:05.116748" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:05.116263" elapsed="0.000514"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:42:05.116831" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:42:05.111094" elapsed="0.005881"/>
</kw>
<msg time="2026-08-22T23:42:05.117030" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:42:05.098350" elapsed="0.018728"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:05.129628" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:05.141883" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:05.154014" 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-08-22T23:42:05.154246" 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-08-22T23:42:05.154428" elapsed="0.000019"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:05.154902" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:05.154748" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:05.154727" 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-08-22T23:42:05.155130" 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-08-22T23:42:05.155293" 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-08-22T23:42:05.155453" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:42:05.154679" elapsed="0.000917"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:42:05.154522" 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-08-22T23:42:05.155783" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:05.155874" elapsed="0.000022"/>
</return>
<msg time="2026-08-22T23:42:05.156046" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:42:05.095497" elapsed="0.060581"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:05.157597" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:05.157244" elapsed="0.000440">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:05.157780" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:05.156821" 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-08-22T23:42:05.158144" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:05.157875" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:05.158728" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:05.158411" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:05.158224" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:05.157857" elapsed="0.000954"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:05.161154" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:05.158959" elapsed="0.002221"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:42:05.161232" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:42:05.161389" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:42:05.156431" elapsed="0.004984"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:05.162843" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:05.162566" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:05.163279" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:05.163042" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:05.163734" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:05.163473" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:05.164183" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:05.163941" elapsed="0.000286"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:42:05.165065" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:42:05.164849" elapsed="0.000242"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:42:05.165419" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:42:05.165242" 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-08-22T23:42:05.165606" elapsed="0.000225"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:05.166229" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:05.165983" elapsed="0.000290"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:42:05.166315" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:05.166469" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:42:05.164426" 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="PUT On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:42:05.177749" level="INFO">PUT Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Content-Length': '81', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:42:05.177968" level="INFO">PUT Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:42:05.178118" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:42:05.168879" elapsed="0.009695">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:05.166630" elapsed="0.012075">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</branch>
<branch type="ELSE">
<kw name="PUT 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 PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:05.179020" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:05.178757" elapsed="0.000336"/>
</branch>
<status status="FAIL" start="2026-08-22T23:42:05.166610" elapsed="0.012510">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:05.179649" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:05.179852" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:42:05.179803" elapsed="0.000099"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:05.179778" elapsed="0.000146"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:05.180073" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:05.180141" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:42:05.161774" elapsed="0.018489">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:05.180342" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:42:05.003812" elapsed="0.176749">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:05.181254" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:05.180850" elapsed="0.000557"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:05.180811" elapsed="0.000649"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:05.181534" elapsed="0.000031"/>
</return>
<arg>${directory_with_template_folders}${/}datamod1</arg>
<arg>${mapping}</arg>
<arg>session=node3</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:42:04.998892" elapsed="0.182887">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:06.220263" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:06.219866" elapsed="0.000433"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:06.221086" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:06.220822" elapsed="0.000344">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:06.221260" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:06.220471" elapsed="0.000814"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:06.221857" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:06.221446" elapsed="0.000439"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:42:06.222186" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:42:06.222348" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:42:06.222044" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:06.222794" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:06.222532" 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-08-22T23:42:06.223811" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:06.223536" elapsed="0.000320"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:42:06.224284" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:42:06.224013" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:42:06.225053" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:42:06.224694" elapsed="0.000385"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:42:06.226013" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:42:06.225625" elapsed="0.000414"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:42:06.226094" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:42:06.226260" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:42:06.225263" elapsed="0.001022"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:42:06.226436" elapsed="0.000314"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:42:06.224544" elapsed="0.002248"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:42:06.227353" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:42:06.227034" elapsed="0.000345"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:42:06.228264" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:42:06.227923" elapsed="0.000367"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:42:06.228341" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:06.228491" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:42:06.227559" elapsed="0.000957"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:42:06.228683" elapsed="0.000272"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:42:06.226906" elapsed="0.002091"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:42:06.224365" elapsed="0.004667"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:42:06.229076" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:42:06.229232" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:42:06.223219" elapsed="0.006040"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:06.222918" elapsed="0.006373"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:06.229462" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:06.229317" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:06.222894" elapsed="0.006713"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:06.230449" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:06.229838" elapsed="0.000639"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:42:06.230527" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:42:06.219233" elapsed="0.011447"/>
</kw>
<msg time="2026-08-22T23:42:06.230735" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:42:06.206571" elapsed="0.024212"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:06.243217" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:06.255498" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:06.267703" 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-08-22T23:42:06.267897" 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-08-22T23:42:06.268100" 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-08-22T23:42:06.268461" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:06.268320" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:06.268305" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:06.268694" 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-08-22T23:42:06.268860" 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-08-22T23:42:06.269021" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:42:06.268277" elapsed="0.000796"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:42:06.268175" elapsed="0.000923"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:06.269240" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:06.269316" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:06.269437" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:42:06.202273" elapsed="0.067192"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:06.295734" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:06.295330" elapsed="0.000433"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:06.296505" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:06.296253" elapsed="0.000341">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:06.296691" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:06.295923" elapsed="0.000792"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:06.297255" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:06.296874" elapsed="0.000407"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:42:06.297623" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:42:06.297769" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:42:06.297463" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:06.298204" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:06.297956" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:42:06.298639" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:06.298321" elapsed="0.000378"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:06.299160" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:06.298867" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:06.298724" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:06.298301" elapsed="0.000942"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:06.299851" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:06.299387" elapsed="0.000492"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:42:06.299928" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:42:06.294719" elapsed="0.005335"/>
</kw>
<msg time="2026-08-22T23:42:06.300107" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:42:06.282270" elapsed="0.017882"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:06.314038" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:06.326232" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:06.338640" 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-08-22T23:42:06.338858" 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-08-22T23:42:06.339033" 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-08-22T23:42:06.339406" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:06.339265" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:06.339250" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:06.339640" 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-08-22T23:42:06.339805" 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-08-22T23:42:06.339965" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:42:06.339219" elapsed="0.000855"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:42:06.339111" elapsed="0.000991"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:06.340248" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:06.340324" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:42:06.340452" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:42:06.279617" elapsed="0.060863"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:06.341830" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:06.341551" elapsed="0.000348">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:06.341992" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:06.341188" 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-08-22T23:42:06.342332" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:06.342086" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:06.342901" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:06.342603" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:06.342412" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:06.342068" elapsed="0.000916"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:06.345347" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:06.343131" elapsed="0.002243"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:42:06.345431" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:42:06.345610" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:42:06.340837" elapsed="0.004800"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:06.347010" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:06.346760" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:06.347505" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:06.347209" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:06.347967" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:06.347720" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:06.348400" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:06.348159" elapsed="0.000287"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:42:06.349405" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:42:06.349199" elapsed="0.000231"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:42:06.349777" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:42:06.349598" 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-08-22T23:42:06.349948" elapsed="0.000218"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:06.350567" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:06.350319" elapsed="0.000310"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:42:06.350672" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:42:06.350829" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:42:06.348661" 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="PUT On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:42:06.361155" level="INFO">PUT Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Content-Length': '81', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:42:06.361342" level="INFO">PUT Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:42:06.361466" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:42:06.353171" elapsed="0.008711">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:06.350924" elapsed="0.011046">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</branch>
<branch type="ELSE">
<kw name="PUT 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 PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:06.362158" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:06.362004" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:42:06.350906" elapsed="0.011344">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:06.362641" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:06.362774" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:42:06.362736" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:06.362719" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:06.362978" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:06.363046" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:42:06.345962" elapsed="0.017189">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:06.363260" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:42:06.191600" elapsed="0.171759">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:06.363665" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:06.363469" elapsed="0.000267"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:06.363452" elapsed="0.000308"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:06.363794" elapsed="0.000014"/>
</return>
<arg>${directory_with_template_folders}${/}datamod1</arg>
<arg>${mapping}</arg>
<arg>session=node3</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:42:06.182956" elapsed="0.180933">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:07.414702" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:07.414240" elapsed="0.000499"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:07.415612" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:07.415288" elapsed="0.000412">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:07.415798" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:07.414919" elapsed="0.000910"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:07.416508" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:07.416049" elapsed="0.000487"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:42:07.416866" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:42:07.417036" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:42:07.416716" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:07.417530" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:07.417236" 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-08-22T23:42:07.418923" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:07.418352" elapsed="0.000618"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:42:07.419453" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:42:07.419133" elapsed="0.000348"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:42:07.420249" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:42:07.419890" elapsed="0.000386"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:42:07.421243" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:42:07.420879" elapsed="0.000391"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:42:07.421341" elapsed="0.000048"/>
</return>
<msg time="2026-08-22T23:42:07.421532" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:42:07.420503" elapsed="0.001054"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:42:07.421730" elapsed="0.000298"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:42:07.419738" elapsed="0.002333"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:42:07.422766" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:42:07.422401" elapsed="0.000392"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:42:07.423696" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:42:07.423321" elapsed="0.000403"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:42:07.423774" elapsed="0.000061"/>
</return>
<msg time="2026-08-22T23:42:07.423984" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:42:07.422980" elapsed="0.001034"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:42:07.424193" elapsed="0.000293"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:42:07.422248" elapsed="0.002281"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:42:07.419539" elapsed="0.005026"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:42:07.424635" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:42:07.424799" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:42:07.418000" elapsed="0.006825"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:07.417679" elapsed="0.007178"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:07.425033" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:07.424883" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:07.417653" elapsed="0.007458"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:07.425903" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:07.425254" elapsed="0.000676"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:42:07.425979" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:42:07.413566" elapsed="0.012539"/>
</kw>
<msg time="2026-08-22T23:42:07.426160" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:42:07.395712" elapsed="0.030497"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:07.438979" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:07.451626" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:07.464449" 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-08-22T23:42:07.464683" 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-08-22T23:42:07.464867" 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-08-22T23:42:07.465423" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:07.465265" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:07.465243" 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-08-22T23:42:07.465672" 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-08-22T23:42:07.465848" 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-08-22T23:42:07.466012" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:42:07.465191" elapsed="0.000893"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:42:07.465034" elapsed="0.001102"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:07.466303" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:07.466384" elapsed="0.000019"/>
</return>
<msg time="2026-08-22T23:42:07.466553" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:42:07.389510" elapsed="0.077089"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:07.493944" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:07.493497" elapsed="0.000477"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:07.494814" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:07.494479" elapsed="0.000421">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:07.494996" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:07.494141" elapsed="0.000879"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:07.495644" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:07.495185" elapsed="0.000492"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:42:07.496031" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:42:07.496195" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:42:07.495871" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:07.496648" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:07.496378" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:42:07.497070" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:07.496767" elapsed="0.000362"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:07.497611" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:07.497296" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:07.497154" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:07.496748" elapsed="0.000948"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:07.498305" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:07.497840" elapsed="0.000493"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:42:07.498384" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:42:07.492864" elapsed="0.005649"/>
</kw>
<msg time="2026-08-22T23:42:07.498634" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:42:07.479961" elapsed="0.018724"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:07.511214" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:07.523714" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:07.536213" 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-08-22T23:42:07.536410" 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-08-22T23:42:07.536596" 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-08-22T23:42:07.536976" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:07.536832" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:07.536816" 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-08-22T23:42:07.537195" 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-08-22T23:42:07.537359" 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-08-22T23:42:07.537529" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:42:07.536786" elapsed="0.000809"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:42:07.536677" 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-08-22T23:42:07.537770" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:07.537846" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:42:07.537970" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:42:07.477196" elapsed="0.060801"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:07.539291" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:07.539021" elapsed="0.000382">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:07.539498" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:07.538675" elapsed="0.000848"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:07.539862" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:07.539612" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:07.540420" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:07.540123" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:07.539945" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:07.539592" elapsed="0.000913"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:07.542842" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:07.540671" elapsed="0.002198"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:42:07.542921" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:42:07.543077" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:42:07.538331" elapsed="0.004771"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:07.544703" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:07.544430" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:07.545145" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:07.544904" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:07.545600" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:07.545339" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:07.546040" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:07.545795" elapsed="0.000289"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:42:07.546921" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:42:07.546712" elapsed="0.000235"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:42:07.547308" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:42:07.547104" elapsed="0.000232"/>
</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-08-22T23:42:07.547484" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:07.548122" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:07.547875" elapsed="0.000292"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:42:07.548210" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:42:07.548365" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:42:07.546293" elapsed="0.002098"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:42:07.558998" level="INFO">PUT Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Content-Length': '81', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:42:07.559171" level="INFO">PUT Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:42:07.559318" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:42:07.550705" elapsed="0.009066">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:07.548459" elapsed="0.011451">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</branch>
<branch type="ELSE">
<kw name="PUT 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 PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:07.560122" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:07.559948" elapsed="0.000243"/>
</branch>
<status status="FAIL" start="2026-08-22T23:42:07.548442" elapsed="0.011773">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:07.560632" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:07.560770" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:42:07.560731" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:07.560712" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:07.560979" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:07.561047" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:42:07.543614" elapsed="0.017540">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:07.561229" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:42:07.373075" elapsed="0.188250">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:07.561642" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:07.561434" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:07.561417" elapsed="0.000318"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:07.561768" elapsed="0.000014"/>
</return>
<arg>${directory_with_template_folders}${/}datamod1</arg>
<arg>${mapping}</arg>
<arg>session=node3</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:42:07.365033" elapsed="0.196833">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:08.604874" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:08.604459" elapsed="0.000452"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:08.605703" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:08.605419" elapsed="0.000363">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:08.605876" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:08.605083" elapsed="0.000818"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:08.606444" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:08.606061" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:42:08.606810" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:42:08.607058" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:42:08.606645" elapsed="0.000440"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:08.607490" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:08.607242" 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-08-22T23:42:08.608528" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:08.608267" elapsed="0.000327"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:42:08.609030" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:42:08.608756" elapsed="0.000308"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:42:08.609802" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:42:08.609431" elapsed="0.000397"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:42:08.610744" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:42:08.610351" elapsed="0.000420"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:42:08.610825" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:42:08.610989" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:42:08.610012" elapsed="0.001002"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:42:08.611164" elapsed="0.000294"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:42:08.609298" elapsed="0.002206"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:42:08.612094" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:42:08.611775" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:42:08.613001" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:42:08.612659" elapsed="0.000389"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:42:08.613109" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:42:08.613272" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:42:08.612302" elapsed="0.000994"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:42:08.613457" elapsed="0.000314"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:42:08.611636" elapsed="0.002177"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:42:08.609120" elapsed="0.004728"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:42:08.613891" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:08.614047" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:42:08.607937" elapsed="0.006137"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:08.607634" elapsed="0.006471"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:08.614276" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:08.614131" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:08.607608" elapsed="0.006743"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:08.615116" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:08.614493" elapsed="0.000652"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:42:08.615194" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:42:08.603846" elapsed="0.011471"/>
</kw>
<msg time="2026-08-22T23:42:08.615376" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:42:08.591022" elapsed="0.024414"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:08.627908" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:08.640221" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:08.652659" 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-08-22T23:42:08.652868" 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-08-22T23:42:08.653042" 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-08-22T23:42:08.653406" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:08.653264" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:08.653250" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:08.653637" 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-08-22T23:42:08.653804" 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-08-22T23:42:08.653965" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:42:08.653221" elapsed="0.000796"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:42:08.653117" elapsed="0.000926"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:08.654185" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:08.654261" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:08.654386" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:42:08.586763" elapsed="0.067651"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:08.680549" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:08.680176" elapsed="0.000415"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:08.681309" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:08.681081" elapsed="0.000296">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:08.681470" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:08.680754" elapsed="0.000740"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:08.682054" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:08.681669" elapsed="0.000468"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:42:08.682474" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:42:08.682628" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:42:08.682304" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:08.683065" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:08.682817" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:42:08.683478" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:08.683187" elapsed="0.000350"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:08.684016" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:08.683723" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:08.683562" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:08.683162" elapsed="0.000938"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:08.684700" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:08.684241" elapsed="0.000488"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:42:08.684778" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:42:08.679556" elapsed="0.005347"/>
</kw>
<msg time="2026-08-22T23:42:08.684956" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:42:08.667190" elapsed="0.017812"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:08.697322" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:08.709564" elapsed="0.000038"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:08.721711" 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-08-22T23:42:08.721900" 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-08-22T23:42:08.722072" 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-08-22T23:42:08.722445" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:08.722304" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:08.722289" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:08.722677" 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-08-22T23:42:08.722879" 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-08-22T23:42:08.723044" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:42:08.722261" elapsed="0.000836"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:42:08.722145" 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-08-22T23:42:08.723263" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:08.723338" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:42:08.723454" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:42:08.664477" elapsed="0.059005"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:08.724728" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:08.724477" elapsed="0.000315">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:08.724883" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:08.724144" elapsed="0.000764"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:08.725217" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:08.724977" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:08.725803" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:08.725480" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:08.725303" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:08.724959" elapsed="0.000928"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:08.728236" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:08.726038" elapsed="0.002225"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:42:08.728314" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:42:08.728468" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:42:08.723824" elapsed="0.004669"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:08.729881" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:08.729634" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:08.730340" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:08.730076" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:08.730793" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:08.730532" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:08.731218" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:08.730981" elapsed="0.000279"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:42:08.732073" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:42:08.731876" elapsed="0.000223"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:42:08.732419" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:42:08.732246" 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-08-22T23:42:08.732603" elapsed="0.000199"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:08.733194" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:08.732951" elapsed="0.000323"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:42:08.733319" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:08.733474" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:42:08.731456" elapsed="0.002043"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:42:08.745357" level="INFO">PUT Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Content-Length': '81', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:42:08.745537" level="INFO">PUT Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:42:08.745663" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:42:08.735812" elapsed="0.010227">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:08.733568" elapsed="0.012587">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</branch>
<branch type="ELSE">
<kw name="PUT 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 PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:08.746343" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:08.746191" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-08-22T23:42:08.733551" elapsed="0.012887">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:08.746891" elapsed="0.000069"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:08.747198" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:42:08.747115" elapsed="0.000173"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:08.747077" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:08.747678" elapsed="0.000049"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:08.747829" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:42:08.728838" elapsed="0.019216">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:08.748216" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:42:08.572328" elapsed="0.176093">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:08.749106" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:08.748716" elapsed="0.000539"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:08.748678" elapsed="0.000628"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:08.749379" elapsed="0.000032"/>
</return>
<arg>${directory_with_template_folders}${/}datamod1</arg>
<arg>${mapping}</arg>
<arg>session=node3</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:42:08.562926" elapsed="0.186694">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:09.789071" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:09.788673" elapsed="0.000441"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:09.789919" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:09.789640" elapsed="0.000373">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:09.790111" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:09.789287" elapsed="0.000849"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:09.790728" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:09.790322" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:42:09.791059" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:42:09.791230" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:42:09.790915" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:09.791682" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:09.791413" 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-08-22T23:42:09.792711" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:09.792435" elapsed="0.000322"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:42:09.793187" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:42:09.792914" elapsed="0.000299"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:42:09.793957" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:42:09.793605" elapsed="0.000378"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:42:09.794898" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:42:09.794521" elapsed="0.000404"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:42:09.794980" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:42:09.795145" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:42:09.794168" elapsed="0.001002"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:42:09.795322" elapsed="0.000314"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:42:09.793450" elapsed="0.002227"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:42:09.796246" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:42:09.795927" elapsed="0.000345"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:42:09.797149" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:42:09.796814" elapsed="0.000362"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:42:09.797225" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:42:09.797376" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:42:09.796455" elapsed="0.000945"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:42:09.797546" elapsed="0.000288"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:42:09.795798" elapsed="0.002077"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:42:09.793269" elapsed="0.004640"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:42:09.798018" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:42:09.798179" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:42:09.792113" elapsed="0.006092"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:09.791809" elapsed="0.006443"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:09.798438" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:09.798279" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:09.791784" elapsed="0.006732"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:09.799275" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:09.798682" elapsed="0.000621"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:42:09.799352" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:42:09.788046" elapsed="0.011429"/>
</kw>
<msg time="2026-08-22T23:42:09.799530" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:42:09.775358" elapsed="0.024250"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:09.812070" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:09.824091" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:09.836186" 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-08-22T23:42:09.836375" 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-08-22T23:42:09.836544" 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-08-22T23:42:09.836920" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:09.836775" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:09.836761" 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-08-22T23:42:09.837137" 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-08-22T23:42:09.837300" 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-08-22T23:42:09.837461" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:42:09.836733" elapsed="0.000780"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:42:09.836633" elapsed="0.000905"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:09.837698" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:09.837812" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:42:09.837933" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:42:09.771154" elapsed="0.066805"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:09.863862" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:09.863472" elapsed="0.000419"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:09.864595" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:09.864375" elapsed="0.000284">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:09.864751" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:09.864049" elapsed="0.000726"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:09.865311" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:09.864932" elapsed="0.000406"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:42:09.865642" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:42:09.865774" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:42:09.865492" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:09.866218" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:09.865955" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:42:09.866637" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:09.866332" elapsed="0.000364"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:09.867157" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:09.866865" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:09.866721" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:09.866313" elapsed="0.000927"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:09.867826" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:09.867381" elapsed="0.000473"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:42:09.867903" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:42:09.862867" elapsed="0.005159"/>
</kw>
<msg time="2026-08-22T23:42:09.868077" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:42:09.850479" elapsed="0.017644"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:09.881823" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:09.894056" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:09.906207" 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-08-22T23:42:09.906397" 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-08-22T23:42:09.906568" 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-08-22T23:42:09.906943" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:09.906801" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:09.906787" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:09.907158" 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-08-22T23:42:09.907320" 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-08-22T23:42:09.907480" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:42:09.906759" elapsed="0.000773"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:42:09.906657" elapsed="0.000899"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:09.907716" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:09.907792" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:09.907908" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:42:09.847844" elapsed="0.060092"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:09.909165" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:09.908933" elapsed="0.000296">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:09.909321" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:09.908597" elapsed="0.000748"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:09.909675" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:09.909415" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:09.910247" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:09.909950" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:09.909757" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:09.909397" elapsed="0.000934"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:09.912657" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:09.910479" elapsed="0.002205"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:42:09.912735" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:09.912931" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:42:09.908262" elapsed="0.004695"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:09.914352" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:09.914104" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:09.914831" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:09.914550" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:09.915270" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:09.915027" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:09.915718" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:09.915461" elapsed="0.000301"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:42:09.916552" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:42:09.916357" elapsed="0.000235"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:42:09.916931" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:42:09.916753" 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-08-22T23:42:09.917103" elapsed="0.000198"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:09.917715" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:09.917453" elapsed="0.000307"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:42:09.917802" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:09.917983" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:42:09.915958" elapsed="0.002050"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:42:09.928900" level="INFO">PUT Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Content-Length': '81', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:42:09.929068" level="INFO">PUT Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:42:09.929180" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:42:09.920382" elapsed="0.009231">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:09.918078" elapsed="0.011681">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</branch>
<branch type="ELSE">
<kw name="PUT 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 PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:09.930041" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:09.929821" elapsed="0.000316"/>
</branch>
<status status="FAIL" start="2026-08-22T23:42:09.918060" elapsed="0.012110">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:09.930700" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:09.930884" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:42:09.930831" elapsed="0.000110"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:09.930808" elapsed="0.000163"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:09.931169" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:09.931310" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:42:09.913295" elapsed="0.018161">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:09.931560" elapsed="0.000042"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:42:09.760314" elapsed="0.171402">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:09.932110" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:09.931865" elapsed="0.000340"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:09.931842" elapsed="0.000396"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:09.932285" elapsed="0.000020"/>
</return>
<arg>${directory_with_template_folders}${/}datamod1</arg>
<arg>${mapping}</arg>
<arg>session=node3</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:42:09.750957" elapsed="0.181460">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:10.974407" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:10.974006" elapsed="0.000449"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:10.975431" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:10.975022" elapsed="0.000493">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:10.975634" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:10.974666" elapsed="0.000994"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:10.976210" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:10.975825" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:42:10.976539" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:42:10.976729" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:42:10.976397" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:10.977173" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:10.976918" 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-08-22T23:42:10.978445" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:10.977939" elapsed="0.000553"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:42:10.978948" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:42:10.978672" elapsed="0.000302"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:42:10.979720" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:42:10.979345" elapsed="0.000401"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:42:10.980715" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:42:10.980276" elapsed="0.000466"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:42:10.980798" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:42:10.980962" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:42:10.979932" elapsed="0.001055"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:42:10.981139" elapsed="0.000295"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:42:10.979211" elapsed="0.002265"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:42:10.982071" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:42:10.981751" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:42:10.983012" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:42:10.982668" elapsed="0.000370"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:42:10.983089" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:42:10.983240" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:42:10.982279" elapsed="0.000986"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:42:10.983414" elapsed="0.000303"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:42:10.981618" elapsed="0.002141"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:42:10.979031" elapsed="0.004763"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:42:10.983838" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:10.983995" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:42:10.977615" elapsed="0.006406"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:10.977297" elapsed="0.006756"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:10.984225" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:10.984078" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:10.977274" elapsed="0.007028"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:10.985049" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:10.984443" elapsed="0.000634"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:42:10.985125" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:42:10.973377" elapsed="0.011871"/>
</kw>
<msg time="2026-08-22T23:42:10.985302" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:42:10.960870" elapsed="0.024479"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:10.997669" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:11.009850" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:11.021993" 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-08-22T23:42:11.022236" 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-08-22T23:42:11.022424" 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-08-22T23:42:11.022810" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:11.022664" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:11.022650" 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-08-22T23:42:11.023028" 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-08-22T23:42:11.023194" 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-08-22T23:42:11.023356" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:42:11.022621" elapsed="0.000788"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:42:11.022498" 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-08-22T23:42:11.023613" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:11.023692" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:42:11.023812" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:42:10.956614" elapsed="0.067224"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:11.050356" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:11.049952" elapsed="0.000432"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:11.051107" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:11.050897" elapsed="0.000274">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:11.051263" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:11.050546" elapsed="0.000742"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:11.051858" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:11.051454" elapsed="0.000431"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:42:11.052178" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:42:11.052306" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:42:11.052044" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:11.052750" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:11.052487" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:42:11.053153" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:11.052864" elapsed="0.000347"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:11.053691" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:11.053380" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:11.053235" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:11.052847" elapsed="0.000927"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:11.054380" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:11.053919" elapsed="0.000544"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:42:11.054516" elapsed="0.000034"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:42:11.049322" elapsed="0.005343"/>
</kw>
<msg time="2026-08-22T23:42:11.054719" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:42:11.036817" elapsed="0.017949"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:11.067185" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:11.079413" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:11.092037" 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-08-22T23:42:11.092233" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:11.092404" 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-08-22T23:42:11.092787" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:11.092643" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:11.092627" 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-08-22T23:42:11.093005" 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-08-22T23:42:11.093170" 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-08-22T23:42:11.093331" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:42:11.092597" elapsed="0.000786"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:42:11.092479" elapsed="0.000930"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:11.093552" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:11.093642" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:42:11.093764" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:42:11.034153" elapsed="0.059640"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:11.095132" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:11.094883" elapsed="0.000314">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:11.095290" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:11.094519" elapsed="0.000795"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:11.095650" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:11.095384" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:11.096204" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:11.095910" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:11.095732" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:11.095366" elapsed="0.000921"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:11.098655" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:11.096436" elapsed="0.002246"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:42:11.098733" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:11.098888" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:42:11.094191" elapsed="0.004722"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:11.100290" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:11.100042" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:11.100750" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:11.100486" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:11.101190" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:11.100945" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:11.101642" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:11.101379" elapsed="0.000307"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:42:11.102504" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:42:11.102301" elapsed="0.000229"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:42:11.102875" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:42:11.102698" 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-08-22T23:42:11.103045" elapsed="0.000200"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:11.103661" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:11.103395" elapsed="0.000310"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:42:11.103747" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:11.103901" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:42:11.101886" elapsed="0.002040"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:42:11.115694" level="INFO">PUT Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Content-Length': '81', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:42:11.115863" level="INFO">PUT Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:42:11.115968" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:42:11.106231" elapsed="0.010145">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:11.103994" elapsed="0.012467">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</branch>
<branch type="ELSE">
<kw name="PUT 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 PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:11.116669" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:11.116495" elapsed="0.000245"/>
</branch>
<status status="FAIL" start="2026-08-22T23:42:11.103977" elapsed="0.012788">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:11.117139" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:11.117273" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:42:11.117235" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:11.117217" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:11.117480" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:11.117552" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:42:11.099243" elapsed="0.018435">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:11.117754" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:42:10.943337" elapsed="0.174514">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:11.118173" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:11.117961" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:11.117944" elapsed="0.000323"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:11.118303" elapsed="0.000014"/>
</return>
<arg>${directory_with_template_folders}${/}datamod1</arg>
<arg>${mapping}</arg>
<arg>session=node3</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:42:10.933455" elapsed="0.184945">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:12.157973" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:12.157370" elapsed="0.000652"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:12.159170" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:12.158787" elapsed="0.000494">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:12.159422" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:12.158270" elapsed="0.001188"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:12.160285" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:12.159720" elapsed="0.000605"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:42:12.160885" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:42:12.161111" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:42:12.160673" elapsed="0.000482"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:12.161781" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:12.161384" elapsed="0.000467"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:12.163301" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:12.162903" elapsed="0.000465"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:42:12.164023" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:42:12.163625" elapsed="0.000437"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:42:12.165107" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:42:12.164614" elapsed="0.000531"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:42:12.166451" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:42:12.165944" elapsed="0.000546"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:42:12.166568" elapsed="0.000073"/>
</return>
<msg time="2026-08-22T23:42:12.166831" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:42:12.165417" elapsed="0.001450"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:42:12.167118" elapsed="0.000420"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:42:12.164399" elapsed="0.003199"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:42:12.168162" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:42:12.167844" elapsed="0.000344"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:42:12.169058" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:42:12.168724" elapsed="0.000360"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:42:12.169133" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:42:12.169283" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:42:12.168368" elapsed="0.000939"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:42:12.169453" elapsed="0.000292"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:42:12.167715" elapsed="0.002071"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:42:12.164141" elapsed="0.005678"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:42:12.169863" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:42:12.170018" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:42:12.162403" elapsed="0.007641"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:12.161963" elapsed="0.008113"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:12.170249" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:12.170102" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:12.161929" elapsed="0.008396"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:12.171096" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:12.170472" elapsed="0.000652"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:42:12.171172" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:42:12.156439" elapsed="0.014855"/>
</kw>
<msg time="2026-08-22T23:42:12.171348" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:42:12.143399" elapsed="0.027996"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:12.183877" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:12.196315" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:12.208606" 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-08-22T23:42:12.208800" 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-08-22T23:42:12.208973" 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-08-22T23:42:12.209332" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:12.209190" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:12.209175" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:12.209547" 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-08-22T23:42:12.209727" 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-08-22T23:42:12.209887" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:42:12.209147" elapsed="0.000792"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:42:12.209046" elapsed="0.000918"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:12.210107" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:12.210182" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:42:12.210300" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:42:12.139085" elapsed="0.071241"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:12.236232" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:12.235858" elapsed="0.000403"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:12.237014" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:12.236764" elapsed="0.000315">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:12.237172" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:12.236420" elapsed="0.000808"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:12.237796" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:12.237391" elapsed="0.000433"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:42:12.238117" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:42:12.238243" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:42:12.237981" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:12.238698" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:12.238422" elapsed="0.000324"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:42:12.239114" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:12.238815" elapsed="0.000358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:12.239655" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:12.239338" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:12.239197" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:12.238796" elapsed="0.000943"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:12.240310" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:12.239881" elapsed="0.000457"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:42:12.240387" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:42:12.235226" elapsed="0.005284"/>
</kw>
<msg time="2026-08-22T23:42:12.240561" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:42:12.222869" elapsed="0.017756"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:12.252947" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:12.265170" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:12.277369" 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-08-22T23:42:12.277557" 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-08-22T23:42:12.277744" 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-08-22T23:42:12.278151" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:12.278006" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:12.277989" 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-08-22T23:42:12.278373" 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-08-22T23:42:12.278537" 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-08-22T23:42:12.278718" elapsed="0.000031"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:42:12.277917" elapsed="0.000866"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:42:12.277817" elapsed="0.000991"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:12.278951" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:12.279026" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:42:12.279142" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:42:12.220254" elapsed="0.058916"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:12.280407" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:12.280175" elapsed="0.000295">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:12.280560" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:12.279839" 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-08-22T23:42:12.280917" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:12.280672" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:12.281462" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:12.281172" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:12.280997" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:12.280654" elapsed="0.000889"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:12.283901" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:12.281708" elapsed="0.002219"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:42:12.283978" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:12.284130" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:42:12.279497" elapsed="0.004658"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:12.285520" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:12.285275" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:12.285968" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:12.285732" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:12.286401" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:12.286159" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:12.286863" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:12.286607" elapsed="0.000299"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:42:12.287711" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:42:12.287496" elapsed="0.000240"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:42:12.288072" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:42:12.287885" 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-08-22T23:42:12.288328" elapsed="0.000202"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:12.288945" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:12.288699" elapsed="0.000290"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:42:12.289031" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:12.289185" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:42:12.287101" elapsed="0.002109"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:42:12.301849" level="INFO">PUT Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Content-Length': '81', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:42:12.302016" level="INFO">PUT Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:42:12.302118" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:42:12.291528" elapsed="0.010964">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:12.289278" elapsed="0.013319">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</branch>
<branch type="ELSE">
<kw name="PUT 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 PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:12.302818" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:12.302635" elapsed="0.000252"/>
</branch>
<status status="FAIL" start="2026-08-22T23:42:12.289261" elapsed="0.013650">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:12.303274" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:12.303412" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:42:12.303374" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:12.303357" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:12.303755" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:12.303904" elapsed="0.000032"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:42:12.284474" elapsed="0.019658">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:12.304295" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:42:12.127407" elapsed="0.177097">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:12.305160" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:12.304773" elapsed="0.000611"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:12.304737" elapsed="0.000705"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:12.305518" elapsed="0.000034"/>
</return>
<arg>${directory_with_template_folders}${/}datamod1</arg>
<arg>${mapping}</arg>
<arg>session=node3</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:42:12.119666" elapsed="0.186140">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:13.347994" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:13.347590" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:13.348838" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:13.348553" elapsed="0.000367">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:13.349015" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:13.348217" elapsed="0.000823"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:13.349606" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:13.349200" elapsed="0.000435"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:42:13.349933" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:42:13.350100" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:42:13.349791" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:13.350520" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:13.350276" 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-08-22T23:42:13.351542" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:13.351286" elapsed="0.000316"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:42:13.352029" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:42:13.351760" elapsed="0.000305"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:42:13.352793" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:42:13.352432" elapsed="0.000387"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:42:13.353715" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:42:13.353339" elapsed="0.000402"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:42:13.353794" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:42:13.353958" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:42:13.353004" elapsed="0.000979"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:42:13.354138" elapsed="0.000298"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:42:13.352299" elapsed="0.002187"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:42:13.355092" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:42:13.354766" elapsed="0.000352"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:42:13.355992" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:42:13.355655" elapsed="0.000363"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:42:13.356091" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:42:13.356248" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:42:13.355298" elapsed="0.000975"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:42:13.356419" elapsed="0.000334"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:42:13.354637" elapsed="0.002212"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:42:13.352121" elapsed="0.004765"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:42:13.356930" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:13.357088" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:42:13.350970" elapsed="0.006143"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:13.350662" elapsed="0.006482"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:13.357316" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:13.357171" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:13.350637" elapsed="0.006755"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:13.358129" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:13.357531" elapsed="0.000625"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:42:13.358204" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:42:13.346965" elapsed="0.011361"/>
</kw>
<msg time="2026-08-22T23:42:13.358381" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:42:13.334217" elapsed="0.024210"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:13.370874" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:13.382986" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:13.395103" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:13.395292" 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-08-22T23:42:13.395460" 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-08-22T23:42:13.395834" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:13.395692" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:13.395678" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:13.396063" 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-08-22T23:42:13.396414" 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-08-22T23:42:13.396590" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:42:13.395650" elapsed="0.000995"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:42:13.395532" elapsed="0.001171"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:13.396855" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:13.396931" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:13.397050" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:42:13.329973" elapsed="0.067102"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:13.422814" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:13.422421" elapsed="0.000421"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:13.423533" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:13.423325" elapsed="0.000289">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:13.423707" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:13.423000" elapsed="0.000731"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:13.424288" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:13.423906" elapsed="0.000409"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:42:13.424625" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:42:13.424754" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:42:13.424470" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:13.425172" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:13.424930" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:42:13.425567" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:13.425283" elapsed="0.000360"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:13.426101" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:13.425811" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:13.425668" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:13.425265" elapsed="0.000917"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:13.426778" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:13.426323" elapsed="0.000483"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:42:13.426854" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:42:13.421820" elapsed="0.005157"/>
</kw>
<msg time="2026-08-22T23:42:13.427029" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:42:13.409491" elapsed="0.017584"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:13.440667" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:13.453104" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:13.465289" 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-08-22T23:42:13.465520" 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-08-22T23:42:13.465722" 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-08-22T23:42:13.466152" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:13.466001" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:13.465981" 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-08-22T23:42:13.466378" 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-08-22T23:42:13.466539" 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-08-22T23:42:13.466716" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:42:13.465938" elapsed="0.000830"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:42:13.465808" 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-08-22T23:42:13.466939" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:13.467018" elapsed="0.000021"/>
</return>
<msg time="2026-08-22T23:42:13.467182" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:42:13.406903" elapsed="0.060309"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:13.468708" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:13.468370" elapsed="0.000420">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:13.468884" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:13.467950" elapsed="0.000959"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:13.469244" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:13.468979" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:13.469824" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:13.469506" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:13.469325" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:13.468961" elapsed="0.000997"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:13.472279" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:13.470109" elapsed="0.002196"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:42:13.472355" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:42:13.472509" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:42:13.467549" elapsed="0.004985"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:13.473948" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:13.473687" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:13.474381" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:13.474145" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:13.474832" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:13.474574" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:13.475258" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:13.475019" elapsed="0.000282"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:42:13.476154" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:42:13.475945" elapsed="0.000235"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:42:13.476503" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:42:13.476328" 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-08-22T23:42:13.476691" elapsed="0.000218"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:13.477307" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:13.477063" elapsed="0.000288"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:42:13.477392" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:13.477546" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:42:13.475496" elapsed="0.002075"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:42:13.491377" level="INFO">PUT Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Content-Length': '81', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:42:13.491673" level="INFO">PUT Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:42:13.491905" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:42:13.479941" elapsed="0.012567">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:13.477661" elapsed="0.015014">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</branch>
<branch type="ELSE">
<kw name="PUT 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 PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:13.493030" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:13.492737" elapsed="0.000393"/>
</branch>
<status status="FAIL" start="2026-08-22T23:42:13.477641" elapsed="0.015525">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:13.493814" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:13.494109" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:42:13.494048" elapsed="0.000126"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:13.494019" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:13.494419" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:13.494518" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:42:13.472879" elapsed="0.021822">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:13.494816" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:42:13.317136" elapsed="0.177820">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:13.495377" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:13.495113" elapsed="0.000363"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:13.495089" elapsed="0.000421"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:13.495558" elapsed="0.000039"/>
</return>
<arg>${directory_with_template_folders}${/}datamod1</arg>
<arg>${mapping}</arg>
<arg>session=node3</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:42:13.306937" elapsed="0.188803">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:14.535531" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:14.535132" elapsed="0.000435"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:14.536359" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:14.536096" elapsed="0.000341">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:14.536532" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:14.535759" elapsed="0.000798"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:14.537138" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:14.536736" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:42:14.537478" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:42:14.537659" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:42:14.537323" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:14.538088" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:14.537841" 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-08-22T23:42:14.539348" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:14.538849" elapsed="0.000545"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:42:14.539847" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:42:14.539555" elapsed="0.000318"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:42:14.540676" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:42:14.540294" elapsed="0.000409"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:42:14.541615" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:42:14.541233" elapsed="0.000410"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:42:14.541698" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:42:14.541862" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:42:14.540890" elapsed="0.001004"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:42:14.542045" elapsed="0.000291"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:42:14.540161" elapsed="0.002217"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:42:14.542964" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:42:14.542644" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:42:14.543865" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:42:14.543507" elapsed="0.000385"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:42:14.543947" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:42:14.544098" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:42:14.543171" elapsed="0.000952"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:42:14.544270" elapsed="0.000271"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:42:14.542490" elapsed="0.002115"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:42:14.539982" elapsed="0.004663"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:42:14.544688" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:14.544846" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:42:14.538511" elapsed="0.006361"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:14.538211" elapsed="0.006693"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:14.545079" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:14.544930" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:14.538188" elapsed="0.006968"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:14.545935" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:14.545297" elapsed="0.000667"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:42:14.546013" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:42:14.534501" elapsed="0.011636"/>
</kw>
<msg time="2026-08-22T23:42:14.546190" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:42:14.522036" elapsed="0.024202"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:14.558659" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:14.570722" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:14.582870" 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-08-22T23:42:14.583063" 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-08-22T23:42:14.583235" 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-08-22T23:42:14.583647" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:14.583482" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:14.583466" 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-08-22T23:42:14.583870" 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-08-22T23:42:14.584035" 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-08-22T23:42:14.584196" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:42:14.583434" elapsed="0.000815"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:42:14.583310" elapsed="0.000964"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:14.584417" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:14.584492" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:42:14.584630" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:42:14.517807" elapsed="0.066851"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:14.611006" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:14.610627" elapsed="0.000408"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:14.611767" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:14.611527" elapsed="0.000307">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:14.611928" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:14.611195" elapsed="0.000757"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:14.612491" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:14.612110" elapsed="0.000409"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:42:14.612830" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:42:14.612972" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:42:14.612692" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:14.613436" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:14.613156" elapsed="0.000327"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:42:14.613857" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:14.613551" elapsed="0.000406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:14.614430" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:14.614134" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:14.613985" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:14.613532" elapsed="0.000983"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:14.615246" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:14.614676" elapsed="0.000599"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:42:14.615336" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:42:14.610002" elapsed="0.005487"/>
</kw>
<msg time="2026-08-22T23:42:14.615543" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:42:14.597393" elapsed="0.018214"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:14.627825" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:14.639892" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:14.652149" 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-08-22T23:42:14.652361" 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-08-22T23:42:14.652534" 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-08-22T23:42:14.652929" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:14.652785" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:14.652770" 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-08-22T23:42:14.653145" 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-08-22T23:42:14.653336" 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-08-22T23:42:14.653498" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:42:14.652738" elapsed="0.000812"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:42:14.652626" elapsed="0.000964"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:14.653735" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:14.653813" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:42:14.653944" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:42:14.594763" elapsed="0.059255"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:14.655331" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:14.655072" elapsed="0.000330">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:14.655495" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:14.654708" 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-08-22T23:42:14.655858" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:14.655606" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:14.656407" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:14.656114" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:14.655939" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:14.655572" elapsed="0.000918"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:14.658899" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:14.656654" elapsed="0.002273"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:42:14.658979" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:42:14.659134" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:42:14.654359" elapsed="0.004800"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:14.660614" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:14.660318" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:14.661111" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:14.660850" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:14.661600" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:14.661333" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:14.662118" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:14.661806" elapsed="0.000357"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:42:14.662985" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:42:14.662784" elapsed="0.000227"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:42:14.663334" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:42:14.663161" 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-08-22T23:42:14.663506" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:14.664256" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:14.664002" elapsed="0.000300"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:42:14.664345" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:14.664499" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:42:14.662362" elapsed="0.002163"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:42:14.674882" level="INFO">PUT Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Content-Length': '81', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:42:14.675053" level="INFO">PUT Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:42:14.675205" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:42:14.667038" elapsed="0.008576">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:14.664610" elapsed="0.011145">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</branch>
<branch type="ELSE">
<kw name="PUT 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 PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:14.676038" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:14.675813" elapsed="0.000319"/>
</branch>
<status status="FAIL" start="2026-08-22T23:42:14.664591" elapsed="0.011575">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:14.676710" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:14.676895" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:42:14.676842" elapsed="0.000110"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:14.676818" elapsed="0.000163"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:14.677194" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:14.677290" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:42:14.659486" elapsed="0.017950">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:14.677539" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:42:14.505446" elapsed="0.172246">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:14.678098" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:14.677843" elapsed="0.000352"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:14.677820" elapsed="0.000408"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:14.678275" elapsed="0.000020"/>
</return>
<arg>${directory_with_template_folders}${/}datamod1</arg>
<arg>${mapping}</arg>
<arg>session=node3</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:42:14.496827" elapsed="0.181580">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:15.718287" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:15.717857" elapsed="0.000467"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:15.719189" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:15.718865" elapsed="0.000400">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:15.719445" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:15.718500" elapsed="0.000970"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:15.720047" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:15.719652" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:42:15.720391" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:42:15.720547" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:42:15.720237" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:15.721159" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:15.720751" elapsed="0.000457"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:15.722254" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:15.721997" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:42:15.722754" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:42:15.722458" elapsed="0.000322"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:42:15.723514" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:42:15.723161" elapsed="0.000379"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:42:15.724615" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:42:15.724247" elapsed="0.000396"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:42:15.724697" elapsed="0.000041"/>
</return>
<msg time="2026-08-22T23:42:15.724865" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:42:15.723901" elapsed="0.000990"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:42:15.725044" elapsed="0.000292"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:42:15.723010" elapsed="0.002367"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:42:15.725967" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:42:15.725643" elapsed="0.000350"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:42:15.726940" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:42:15.726519" elapsed="0.000448"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:42:15.727018" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:42:15.727188" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:42:15.726176" elapsed="0.001036"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:42:15.727362" elapsed="0.000297"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:42:15.725491" elapsed="0.002210"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:42:15.722834" elapsed="0.004901"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:42:15.727780" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:42:15.727938" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:42:15.721665" elapsed="0.006300"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:15.721290" elapsed="0.006707"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:15.728175" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:15.728025" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:15.721265" elapsed="0.006994"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:15.729039" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:15.728405" elapsed="0.000662"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:42:15.729116" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:42:15.717092" elapsed="0.012148"/>
</kw>
<msg time="2026-08-22T23:42:15.729361" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:42:15.703991" elapsed="0.025424"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:15.742022" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:15.754255" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:15.771517" elapsed="0.000146"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:15.772168" elapsed="0.000053"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:15.772606" elapsed="0.000054"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:15.773645" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:15.773256" elapsed="0.000530"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:15.773214" elapsed="0.000637"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:15.774191" 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-08-22T23:42:15.774616" elapsed="0.000051"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:15.775031" elapsed="0.000049"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:42:15.773130" elapsed="0.002029"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:42:15.772812" elapsed="0.002411"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:15.775566" elapsed="0.000079"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:15.775791" elapsed="0.000043"/>
</return>
<msg time="2026-08-22T23:42:15.776160" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:42:15.699615" elapsed="0.076613"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:15.804235" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:15.803841" elapsed="0.000500"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:15.805148" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:15.804869" elapsed="0.000363">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:15.805329" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:15.804508" elapsed="0.000845"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:15.805919" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:15.805516" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:42:15.806250" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:42:15.806416" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:42:15.806105" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:15.806867" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:15.806612" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:42:15.807301" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:15.806999" elapsed="0.000362"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:15.807843" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:15.807529" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:15.807386" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:15.806979" elapsed="0.000948"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:15.808521" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:15.808070" elapsed="0.000479"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:42:15.808614" elapsed="0.000034"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:42:15.803212" elapsed="0.005533"/>
</kw>
<msg time="2026-08-22T23:42:15.808798" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:42:15.790831" elapsed="0.018014"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:15.821154" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:15.833535" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:15.845623" 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-08-22T23:42:15.845850" 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-08-22T23:42:15.846024" 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-08-22T23:42:15.846381" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:15.846241" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:15.846226" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:15.846613" 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-08-22T23:42:15.846778" 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-08-22T23:42:15.846955" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:42:15.846199" elapsed="0.000810"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:42:15.846097" 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-08-22T23:42:15.847175" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:15.847250" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:15.847367" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:42:15.788144" elapsed="0.059251"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:15.848644" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:15.848395" elapsed="0.000313">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:15.848807" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:15.848062" elapsed="0.000769"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:15.849144" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:15.848902" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:15.849718" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:15.849404" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:15.849225" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:15.848883" elapsed="0.000918"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:15.852134" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:15.849947" elapsed="0.002213"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:42:15.852211" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:42:15.852369" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:42:15.847741" elapsed="0.004653"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:15.853795" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:15.853527" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:15.854229" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:15.853993" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:15.854680" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:15.854421" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:15.855124" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:15.854881" elapsed="0.000286"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:42:15.856036" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:42:15.855827" elapsed="0.000236"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:42:15.856388" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:42:15.856212" elapsed="0.000201"/>
</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-08-22T23:42:15.856560" elapsed="0.000238"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:15.857196" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:15.856950" elapsed="0.000291"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:42:15.857284" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:15.857438" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:42:15.855405" elapsed="0.002058"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:42:15.868540" level="INFO">PUT Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Content-Length': '81', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:42:15.868729" level="INFO">PUT Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:42:15.868837" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:42:15.859927" elapsed="0.009288">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:15.857532" elapsed="0.011771">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</branch>
<branch type="ELSE">
<kw name="PUT 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 PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:15.869498" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:15.869337" elapsed="0.000228"/>
</branch>
<status status="FAIL" start="2026-08-22T23:42:15.857515" elapsed="0.012092">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:15.869992" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:15.870122" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:42:15.870085" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:15.870068" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:15.870327" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:15.870395" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:42:15.852749" elapsed="0.017750">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:15.870572" elapsed="0.000030"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:42:15.688619" elapsed="0.182064">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:15.871177" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:15.870973" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:15.870820" elapsed="0.000455"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:15.871309" elapsed="0.000014"/>
</return>
<arg>${directory_with_template_folders}${/}datamod1</arg>
<arg>${mapping}</arg>
<arg>session=node3</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:42:15.679472" elapsed="0.191943">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:16.910684" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:16.910274" elapsed="0.000445"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:16.911501" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:16.911233" elapsed="0.000360">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:16.911695" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:16.910891" elapsed="0.000834"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:16.912268" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:16.911886" elapsed="0.000408"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:42:16.912606" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:42:16.912767" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:42:16.912451" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:16.913215" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:16.912951" 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-08-22T23:42:16.914230" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:16.913973" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:42:16.914716" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:42:16.914432" elapsed="0.000309"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:42:16.915453" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:42:16.915103" elapsed="0.000376"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:42:16.916376" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:42:16.916030" elapsed="0.000373"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:42:16.916457" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:42:16.916646" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:42:16.915691" elapsed="0.000980"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:42:16.916827" elapsed="0.000368"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:42:16.914972" elapsed="0.002269"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:42:16.917848" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:42:16.917494" elapsed="0.000380"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:42:16.918745" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:42:16.918391" elapsed="0.000381"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:42:16.918873" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:42:16.919027" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:42:16.918057" elapsed="0.000994"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:42:16.919199" elapsed="0.000270"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:42:16.917358" elapsed="0.002152"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:42:16.914796" elapsed="0.004748"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:42:16.919610" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:16.919769" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:42:16.913654" elapsed="0.006141"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:16.913338" elapsed="0.006489"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:16.919997" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:16.919852" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:16.913315" elapsed="0.006758"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:16.920814" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:16.920217" elapsed="0.000625"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:42:16.920891" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:42:16.909662" elapsed="0.011351"/>
</kw>
<msg time="2026-08-22T23:42:16.921090" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:42:16.897033" elapsed="0.024109"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:16.938308" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:16.950438" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:16.962550" elapsed="0.000039"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:16.962758" 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-08-22T23:42:16.962931" 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-08-22T23:42:16.963299" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:16.963157" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:16.963141" 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-08-22T23:42:16.963515" 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-08-22T23:42:16.963745" 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-08-22T23:42:16.963911" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:42:16.963111" elapsed="0.000854"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:42:16.963008" elapsed="0.000982"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:16.964133" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:16.964209" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:42:16.964332" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:42:16.892834" elapsed="0.071525"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:16.990353" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:16.989979" elapsed="0.000403"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:16.991118" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:16.990890" elapsed="0.000299">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:16.991281" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:16.990540" elapsed="0.000766"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:16.991863" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:16.991464" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:42:16.992182" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:42:16.992322" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:42:16.992046" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:16.992760" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:16.992498" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:42:16.993190" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:16.992875" elapsed="0.000375"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:16.993732" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:16.993417" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:16.993275" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:16.992856" elapsed="0.000960"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:16.994389" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:16.993957" elapsed="0.000460"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:42:16.994465" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:42:16.989357" elapsed="0.005248"/>
</kw>
<msg time="2026-08-22T23:42:16.994694" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:42:16.976851" elapsed="0.017893"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:17.008298" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:17.020441" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:17.032670" 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-08-22T23:42:17.032879" 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-08-22T23:42:17.033052" 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-08-22T23:42:17.033407" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:17.033267" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:17.033253" elapsed="0.000232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:17.033636" 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-08-22T23:42:17.033800" 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-08-22T23:42:17.033959" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:42:17.033225" elapsed="0.000785"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:42:17.033124" elapsed="0.000911"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:17.034175" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:17.034249" elapsed="0.000155"/>
</return>
<msg time="2026-08-22T23:42:17.034514" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:42:16.974238" elapsed="0.060304"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:42:17.035832" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:42:17.035561" elapsed="0.000335">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:42:17.035988" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:17.035210" elapsed="0.000802"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:17.036366" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:17.036081" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:17.036970" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:17.036652" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:17.036449" elapsed="0.000583"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:17.036063" elapsed="0.000990"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:17.039361" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:17.037203" elapsed="0.002185"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:42:17.039438" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:42:17.039605" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:42:17.034891" elapsed="0.004740"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:17.041021" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:17.040747" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:17.041604" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:17.041218" elapsed="0.000435"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:17.042047" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:17.041804" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:17.042475" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:17.042236" elapsed="0.000282"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:42:17.043323" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:42:17.043128" elapsed="0.000220"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:42:17.043686" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:42:17.043495" 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-08-22T23:42:17.043856" elapsed="0.000200"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:17.044449" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:17.044206" elapsed="0.000288"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:42:17.044535" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:17.044705" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:42:17.042730" elapsed="0.002000"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:42:17.106273" level="INFO">PUT Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Content-Length': '81', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:42:17.106462" level="INFO">PUT Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:42:17.106631" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:42:17.097687" elapsed="0.009352">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:17.044798" elapsed="0.062337">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</branch>
<branch type="ELSE">
<kw name="PUT 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 PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:17.107338" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:17.107175" elapsed="0.000300"/>
</branch>
<status status="FAIL" start="2026-08-22T23:42:17.044780" elapsed="0.062721">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:17.107931" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:17.108072" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:42:17.108031" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:17.108013" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:17.108282" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:17.108350" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:42:17.039949" elapsed="0.068509">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:17.108533" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:42:16.882132" elapsed="0.226510">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:17.108961" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:17.108777" elapsed="0.000251"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:17.108759" elapsed="0.000293"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:42:17.109084" elapsed="0.000014"/>
</return>
<arg>${directory_with_template_folders}${/}datamod1</arg>
<arg>${mapping}</arg>
<arg>session=node3</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:42:16.872410" elapsed="0.236766">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<msg time="2026-08-22T23:42:17.109277" level="FAIL">Keyword 'TemplatedRequests.Put_As_Xml_Templated' failed after retrying for 15 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<arg>${MASTER_CONNECT_TIMEOUT}</arg>
<arg>1s</arg>
<arg>TemplatedRequests.Put_As_Xml_Templated</arg>
<arg>${directory_with_template_folders}${/}datamod1</arg>
<arg>${mapping}</arg>
<arg>session=node3</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:42:01.430370" elapsed="15.679001">Keyword 'TemplatedRequests.Put_As_Xml_Templated' failed after retrying for 15 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:17.111128" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:17.110469" elapsed="0.000698"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-08-22T23:42:17.111467" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:42:17.111270" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:17.111245" elapsed="0.000313"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:42:17.111817" elapsed="0.000301"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:42:17.113356" level="FAIL">'5762' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:42:17.112878" elapsed="0.000561">'5762' does not contain '-'</status>
</kw>
<msg time="2026-08-22T23:42:17.113568" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:42:17.112342" elapsed="0.001282"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:17.114324" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=5762</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:17.113853" elapsed="0.000508"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:17.115074" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5762</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:17.114658" elapsed="0.000452"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:17.115765" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:17.115326" elapsed="0.000476"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-08-22T23:42:17.116528" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5762

Keyword 'TemplatedRequests.Put_As_Xml_Templated' failed after retrying for 15 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-08-22T23:42:17.116015" elapsed="0.000603"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:17.117205" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5762</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:17.116864" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-08-22T23:42:17.118184" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=5762'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-08-22T23:42:17.117707" elapsed="0.000543"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:17.117356" elapsed="0.000940"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:17.117332" elapsed="0.000999"/>
</if>
<arg>5762</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:42:17.109928" elapsed="0.008466"/>
</kw>
<doc>Check that the modification requests work when node 2 is down.
As ODL may be in the process of connecting possible new master to the device,
the action is retried few times.</doc>
<tag>critical</tag>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=5762</tag>
<status status="FAIL" start="2026-08-22T23:41:51.186545" elapsed="25.931911">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5762

Keyword 'TemplatedRequests.Put_As_Xml_Templated' failed after retrying for 15 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</test>
<test id="s1-s6-t13" name="Check_Modified_Device_Data_Is_Visible_On_Nodes_Without_node2" 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-08-22T23:42:17.123172" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:42:17.122902" 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-08-22T23:42:17.124600" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:42:17.124474" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:17.124454" 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-08-22T23:42:17.129643" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:42:17.129520" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:17.129502" elapsed="0.000211"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:42:17.130704" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:42:17.130310" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:42:17.131194" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:42:17.130888" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:42:17.131265" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:42:17.131422" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:42:17.129937" elapsed="0.001509"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:42:17.136892" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:42:17.136783" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:17.136764" 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-08-22T23:42:17.138151" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:42:17.138042" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:17.138024" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:42:17.138685" level="INFO">${karaf_connection_index} = 53</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:42:17.138362" elapsed="0.000350"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:42:17.139095" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:42:17.138869" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:42:17.186902" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:42:17.139815" elapsed="0.047196"/>
</kw>
<msg time="2026-08-22T23:42:17.187179" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:42:17.187227" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:42:17.139330" elapsed="0.047935"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:42:17.238893" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "N "o "d "e "s "_ "W "i "t "h "o "u "t "_ "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-08-22T23:42:17.187806" elapsed="0.051205"/>
</kw>
<msg time="2026-08-22T23:42:17.239176" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:42:17.239223" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:42:17.187436" elapsed="0.051825"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:17.239569" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:17.239340" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:17.239319" elapsed="0.000359"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:17.240124" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "N "o "d "e "s "_ "W "i "t "h "o "u "t "_ "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-08-22T23:42:17.239823" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:17.240485" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:17.240272" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:17.240253" elapsed="0.000346"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:42:17.240636" 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-08-22T23:42:17.243301" elapsed="0.000150"/>
</kw>
<msg time="2026-08-22T23:42:17.243513" 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-08-22T23:42:17.242081" elapsed="0.001591"/>
</kw>
<kw name="Open 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-08-22T23:42:17.243945" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:17.244275" 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-08-22T23:42:17.241431" elapsed="0.003031"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:42:17.240902" 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-08-22T23:42:17.137737" elapsed="0.106941"/>
</kw>
<msg time="2026-08-22T23:42:17.244771" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:42:17.244815" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:42:17.137113" elapsed="0.107740"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:42:17.245034" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:42:17.244928" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:17.244909" 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-08-22T23:42:17.245517" 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-08-22T23:42:17.245877" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:42:17.245949" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:42:17.136407" elapsed="0.109690"/>
</kw>
<msg time="2026-08-22T23:42:17.246192" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:42:17.246236" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:42:17.131836" elapsed="0.114437"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:17.246681" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:17.246348" elapsed="0.000389"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:17.246330" elapsed="0.000432"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:42:17.131695" elapsed="0.115090"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:42:17.252124" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:42:17.252015" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:17.251996" 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-08-22T23:42:17.253355" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:42:17.253248" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:17.253230" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:42:17.253882" level="INFO">${karaf_connection_index} = 59</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:42:17.253561" elapsed="0.000348"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:42:17.254275" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:42:17.254062" elapsed="0.000239"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:42:17.255209" 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-08-22T23:42:17.254805" elapsed="0.001098">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-08-22T23:42:17.256090" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-08-22T23:42:17.256137" 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-08-22T23:42:17.254455" elapsed="0.001706"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:42:17.256939" 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-08-22T23:42:17.256700" elapsed="0.000909">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-08-22T23:42:17.257796" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-08-22T23:42:17.257843" 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-08-22T23:42:17.256327" elapsed="0.001540"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-08-22T23:42:17.258803" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_Modified_Device_Data_Is_Visible_On_Nodes_Without_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-08-22T23:42:17.258158" elapsed="0.000708">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_Modified_Device_Data_Is_Visible_On_Nodes_Without_node2"</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:17.257943" elapsed="0.000990">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_Modified_Device_Data_Is_Visible_On_Nodes_Without_node2"</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:17.257924" elapsed="0.001042">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_Modified_Device_Data_Is_Visible_On_Nodes_Without_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-08-22T23:42:17.259125" 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-08-22T23:42:17.259350" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:17.259211" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:17.259194" elapsed="0.000230"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-08-22T23:42:17.259457" 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">
<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-08-22T23:42:17.261994" elapsed="0.000148"/>
</kw>
<msg time="2026-08-22T23:42:17.262204" 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-08-22T23:42:17.260940" elapsed="0.001394"/>
</kw>
<kw name="Open 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-08-22T23:42:17.262642" elapsed="0.000109"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:17.263008" 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-08-22T23:42:17.260259" 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-08-22T23:42:17.259738" elapsed="0.003517"/>
</kw>
<arg>${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-08-22T23:42:17.252947" elapsed="0.010390">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_Modified_Device_Data_Is_Visible_On_Nodes_Without_node2"</status>
</kw>
<msg time="2026-08-22T23:42:17.263439" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:42:17.263483" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_Modified_Device_Data_Is_Visible_On_Nodes_Without_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-08-22T23:42:17.252342" elapsed="0.011165"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:42:17.263718" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:42:17.263608" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:17.263565" elapsed="0.000218"/>
</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-08-22T23:42:17.264570" elapsed="0.000090"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:42:17.264456" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:17.264439" elapsed="0.000275"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:42:17.264984" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:42:17.265087" level="INFO">${current_ssh_connection_object} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:42:17.264864" elapsed="0.000249"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:17.265515" level="INFO">{1: 53, 2: 59, 3: 36}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:17.265259" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:17.266018" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:17.265776" 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-08-22T23:42:17.266565" elapsed="0.000276"/>
</kw>
<msg time="2026-08-22T23:42:17.266939" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:42:17.266984" level="INFO">${old_connection_index} = 59</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-08-22T23:42:17.266213" 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-08-22T23:42:17.267820" elapsed="0.000194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:42:17.269243" 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-08-22T23:42:17.268694" elapsed="0.001422">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-08-22T23:42:17.268176" elapsed="0.002040"/>
</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-08-22T23:42:17.270870" elapsed="0.000277"/>
</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-08-22T23:42:17.270387" elapsed="0.000844"/>
</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-08-22T23:42:17.267297" elapsed="0.003982"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:17.267082" elapsed="0.004247"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:17.267064" elapsed="0.004290"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:42:17.272205" level="INFO">${ip_address} = 10.30.170.12</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:42:17.271901" elapsed="0.000330"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:42:17.272278" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:42:17.272428" level="INFO">${odl_ip} = 10.30.170.12</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:42:17.271555" elapsed="0.000897"/>
</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-08-22T23:42:17.272716" elapsed="0.000424"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:42:17.273414" level="INFO">index=60
host=10.30.170.12
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-08-22T23:42:17.273551" level="INFO">${karaf_connection_object} = index=60
host=10.30.170.12
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:42:17.273305" elapsed="0.000344"/>
</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-08-22T23:42:17.273802" elapsed="0.002236"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:42:17.276474" level="INFO">Logging into '10.30.170.12:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:42:17.278725" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.12</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-08-22T23:42:17.276201" elapsed="0.002906">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.12</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-08-22T23:42:17.293081" elapsed="0.000395"/>
</kw>
<msg time="2026-08-22T23:42:17.293564" 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-08-22T23:42:17.291631" elapsed="0.002101"/>
</kw>
<kw name="Open 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-08-22T23:42:17.293891" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:17.294050" 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-08-22T23:42:17.279907" elapsed="0.014226"/>
</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-08-22T23:42:17.279374" elapsed="0.014806"/>
</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-08-22T23:42:17.264166" elapsed="0.030094">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.12</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-08-22T23:42:17.294680" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:42:17.294756" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_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-08-22T23:42:17.251677" elapsed="0.043180">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.12</status>
</kw>
<msg time="2026-08-22T23:42:17.294961" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:42:17.295004" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.12</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:42:17.247048" elapsed="0.047979"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:17.295350" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:17.295102" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:17.295084" elapsed="0.000342"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:42:17.246911" elapsed="0.048539"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:42:17.300994" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:42:17.300887" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:17.300868" 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-08-22T23:42:17.302268" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:42:17.302162" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:17.302144" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:42:17.302805" level="INFO">${karaf_connection_index} = 36</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:42:17.302476" elapsed="0.000356"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:42:17.303196" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:42:17.302984" elapsed="0.000237"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:42:17.339666" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:42:17.303724" elapsed="0.036043"/>
</kw>
<msg time="2026-08-22T23:42:17.340013" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:42:17.340060" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:42:17.303375" elapsed="0.036722"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:42:17.383351" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "N "o "d "e "s "_ "W "i "t "h "o "u "t "_ "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-08-22T23:42:17.340658" elapsed="0.042805"/>
</kw>
<msg time="2026-08-22T23:42:17.383647" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:42:17.383694" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:42:17.340265" elapsed="0.043466"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:17.384027" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:17.383809" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:17.383789" elapsed="0.000317"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:17.384609" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "N "o "d "e "s "_ "W "i "t "h "o "u "t "_ "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-08-22T23:42:17.384248" 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-08-22T23:42:17.384971" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:17.384757" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:17.384739" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:42:17.385083" 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-08-22T23:42:17.387534" elapsed="0.000171"/>
</kw>
<msg time="2026-08-22T23:42:17.387766" 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-08-22T23:42:17.386490" elapsed="0.001401"/>
</kw>
<kw name="Open 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-08-22T23:42:17.388158" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:17.388502" 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-08-22T23:42:17.385887" elapsed="0.002822"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:42:17.385335" elapsed="0.003437"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:42:17.301861" elapsed="0.087008"/>
</kw>
<msg time="2026-08-22T23:42:17.388962" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:42:17.389006" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:42:17.301207" elapsed="0.087836"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:42:17.389224" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:42:17.389119" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:17.389101" elapsed="0.000204"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:17.389727" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:17.390060" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:42:17.390131" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:42:17.300533" elapsed="0.089707"/>
</kw>
<msg time="2026-08-22T23:42:17.390333" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:42:17.390377" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:42:17.295735" elapsed="0.094678"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:17.390852" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:17.390524" elapsed="0.000383"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:17.390506" elapsed="0.000424"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:42:17.295573" elapsed="0.095380"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:42:17.131501" elapsed="0.259481"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:42:17.129157" elapsed="0.261883"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:42:17.124182" elapsed="0.266915"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:42:17.123605" elapsed="0.267538"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:42:17.119975" elapsed="0.271222"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:17.392801" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:17.392394" elapsed="0.000435"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:17.400214" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:17.399966" elapsed="0.000405"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:17.401453" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:17.400808" elapsed="0.000750"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:42:17.425786" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:17.426105" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:17.426345" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:17.406431" elapsed="0.019977"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:17.401746" elapsed="0.024767"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:17.426992" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:17.426612" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:17.401703" elapsed="0.025499"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:17.434384" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:17.429734" elapsed="0.004719"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:17.429174" elapsed="0.005330"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:17.429129" elapsed="0.005411"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:17.438259" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:17.434947" elapsed="0.003377"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:17.434641" elapsed="0.003734"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:17.434616" elapsed="0.003796"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:17.439394" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:17.438788" 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-08-22T23:42:17.439986" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:17.439535" elapsed="0.000546"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:17.440848" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:17.440394" elapsed="0.000492"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:17.440115" elapsed="0.000821"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:17.439509" elapsed="0.001535"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:17.441917" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:17.441299" elapsed="0.000659"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:17.442386" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:17.442058" elapsed="0.000410"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:17.443169" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:17.442745" elapsed="0.000481"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:17.442502" elapsed="0.000777"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:17.442032" 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-08-22T23:42:17.443518" elapsed="0.000519"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:17.444744" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:17.444322" 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-08-22T23:42:17.444925" elapsed="0.002535"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:42:17.428071" elapsed="0.019454"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:17.447725" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-08-22T23:42:17.447611" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:17.447590" 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-08-22T23:42:17.447961" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:17.448033" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:17.450377" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:17.395646" elapsed="0.054761"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:17.450467" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:17.450636" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:17.393039" elapsed="0.057628"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:17.451314" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:17.450952" elapsed="0.000435">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:17.450739" elapsed="0.000717">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:17.450723" elapsed="0.000767">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:17.451725" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:17.451560" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:17.451543" elapsed="0.000264"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:17.391988" elapsed="0.059900">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:18.455052" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:18.453968" elapsed="0.001161"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:18.467428" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:18.466924" elapsed="0.000577"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:18.468102" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:18.467747" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:42:18.488533" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:18.488884" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:18.489123" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:18.471365" elapsed="0.017816"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:18.468294" elapsed="0.020991"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:18.489753" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:18.489362" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:18.468261" elapsed="0.021691"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:18.498996" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:18.492432" elapsed="0.006704"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:18.491928" elapsed="0.007309"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:18.491885" elapsed="0.007428"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:18.503215" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:18.499950" elapsed="0.003330"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:18.499477" elapsed="0.003853"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:18.499428" elapsed="0.003938"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:18.504154" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:18.503635" elapsed="0.000546"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:18.504492" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:18.504252" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:18.505058" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:18.504752" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:18.504574" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:18.504234" elapsed="0.000909"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:18.505680" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:18.505298" 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-08-22T23:42:18.506007" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:18.505778" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:18.506540" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:18.506244" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:18.506089" elapsed="0.000647"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:18.505760" 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-08-22T23:42:18.506944" elapsed="0.000370"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:18.507811" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:18.507478" 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-08-22T23:42:18.507990" elapsed="0.002334"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:42:18.490878" elapsed="0.019512"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:18.510668" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-08-22T23:42:18.510525" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:18.510506" 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-08-22T23:42:18.510922" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:18.510994" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:18.513354" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:18.460822" elapsed="0.052562"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:18.513444" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:18.513615" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:18.455671" elapsed="0.057971"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:18.514291" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:18.513923" elapsed="0.000449">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:18.513714" elapsed="0.000731">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:18.513697" elapsed="0.000783">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:18.514777" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:18.514549" elapsed="0.000293"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:18.514532" elapsed="0.000335"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:18.452838" elapsed="0.062114">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:19.518174" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:19.517063" elapsed="0.001191"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:19.530070" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:19.529797" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:19.530525" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:19.530277" 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-08-22T23:42:19.552400" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:19.552758" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:19.552991" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:19.532728" elapsed="0.020323"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:19.530664" elapsed="0.022489"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:19.553637" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:19.553245" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:19.530640" elapsed="0.023199"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:19.561961" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:19.556378" elapsed="0.005634"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:19.555855" elapsed="0.006192"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:19.555801" elapsed="0.006272"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:19.564717" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:19.562349" elapsed="0.002415"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:19.562129" elapsed="0.002670"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:19.562113" elapsed="0.002711"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:19.565415" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:19.565000" 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-08-22T23:42:19.565770" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:19.565515" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:19.566318" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:19.566015" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:19.565854" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:19.565497" elapsed="0.000907"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:19.566945" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:19.566562" 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-08-22T23:42:19.567275" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:19.567042" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:19.567831" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:19.567516" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:19.567357" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:19.567024" 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-08-22T23:42:19.568068" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:19.568896" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:19.568593" 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-08-22T23:42:19.569076" elapsed="0.002390"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:42:19.554821" elapsed="0.016712"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:19.571734" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:42:19.571621" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:19.571602" 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-08-22T23:42:19.571981" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:19.572054" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:19.574465" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:19.524533" elapsed="0.049963"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:19.574557" elapsed="0.000042"/>
</return>
<msg time="2026-08-22T23:42:19.574729" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:19.518813" elapsed="0.055943"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:19.575398" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:19.575035" elapsed="0.000441">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:19.574827" elapsed="0.000784">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:19.574810" elapsed="0.000840">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:19.575870" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:19.575722" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:19.575705" elapsed="0.000246"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:19.515937" elapsed="0.060098">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:20.578233" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:20.577558" elapsed="0.000726"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:20.590837" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:20.590529" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:20.591297" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:20.591044" 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-08-22T23:42:20.617203" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:20.617381" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:20.617493" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:20.593575" elapsed="0.023945"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:20.591426" elapsed="0.026140"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:20.617789" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:20.617623" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:20.591399" elapsed="0.026478"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:20.621401" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:20.618939" elapsed="0.002512"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:20.618710" elapsed="0.002778"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:20.618691" elapsed="0.002821"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:20.624192" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:20.621825" elapsed="0.002414"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:20.621570" elapsed="0.002704"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:20.621552" elapsed="0.002747"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:20.624917" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:20.624480" 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-08-22T23:42:20.625273" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:20.625022" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:20.625843" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:20.625516" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:20.625355" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:20.624999" elapsed="0.000930"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:20.626472" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:20.626088" 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-08-22T23:42:20.626888" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:20.626647" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:20.627452" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:20.627128" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:20.626970" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:20.626552" 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-08-22T23:42:20.627710" elapsed="0.000390"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:20.628612" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:20.628270" 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-08-22T23:42:20.628797" 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-08-22T23:42:20.618244" elapsed="0.013078"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:20.631507" elapsed="0.000047"/>
</return>
<status status="PASS" start="2026-08-22T23:42:20.631394" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:20.631376" 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-08-22T23:42:20.631788" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:20.631875" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:42:20.634251" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:20.582616" elapsed="0.051665"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:20.634340" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:42:20.634495" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:20.578656" elapsed="0.055866"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:20.635230" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:20.634855" elapsed="0.000458">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:20.634624" elapsed="0.000763">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:20.634604" elapsed="0.000817">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:20.635654" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:20.635490" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:20.635473" elapsed="0.000261"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:20.576798" elapsed="0.059020">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:21.639178" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:21.638166" elapsed="0.001085"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:21.650347" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:21.650077" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:21.650822" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:21.650550" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:42:21.673085" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:21.673389" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:21.673616" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:21.653122" elapsed="0.020585"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:21.651037" elapsed="0.022767"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:21.674205" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:21.673866" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:21.651013" elapsed="0.023387"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:21.684529" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:21.676824" elapsed="0.007761"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:21.676300" elapsed="0.008321"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:21.676259" elapsed="0.008403"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:21.687284" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:21.684943" elapsed="0.002390"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:21.684720" elapsed="0.002649"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:21.684703" elapsed="0.002692"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:21.687982" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:21.687566" 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-08-22T23:42:21.688316" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:21.688081" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:21.688886" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:21.688557" elapsed="0.000357"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:21.688398" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:21.688063" elapsed="0.000910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:21.689493" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:21.689128" 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-08-22T23:42:21.689857" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:21.689594" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:21.690395" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:21.690098" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:21.689940" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:21.689573" 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-08-22T23:42:21.690648" elapsed="0.000360"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:21.691527" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:21.691171" 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-08-22T23:42:21.691743" elapsed="0.002331"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:42:21.675281" elapsed="0.018857"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:21.694317" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:42:21.694209" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:21.694190" 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-08-22T23:42:21.694597" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:21.694687" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:21.697052" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:21.645559" elapsed="0.051523"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:21.697144" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:42:21.697298" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:21.639786" elapsed="0.057540"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:21.697990" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:21.697610" elapsed="0.000460">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:21.697396" elapsed="0.000748">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:21.697379" elapsed="0.000800">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:21.698420" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:21.698252" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:21.698234" elapsed="0.000272"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:21.637027" elapsed="0.061570">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:22.700539" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:22.700068" elapsed="0.000507"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:22.708192" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:22.707921" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:22.708669" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:22.708400" 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-08-22T23:42:22.732188" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:22.732365" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:22.732496" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:22.710905" elapsed="0.021620"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:22.708794" elapsed="0.023791"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:22.732856" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:22.732643" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:22.708772" elapsed="0.024174"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:22.736846" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:22.734114" elapsed="0.002788"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:22.733868" elapsed="0.003145"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:22.733847" elapsed="0.003199"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:22.739692" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:22.737336" elapsed="0.002402"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:22.737105" elapsed="0.002669"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:22.737088" elapsed="0.002710"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:22.740395" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:22.739984" 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-08-22T23:42:22.740753" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:22.740493" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:22.741309" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:22.741000" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:22.740838" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:22.740475" elapsed="0.000921"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:22.741942" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:22.741555" 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-08-22T23:42:22.742273" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:22.742040" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:22.742906" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:22.742514" elapsed="0.000424"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:22.742356" elapsed="0.000623"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:22.742021" 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-08-22T23:42:22.743159" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:22.743988" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:22.743691" 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-08-22T23:42:22.744167" 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-08-22T23:42:22.733371" elapsed="0.013220"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:22.746791" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-08-22T23:42:22.746678" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:22.746659" 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-08-22T23:42:22.747100" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:22.747176" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:22.749529" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:22.703352" elapsed="0.046207"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:22.749638" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:42:22.749794" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:22.700832" elapsed="0.048988"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:22.750468" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:22.750102" elapsed="0.000445">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:22.749892" elapsed="0.000747">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:22.749875" elapsed="0.000801">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:22.750944" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:22.750794" elapsed="0.000244"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:22.750776" elapsed="0.000293"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:22.699504" elapsed="0.051675">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:23.755512" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:23.754370" elapsed="0.001235"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:23.765788" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:23.765464" elapsed="0.000374"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:23.766243" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:23.765993" 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-08-22T23:42:23.785112" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:23.785283" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:23.785386" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:23.768466" elapsed="0.016946"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:23.766365" elapsed="0.019091"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:23.785662" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:23.785484" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:23.766342" elapsed="0.019408"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:23.793449" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:23.787912" elapsed="0.005647"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:23.787382" elapsed="0.006294"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:23.787341" elapsed="0.006393"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:23.798169" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:23.794352" elapsed="0.003863"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:23.793861" elapsed="0.004390"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:23.793824" elapsed="0.004451"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:23.798886" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:23.798451" 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-08-22T23:42:23.799220" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:23.798985" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:23.799787" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:23.799464" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:23.799304" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:23.798967" elapsed="0.000906"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:23.800546" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:23.800030" 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-08-22T23:42:23.800912" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:23.800663" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:23.801542" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:23.801241" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:23.800994" elapsed="0.000628"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:23.800645" 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-08-22T23:42:23.801798" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:23.802642" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:23.802319" 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-08-22T23:42:23.802824" 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-08-22T23:42:23.786401" elapsed="0.018988"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:23.805569" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:42:23.805460" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:23.805442" 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-08-22T23:42:23.805834" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:23.805906" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:23.808269" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:23.761107" elapsed="0.047191"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:23.808359" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:23.808512" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:23.756174" elapsed="0.052366"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:23.809233" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:23.808838" elapsed="0.000473">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:23.808628" elapsed="0.000756">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:23.808598" elapsed="0.000821">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:23.809652" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:23.809490" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:23.809473" elapsed="0.000261"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:23.753129" elapsed="0.056687">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:24.812761" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:24.811748" elapsed="0.001086"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:24.825072" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:24.824639" elapsed="0.000503"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:24.825727" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:24.825355" 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-08-22T23:42:24.846965" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:24.847415" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:24.847677" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:24.828015" elapsed="0.019724"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:24.825908" elapsed="0.021927"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:24.848238" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:24.847896" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:24.825872" elapsed="0.022556"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:24.854077" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:24.850448" elapsed="0.003699"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:24.850141" elapsed="0.004056"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:24.850116" elapsed="0.004115"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:24.857917" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:24.854637" elapsed="0.003356"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:24.854310" elapsed="0.003734"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:24.854287" elapsed="0.003791"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:24.858899" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:24.858316" 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-08-22T23:42:24.859294" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:24.859056" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:24.859854" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:24.859535" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:24.859377" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:24.859034" elapsed="0.000906"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:24.860460" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:24.860094" 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-08-22T23:42:24.860805" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:24.860556" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:24.861342" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:24.861045" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:24.860887" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:24.860538" 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-08-22T23:42:24.861576" elapsed="0.000368"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:24.862424" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:24.862122" 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-08-22T23:42:24.862622" elapsed="0.002316"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:42:24.849264" elapsed="0.015737"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:24.865180" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:42:24.865070" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:24.865052" 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-08-22T23:42:24.865420" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:24.865490" elapsed="0.000014"/>
</return>
<msg time="2026-08-22T23:42:24.867837" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:24.818521" elapsed="0.049345"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:24.867967" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:42:24.868121" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:24.813330" elapsed="0.054818"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:24.868807" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:24.868427" elapsed="0.000460">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:24.868219" elapsed="0.000740">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:24.868202" elapsed="0.000791">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:24.869209" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:24.869063" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:24.869046" elapsed="0.000242"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:24.810721" elapsed="0.058650">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:25.872474" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:25.871480" elapsed="0.001066"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:25.883984" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:25.883712" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:25.884436" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:25.884188" 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-08-22T23:42:25.901487" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:25.901660" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:25.901773" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:25.886666" elapsed="0.015133"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:25.884559" elapsed="0.017284"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:25.902154" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:25.901871" elapsed="0.000428"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:25.884536" elapsed="0.017812"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:25.910192" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:25.904718" elapsed="0.005584"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:25.904192" elapsed="0.006187"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:25.904150" elapsed="0.006285"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:25.913867" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:25.911143" elapsed="0.002769"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:25.910562" elapsed="0.003384"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:25.910525" elapsed="0.003446"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:25.914553" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:25.914146" 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-08-22T23:42:25.915023" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:25.914766" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:25.915569" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:25.915268" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:25.915107" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:25.914746" elapsed="0.000926"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:25.916196" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:25.915829" 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-08-22T23:42:25.916520" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:25.916292" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:25.917076" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:25.916779" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:25.916619" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:25.916274" elapsed="0.000886"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:42:25.917311" elapsed="0.000368"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:25.918138" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:25.917841" 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-08-22T23:42:25.918314" elapsed="0.002346"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:42:25.903208" elapsed="0.017517"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:25.920907" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:42:25.920796" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:25.920778" 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-08-22T23:42:25.921149" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:25.921220" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:25.923550" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:25.877296" elapsed="0.046283"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:25.923657" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:25.923810" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:25.873070" elapsed="0.050766"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:25.924477" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:25.924115" elapsed="0.000443">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:25.923907" elapsed="0.000743">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:25.923890" elapsed="0.000795">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:25.924902" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:25.924755" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:25.924737" elapsed="0.000244"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:25.870366" elapsed="0.054698">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:26.927487" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:26.926828" elapsed="0.000708"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:26.938506" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:26.938087" elapsed="0.000501"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:26.939183" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:26.938837" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:42:26.958848" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:26.959066" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:26.959207" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:26.941706" elapsed="0.017538"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:26.939352" elapsed="0.019952"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:26.959559" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:26.959343" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:26.939321" elapsed="0.020385"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:26.964555" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:26.961186" elapsed="0.003461"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:26.960882" elapsed="0.003815"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:26.960857" elapsed="0.003875"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:26.968350" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:26.965113" elapsed="0.003301"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:26.964809" elapsed="0.003654"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:26.964786" elapsed="0.003710"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:26.969258" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:26.968761" 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-08-22T23:42:26.969594" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:26.969356" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:26.970150" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:26.969849" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:26.969689" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:26.969338" elapsed="0.000896"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:26.970809" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:26.970428" 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-08-22T23:42:26.971134" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:26.970904" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:26.971683" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:26.971370" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:26.971215" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:26.970887" 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-08-22T23:42:26.971918" elapsed="0.000368"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:26.972761" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:26.972446" 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-08-22T23:42:26.973023" 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-08-22T23:42:26.960266" elapsed="0.015244"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:26.975707" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:42:26.975583" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:26.975561" 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-08-22T23:42:26.975948" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:26.976019" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:26.978359" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:26.931733" elapsed="0.046655"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:26.978448" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:26.978617" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:26.927879" elapsed="0.050767"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:26.979283" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:26.978925" elapsed="0.000438">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:26.978718" elapsed="0.000718">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:26.978701" elapsed="0.000769">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:26.979701" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:26.979538" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:26.979522" elapsed="0.000260"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:26.926069" elapsed="0.053796">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:27.983058" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:27.982075" elapsed="0.001057"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:27.994650" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:27.994364" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:27.995099" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:27.994854" 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-08-22T23:42:28.013673" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:28.013900" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:28.014103" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:27.997423" elapsed="0.016721"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:27.995221" elapsed="0.019086"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:28.014653" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:28.014355" elapsed="0.000396"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:27.995197" elapsed="0.019586"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:28.020248" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:28.016349" elapsed="0.003970"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:28.016022" elapsed="0.004347"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:28.015995" elapsed="0.004411"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:28.024058" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:28.020819" elapsed="0.003304"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:28.020485" elapsed="0.003687"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:28.020461" elapsed="0.003746"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:28.025027" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:28.024445" 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-08-22T23:42:28.025488" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:28.025163" elapsed="0.000406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:28.026293" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:28.025852" elapsed="0.000488"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:28.025626" elapsed="0.000766"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:28.025138" elapsed="0.001285"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:28.027219" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:28.026660" 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-08-22T23:42:28.027699" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:28.027354" elapsed="0.000425"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:28.028443" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:28.028031" elapsed="0.000448"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:28.027813" elapsed="0.000715"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:28.027329" 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-08-22T23:42:28.028793" elapsed="0.000485"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:28.029930" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:28.029501" 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-08-22T23:42:28.030177" 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-08-22T23:42:28.015341" elapsed="0.017549"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:28.033071" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:42:28.032961" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:28.032942" 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-08-22T23:42:28.033310" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:28.033381" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:28.035734" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:27.988089" elapsed="0.047675"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:28.035822" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:42:28.035975" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:27.983659" elapsed="0.052342"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:28.036718" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:28.036278" elapsed="0.000520">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:28.036071" elapsed="0.000798">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:28.036053" elapsed="0.000851">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:28.037121" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:28.036974" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:28.036957" elapsed="0.000243"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:27.980995" elapsed="0.056300">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:29.040650" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:29.039655" elapsed="0.001082"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:29.053381" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:29.052954" elapsed="0.000500"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:29.054035" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:29.053693" 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-08-22T23:42:29.072690" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:29.072918" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:29.073145" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:29.056225" elapsed="0.016978"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:29.054156" elapsed="0.019148"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:29.073801" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:29.073366" elapsed="0.000582"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:29.054133" elapsed="0.019864"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:29.081965" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:29.076350" elapsed="0.005668"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:29.075848" elapsed="0.006206"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:29.075804" elapsed="0.006275"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:29.084678" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:29.082359" elapsed="0.002366"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:29.082137" elapsed="0.002623"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:29.082119" elapsed="0.002665"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:29.085361" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:29.084964" 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-08-22T23:42:29.085727" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:29.085459" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:29.086275" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:29.085974" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:29.085810" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:29.085441" elapsed="0.000990"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:29.086967" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:29.086590" 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-08-22T23:42:29.087291" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:29.087063" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:29.087842" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:29.087527" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:29.087372" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:29.087045" 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-08-22T23:42:29.088082" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:29.088920" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:29.088609" 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-08-22T23:42:29.089098" elapsed="0.002390"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:42:29.074847" elapsed="0.016710"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:29.091760" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:42:29.091646" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:29.091627" 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-08-22T23:42:29.092003" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:29.092075" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:29.094426" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:29.046535" elapsed="0.047921"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:29.094517" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:29.094689" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:29.041293" elapsed="0.053423"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:29.095360" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:29.094994" elapsed="0.000447">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:29.094787" elapsed="0.000725">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:29.094770" elapsed="0.000776">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:29.095783" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:29.095635" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:29.095617" elapsed="0.000246"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:29.038489" elapsed="0.057458">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:30.098932" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:30.097921" elapsed="0.001082"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:30.111200" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:30.110888" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:30.111663" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:30.111400" 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-08-22T23:42:30.130185" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:30.130382" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:30.130584" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:30.113994" elapsed="0.016656"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:30.111785" elapsed="0.018926"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:30.130965" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:30.130750" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:30.111762" elapsed="0.019382"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:30.139096" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:30.133571" elapsed="0.005576"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:30.133037" elapsed="0.006148"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:30.132990" elapsed="0.006220"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:30.141799" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:30.139491" elapsed="0.002360"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:30.139268" elapsed="0.002619"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:30.139251" elapsed="0.002660"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:30.142514" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:30.142098" 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-08-22T23:42:30.142901" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:30.142658" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:30.143448" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:30.143146" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:30.142984" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:30.142636" elapsed="0.000897"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:30.144073" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:30.143709" 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-08-22T23:42:30.144399" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:30.144170" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:30.144954" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:30.144654" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:30.144480" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:30.144152" 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-08-22T23:42:30.145196" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:30.146026" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:30.145728" 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-08-22T23:42:30.146206" 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-08-22T23:42:30.131965" elapsed="0.016792"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:30.148998" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:42:30.148887" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:30.148868" 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-08-22T23:42:30.149240" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:30.149312" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:30.151663" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:30.104774" elapsed="0.046919"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:30.151755" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:30.151907" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:30.099663" elapsed="0.052271"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:30.152582" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:30.152213" elapsed="0.000466">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:30.152004" elapsed="0.000748">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:30.151987" elapsed="0.000800">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:30.153003" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:30.152856" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:30.152840" elapsed="0.000243"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:30.096890" elapsed="0.056274">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:31.156257" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:31.155219" elapsed="0.001114"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:31.167116" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:31.166850" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:31.167564" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:31.167317" 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-08-22T23:42:31.186411" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:31.186769" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:31.187004" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:31.169885" elapsed="0.017182"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:31.167708" elapsed="0.019463"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:31.187639" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:31.187236" elapsed="0.000689"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:31.167685" elapsed="0.020295"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:31.196782" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:31.190346" elapsed="0.006522"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:31.189959" elapsed="0.006969"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:31.189914" elapsed="0.007054"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:31.200046" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:31.197501" elapsed="0.002594"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:31.197061" elapsed="0.003069"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:31.197033" elapsed="0.003122"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:31.200780" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:31.200348" 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-08-22T23:42:31.201114" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:31.200879" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:31.201703" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:31.201355" elapsed="0.000377"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:31.201196" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:31.200861" elapsed="0.000931"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:31.202323" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:31.201950" 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-08-22T23:42:31.202668" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:31.202420" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:31.203201" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:31.202907" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:31.202751" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:31.202402" 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-08-22T23:42:31.203436" elapsed="0.000368"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:31.204271" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:31.203966" 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-08-22T23:42:31.204449" 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-08-22T23:42:31.188863" elapsed="0.018041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:31.207088" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:42:31.206976" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:31.206957" 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-08-22T23:42:31.207333" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:31.207405" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:31.209792" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:31.162409" elapsed="0.047412"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:31.209882" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:31.210035" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:31.156912" elapsed="0.053149"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:31.210739" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:31.210343" elapsed="0.000476">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:31.210133" elapsed="0.000837">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:31.210116" elapsed="0.000889">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:31.211224" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:31.211076" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:31.211059" elapsed="0.000245"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:31.154137" elapsed="0.057251">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:32.214454" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:32.213434" elapsed="0.001093"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:32.227112" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:32.226849" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:32.227559" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:32.227313" 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-08-22T23:42:32.245371" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:32.245528" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:32.245652" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:32.229777" elapsed="0.015903"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:32.227699" elapsed="0.018025"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:32.245907" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:32.245753" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:32.227676" elapsed="0.018320"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:32.253940" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:32.248286" elapsed="0.005768"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:32.247794" elapsed="0.006345"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:32.247752" elapsed="0.006447"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:32.257428" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:32.254951" elapsed="0.002524"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:32.254410" elapsed="0.003101"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:32.254291" elapsed="0.003245"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:32.258129" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:32.257726" 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-08-22T23:42:32.258484" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:32.258228" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:32.259072" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:32.258757" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:32.258572" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:32.258210" elapsed="0.000952"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:32.259783" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:32.259322" 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-08-22T23:42:32.260121" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:32.259884" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:32.260696" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:32.260371" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:32.260207" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:32.259865" 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-08-22T23:42:32.260937" elapsed="0.000362"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:32.261784" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:32.261463" 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-08-22T23:42:32.261965" 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-08-22T23:42:32.246810" elapsed="0.017595"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:32.264600" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:42:32.264474" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:32.264456" 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-08-22T23:42:32.264845" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:32.264916" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:32.267244" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:32.220730" elapsed="0.046543"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:32.267333" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:42:32.267484" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:32.215067" elapsed="0.052444"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:32.268169" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:32.267807" elapsed="0.000440">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:32.267584" elapsed="0.000736">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:32.267563" elapsed="0.000792">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:32.268570" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:32.268423" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:32.268407" elapsed="0.000261"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:32.212350" elapsed="0.056401">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:33.272083" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:33.271022" elapsed="0.001136"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:33.283474" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:33.283207" elapsed="0.000405"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:33.284032" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:33.283770" 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-08-22T23:42:33.305792" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:33.306103" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:33.306330" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:33.286365" elapsed="0.020025"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:33.284176" elapsed="0.022314"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:33.306950" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:33.306555" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:33.284152" elapsed="0.022998"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:33.313276" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:33.309530" elapsed="0.003816"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:33.308997" elapsed="0.004399"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:33.308954" elapsed="0.004478"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:33.317154" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:33.313857" elapsed="0.003363"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:33.313511" elapsed="0.003760"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:33.313487" elapsed="0.003820"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:33.318148" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:33.317547" 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-08-22T23:42:33.318486" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:33.318249" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:33.319057" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:33.318752" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:33.318570" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:33.318230" elapsed="0.000915"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:33.319685" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:33.319303" 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-08-22T23:42:33.320013" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:33.319783" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:33.320559" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:33.320263" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:33.320101" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:33.319765" 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-08-22T23:42:33.320814" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:33.321642" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:33.321326" 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-08-22T23:42:33.321848" 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-08-22T23:42:33.307988" elapsed="0.016437"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:33.324622" elapsed="0.000091"/>
</return>
<status status="PASS" start="2026-08-22T23:42:33.324496" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:33.324477" elapsed="0.000301"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:33.324927" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:33.324999" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:33.327421" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:33.278664" elapsed="0.048787"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:33.327513" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:33.327682" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:33.272713" elapsed="0.054996"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:33.328363" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:33.327990" elapsed="0.000454">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:33.327781" elapsed="0.000737">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:33.327763" elapsed="0.000789">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:33.328801" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:33.328654" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:33.328636" elapsed="0.000247"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:33.269836" elapsed="0.059129">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:34.332077" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:34.330954" elapsed="0.001194"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:34.344787" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:34.344479" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:34.345255" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:34.345004" 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-08-22T23:42:34.367821" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:34.368134" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:34.368374" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:34.347505" elapsed="0.020932"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:34.345380" elapsed="0.023166"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:34.369036" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:34.368652" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:34.345357" elapsed="0.023893"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:34.375936" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:34.371872" elapsed="0.004138"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:34.371251" elapsed="0.004816"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:34.371208" elapsed="0.004904"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:34.380001" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:34.376550" elapsed="0.003527"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:34.376211" elapsed="0.003929"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:34.376182" elapsed="0.004002"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:34.380862" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:34.380407" 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-08-22T23:42:34.381211" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:34.380965" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:34.381797" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:34.381460" elapsed="0.000371"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:34.381295" elapsed="0.000575"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:34.380946" elapsed="0.000946"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:34.382430" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:34.382055" 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-08-22T23:42:34.382799" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:34.382530" elapsed="0.000329"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:34.383346" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:34.383043" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:34.382883" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:34.382512" 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-08-22T23:42:34.383605" elapsed="0.000379"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:34.384460" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:34.384152" 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-08-22T23:42:34.384663" 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-08-22T23:42:34.370165" elapsed="0.017056"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:34.387405" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:42:34.387293" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:34.387274" 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-08-22T23:42:34.387676" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:34.387751" elapsed="0.000039"/>
</return>
<msg time="2026-08-22T23:42:34.390109" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:34.337952" elapsed="0.052186"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:34.390198" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:34.390349" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:34.332725" elapsed="0.057651"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:34.391035" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:34.390671" elapsed="0.000444">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:34.390446" elapsed="0.000743">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:34.390429" elapsed="0.000850">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:34.391503" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:34.391355" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:34.391338" elapsed="0.000262"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:34.329908" elapsed="0.061778">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:35.394667" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:35.393675" elapsed="0.001067"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:35.405893" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:35.405628" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:35.406348" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:35.406096" 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-08-22T23:42:35.425105" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:35.425260" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:35.425362" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:35.408609" elapsed="0.016779"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:35.406470" elapsed="0.018963"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:35.425643" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:35.425461" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:35.406448" elapsed="0.019286"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:35.429491" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:35.426790" elapsed="0.002849"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:35.426534" elapsed="0.003189"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:35.426515" elapsed="0.003267"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:35.435810" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:35.430405" elapsed="0.005512"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:35.429910" elapsed="0.006087"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:35.429874" elapsed="0.006180"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:35.437290" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:35.436481" 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-08-22T23:42:35.437643" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:35.437390" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:35.438196" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:35.437891" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:35.437729" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:35.437372" elapsed="0.000911"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:35.438834" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:35.438440" 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-08-22T23:42:35.439205" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:35.438941" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:35.439909" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:35.439602" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:35.439413" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:35.438924" 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-08-22T23:42:35.440158" elapsed="0.000378"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:35.441024" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:35.440727" 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-08-22T23:42:35.441204" 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-08-22T23:42:35.426101" elapsed="0.017584"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:35.443866" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:42:35.443756" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:35.443737" 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-08-22T23:42:35.444111" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:35.444185" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:35.446721" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:35.400872" elapsed="0.045879"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:35.446812" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:35.446965" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:35.395238" elapsed="0.051755"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:35.447651" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:35.447272" elapsed="0.000460">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:35.447063" elapsed="0.000743">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:35.447046" elapsed="0.000795">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:35.448058" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:35.447911" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:35.447894" elapsed="0.000245"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:35.392545" elapsed="0.055677">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:36.450811" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:36.449865" elapsed="0.001013"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:36.468796" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:36.468408" elapsed="0.000456"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:36.469427" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:36.469080" 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-08-22T23:42:36.488528" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:36.488950" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:36.489190" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:36.472485" elapsed="0.016767"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:36.469611" 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-08-22T23:42:36.489784" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:36.489409" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:36.469561" elapsed="0.020421"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:36.495783" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:36.492331" elapsed="0.003522"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:36.491794" elapsed="0.004110"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:36.491752" elapsed="0.004187"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:36.499786" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:36.496444" elapsed="0.003409"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:36.496024" elapsed="0.003881"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:36.496000" elapsed="0.003941"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:36.500802" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:36.500226" 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-08-22T23:42:36.501329" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:36.500949" elapsed="0.000451"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:36.501925" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:36.501609" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:36.501425" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:36.500921" elapsed="0.001093"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:36.502557" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:36.502178" 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-08-22T23:42:36.502921" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:36.502679" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:36.503476" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:36.503169" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:36.503005" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:36.502659" 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-08-22T23:42:36.503735" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:36.504576" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:36.504283" 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-08-22T23:42:36.504777" 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-08-22T23:42:36.490807" elapsed="0.016545"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:36.507534" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-08-22T23:42:36.507422" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:36.507404" 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-08-22T23:42:36.507797" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:36.507873" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:42:36.510297" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:36.457731" elapsed="0.052597"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:36.510426" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:42:36.510608" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:36.451361" elapsed="0.059276"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:36.511300" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:36.510927" elapsed="0.000452">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:36.510711" elapsed="0.000740">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:36.510693" elapsed="0.000794">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:36.511729" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:36.511561" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:36.511543" elapsed="0.000269"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:36.448933" elapsed="0.062962">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:37.514526" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:37.513612" elapsed="0.001055"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:37.526573" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:37.526219" elapsed="0.000474"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:37.527281" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:37.526909" elapsed="0.000438"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:42:37.545136" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:37.545354" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:37.545618" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:37.529497" elapsed="0.016184"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:37.527434" elapsed="0.018345"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:37.546178" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:37.545837" elapsed="0.000485"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:37.527407" elapsed="0.018962"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:37.554647" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:37.548744" elapsed="0.006021"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:37.548214" elapsed="0.006692"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:37.548173" elapsed="0.006794"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:37.557868" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:37.555488" elapsed="0.002426"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:37.555099" elapsed="0.002851"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:37.555061" elapsed="0.002914"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:37.558537" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:37.558147" 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-08-22T23:42:37.559002" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:37.558744" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:37.559551" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:37.559248" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:37.559087" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:37.558724" elapsed="0.000934"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:37.560179" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:37.559816" 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-08-22T23:42:37.560508" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:37.560277" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:37.561067" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:37.560769" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:37.560609" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:37.560259" 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-08-22T23:42:37.561302" elapsed="0.000369"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:37.562126" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:37.561834" 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-08-22T23:42:37.562306" 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-08-22T23:42:37.547232" elapsed="0.017591"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:37.565002" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:42:37.564894" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:37.564875" 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-08-22T23:42:37.565240" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:37.565312" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:37.567715" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:37.520173" elapsed="0.047572"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:37.567806" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:37.567958" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:37.515158" elapsed="0.052827"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:37.568636" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:37.568263" elapsed="0.000449">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:37.568056" elapsed="0.000728">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:37.568039" elapsed="0.000779">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:37.569035" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:37.568889" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:37.568871" elapsed="0.000244"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:37.512660" elapsed="0.056536">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:38.572171" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:38.571184" elapsed="0.001067"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:38.585087" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:38.584718" elapsed="0.000438"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:38.585669" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:38.585402" 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-08-22T23:42:38.604261" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:38.604489" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:38.604674" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:38.587881" elapsed="0.016833"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:38.585791" elapsed="0.018987"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:38.605038" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:38.604817" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:38.585768" elapsed="0.019394"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:38.610229" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:38.606662" elapsed="0.003642"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:38.606330" elapsed="0.004028"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:38.606305" elapsed="0.004089"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:38.614297" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:38.610824" elapsed="0.003543"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:38.610477" elapsed="0.003943"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:38.610452" elapsed="0.004004"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:38.615310" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:38.614731" 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-08-22T23:42:38.615831" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:38.615458" elapsed="0.000460"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:38.616659" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:38.616191" elapsed="0.000511"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:38.615954" elapsed="0.000839"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:38.615431" elapsed="0.001397"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:38.617495" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:38.617065" 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-08-22T23:42:38.617845" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:38.617611" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:38.618379" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:38.618085" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:38.617928" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:38.617576" 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-08-22T23:42:38.618633" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:38.619452" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:38.619146" 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-08-22T23:42:38.619711" elapsed="0.002383"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:42:38.605737" elapsed="0.016422"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:38.622345" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:42:38.622230" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:38.622212" 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-08-22T23:42:38.622606" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:38.622681" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:42:38.625067" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:38.578106" elapsed="0.046991"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:38.625159" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:38.625311" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:38.572830" elapsed="0.052509"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:38.626051" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:38.625687" elapsed="0.000444">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:38.625410" elapsed="0.000795">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:38.625393" elapsed="0.000848">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:38.626462" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:38.626316" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:38.626297" elapsed="0.000247"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:38.570088" elapsed="0.056560">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:39.629466" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:39.628491" elapsed="0.001046"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:39.642329" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:39.641951" elapsed="0.000461"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:39.642860" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:39.642613" 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-08-22T23:42:39.661243" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:39.661526" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:39.661792" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:39.645112" elapsed="0.016738"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:39.642982" elapsed="0.019092"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:39.662484" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:39.662138" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:39.642959" elapsed="0.019754"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:39.670703" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:39.665000" elapsed="0.005817"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:39.664476" elapsed="0.006423"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:39.664435" elapsed="0.006521"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:39.676888" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:39.671613" elapsed="0.005378"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:39.671081" elapsed="0.005989"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:39.671044" elapsed="0.006081"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:39.678428" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:39.677490" elapsed="0.000999"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:39.678832" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:39.678580" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:39.679380" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:39.679073" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:39.678915" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:39.678558" elapsed="0.000908"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:39.680002" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:39.679637" 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-08-22T23:42:39.680329" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:39.680098" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:39.680881" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:39.680567" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:39.680410" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:39.680081" 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-08-22T23:42:39.681119" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:39.681956" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:39.681644" 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-08-22T23:42:39.682137" 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-08-22T23:42:39.663501" elapsed="0.021131"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:39.684816" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:42:39.684704" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:39.684686" 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-08-22T23:42:39.685057" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:39.685130" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:39.687468" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:39.635736" elapsed="0.051761"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:39.687557" elapsed="0.000043"/>
</return>
<msg time="2026-08-22T23:42:39.687726" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:39.630108" elapsed="0.057644"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:39.688441" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:39.688029" elapsed="0.000493">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:39.687822" elapsed="0.000791">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:39.687805" elapsed="0.000845">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:39.688869" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:39.688721" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:39.688704" elapsed="0.000244"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:39.627436" elapsed="0.061595">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:40.692086" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:40.691076" elapsed="0.001081"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:40.703633" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:40.703339" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:40.704087" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:40.703839" 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-08-22T23:42:40.724553" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:40.724915" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:40.725138" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:40.706301" elapsed="0.018895"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:40.704210" elapsed="0.021084"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:40.725728" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:40.725354" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:40.704186" elapsed="0.021741"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:40.736233" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:40.728240" elapsed="0.008046"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:40.727745" elapsed="0.008578"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:40.727703" elapsed="0.008647"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:40.739037" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:40.736653" elapsed="0.002431"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:40.736408" elapsed="0.002712"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:40.736390" elapsed="0.002755"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:40.739774" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:40.739347" 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-08-22T23:42:40.740110" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:40.739874" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:40.740678" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:40.740355" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:40.740194" elapsed="0.000610"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:40.739856" elapsed="0.000971"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:40.741362" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:40.740988" 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-08-22T23:42:40.741713" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:40.741461" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:40.742257" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:40.741956" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:40.741797" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:40.741443" 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-08-22T23:42:40.742494" elapsed="0.000402"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:40.743386" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:40.743059" 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-08-22T23:42:40.743566" 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-08-22T23:42:40.726765" elapsed="0.019259"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:40.746203" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-08-22T23:42:40.746094" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:40.746076" 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-08-22T23:42:40.746442" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:40.746515" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:42:40.748921" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:40.697180" elapsed="0.051770"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:40.749010" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:40.749161" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:40.692685" elapsed="0.056502"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:40.749846" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:40.749465" elapsed="0.000460">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:40.749258" elapsed="0.000740">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:40.749241" elapsed="0.000792">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:40.750248" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:40.750103" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:40.750086" elapsed="0.000243"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:40.689975" elapsed="0.060453">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:41.753400" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:41.752313" elapsed="0.001162"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:41.764750" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:41.764452" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:41.765205" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:41.764955" 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-08-22T23:42:41.783815" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:41.783973" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:41.784073" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:41.767595" elapsed="0.016504"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:41.765334" elapsed="0.018809"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:41.784328" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:41.784172" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:41.765306" elapsed="0.019110"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:41.787915" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:41.785447" elapsed="0.002517"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:41.785221" elapsed="0.002779"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:41.785202" elapsed="0.002824"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:41.791366" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:41.788303" elapsed="0.003113"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:41.788082" elapsed="0.003370"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:41.788065" elapsed="0.003412"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:41.792065" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:41.791666" 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-08-22T23:42:41.792403" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:41.792165" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:41.792971" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:41.792666" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:41.792487" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:41.792147" elapsed="0.000911"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:41.793595" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:41.793215" 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-08-22T23:42:41.793930" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:41.793696" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:41.794468" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:41.794170" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:41.794012" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:41.793678" elapsed="0.000875"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:42:41.794748" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:41.795555" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:41.795262" 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-08-22T23:42:41.795754" elapsed="0.002334"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:42:41.784793" elapsed="0.013359"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:41.798378" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:42:41.798268" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:41.798248" 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-08-22T23:42:41.798662" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:41.798737" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:41.801062" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:41.759864" elapsed="0.041227"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:41.801153" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:41.801306" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:41.754153" elapsed="0.047179"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:41.801988" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:41.801627" elapsed="0.000440">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:41.801403" elapsed="0.000737">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:41.801386" elapsed="0.000788">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:41.802389" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:41.802244" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:41.802227" elapsed="0.000242"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:41.751276" elapsed="0.051276">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:42.805553" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:42.804548" elapsed="0.001109"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:42.816039" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:42.815772" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:42.816496" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:42.816245" 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-08-22T23:42:42.834885" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:42.835049" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:42.835153" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:42.818803" elapsed="0.016377"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:42.816637" elapsed="0.018587"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:42.835410" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:42.835255" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:42.816612" elapsed="0.018954"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:42.839133" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:42.836626" elapsed="0.002558"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:42.836380" elapsed="0.002840"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:42.836362" elapsed="0.002884"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:42.843028" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:42.839677" elapsed="0.003417"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:42.839313" elapsed="0.003831"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:42.839292" elapsed="0.003888"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:42.843999" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:42.843421" elapsed="0.000617"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:42.844468" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:42.844137" elapsed="0.000414"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:42.845259" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:42.844835" elapsed="0.000463"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:42.844608" elapsed="0.000741"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:42.844112" elapsed="0.001267"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:42.846133" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:42.845620" 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-08-22T23:42:42.846677" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:42.846303" elapsed="0.000433"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:42.847213" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:42.846917" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:42.846761" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:42.846278" 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-08-22T23:42:42.847453" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:42.848279" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:42.847982" 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-08-22T23:42:42.848458" 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-08-22T23:42:42.835947" elapsed="0.015041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:42.851170" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:42:42.851060" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:42.851042" 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-08-22T23:42:42.851411" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:42.851484" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:42.853855" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:42.810183" elapsed="0.043702"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:42.853946" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:42.854098" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:42.806211" elapsed="0.047914"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:42.854818" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:42.854438" elapsed="0.000459">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:42.854225" elapsed="0.000784">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:42.854178" elapsed="0.000867">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:42.855265" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:42.855116" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:42.855099" elapsed="0.000246"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:42.803449" elapsed="0.051978">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:43.859470" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:43.858058" elapsed="0.001515"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:43.872352" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:43.871973" elapsed="0.000436"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:43.872870" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:43.872603" 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-08-22T23:42:43.891341" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:43.891708" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:43.891986" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:43.875339" elapsed="0.016711"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:43.873005" elapsed="0.019145"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:43.892566" elapsed="0.000088"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:43.892215" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:43.872977" elapsed="0.019827"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:43.899857" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:43.895351" elapsed="0.004556"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:43.894797" elapsed="0.005146"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:43.894753" elapsed="0.005216"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:43.902670" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:43.900251" elapsed="0.002467"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:43.900026" elapsed="0.002728"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:43.900008" elapsed="0.002771"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:43.903413" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:43.902981" 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-08-22T23:42:43.903777" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:43.903513" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:43.904351" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:43.904042" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:43.903861" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:43.903494" elapsed="0.000949"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:43.905076" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:43.904621" 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-08-22T23:42:43.905459" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:43.905189" elapsed="0.000331"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:43.906031" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:43.905725" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:43.905544" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:43.905170" 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-08-22T23:42:43.906291" elapsed="0.000389"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:43.907164" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:43.906846" 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-08-22T23:42:43.907366" 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-08-22T23:42:43.893742" elapsed="0.016192"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:43.910147" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-08-22T23:42:43.910017" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:43.909996" 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-08-22T23:42:43.910459" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:43.910555" elapsed="0.000019"/>
</return>
<msg time="2026-08-22T23:42:43.913264" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:43.866104" elapsed="0.047190"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:43.913357" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:42:43.913570" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:43.860311" elapsed="0.053307"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:43.914306" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:43.913924" elapsed="0.000477">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:43.913694" elapsed="0.000784">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:43.913677" elapsed="0.000836">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:43.914778" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:43.914605" elapsed="0.000252"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:43.914566" elapsed="0.000324"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:43.856482" elapsed="0.058514">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:44.918078" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:44.917085" elapsed="0.001066"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:44.929266" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:44.929004" elapsed="0.000433"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:44.929864" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:44.929610" 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-08-22T23:42:44.949488" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:44.949836" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:44.950061" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:44.932132" elapsed="0.017987"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:44.929989" elapsed="0.020228"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:44.950668" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:44.950280" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:44.929964" elapsed="0.020904"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:44.958752" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:44.953313" elapsed="0.005552"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:44.952816" elapsed="0.006129"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:44.952773" elapsed="0.006230"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:44.962978" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:44.959651" elapsed="0.003374"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:44.959128" elapsed="0.003932"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:44.959091" elapsed="0.003994"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:44.963685" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:44.963261" 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-08-22T23:42:44.964020" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:44.963784" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:44.964600" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:44.964274" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:44.964102" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:44.963766" elapsed="0.000921"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:44.965206" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:44.964844" 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-08-22T23:42:44.965532" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:44.965303" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:44.966084" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:44.965790" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:44.965631" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:44.965285" 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-08-22T23:42:44.966316" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:44.967140" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:44.966844" 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-08-22T23:42:44.967316" 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-08-22T23:42:44.951706" elapsed="0.018191"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:44.970075" elapsed="0.000075"/>
</return>
<status status="PASS" start="2026-08-22T23:42:44.969966" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:44.969949" 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-08-22T23:42:44.970360" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:44.970437" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:42:44.972823" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:44.922864" elapsed="0.049988"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:44.972915" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:44.973066" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:44.918679" elapsed="0.054414"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:44.973755" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:44.973374" elapsed="0.000462">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:44.973164" elapsed="0.000746">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:44.973147" elapsed="0.000798">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:44.974161" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:44.974015" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:44.973998" elapsed="0.000243"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:44.915958" elapsed="0.058366">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:45.977366" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:45.976370" elapsed="0.001067"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:45.988899" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:45.988632" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:45.989352" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:45.989104" 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-08-22T23:42:46.009920" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:46.010211" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:46.010437" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:45.991606" elapsed="0.018889"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:45.989478" elapsed="0.021148"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:46.011166" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:46.010690" elapsed="0.000635"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:45.989455" elapsed="0.021920"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:46.019459" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:46.013724" elapsed="0.005798"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:46.013188" elapsed="0.006370"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:46.013146" elapsed="0.006453"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:46.022200" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:46.019883" elapsed="0.002364"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:46.019660" elapsed="0.002623"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:46.019642" elapsed="0.002665"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:46.022943" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:46.022485" 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-08-22T23:42:46.023288" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:46.023052" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:46.023855" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:46.023534" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:46.023371" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:46.023030" elapsed="0.000911"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:46.024461" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:46.024098" 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-08-22T23:42:46.024806" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:46.024558" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:46.025348" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:46.025043" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:46.024888" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:46.024540" 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-08-22T23:42:46.025602" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:46.026420" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:46.026120" 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-08-22T23:42:46.026614" 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-08-22T23:42:46.012197" elapsed="0.017003"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:46.029385" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:42:46.029274" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:46.029256" 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-08-22T23:42:46.029647" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:46.029718" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:46.032097" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:45.982624" elapsed="0.049502"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:46.032187" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:46.032344" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:45.977973" elapsed="0.054397"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:46.033035" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:46.032667" elapsed="0.000451">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:46.032439" elapsed="0.000753">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:46.032423" elapsed="0.000851">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:46.033504" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:46.033350" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:46.033333" elapsed="0.000268"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:45.975314" elapsed="0.058375">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:47.036668" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:47.035658" elapsed="0.001086"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:47.046862" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:47.046599" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:47.047308" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:47.047062" 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-08-22T23:42:47.065432" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:47.065795" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:47.066022" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:47.049543" elapsed="0.016536"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:47.047431" elapsed="0.018745"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:47.066612" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:47.066239" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:47.047407" elapsed="0.019404"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:47.074252" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:47.069117" elapsed="0.005185"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:47.068562" elapsed="0.005777"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:47.068521" elapsed="0.005845"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:47.076969" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:47.074666" elapsed="0.002349"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:47.074424" elapsed="0.002626"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:47.074407" elapsed="0.002683"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:47.077687" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:47.077269" 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-08-22T23:42:47.078022" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:47.077787" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:47.078598" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:47.078264" elapsed="0.000363"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:47.078104" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:47.077769" elapsed="0.000916"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:47.079203" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:47.078841" 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-08-22T23:42:47.079528" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:47.079299" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:47.080152" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:47.079856" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:47.079689" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:47.079282" 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-08-22T23:42:47.080390" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:47.081250" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:47.080919" 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-08-22T23:42:47.081486" elapsed="0.004650"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:42:47.067623" elapsed="0.018577"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:47.086379" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:42:47.086270" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:47.086252" 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-08-22T23:42:47.086636" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:47.086709" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:47.089017" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:47.042273" elapsed="0.046773"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:47.089124" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:47.089407" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:47.037304" elapsed="0.052132"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:47.090101" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:47.089736" elapsed="0.000444">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:47.089508" elapsed="0.000745">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:47.089491" elapsed="0.000796">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:47.090508" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:47.090358" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:47.090341" elapsed="0.000264"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:47.034571" elapsed="0.056118">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:48.093915" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:48.092873" elapsed="0.001114"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:48.105284" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:48.105015" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:48.105788" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:48.105494" 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-08-22T23:42:48.126374" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:48.126914" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:48.127264" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:48.108088" elapsed="0.019255"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:48.105917" elapsed="0.021538"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:48.127902" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:48.127518" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:48.105893" elapsed="0.022204"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:48.134236" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:48.130387" elapsed="0.003916"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:48.129902" elapsed="0.004450"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:48.129861" elapsed="0.004525"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:48.138088" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:48.134792" elapsed="0.003360"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:48.134465" elapsed="0.003736"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:48.134442" elapsed="0.003793"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:48.139056" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:48.138474" 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-08-22T23:42:48.139649" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:48.139255" elapsed="0.000455"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:48.140196" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:48.139894" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:48.139734" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:48.139223" elapsed="0.001057"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:48.140816" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:48.140435" 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-08-22T23:42:48.141142" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:48.140912" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:48.141693" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:48.141379" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:48.141223" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:48.140895" 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-08-22T23:42:48.141928" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:48.142761" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:48.142440" 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-08-22T23:42:48.142939" elapsed="0.002416"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:42:48.128922" elapsed="0.016499"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:48.145619" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:42:48.145491" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:48.145472" 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-08-22T23:42:48.145865" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:48.145936" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:48.148301" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:48.098910" elapsed="0.049419"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:48.148440" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:42:48.148612" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:48.094548" elapsed="0.054093"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:48.149283" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:48.148919" elapsed="0.000446">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:48.148712" elapsed="0.000725">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:48.148695" elapsed="0.000778">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:48.149705" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:48.149542" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:48.149526" elapsed="0.000260"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:48.091767" elapsed="0.058103">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:49.152873" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:49.151856" elapsed="0.001154"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:49.165268" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:49.165006" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:49.165742" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:49.165473" 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-08-22T23:42:49.184824" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:49.184993" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:49.185093" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:49.167934" elapsed="0.017185"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:49.165863" elapsed="0.019300"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:49.185347" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:49.185191" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:49.165840" elapsed="0.019595"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:49.193171" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:49.187731" elapsed="0.005551"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:49.187206" elapsed="0.006156"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:49.187166" elapsed="0.006252"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:49.196171" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:49.193825" elapsed="0.002394"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:49.193556" elapsed="0.002698"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:49.193514" elapsed="0.002766"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:49.196873" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:49.196454" 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-08-22T23:42:49.197285" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:49.197047" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:49.197848" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:49.197528" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:49.197368" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:49.197027" elapsed="0.000907"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:49.198450" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:49.198088" 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-08-22T23:42:49.198793" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:49.198547" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:49.199324" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:49.199031" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:49.198875" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:49.198529" 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-08-22T23:42:49.199554" elapsed="0.000371"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:49.200379" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:49.200086" 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-08-22T23:42:49.200557" 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-08-22T23:42:49.186230" elapsed="0.016902"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:49.203307" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:42:49.203200" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:49.203182" 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-08-22T23:42:49.203561" elapsed="0.000038"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:49.203651" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:49.206142" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:49.159635" elapsed="0.046536"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:49.206231" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:42:49.206382" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:49.153527" elapsed="0.052882"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:49.207070" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:49.206708" elapsed="0.000443">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:49.206483" elapsed="0.000740">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:49.206463" elapsed="0.000794">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:49.207479" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:49.207335" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:49.207312" elapsed="0.000246"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:49.150768" elapsed="0.056885">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:50.210811" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:50.209730" elapsed="0.001156"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:50.227999" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:50.227736" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:50.228453" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:50.228204" 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-08-22T23:42:50.250353" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:50.250618" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:50.250747" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:50.230665" elapsed="0.020109"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:50.228574" elapsed="0.022244"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:50.251003" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:50.250846" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:50.228552" elapsed="0.022539"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:50.256338" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:50.252122" elapsed="0.004267"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:50.251897" elapsed="0.004528"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:50.251879" elapsed="0.004572"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:50.259087" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:50.256751" elapsed="0.002384"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:50.256507" elapsed="0.002664"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:50.256490" elapsed="0.002706"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:50.259793" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:50.259371" 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-08-22T23:42:50.260125" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:50.259891" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:50.260681" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:50.260365" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:50.260205" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:50.259873" elapsed="0.000894"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:50.261285" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:50.260924" 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-08-22T23:42:50.261627" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:50.261381" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:50.262159" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:50.261865" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:50.261708" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:50.261364" 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-08-22T23:42:50.262391" elapsed="0.000381"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:50.263248" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:50.262948" 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-08-22T23:42:50.263531" elapsed="0.003337"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:42:50.251454" elapsed="0.015510"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:50.267174" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-08-22T23:42:50.267055" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:50.267031" 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-08-22T23:42:50.267452" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:50.267525" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:50.269908" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:50.217316" elapsed="0.052622"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:50.269998" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:50.270149" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:50.211393" elapsed="0.058782"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:50.270869" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:50.270453" elapsed="0.000499">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:50.270246" elapsed="0.000780">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:50.270229" elapsed="0.000831">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:50.271277" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:50.271129" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:50.271112" elapsed="0.000244"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:50.208633" elapsed="0.062805">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:51.274475" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:51.273490" elapsed="0.001058"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:51.285782" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:51.285504" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:51.286231" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:51.285983" 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-08-22T23:42:51.305972" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:51.306271" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:51.306504" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:51.288462" elapsed="0.018103"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:51.286353" elapsed="0.020494"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:51.307277" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:51.306914" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:51.286329" elapsed="0.021144"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:51.315447" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:51.309903" elapsed="0.005656"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:51.309350" elapsed="0.006329"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:51.309308" elapsed="0.006431"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:51.318870" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:51.316416" elapsed="0.002501"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:51.315868" elapsed="0.003085"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:51.315830" elapsed="0.003148"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:51.319589" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:51.319156" 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-08-22T23:42:51.319984" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:51.319705" elapsed="0.000339"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:51.320547" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:51.320243" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:51.320069" elapsed="0.000568"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:51.319686" elapsed="0.000973"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:51.321187" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:51.320817" 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-08-22T23:42:51.321527" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:51.321285" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:51.322087" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:51.321790" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:51.321631" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:51.321267" 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-08-22T23:42:51.322325" elapsed="0.000373"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:51.323158" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:51.322859" 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-08-22T23:42:51.323338" elapsed="0.002572"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:42:51.308350" elapsed="0.017626"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:51.326158" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:42:51.326047" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:51.326029" 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-08-22T23:42:51.326402" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:51.326475" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:51.329014" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:51.279271" elapsed="0.049774"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:51.329109" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:42:51.329269" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:51.275075" elapsed="0.054221"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:51.330064" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:51.329601" elapsed="0.000547">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:51.329369" elapsed="0.000854">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:51.329350" elapsed="0.000909">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:51.330478" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:51.330330" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:51.330313" elapsed="0.000244"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:51.272395" elapsed="0.058263">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:52.333511" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:52.332538" elapsed="0.001134"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:52.344153" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:52.343884" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:52.344638" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:52.344362" 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-08-22T23:42:52.363790" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:52.364072" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:52.364295" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:52.346900" elapsed="0.017455"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:52.344762" elapsed="0.019691"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:52.365047" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:52.364515" elapsed="0.000682"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:52.344739" elapsed="0.020508"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:52.373264" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:52.367636" elapsed="0.005743"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:52.367106" elapsed="0.006352"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:52.367064" elapsed="0.006452"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:52.376226" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:52.373863" elapsed="0.002411"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:52.373636" elapsed="0.002674"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:52.373617" elapsed="0.002727"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:52.376956" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:52.376532" 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-08-22T23:42:52.377292" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:52.377056" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:52.377870" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:52.377531" elapsed="0.000366"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:52.377372" elapsed="0.000637"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:52.377038" elapsed="0.000994"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:52.378564" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:52.378190" 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-08-22T23:42:52.378913" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:52.378678" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:52.379454" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:52.379155" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:52.378995" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:52.378660" 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-08-22T23:42:52.379709" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:52.380527" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:52.380230" 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-08-22T23:42:52.380724" 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-08-22T23:42:52.366114" elapsed="0.017171"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:52.383467" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:42:52.383356" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:52.383338" 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-08-22T23:42:52.383723" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:52.383796" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:52.386161" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:52.338236" elapsed="0.047959"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:52.386259" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:52.386425" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:52.334178" elapsed="0.052275"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:52.387122" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:52.386754" elapsed="0.000450">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:52.386526" elapsed="0.000750">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:52.386509" elapsed="0.000802">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:52.387531" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:52.387381" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:52.387364" elapsed="0.000263"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:52.331507" elapsed="0.056205">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:53.390888" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:53.389819" elapsed="0.001147"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:53.401133" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:53.400867" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:53.401627" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:53.401336" 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-08-22T23:42:53.422907" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:53.423230" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:53.423462" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:53.403903" elapsed="0.019620"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:53.401761" elapsed="0.021913"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:53.424132" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:53.423744" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:53.401737" elapsed="0.022598"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:53.431097" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:53.426772" elapsed="0.004397"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:53.426237" elapsed="0.004984"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:53.426193" elapsed="0.005064"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:53.435047" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:53.431720" elapsed="0.003395"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:53.431337" elapsed="0.003827"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:53.431313" elapsed="0.003886"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:53.435959" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:53.435440" elapsed="0.000546"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:53.436294" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:53.436057" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:53.436869" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:53.436532" elapsed="0.000364"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:53.436376" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:53.436039" elapsed="0.000915"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:53.437518" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:53.437124" 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-08-22T23:42:53.437895" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:53.437647" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:53.438448" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:53.438145" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:53.437986" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:53.437626" 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-08-22T23:42:53.438709" elapsed="0.000377"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:53.439555" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:53.439251" 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-08-22T23:42:53.439768" 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-08-22T23:42:53.425206" elapsed="0.016992"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:53.442434" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:42:53.442319" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:53.442300" 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-08-22T23:42:53.442712" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:53.442789" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:53.445165" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:53.396456" elapsed="0.048738"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:53.445255" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:42:53.445407" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:53.391697" elapsed="0.053736"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:53.446099" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:53.445730" elapsed="0.000452">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:53.445503" elapsed="0.000754">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:53.445486" elapsed="0.000806">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:53.446508" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:53.446362" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:53.446345" elapsed="0.000267"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:53.388647" elapsed="0.058058">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:54.449809" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:54.448777" elapsed="0.001105"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:54.462037" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:54.461744" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:54.462495" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:54.462242" 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-08-22T23:42:54.485885" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:54.486194" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:54.486419" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:54.464793" elapsed="0.021685"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:54.462637" elapsed="0.023938"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:54.487076" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:54.486673" elapsed="0.000692"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:54.462612" elapsed="0.024818"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:54.495722" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:54.489968" elapsed="0.005867"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:54.489375" elapsed="0.006543"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:54.489323" elapsed="0.006652"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:54.499599" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:54.496733" elapsed="0.002915"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:54.496104" elapsed="0.003581"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:54.496066" elapsed="0.003643"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:54.500304" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:54.499888" 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-08-22T23:42:54.500675" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:54.500404" elapsed="0.000332"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:54.501227" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:54.500923" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:54.500761" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:54.500385" elapsed="0.000929"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:54.501859" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:54.501470" 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-08-22T23:42:54.502187" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:54.501957" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:54.502738" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:54.502424" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:54.502269" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:54.501939" 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-08-22T23:42:54.502975" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:54.503811" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:54.503488" 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-08-22T23:42:54.503991" elapsed="0.002357"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:42:54.488288" elapsed="0.018126"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:54.506613" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:42:54.506486" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:54.506468" 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-08-22T23:42:54.506858" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:54.506930" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:54.509295" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:54.455187" elapsed="0.054138"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:54.509387" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:54.509542" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:54.450384" elapsed="0.059186"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:54.510237" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:54.509870" elapsed="0.000448">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:54.509658" elapsed="0.000771">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:54.509641" elapsed="0.000824">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:54.510701" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:54.510537" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:54.510520" elapsed="0.000265"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:54.447638" elapsed="0.063231">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:55.513919" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:55.512891" elapsed="0.001100"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:55.525015" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:55.524748" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:55.525471" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:55.525221" 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-08-22T23:42:55.549458" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:55.549630" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:55.549732" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:55.527701" elapsed="0.022059"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:55.525608" elapsed="0.024198"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:55.549990" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:55.549834" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:55.525570" elapsed="0.024512"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:55.553587" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:55.551129" elapsed="0.002510"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:55.550890" elapsed="0.002786"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:55.550872" elapsed="0.002830"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:55.556345" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:55.553984" elapsed="0.002408"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:55.553764" elapsed="0.002664"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:55.553747" elapsed="0.002706"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:55.557043" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:55.556643" 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-08-22T23:42:55.557377" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:55.557142" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:55.557940" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:55.557637" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:55.557462" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:55.557124" elapsed="0.000903"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:55.558631" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:55.558183" elapsed="0.000477"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:55.558995" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:55.558732" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:55.559541" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:55.559242" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:55.559081" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:55.558714" elapsed="0.000936"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:42:55.559803" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:55.560629" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:55.560318" 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-08-22T23:42:55.560809" 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-08-22T23:42:55.550445" elapsed="0.012900"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:55.563524" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:42:55.563415" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:55.563397" 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-08-22T23:42:55.563788" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:55.563862" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:55.566219" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:55.518966" elapsed="0.047282"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:55.566310" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:42:55.566464" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:55.514483" elapsed="0.052008"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:55.567200" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:55.566789" elapsed="0.000490">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:55.566562" elapsed="0.000788">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:55.566545" elapsed="0.000841">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:55.567620" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:55.567456" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:55.567439" elapsed="0.000266"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:55.511786" elapsed="0.056001">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:56.570728" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:56.569748" elapsed="0.001052"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:56.582302" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:56.582030" elapsed="0.000429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:56.582893" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:56.582640" 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-08-22T23:42:56.602648" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:56.602936" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:56.603188" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:56.585110" elapsed="0.018138"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:56.583021" elapsed="0.020335"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:56.603850" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:56.603423" elapsed="0.000577"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:56.582997" elapsed="0.021053"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:56.612448" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:56.606455" elapsed="0.006107"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:56.605952" elapsed="0.006720"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:56.605910" elapsed="0.006822"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:56.615877" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:56.613400" elapsed="0.002522"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:56.612861" elapsed="0.003095"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:56.612823" elapsed="0.003159"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:56.616566" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:56.616164" 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-08-22T23:42:56.616921" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:56.616681" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:56.617476" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:56.617174" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:56.617002" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:56.616663" elapsed="0.000899"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:56.618098" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:56.617736" 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-08-22T23:42:56.618426" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:56.618195" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:56.618977" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:56.618680" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:56.618507" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:56.618177" 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-08-22T23:42:56.619209" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:56.620031" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:56.619736" 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-08-22T23:42:56.620208" elapsed="0.002337"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:42:56.604920" elapsed="0.017707"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:56.622814" elapsed="0.000111"/>
</return>
<status status="PASS" start="2026-08-22T23:42:56.622698" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:56.622680" elapsed="0.000310"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:56.623136" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:56.623208" elapsed="0.000014"/>
</return>
<msg time="2026-08-22T23:42:56.625526" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:56.575761" elapsed="0.049793"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:56.625630" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:42:56.625783" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:56.571288" elapsed="0.054521"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:56.626447" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:56.626087" elapsed="0.000439">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:56.625880" elapsed="0.000735">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:56.625862" elapsed="0.000788">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:56.626865" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:56.626719" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:56.626703" elapsed="0.000242"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:56.568663" elapsed="0.058364">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:57.630099" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:57.629115" elapsed="0.001057"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:57.641038" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:57.640775" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:57.641485" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:57.641241" 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-08-22T23:42:57.665441" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:57.665666" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:57.665874" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:57.643718" elapsed="0.022213"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:57.641624" elapsed="0.024404"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:57.666435" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:57.666089" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:57.641599" elapsed="0.025064"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:57.674605" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:57.669018" elapsed="0.005703"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:57.668495" elapsed="0.006305"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:57.668455" elapsed="0.006402"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:57.678029" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:57.675531" elapsed="0.002545"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:57.674985" elapsed="0.003126"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:57.674946" elapsed="0.003189"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:57.678730" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:57.678314" 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-08-22T23:42:57.679065" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:57.678830" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:57.679646" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:57.679325" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:57.679147" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:57.678811" elapsed="0.000921"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:57.680262" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:57.679892" 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-08-22T23:42:57.680604" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:57.680360" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:57.681138" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:57.680843" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:57.680687" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:57.680342" 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-08-22T23:42:57.681371" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:57.682194" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:57.681897" 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-08-22T23:42:57.682371" elapsed="0.002346"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:42:57.667480" elapsed="0.017301"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:57.684961" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:42:57.684850" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:57.684832" 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-08-22T23:42:57.685203" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:57.685273" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:57.687617" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:57.634538" elapsed="0.053109"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:57.687706" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:42:57.687858" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:57.630695" elapsed="0.057189"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:57.688527" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:57.688160" elapsed="0.000470">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:57.687954" elapsed="0.000751">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:57.687937" elapsed="0.000845">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:57.689007" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:57.688859" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:57.688841" elapsed="0.000246"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:57.628001" elapsed="0.061170">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:58.692241" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:58.691200" elapsed="0.001117"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:58.703129" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:58.702868" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:58.703591" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:58.703333" 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-08-22T23:42:58.724094" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:58.724251" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:58.724350" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:58.705796" elapsed="0.018579"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:58.703717" elapsed="0.020702"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:58.724624" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:58.724447" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:58.703694" elapsed="0.021027"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:58.733007" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:58.727149" elapsed="0.005976"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:58.726617" elapsed="0.006592"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:58.726544" elapsed="0.006726"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:58.736317" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:58.734012" elapsed="0.002351"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:58.733454" elapsed="0.002944"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:58.733414" elapsed="0.003009"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:58.737012" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:58.736611" 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-08-22T23:42:58.737354" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:58.737109" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:58.737915" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:58.737614" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:58.737440" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:58.737091" elapsed="0.000907"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:58.738511" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:58.738153" 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-08-22T23:42:58.738854" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:58.738624" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:58.739454" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:58.739156" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:58.738995" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:58.738605" 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-08-22T23:42:58.739706" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:58.740518" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:58.740222" 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-08-22T23:42:58.740711" 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-08-22T23:42:58.725542" elapsed="0.017673"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:58.743393" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:42:58.743285" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:58.743266" 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-08-22T23:42:58.743649" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:58.743722" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:42:58.746034" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:58.697084" elapsed="0.048979"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:58.746122" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:42:58.746272" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:58.692880" elapsed="0.053419"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:58.747081" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:58.746573" elapsed="0.000588">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:58.746368" elapsed="0.000866">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:58.746352" elapsed="0.000918">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:58.747483" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:58.747339" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:58.747322" elapsed="0.000241"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:58.690099" elapsed="0.057563">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:59.750825" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:59.749816" elapsed="0.001083"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:59.768309" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:59.767942" elapsed="0.000436"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:59.768967" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:59.768616" 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-08-22T23:42:59.794121" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:42:59.794539" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:42:59.794793" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:42:59.772065" elapsed="0.022786"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:59.769138" elapsed="0.025811"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:59.795380" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:59.795010" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:59.769107" elapsed="0.026503"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:59.805420" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:59.797898" elapsed="0.007572"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:59.797378" elapsed="0.008129"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:59.797337" elapsed="0.008196"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:42:59.808207" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:42:59.805830" elapsed="0.002423"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:59.805605" elapsed="0.002684"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:59.805573" elapsed="0.002742"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:59.808922" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:59.808492" 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-08-22T23:42:59.809257" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:59.809021" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:59.809827" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:59.809503" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:59.809341" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:59.809003" elapsed="0.000913"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:42:59.810435" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:59.810073" 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-08-22T23:42:59.810780" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:59.810532" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:42:59.811344" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:42:59.811020" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-08-22T23:42:59.810862" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:59.810514" 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-08-22T23:42:59.811596" elapsed="0.000359"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:42:59.812426" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:42:59.812119" 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-08-22T23:42:59.812621" 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-08-22T23:42:59.796406" elapsed="0.018634"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:42:59.815222" elapsed="0.000063"/>
</return>
<status status="PASS" start="2026-08-22T23:42:59.815110" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-08-22T23:42:59.815092" 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-08-22T23:42:59.815497" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:42:59.815574" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:42:59.817946" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:42:59.757405" elapsed="0.060570"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:42:59.818072" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:42:59.818226" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:42:59.751436" elapsed="0.066816"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:42:59.818917" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:42:59.818533" elapsed="0.000471">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:42:59.818323" elapsed="0.000758">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:42:59.818306" elapsed="0.000809">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:42:59.819364" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:42:59.819185" elapsed="0.000239"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:42:59.819168" elapsed="0.000280"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:42:59.748633" elapsed="0.070899">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:00.822724" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:00.821702" elapsed="0.001106"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:00.834341" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:00.834076" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:00.834806" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:00.834541" 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-08-22T23:43:00.852618" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:00.852901" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:43:00.853177" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:43:00.837062" elapsed="0.016177"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:00.834932" elapsed="0.018406"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:00.853786" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:00.853400" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:00.834906" elapsed="0.019075"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:00.861881" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:00.856298" elapsed="0.005633"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:00.855802" elapsed="0.006165"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:00.855761" elapsed="0.006231"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:00.864832" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:00.862455" elapsed="0.002425"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:00.862050" elapsed="0.002866"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:00.862033" elapsed="0.002908"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:00.865565" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:00.865139" 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-08-22T23:43:00.865995" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:00.865752" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:00.866548" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:00.866239" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:00.866078" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:00.865732" elapsed="0.000920"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:00.867182" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:00.866813" 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-08-22T23:43:00.867510" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:00.867279" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:00.868064" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:00.867765" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:00.867608" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:00.867261" elapsed="0.000886"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:43:00.868297" elapsed="0.000370"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:43:00.869191" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:00.868836" 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-08-22T23:43:00.869372" elapsed="0.002331"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:43:00.854814" elapsed="0.016957"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:43:00.871951" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-08-22T23:43:00.871841" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:00.871823" 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-08-22T23:43:00.872210" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:00.872281" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:43:00.874764" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:43:00.828934" elapsed="0.045863"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:43:00.874858" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:43:00.875012" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:43:00.823319" elapsed="0.051719"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:43:00.875717" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:43:00.875338" elapsed="0.000466">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:00.875108" elapsed="0.000768">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:43:00.875091" elapsed="0.000819">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:00.876128" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:00.875980" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:00.875962" elapsed="0.000245"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:00.820468" elapsed="0.055822">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:01.879419" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:01.878353" elapsed="0.001145"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:01.893712" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:01.893289" elapsed="0.000498"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:01.894361" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:01.894009" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:43:01.914292" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:01.914623" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:43:01.914923" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:43:01.897489" elapsed="0.017504"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:01.894534" elapsed="0.020556"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:01.915506" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:01.915152" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:01.894502" elapsed="0.021242"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:01.923921" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:01.918235" elapsed="0.005738"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:01.917689" elapsed="0.006321"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:01.917644" elapsed="0.006391"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:01.926697" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:01.924315" elapsed="0.002429"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:01.924092" elapsed="0.002692"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:01.924075" elapsed="0.002822"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:01.927497" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:01.927085" 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-08-22T23:43:01.927858" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:01.927616" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:01.928434" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:01.928104" elapsed="0.000365"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:01.927943" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:01.927595" elapsed="0.000935"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:01.929086" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:01.928707" 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-08-22T23:43:01.929417" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:01.929185" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:01.929974" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:01.929674" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:01.929500" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:01.929167" 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-08-22T23:43:01.930209" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:43:01.931100" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:01.930741" 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-08-22T23:43:01.931353" elapsed="0.003363"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:43:01.916558" elapsed="0.018269"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:43:01.935097" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-08-22T23:43:01.934939" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:01.934911" 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-08-22T23:43:01.935437" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:01.935537" elapsed="0.000021"/>
</return>
<msg time="2026-08-22T23:43:01.938947" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:43:01.886348" elapsed="0.052641"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:43:01.939078" elapsed="0.000040"/>
</return>
<msg time="2026-08-22T23:43:01.939297" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:43:01.880091" elapsed="0.059244"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:43:01.940156" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:43:01.939757" elapsed="0.000488">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:01.939435" elapsed="0.000888">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:43:01.939412" elapsed="0.000947">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:01.940597" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:01.940432" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:01.940415" elapsed="0.000268"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:01.877241" elapsed="0.063528">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:02.943883" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:02.942824" elapsed="0.001135"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:02.954428" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:02.954134" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:02.954906" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:02.954648" 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-08-22T23:43:02.973279" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:02.973612" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:43:02.973842" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:43:02.957131" elapsed="0.016770"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:02.955031" elapsed="0.019086"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:02.974525" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:02.974181" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:02.955006" elapsed="0.019753"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:02.982227" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:02.977139" elapsed="0.005158"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:02.976633" elapsed="0.005714"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:02.976559" elapsed="0.005824"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:02.986120" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:02.982798" elapsed="0.003388"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:02.982463" elapsed="0.003773"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:02.982439" elapsed="0.003832"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:02.987098" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:02.986512" 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-08-22T23:43:02.987609" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:02.987235" elapsed="0.000469"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:02.988412" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:02.987963" elapsed="0.000486"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:02.987738" elapsed="0.000802"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:02.987210" elapsed="0.001361"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:02.989214" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:02.988826" 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-08-22T23:43:02.989543" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:02.989313" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:02.990092" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:02.989797" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:02.989641" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:02.989295" 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-08-22T23:43:02.990327" elapsed="0.000365"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:43:02.991155" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:02.990854" 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-08-22T23:43:02.991333" 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-08-22T23:43:02.975558" elapsed="0.018244"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:43:02.993984" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:43:02.993873" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:02.993855" 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-08-22T23:43:02.994229" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:02.994300" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:43:02.996722" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:43:02.948312" elapsed="0.048440"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:43:02.996812" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:43:02.997116" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:43:02.944663" elapsed="0.052481"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:43:02.997873" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:43:02.997427" elapsed="0.000526">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:02.997214" elapsed="0.000814">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:43:02.997197" elapsed="0.000866">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:02.998282" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:02.998134" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:02.998116" elapsed="0.000248"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:02.941733" elapsed="0.056713">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:04.001419" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:04.000404" elapsed="0.001087"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:04.012234" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:04.011969" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:04.012719" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:04.012438" 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-08-22T23:43:04.029370" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:04.029701" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:43:04.029933" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:43:04.014998" elapsed="0.014996"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:04.012844" elapsed="0.017304"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:04.030563" elapsed="0.000084"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:04.030213" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:04.012820" elapsed="0.017977"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:04.038724" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:04.033112" elapsed="0.005726"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:04.032615" elapsed="0.006280"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:04.032544" elapsed="0.006376"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:04.041557" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:04.039199" elapsed="0.002420"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:04.038977" elapsed="0.002678"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:04.038960" elapsed="0.002721"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:04.042283" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:04.041857" 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-08-22T23:43:04.042639" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:04.042384" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:04.043193" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:04.042889" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:04.042724" elapsed="0.000594"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:04.042366" elapsed="0.000976"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:04.043890" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:04.043502" 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-08-22T23:43:04.044223" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:04.043990" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:04.044784" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:04.044467" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:04.044307" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:04.043971" 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-08-22T23:43:04.045024" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:43:04.045859" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:04.045545" 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-08-22T23:43:04.046069" elapsed="0.002386"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:43:04.031624" elapsed="0.016897"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:43:04.048722" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:43:04.048609" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:04.048589" 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-08-22T23:43:04.048969" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:04.049041" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:43:04.051433" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:43:04.007290" elapsed="0.044172"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:43:04.051523" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:43:04.051693" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:43:04.002094" elapsed="0.049626"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:43:04.052379" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:43:04.052005" elapsed="0.000453">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:04.051792" elapsed="0.000740">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:43:04.051775" elapsed="0.000791">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:04.052799" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:04.052654" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:04.052637" elapsed="0.000242"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:03.999299" elapsed="0.053663">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:05.056124" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:05.055022" elapsed="0.001176"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:05.068249" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:05.067980" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:05.068721" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:05.068454" 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-08-22T23:43:05.086466" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:05.086655" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:43:05.086772" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:43:05.070971" elapsed="0.015828"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:05.068848" elapsed="0.018005"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:05.087273" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:05.086921" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:05.068823" elapsed="0.018645"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:05.095621" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:05.089927" elapsed="0.005825"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:05.089386" elapsed="0.006454"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:05.089343" elapsed="0.006528"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:05.098468" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:05.096153" elapsed="0.002362"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:05.095929" elapsed="0.002621"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:05.095912" elapsed="0.002677"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:05.099183" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:05.098769" 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-08-22T23:43:05.099517" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:05.099281" elapsed="0.000333"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:05.100112" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:05.099809" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:05.099642" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:05.099263" elapsed="0.000936"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:05.100750" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:05.100356" 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-08-22T23:43:05.101086" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:05.100849" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:05.101652" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:05.101328" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:05.101169" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:05.100831" 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-08-22T23:43:05.101894" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:43:05.102757" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:05.102414" 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-08-22T23:43:05.102938" 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-08-22T23:43:05.088367" elapsed="0.017144"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:43:05.105769" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:43:05.105656" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:05.105636" 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-08-22T23:43:05.106025" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:05.106099" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:43:05.108462" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:43:05.063193" elapsed="0.045298"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:43:05.108552" elapsed="0.000045"/>
</return>
<msg time="2026-08-22T23:43:05.108728" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:43:05.056911" elapsed="0.051852"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:43:05.109425" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:43:05.109055" elapsed="0.000453">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:05.108842" elapsed="0.000757">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:43:05.108824" elapsed="0.000812">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:05.109874" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:05.109708" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:05.109691" elapsed="0.000268"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:05.053919" elapsed="0.056126">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:06.113101" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:06.112034" elapsed="0.001144"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:06.123318" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:06.123056" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:06.123784" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:06.123520" 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-08-22T23:43:06.140848" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:06.141170" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:43:06.141388" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:43:06.126082" elapsed="0.015366"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:06.123910" elapsed="0.017636"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:06.141989" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:06.141641" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:06.123887" elapsed="0.018415"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:06.148953" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:06.144693" elapsed="0.004363"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:06.144168" elapsed="0.004941"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:06.144124" elapsed="0.005022"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:06.152886" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:06.149543" elapsed="0.003411"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:06.149229" elapsed="0.003822"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:06.149204" elapsed="0.003891"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:06.153940" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:06.153345" 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-08-22T23:43:06.154330" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:06.154092" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:06.154905" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:06.154589" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:06.154414" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:06.154070" elapsed="0.000946"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:06.155554" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:06.155187" 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-08-22T23:43:06.155905" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:06.155672" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:06.156453" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:06.156150" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:06.155992" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:06.155653" 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-08-22T23:43:06.156706" elapsed="0.000364"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:43:06.157527" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:06.157232" 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-08-22T23:43:06.157724" elapsed="0.002372"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:43:06.143137" elapsed="0.017024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:43:06.160343" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:43:06.160231" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:06.160213" 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-08-22T23:43:06.160605" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:06.160680" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:43:06.163067" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:43:06.117314" elapsed="0.045782"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:43:06.163156" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:43:06.163307" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:43:06.113705" elapsed="0.049630"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:43:06.164001" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:43:06.163635" elapsed="0.000446">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:06.163406" elapsed="0.000791">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:43:06.163389" elapsed="0.000844">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:06.164454" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:06.164305" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:06.164288" elapsed="0.000248"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:06.110960" elapsed="0.053675">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:07.167562" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:07.166611" elapsed="0.001054"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:07.179388" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:07.179108" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:07.179857" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:07.179606" 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-08-22T23:43:07.197494" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:07.197684" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:43:07.197787" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:43:07.182076" elapsed="0.015738"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:07.179979" elapsed="0.017879"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:07.198099" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:07.197887" elapsed="0.000360"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:07.179956" elapsed="0.018340"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:07.206800" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:07.200745" elapsed="0.006155"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:07.200181" elapsed="0.006755"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:07.200136" elapsed="0.006825"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:07.209524" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:07.207234" elapsed="0.002337"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:07.207016" elapsed="0.002605"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:07.207000" elapsed="0.002646"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:07.210213" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:07.209820" 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-08-22T23:43:07.210597" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:07.210310" elapsed="0.000349"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:07.211144" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:07.210843" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:07.210684" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:07.210292" elapsed="0.000937"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:07.211829" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:07.211383" elapsed="0.000474"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:07.212161" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:07.211931" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:07.212713" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:07.212399" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:07.212242" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:07.211913" 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-08-22T23:43:07.212948" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:43:07.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-08-22T23:43:07.213456" 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-08-22T23:43:07.213945" 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-08-22T23:43:07.199146" elapsed="0.017190"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:43:07.216515" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:43:07.216406" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:07.216388" 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-08-22T23:43:07.216772" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:07.216845" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:43:07.219164" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:43:07.172742" elapsed="0.046451"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:43:07.219254" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:43:07.219405" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:43:07.168162" elapsed="0.051270"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:43:07.220085" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:43:07.219723" elapsed="0.000441">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:07.219501" elapsed="0.000736">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:43:07.219484" elapsed="0.000786">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:07.220485" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:07.220339" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:07.220323" elapsed="0.000241"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:07.165486" elapsed="0.055177">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:08.223565" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:08.222631" elapsed="0.001033"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:08.235864" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:08.235553" elapsed="0.000451"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:08.236411" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:08.236161" 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-08-22T23:43:08.254283" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:08.254575" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:43:08.254830" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:43:08.238634" elapsed="0.016253"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:08.236535" elapsed="0.018450"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:08.255386" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:08.255047" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:08.236511" elapsed="0.019094"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:08.262637" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:08.257921" elapsed="0.004791"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:08.257398" elapsed="0.005366"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:08.257358" elapsed="0.005444"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:08.266753" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:08.263210" elapsed="0.003612"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:08.262886" elapsed="0.003988"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:08.262862" elapsed="0.004050"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:08.267801" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:08.267166" elapsed="0.000678"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:08.268300" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:08.267951" elapsed="0.000437"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:08.269078" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:08.268684" elapsed="0.000423"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:08.268424" elapsed="0.000720"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:08.267925" elapsed="0.001241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:08.269701" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:08.269322" 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-08-22T23:43:08.270029" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:08.269799" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:08.270562" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:08.270268" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:08.270111" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:08.269782" 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-08-22T23:43:08.270815" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:43:08.271654" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:08.271334" 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-08-22T23:43:08.271851" 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-08-22T23:43:08.256426" elapsed="0.018013"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:43:08.274637" elapsed="0.000100"/>
</return>
<status status="PASS" start="2026-08-22T23:43:08.274510" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:08.274492" elapsed="0.000310"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:08.274952" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:08.275025" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:43:08.277460" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:43:08.230255" elapsed="0.047236"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:43:08.277555" elapsed="0.000043"/>
</return>
<msg time="2026-08-22T23:43:08.277728" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:43:08.224200" elapsed="0.053556"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:43:08.278428" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:43:08.278043" elapsed="0.000463">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:08.277829" elapsed="0.000766">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:43:08.277811" elapsed="0.000821">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:08.278852" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:08.278704" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:08.278687" elapsed="0.000247"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:08.221534" elapsed="0.057482">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:09.282054" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:09.281058" elapsed="0.001067"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:09.294022" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:09.293752" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:09.294475" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:09.294227" 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-08-22T23:43:09.315418" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:09.315765" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:43:09.315990" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:43:09.296693" elapsed="0.019356"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:09.294613" elapsed="0.021535"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:09.316555" elapsed="0.000082"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:09.316209" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:09.294588" elapsed="0.022205"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:09.327214" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:09.319219" elapsed="0.008047"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:09.318686" elapsed="0.008616"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:09.318640" elapsed="0.008688"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:09.330009" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:09.327626" elapsed="0.002435"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:09.327385" elapsed="0.002712"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:09.327368" elapsed="0.002755"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:09.330715" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:09.330298" 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-08-22T23:43:09.331054" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:09.330816" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:09.331621" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:09.331300" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:09.331137" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:09.330798" elapsed="0.000914"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:09.332238" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:09.331870" 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-08-22T23:43:09.332569" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:09.332336" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:09.333152" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:09.332829" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:09.332669" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:09.332319" 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-08-22T23:43:09.333390" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:43:09.334216" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:09.333919" 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-08-22T23:43:09.334395" elapsed="0.002368"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:43:09.317651" elapsed="0.019178"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:43:09.337008" elapsed="0.000066"/>
</return>
<status status="PASS" start="2026-08-22T23:43:09.336898" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:09.336880" 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-08-22T23:43:09.337291" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:09.337364" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:43:09.339768" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:43:09.288294" elapsed="0.051503"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:43:09.339858" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:43:09.340010" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:43:09.282645" elapsed="0.057391"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:43:09.340692" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:43:09.340314" elapsed="0.000460">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:09.340106" elapsed="0.000744">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:43:09.340090" elapsed="0.000834">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:09.341175" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:09.340999" elapsed="0.000236"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:09.340982" elapsed="0.000277"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:09.279932" elapsed="0.061410">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:10.344286" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:10.343285" elapsed="0.001093"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:10.356154" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:10.355781" elapsed="0.000443"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:10.356807" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:10.356439" elapsed="0.000433"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:43:10.376849" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:10.377021" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:43:10.377257" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:43:10.359682" elapsed="0.017633"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:10.356976" elapsed="0.020436"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:10.377846" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:10.377472" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:10.356946" elapsed="0.021098"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:10.385914" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:10.380387" elapsed="0.005640"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:10.379895" elapsed="0.006211"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:10.379853" elapsed="0.006311"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:10.389301" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:10.386885" elapsed="0.002475"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:10.386354" elapsed="0.003042"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:10.386307" elapsed="0.003114"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:10.390007" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:10.389610" 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-08-22T23:43:10.390392" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:10.390106" elapsed="0.000349"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:10.390988" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:10.390673" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:10.390482" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:10.390088" elapsed="0.000989"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:10.391617" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:10.391234" 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-08-22T23:43:10.391949" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:10.391718" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:10.392554" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:10.392251" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:10.392088" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:10.391700" 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-08-22T23:43:10.392809" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:43:10.393635" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:10.393325" 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-08-22T23:43:10.393831" elapsed="0.002386"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:43:10.378889" elapsed="0.017392"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:43:10.396461" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:43:10.396352" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:10.396333" 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-08-22T23:43:10.396716" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:10.396790" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:43:10.399158" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:43:10.349271" elapsed="0.049917"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:43:10.399376" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:43:10.399536" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:43:10.344926" elapsed="0.054638"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:43:10.400228" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:43:10.399868" elapsed="0.000438">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:10.399656" elapsed="0.000723">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:43:10.399639" elapsed="0.000774">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:10.400653" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:10.400483" elapsed="0.000237"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:10.400466" elapsed="0.000279"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:10.342173" elapsed="0.058655">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:11.404008" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:11.402973" elapsed="0.001108"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:11.416383" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:11.416118" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:11.416849" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:11.416600" 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-08-22T23:43:11.435817" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:11.436098" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:43:11.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-08-22T23:43:11.419066" elapsed="0.017319"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:11.416972" elapsed="0.019513"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:11.436933" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:11.436547" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:11.416948" elapsed="0.020188"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:11.444536" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:11.439513" elapsed="0.005090"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:11.438966" elapsed="0.005675"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:11.438924" elapsed="0.005743"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:11.447320" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:11.444948" elapsed="0.002419"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:11.444725" elapsed="0.002678"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:11.444708" elapsed="0.002720"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:11.448031" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:11.447632" 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-08-22T23:43:11.448369" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:11.448133" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:11.448940" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:11.448635" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:11.448454" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:11.448115" elapsed="0.000918"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:11.449557" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:11.449190" 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-08-22T23:43:11.449923" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:11.449689" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:11.450474" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:11.450169" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:11.450006" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:11.449671" 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-08-22T23:43:11.450727" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:43:11.451570" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:11.451244" elapsed="0.000369"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:43:11.451768" 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-08-22T23:43:11.437970" elapsed="0.016370"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:43:11.454522" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:43:11.454412" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:11.454393" 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-08-22T23:43:11.454785" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:11.454857" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:43:11.457253" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:43:11.411065" elapsed="0.046217"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:43:11.457492" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:43:11.457669" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:43:11.404605" elapsed="0.053092"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:43:11.458344" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:43:11.457982" elapsed="0.000442">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:11.457769" elapsed="0.000729">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:43:11.457751" elapsed="0.000782">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:11.458768" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:11.458621" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:11.458604" elapsed="0.000251"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:11.401817" elapsed="0.057126">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:12.461984" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:12.460991" elapsed="0.001065"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:12.473733" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:12.473432" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:12.474239" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:12.473946" 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-08-22T23:43:12.494740" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:12.495025" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:43:12.495246" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:43:12.476451" elapsed="0.018855"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:12.474367" elapsed="0.021038"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:12.495865" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:12.495465" elapsed="0.000596"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:12.474343" elapsed="0.021800"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:12.503176" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:12.498615" elapsed="0.004637"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:12.498089" elapsed="0.005212"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:12.498048" elapsed="0.005288"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:12.506995" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:12.503749" elapsed="0.003311"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:12.503416" elapsed="0.003692"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:12.503393" elapsed="0.003750"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:12.507945" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:12.507379" 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-08-22T23:43:12.508490" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:12.508160" elapsed="0.000411"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:12.509242" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:12.508897" elapsed="0.000372"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:12.508656" elapsed="0.000649"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:12.508133" elapsed="0.001194"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:12.509869" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:12.509483" 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-08-22T23:43:12.510198" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:12.509967" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:12.510758" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:12.510438" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:12.510279" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:12.509949" 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-08-22T23:43:12.510994" elapsed="0.000359"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:43:12.511833" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:12.511517" 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-08-22T23:43:12.512013" elapsed="0.002367"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:43:12.497101" elapsed="0.017389"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:43:12.514687" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:43:12.514560" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:12.514541" 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-08-22T23:43:12.514930" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:12.515003" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:43:12.517366" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:43:12.468905" elapsed="0.048491"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:43:12.517458" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:43:12.517659" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:43:12.462685" elapsed="0.055001"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:43:12.518354" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:43:12.517988" elapsed="0.000448">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:12.517774" elapsed="0.000740">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:43:12.517754" elapsed="0.000795">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:12.518815" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:12.518663" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:12.518643" elapsed="0.000254"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:12.459891" elapsed="0.059089">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:13.522263" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:13.521079" elapsed="0.001258"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:13.538818" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:13.538530" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:13.539272" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:13.539023" 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-08-22T23:43:13.556980" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:13.557181" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:43:13.557319" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:43:13.541518" elapsed="0.015837"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:13.539397" elapsed="0.018019"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:13.557724" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:13.557454" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:13.539372" elapsed="0.018479"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:13.562879" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:13.559284" elapsed="0.003664"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:13.558975" elapsed="0.004024"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:13.558949" elapsed="0.004084"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:13.566754" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:13.563450" elapsed="0.003368"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:13.563111" elapsed="0.003757"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:13.563088" elapsed="0.003815"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:13.567706" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:13.567139" 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-08-22T23:43:13.568169" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:13.567844" elapsed="0.000405"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:13.568953" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:13.568502" elapsed="0.000490"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:13.568283" elapsed="0.000759"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:13.567818" elapsed="0.001254"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:13.569840" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:13.569286" 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-08-22T23:43:13.570263" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:13.569975" elapsed="0.000345"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:13.570813" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:13.570499" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:13.570343" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:13.569950" 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-08-22T23:43:13.571045" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:43:13.571873" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:13.571555" 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-08-22T23:43:13.572164" 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-08-22T23:43:13.558356" elapsed="0.016244"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:43:13.574784" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:43:13.574673" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:13.574654" 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-08-22T23:43:13.575029" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:13.575099" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:43:13.577432" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:43:13.528768" elapsed="0.048693"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:43:13.577521" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:43:13.577689" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:43:13.522881" elapsed="0.054856"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:43:13.578411" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:43:13.578042" elapsed="0.000453">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:13.577811" elapsed="0.000759">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:43:13.577793" elapsed="0.000830">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:13.578839" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:13.578693" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:13.578676" elapsed="0.000243"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:13.520029" elapsed="0.058972">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:14.581032" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:14.580547" elapsed="0.000524"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:14.588772" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:14.588492" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:14.589233" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:14.588978" 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-08-22T23:43:14.607458" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:14.607631" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:43:14.607734" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:43:14.591463" elapsed="0.016297"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:14.589354" elapsed="0.018521"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:14.608059" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:14.607905" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:14.589332" elapsed="0.018823"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:14.611676" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:14.609184" elapsed="0.002544"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:14.608961" elapsed="0.002803"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:14.608942" elapsed="0.002849"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:14.614425" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:14.612070" elapsed="0.002403"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:14.611848" elapsed="0.002661"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:14.611831" elapsed="0.002704"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:14.615143" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:14.614724" 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-08-22T23:43:14.615482" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:14.615244" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:14.616050" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:14.615745" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:14.615567" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:14.615226" elapsed="0.000911"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:14.616678" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:14.616294" 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-08-22T23:43:14.617009" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:14.616777" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:14.617552" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:14.617252" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:14.617093" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:14.616759" 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-08-22T23:43:14.617804" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:43:14.618631" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:14.618322" 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-08-22T23:43:14.618839" 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-08-22T23:43:14.608517" elapsed="0.012893"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:43:14.621605" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:43:14.621482" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:14.621463" 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-08-22T23:43:14.621846" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:14.621920" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:43:14.624277" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:43:14.584143" elapsed="0.040163"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:43:14.624367" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:43:14.624520" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:43:14.581305" elapsed="0.043242"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:43:14.625345" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:43:14.624931" elapsed="0.000492">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:14.624640" elapsed="0.000855">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:43:14.624622" elapsed="0.000909">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:14.625771" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:14.625620" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:14.625602" elapsed="0.000253"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:14.579824" elapsed="0.046114">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:15.628956" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:15.627952" elapsed="0.001077"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:15.640480" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:15.640218" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:15.640947" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:15.640701" 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-08-22T23:43:15.664936" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:15.665093" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:43:15.665200" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:43:15.643299" elapsed="0.021927"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:15.641070" elapsed="0.024200"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:15.665455" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:15.665299" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:15.641044" elapsed="0.024496"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:15.669197" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:15.666589" elapsed="0.002659"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:15.666354" elapsed="0.002931"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:15.666336" elapsed="0.002976"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:15.671964" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:15.669607" elapsed="0.002403"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:15.669370" elapsed="0.002676"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:15.669353" elapsed="0.002718"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:15.672673" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:15.672254" 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-08-22T23:43:15.673011" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:15.672773" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:15.673551" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:15.673251" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:15.673094" elapsed="0.000599"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:15.672755" elapsed="0.000961"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:15.674243" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:15.673875" 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-08-22T23:43:15.674574" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:15.674343" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:15.675136" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:15.674836" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:15.674678" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:15.674324" 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-08-22T23:43:15.675373" elapsed="0.000368"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:43:15.676229" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:15.675931" 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-08-22T23:43:15.676411" 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-08-22T23:43:15.665925" elapsed="0.012928"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:43:15.679035" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:43:15.678925" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:15.678907" 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-08-22T23:43:15.679280" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:15.679353" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:43:15.681802" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:43:15.635240" elapsed="0.046591"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:43:15.681893" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:43:15.682044" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:43:15.629524" elapsed="0.052547"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:43:15.682730" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:43:15.682353" elapsed="0.000453">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:15.682146" elapsed="0.000733">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:43:15.682129" elapsed="0.000784">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:15.683128" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:15.682983" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:15.682966" elapsed="0.000242"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:15.626862" elapsed="0.056428">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:16.685448" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:16.684826" elapsed="0.000668"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:16.696138" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:16.695775" elapsed="0.000431"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:16.696804" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:16.696419" 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-08-22T23:43:16.716396" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:16.716541" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:43:16.716661" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:43:16.699867" elapsed="0.016821"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:16.696973" elapsed="0.019760"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:16.716930" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:16.716761" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:16.696943" elapsed="0.020076"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:16.724652" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:16.719200" elapsed="0.005565"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:16.718706" elapsed="0.006182"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:16.718663" elapsed="0.006284"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:16.727676" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:16.725340" elapsed="0.002383"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:16.725076" elapsed="0.002683"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:16.725038" elapsed="0.002746"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:16.728348" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:16.727958" 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-08-22T23:43:16.728696" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:16.728447" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:16.729257" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:16.728956" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:16.728781" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:16.728429" elapsed="0.000914"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:16.729882" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:16.729499" 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-08-22T23:43:16.730209" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:16.729979" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:16.730760" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:16.730447" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:16.730290" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:16.729961" 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-08-22T23:43:16.730992" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:43:16.731806" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:16.731500" 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-08-22T23:43:16.731984" 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-08-22T23:43:16.717730" elapsed="0.016671"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:43:16.734634" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:43:16.734507" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:16.734488" 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-08-22T23:43:16.734874" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:16.734947" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:43:16.737302" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:43:16.689412" elapsed="0.047919"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:43:16.737392" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:43:16.737544" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:43:16.685951" elapsed="0.051620"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:43:16.738228" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:43:16.737866" elapsed="0.000438">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:16.737658" elapsed="0.000716">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:43:16.737640" elapsed="0.000769">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:16.738641" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:16.738479" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:16.738462" elapsed="0.000261"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:16.684087" elapsed="0.054718">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:17.741723" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:17.740710" elapsed="0.001136"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:17.754083" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:17.753819" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:17.754541" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:17.754291" 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-08-22T23:43:17.773476" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:17.773663" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:43:17.773782" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:43:17.756741" elapsed="0.017070"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:17.754681" elapsed="0.019175"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:17.774040" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:17.773884" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:17.754659" elapsed="0.019575"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:17.782101" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:17.776537" elapsed="0.005662"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:17.776050" elapsed="0.006185"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:17.776008" elapsed="0.006252"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:17.784887" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:17.782537" elapsed="0.002398"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:17.782316" elapsed="0.002654"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:17.782300" elapsed="0.002695"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:17.785573" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:17.785175" 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-08-22T23:43:17.785950" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:17.785694" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:17.786493" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:17.786193" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:17.786033" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:17.785676" elapsed="0.000919"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:17.787115" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:17.786752" 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-08-22T23:43:17.787441" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:17.787211" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:17.787994" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:17.787698" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:17.787523" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:17.787194" 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-08-22T23:43:17.788227" elapsed="0.000364"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:43:17.789051" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:17.788755" 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-08-22T23:43:17.789229" elapsed="0.002511"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:43:17.775069" elapsed="0.016736"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:43:17.791987" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:43:17.791877" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:17.791858" 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-08-22T23:43:17.792226" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:17.792299" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:43:17.794815" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:43:17.748528" elapsed="0.046317"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:43:17.794907" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:43:17.795058" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:43:17.742337" elapsed="0.052748"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:43:17.795737" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:43:17.795361" elapsed="0.000454">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:17.795156" elapsed="0.000768">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:43:17.795139" elapsed="0.000821">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:17.796176" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:17.796031" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:17.796014" elapsed="0.000243"/>
</if>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:17.739688" elapsed="0.056651">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<msg time="2026-08-22T23:43:17.796434" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>node1</arg>
<arg>${modified_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:42:17.391367" elapsed="60.405168">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>node3</arg>
<arg>${modified_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:17.796757" elapsed="0.000022"/>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:17.798016" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:17.797558" elapsed="0.000486"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-08-22T23:43:17.798261" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:17.798118" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:17.798101" elapsed="0.000223"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:43:17.798486" elapsed="0.000229"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:43:17.799564" level="FAIL">'5762' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:43:17.799230" elapsed="0.000409">'5762' does not contain '-'</status>
</kw>
<msg time="2026-08-22T23:43:17.799733" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:43:17.798875" elapsed="0.000882"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:43:17.800253" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=5762</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:43:17.799922" elapsed="0.000358"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:17.800741" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5762</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:17.800436" elapsed="0.000332"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:17.801206" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:17.800918" elapsed="0.000314"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-08-22T23:43:17.801762" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5762

Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-08-22T23:43:17.801382" elapsed="0.000444"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:17.802214" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5762</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:17.801976" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-08-22T23:43:17.802919" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=5762'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-08-22T23:43:17.802558" elapsed="0.000408"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:17.802324" elapsed="0.000676"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:17.802306" elapsed="0.000719"/>
</if>
<arg>5762</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:43:17.797208" elapsed="0.005862"/>
</kw>
<doc>Check that the device data modification is propagated in the cluster even when node 2 is down.</doc>
<tag>critical</tag>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=5762</tag>
<status status="FAIL" start="2026-08-22T23:42:17.119031" elapsed="60.684119">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5762

Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</test>
<test id="s1-s6-t14" name="Restart_node2_After_Modify_And_Dump_Its_Topology_Data" 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-08-22T23:43:17.808414" elapsed="0.000230"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:43:17.808150" 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-08-22T23:43:17.809689" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:17.809561" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:17.809543" 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-08-22T23:43:17.814716" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:17.814607" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:17.814573" elapsed="0.000211"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:43:17.815780" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:43:17.815382" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:43:17.816273" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:43:17.815965" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:43:17.816344" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:43:17.816499" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:43:17.815009" 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-08-22T23:43:17.821970" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:17.821860" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:17.821840" 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-08-22T23:43:17.823211" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:17.823101" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:17.823083" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:43:17.823751" level="INFO">${karaf_connection_index} = 53</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:43:17.823421" elapsed="0.000357"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:43:17.824157" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:43:17.823933" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:43:17.870848" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:43:17.824696" elapsed="0.046291"/>
</kw>
<msg time="2026-08-22T23:43:17.871200" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:43:17.871250" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:43:17.824346" elapsed="0.046941"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:43:17.910430" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "R "e "s "t "a "r "t "_ "n "o "d "e "2 "_ "A "f "t "e "r "_ "M "o "d "i "f "y "_ "A "n "d "_ "D "u "m "p "_ "I "t "s "_ "T "o "p "o "l "o "g "y "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:43:17.871860" elapsed="0.038680"/>
</kw>
<msg time="2026-08-22T23:43:17.910721" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:43:17.910768" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "R "e "s "t "a "r "t "_ "n "o "d "e "2 "_ "A "f "t "e "r "_ "M "o "d "i "f "y "_ "A ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:43:17.871474" elapsed="0.039331"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:17.911115" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:17.910891" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:17.910863" elapsed="0.000381"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:17.911708" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "R "e "s "t "a "r "t "_ "n "o "d "e "2 "_ "A "f "t "e "r "_ "M "o "d "i "f "y "_ "A "n "d "_ "D "u "m "p "_ "I "t "s "_ "T "o "p "o "l "o "g "y "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:17.911386" 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-08-22T23:43:17.912065" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:17.911849" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:17.911832" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:43:17.912177" 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-08-22T23:43:17.914751" elapsed="0.000149"/>
</kw>
<msg time="2026-08-22T23:43:17.914961" 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-08-22T23:43:17.913643" 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-08-22T23:43:17.915367" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:17.915720" 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-08-22T23:43:17.913006" elapsed="0.002902"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:43:17.912452" elapsed="0.003521"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:43:17.822802" elapsed="0.093269"/>
</kw>
<msg time="2026-08-22T23:43:17.916163" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:43:17.916207" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "R "e "s "t "a "r "t "_ "n "o "d "e "2 "_ "A "f "t "e "r "_ "M "o "d "i "f "y "_ "A ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:43:17.822189" elapsed="0.094055"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:43:17.916427" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:43:17.916320" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:17.916302" 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-08-22T23:43:17.916939" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:17.917272" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:43:17.917344" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:43:17.821481" elapsed="0.095971"/>
</kw>
<msg time="2026-08-22T23:43:17.917546" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:43:17.917614" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "R "e "s "t "a "r "t "_ "n "o "d "e "2 "_ "A "f "t "e "r "_ "M "o "d "i "f "y "_ "A ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:43:17.816917" elapsed="0.100737"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:17.918007" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:17.917730" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:17.917713" elapsed="0.000373"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:43:17.816776" elapsed="0.101334"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:43:17.923512" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:17.923406" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:17.923387" 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-08-22T23:43:17.924738" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:17.924630" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:17.924611" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:43:17.925241" level="INFO">${karaf_connection_index} = 60</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:43:17.924946" elapsed="0.000321"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:43:17.925692" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:43:17.925456" elapsed="0.000263"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:43:17.926485" 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-08-22T23:43:17.926237" elapsed="0.001121">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-08-22T23:43:17.927544" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-08-22T23:43:17.927611" 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-08-22T23:43:17.925877" elapsed="0.001760"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:43:17.928383" 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-08-22T23:43:17.928139" elapsed="0.000919">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-08-22T23:43:17.929247" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-08-22T23:43:17.929294" 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-08-22T23:43:17.927805" elapsed="0.001514"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-08-22T23:43:17.930288" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Restart_node2_After_Modify_And_Dump_Its_Topology_Data"</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-08-22T23:43:17.929656" elapsed="0.000728">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Restart_node2_After_Modify_And_Dump_Its_Topology_Data"</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:17.929396" elapsed="0.001067">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Restart_node2_After_Modify_And_Dump_Its_Topology_Data"</status>
</branch>
<status status="FAIL" start="2026-08-22T23:43:17.929377" elapsed="0.001120">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Restart_node2_After_Modify_And_Dump_Its_Topology_Data"</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-08-22T23:43:17.930685" 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-08-22T23:43:17.930917" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:17.930776" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:17.930758" elapsed="0.000237"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-08-22T23:43:17.931029" 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-08-22T23:43:17.933599" elapsed="0.000155"/>
</kw>
<msg time="2026-08-22T23:43:17.933820" 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-08-22T23:43:17.932501" elapsed="0.001486"/>
</kw>
<kw name="Open 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-08-22T23:43:17.934267" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:17.934660" 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-08-22T23:43:17.931882" elapsed="0.002962"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:43:17.931301" elapsed="0.003608"/>
</kw>
<arg>${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-08-22T23:43:17.924307" elapsed="0.010686">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Restart_node2_After_Modify_And_Dump_Its_Topology_Data"</status>
</kw>
<msg time="2026-08-22T23:43:17.935098" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:43:17.935142" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Restart_node2_After_Modify_And_Dump_Its_Topology_Data"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:43:17.923743" elapsed="0.011423"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:43:17.935351" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:17.935243" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:17.935224" 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-08-22T23:43:17.936297" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:17.936192" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:17.936173" elapsed="0.000190"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:43:17.936660" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:43:17.936807" level="INFO">${current_ssh_connection_object} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:43:17.936514" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:17.937246" level="INFO">{1: 53, 2: 60, 3: 36}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:17.936985" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:17.937712" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:17.937440" elapsed="0.000316"/>
</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-08-22T23:43:17.938287" elapsed="0.000263"/>
</kw>
<msg time="2026-08-22T23:43:17.938672" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:43:17.938719" level="INFO">${old_connection_index} = 60</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-08-22T23:43:17.937926" elapsed="0.000816"/>
</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-08-22T23:43:17.939545" elapsed="0.000211"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:43:17.940827" 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-08-22T23:43:17.940399" elapsed="0.001483">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-08-22T23:43:17.939922" elapsed="0.002091"/>
</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-08-22T23:43:17.942680" elapsed="0.000281"/>
</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-08-22T23:43:17.942185" 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-08-22T23:43:17.939038" elapsed="0.004057"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:17.938818" elapsed="0.004330"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:17.938799" elapsed="0.004375"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:43:17.944059" level="INFO">${ip_address} = 10.30.170.12</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:43:17.943751" elapsed="0.000334"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:43:17.944134" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:43:17.944286" level="INFO">${odl_ip} = 10.30.170.12</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:43:17.943391" 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-08-22T23:43:17.944463" elapsed="0.000447"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:43:17.945200" level="INFO">index=61
host=10.30.170.12
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-08-22T23:43:17.945299" level="INFO">${karaf_connection_object} = index=61
host=10.30.170.12
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:43:17.945090" elapsed="0.000234"/>
</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-08-22T23:43:17.945469" elapsed="0.002434"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:43:17.948327" level="INFO">Logging into '10.30.170.12:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:43:17.950688" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.12</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-08-22T23:43:17.948066" elapsed="0.002993">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.12</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-08-22T23:43:17.965294" elapsed="0.000411"/>
</kw>
<msg time="2026-08-22T23:43:17.965792" 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-08-22T23:43:17.963886" elapsed="0.002082"/>
</kw>
<kw name="Open 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-08-22T23:43:17.966130" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:17.966295" 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-08-22T23:43:17.951855" elapsed="0.014523"/>
</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-08-22T23:43:17.951327" elapsed="0.015137"/>
</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-08-22T23:43:17.935901" elapsed="0.030648">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.12</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-08-22T23:43:17.966935" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:43:17.967010" 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-08-22T23:43:17.923071" elapsed="0.044044">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.12</status>
</kw>
<msg time="2026-08-22T23:43:17.967223" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:43:17.967268" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.12</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:43:17.918375" elapsed="0.048917"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:17.967661" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:17.967370" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:17.967351" elapsed="0.000390"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:43:17.918239" elapsed="0.049527"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:43:17.973360" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:17.973252" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:17.973233" 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-08-22T23:43:17.974623" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:17.974492" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:17.974474" elapsed="0.000220"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:43:17.975132" level="INFO">${karaf_connection_index} = 36</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:43:17.974835" elapsed="0.000326"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:43:17.975536" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:43:17.975320" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:43:18.012622" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:43:17.976073" elapsed="0.036650"/>
</kw>
<msg time="2026-08-22T23:43:18.012902" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:43:18.012949" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:43:17.975739" elapsed="0.037248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:43:18.044837" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "R "e "s "t "a "r "t "_ "n "o "d "e "2 "_ "A "f "t "e "r "_ "M "o "d "i "f "y "_ "A "n "d "_ "D "u "m "p "_ "I "t "s "_ "T "o "p "o "l "o "g "y "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:43:18.013500" elapsed="0.031584"/>
</kw>
<msg time="2026-08-22T23:43:18.045445" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:43:18.045549" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "R "e "s "t "a "r "t "_ "n "o "d "e "2 "_ "A "f "t "e "r "_ "M "o "d "i "f "y "_ "A ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:43:18.013158" elapsed="0.032516"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:18.046372" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:18.045851" elapsed="0.000643"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:18.045806" elapsed="0.000744"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:18.047567" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "R "e "s "t "a "r "t "_ "n "o "d "e "2 "_ "A "f "t "e "r "_ "M "o "d "i "f "y "_ "A "n "d "_ "D "u "m "p "_ "I "t "s "_ "T "o "p "o "l "o "g "y "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:18.046896" elapsed="0.000881"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:18.048488" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:18.047927" elapsed="0.000771"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:18.047887" elapsed="0.000868"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:43:18.048829" 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-08-22T23:43:18.052780" elapsed="0.000149"/>
</kw>
<msg time="2026-08-22T23:43:18.052990" 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-08-22T23:43:18.051690" elapsed="0.001428"/>
</kw>
<kw name="Open 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-08-22T23:43:18.053390" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:18.053734" 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-08-22T23:43:18.050749" 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-08-22T23:43:18.049400" elapsed="0.004582"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:43:17.974189" elapsed="0.079908"/>
</kw>
<msg time="2026-08-22T23:43:18.054190" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:43:18.054234" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "R "e "s "t "a "r "t "_ "n "o "d "e "2 "_ "A "f "t "e "r "_ "M "o "d "i "f "y "_ "A ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:43:17.973591" elapsed="0.080680"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:43:18.054454" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:43:18.054348" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:18.054329" 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-08-22T23:43:18.054953" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:18.055288" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:43:18.055360" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:43:17.972909" elapsed="0.082561"/>
</kw>
<msg time="2026-08-22T23:43:18.055565" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:43:18.055714" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "R "e "s "t "a "r "t "_ "n "o "d "e "2 "_ "A "f "t "e "r "_ "M "o "d "i "f "y "_ "A ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:43:17.968036" elapsed="0.087717"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:18.056081" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:18.055830" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:18.055812" elapsed="0.000346"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:43:17.967897" elapsed="0.088286"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:43:17.816596" elapsed="0.239616"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:43:17.814230" elapsed="0.242040"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:43:17.809275" elapsed="0.247052"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:43:17.808850" elapsed="0.247523"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:43:17.804279" elapsed="0.252149"/>
</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-08-22T23:43:18.059993" 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-08-22T23:43:18.059673" elapsed="0.000347"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:43:18.060467" 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-08-22T23:43:18.060177" elapsed="0.000316"/>
</kw>
<return>
<value>${index_list}</value>
<status status="PASS" start="2026-08-22T23:43:18.060538" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:43:18.060714" level="INFO">${index_list} = [2]</msg>
<var>${index_list}</var>
<arg>${member}</arg>
<status status="PASS" start="2026-08-22T23:43:18.059336" elapsed="0.001438"/>
</kw>
<kw name="Return_Member_IP" owner="ClusterManagement">
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-08-22T23:43:18.061618" 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-08-22T23:43:18.061286" elapsed="0.000360"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:43:18.062096" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:43:18.061799" elapsed="0.000323"/>
</kw>
<return>
<value>${member_ip}</value>
<status status="PASS" start="2026-08-22T23:43:18.062170" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:43:18.062324" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:43:18.060969" elapsed="0.001379"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:43:18.064809" level="INFO">${msg} = Starting ODL2 10.30.170.12</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-08-22T23:43:18.062508" elapsed="0.002328"/>
</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-08-22T23:43:18.071726" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:18.071616" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:18.071596" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:43:18.072795" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:43:18.072397" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:43:18.073287" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:43:18.072981" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:43:18.073358" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:43:18.073514" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:43:18.072017" elapsed="0.001523"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:43:18.079125" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:18.079017" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:18.078999" 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-08-22T23:43:18.080277" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:18.080171" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:18.080153" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:43:18.080722" level="INFO">${karaf_connection_index} = 53</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:43:18.080487" elapsed="0.000261"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:43:18.081074" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:43:18.080903" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:43:18.122415" level="INFO">log: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 "2 "[K"</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:43:18.081600" elapsed="0.040890"/>
</kw>
<msg time="2026-08-22T23:43:18.122606" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:43:18.122653" level="INFO">${message_write} = log: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-08-22T23:43:18.081254" elapsed="0.041436"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:43:18.125849" 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-08-22T23:43:18.123199" elapsed="0.002708"/>
</kw>
<msg time="2026-08-22T23:43:18.126003" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:43:18.126047" 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-08-22T23:43:18.122857" elapsed="0.003216"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:18.126399" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:18.126181" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:18.126158" elapsed="0.000320"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:18.126926" 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-08-22T23:43:18.126635" elapsed="0.000340"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:18.127256" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:18.127042" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:18.127024" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:43:18.127368" 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-08-22T23:43:18.129042" elapsed="0.000202"/>
</kw>
<msg time="2026-08-22T23:43:18.129344" 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-08-22T23:43:18.128495" elapsed="0.000915"/>
</kw>
<kw name="Open 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-08-22T23:43:18.129566" elapsed="0.000043"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:18.129752" 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-08-22T23:43:18.128141" elapsed="0.001692"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:43:18.127640" elapsed="0.002239"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:43:18.079872" elapsed="0.050103"/>
</kw>
<msg time="2026-08-22T23:43:18.130065" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:43:18.130126" 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-08-22T23:43:18.079343" elapsed="0.050810"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:43:18.130341" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:43:18.130234" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:18.130216" 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-08-22T23:43:18.130826" 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-08-22T23:43:18.131158" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:43:18.131230" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:43:18.078681" elapsed="0.052657"/>
</kw>
<msg time="2026-08-22T23:43:18.131430" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:43:18.131473" 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-08-22T23:43:18.073926" elapsed="0.057574"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:18.131848" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:18.131596" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:18.131558" elapsed="0.000367"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:43:18.073786" elapsed="0.058162"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:43:18.137492" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:18.137381" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:18.137362" 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-08-22T23:43:18.138713" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:18.138573" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:18.138555" elapsed="0.000227"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:43:18.139145" level="INFO">${karaf_connection_index} = 61</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:43:18.138923" elapsed="0.000248"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:43:18.139497" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:43:18.139325" elapsed="0.000198"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:43:18.140273" 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-08-22T23:43:18.140077" elapsed="0.000712">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-08-22T23:43:18.140900" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-08-22T23:43:18.140947" 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-08-22T23:43:18.139738" elapsed="0.001233"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:43:18.141672" 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-08-22T23:43:18.141471" elapsed="0.000729">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-08-22T23:43:18.142310" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-08-22T23:43:18.142372" 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-08-22T23:43:18.141135" elapsed="0.001262"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-08-22T23:43:18.143038" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL2 10.30.170.12"</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-08-22T23:43:18.142715" elapsed="0.000384">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL2 10.30.170.12"</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:18.142474" elapsed="0.000693">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL2 10.30.170.12"</status>
</branch>
<status status="FAIL" start="2026-08-22T23:43:18.142454" elapsed="0.000746">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL2 10.30.170.12"</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-08-22T23:43:18.143358" 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-08-22T23:43:18.143603" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:18.143446" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:18.143429" elapsed="0.000253"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-08-22T23:43:18.143715" 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-08-22T23:43:18.145435" elapsed="0.000225"/>
</kw>
<msg time="2026-08-22T23:43:18.145765" 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-08-22T23:43:18.144865" elapsed="0.000966"/>
</kw>
<kw name="Open 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-08-22T23:43:18.145989" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:18.146165" 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-08-22T23:43:18.144474" elapsed="0.001775"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:43:18.143972" elapsed="0.002324"/>
</kw>
<arg>${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-08-22T23:43:18.138273" elapsed="0.008101">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL2 10.30.170.12"</status>
</kw>
<msg time="2026-08-22T23:43:18.146473" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:43:18.146518" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL2 10.30.170.12"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:43:18.137736" elapsed="0.008805"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:43:18.146743" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:18.146636" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:18.146616" 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-08-22T23:43:18.147794" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:18.147687" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:18.147669" elapsed="0.000192"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:43:18.148138" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:43:18.148243" level="INFO">${current_ssh_connection_object} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:43:18.148015" elapsed="0.000256"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:18.148709" level="INFO">{1: 53, 2: 61, 3: 36}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:18.148421" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:18.149150" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:18.148907" elapsed="0.000324"/>
</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-08-22T23:43:18.149773" elapsed="0.000185"/>
</kw>
<msg time="2026-08-22T23:43:18.150056" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:43:18.150128" level="INFO">${old_connection_index} = 61</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-08-22T23:43:18.149388" elapsed="0.000766"/>
</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-08-22T23:43:18.150979" elapsed="0.000139"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:43:18.151774" 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-08-22T23:43:18.151624" 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-08-22T23:43:18.151280" elapsed="0.000983"/>
</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-08-22T23:43:18.152795" 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-08-22T23:43:18.152429" elapsed="0.000513"/>
</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-08-22T23:43:18.150449" elapsed="0.002539"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:18.150231" elapsed="0.002806"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:18.150212" elapsed="0.002851"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:43:18.153865" level="INFO">${ip_address} = 10.30.170.12</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:43:18.153596" elapsed="0.000296"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:43:18.153940" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:43:18.154089" level="INFO">${odl_ip} = 10.30.170.12</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:43:18.153263" 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-08-22T23:43:18.154281" elapsed="0.000431"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:43:18.154985" level="INFO">index=62
host=10.30.170.12
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-08-22T23:43:18.155085" level="INFO">${karaf_connection_object} = index=62
host=10.30.170.12
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:43:18.154877" 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-08-22T23:43:18.155256" elapsed="0.002270"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:43:18.158000" level="INFO">Logging into '10.30.170.12:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:43:18.159090" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.12</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-08-22T23:43:18.157738" elapsed="0.001722">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.12</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-08-22T23:43:18.163165" elapsed="0.000189"/>
</kw>
<msg time="2026-08-22T23:43:18.163396" 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-08-22T23:43:18.162681" 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="NOT RUN" start="2026-08-22T23:43:18.163631" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:18.163791" 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-08-22T23:43:18.160255" elapsed="0.003617"/>
</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-08-22T23:43:18.159751" elapsed="0.004168"/>
</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-08-22T23:43:18.147195" elapsed="0.016804">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.12</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-08-22T23:43:18.164364" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:43:18.164438" 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-08-22T23:43:18.137014" elapsed="0.027526">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.12</status>
</kw>
<msg time="2026-08-22T23:43:18.164666" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:43:18.164711" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.12</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:43:18.132208" elapsed="0.032526"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:18.165062" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:18.164811" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:18.164793" elapsed="0.000347"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:43:18.132071" elapsed="0.033093"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:43:18.170545" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:18.170437" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:18.170418" 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-08-22T23:43:18.171736" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:18.171627" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:18.171608" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:43:18.172165" level="INFO">${karaf_connection_index} = 36</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:43:18.171945" elapsed="0.000246"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:43:18.172605" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:43:18.172373" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:43:18.204505" level="INFO">log: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 "2 "[K"</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:43:18.173218" elapsed="0.031385"/>
</kw>
<msg time="2026-08-22T23:43:18.204709" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:43:18.204757" level="INFO">${message_write} = log: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-08-22T23:43:18.172826" elapsed="0.031968"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:43:18.207215" 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-08-22T23:43:18.205351" elapsed="0.001925"/>
</kw>
<msg time="2026-08-22T23:43:18.207374" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:43:18.207424" 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-08-22T23:43:18.204966" elapsed="0.002496"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:18.207804" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:18.207547" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:18.207526" elapsed="0.000359"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:18.208287" 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-08-22T23:43:18.208028" 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-08-22T23:43:18.208652" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:18.208401" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:18.208383" elapsed="0.000353"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:43:18.208770" 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-08-22T23:43:18.210570" elapsed="0.000274"/>
</kw>
<msg time="2026-08-22T23:43:18.210949" 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-08-22T23:43:18.209958" elapsed="0.001059"/>
</kw>
<kw name="Open 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-08-22T23:43:18.211225" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:18.211391" elapsed="0.000181"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:43:18.209556" elapsed="0.002113"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:43:18.209032" elapsed="0.002685"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:43:18.171307" elapsed="0.040510"/>
</kw>
<msg time="2026-08-22T23:43:18.211935" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:43:18.211983" 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-08-22T23:43:18.170796" elapsed="0.041215"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:43:18.212200" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:43:18.212090" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:18.212071" 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-08-22T23:43:18.212700" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:18.213060" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:43:18.213136" 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-08-22T23:43:18.170079" elapsed="0.043169"/>
</kw>
<msg time="2026-08-22T23:43:18.213344" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:43:18.213388" 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-08-22T23:43:18.165429" elapsed="0.047987"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:18.213766" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:18.213492" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:18.213474" elapsed="0.000370"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:43:18.165291" elapsed="0.048577"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:43:18.073607" elapsed="0.140290"/>
</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-08-22T23:43:18.069481" elapsed="0.144479"/>
</kw>
<kw name="Start_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:43:18.220985" level="INFO">${base_command} = /tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/start</msg>
<var>${base_command}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/bin/start</arg>
<arg>${NODE_START_COMMAND}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:43:18.220595" elapsed="0.000418"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:43:18.221546" level="INFO">${command} = /tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/start</msg>
<var>${command}</var>
<arg>"""${export_java_home}""" != ""</arg>
<arg>export JAVA_HOME="${export_java_home}"; ${base_command}</arg>
<arg>${base_command}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:43:18.221182" elapsed="0.000405"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-08-22T23:43:18.222039" level="INFO">${epoch} = 1787442198.221964</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-08-22T23:43:18.221774" elapsed="0.000292"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:43:18.222674" level="INFO">${gc_filepath} = /tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log/gc_1787442198.221964.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-08-22T23:43:18.222253" elapsed="0.000449"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:43:18.223275" level="INFO">${gc_options} = -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log/gc_1787442198.221964.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-08-22T23:43:18.222892" elapsed="0.000411"/>
</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-08-22T23:43:18.224888" 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-08-22T23:43:18.224472" elapsed="0.000447"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:43:18.225404" 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-08-22T23:43:18.225100" elapsed="0.000368"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:43:18.225517" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:43:18.225711" 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-08-22T23:43:18.224089" elapsed="0.001648"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:43:18.226860" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:43:18.226570" elapsed="0.000317"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:43:18.227694" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:43:18.227798" level="INFO">${current_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:43:18.227558" 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-08-22T23:43:18.231324" elapsed="0.000078"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:18.230597" elapsed="0.000908"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:18.230559" elapsed="0.000988"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:43:18.231843" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:43:18.232004" level="INFO">${current_ssh_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:43:18.231728" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:18.233197" level="INFO">Attempting to execute command "/tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/start -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log/gc_1787442198.221964.log" on remote system "10.30.170.12" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:18.232201" elapsed="0.001064"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:43:18.234264" level="INFO">${conn_id} = 63</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:43:18.233439" elapsed="0.000854"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:43:18.236013" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:43:18.236286" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:43:18.235421" 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-08-22T23:43:18.236734" elapsed="0.000657"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:43:18.238884" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:43:18.941922" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:43:18 UTC 2026

  System load:  0.0                Processes:             122
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:41:50 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:43:18.238443" elapsed="0.703638"/>
</kw>
<msg time="2026-08-22T23:43:18.942229" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:43:18.237718" elapsed="0.704649"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:43:18.234562" elapsed="0.707976"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:43:18.943206" level="INFO">Executing command '/tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/start -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log/gc_1787442198.221964.log'.</msg>
<msg time="2026-08-22T23:43:18.965508" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:43:18.965968" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:43:18.966068" 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-08-22T23:43:18.942849" elapsed="0.023271"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:43:18.966678" elapsed="0.000490"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:18.968806" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:18.967574" elapsed="0.001331"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:43:18.969523" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:18.969116" elapsed="0.000689"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:18.969064" elapsed="0.000803"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:43:18.970387" elapsed="0.000066"/>
</return>
<status status="PASS" start="2026-08-22T23:43:18.969993" elapsed="0.000720"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:18.969956" elapsed="0.000822"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:43:18.970878" 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-08-22T23:43:18.979230" elapsed="0.000158"/>
</kw>
<msg time="2026-08-22T23:43:18.979453" 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-08-22T23:43:18.978160" elapsed="0.001408"/>
</kw>
<kw name="Open 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-08-22T23:43:18.979879" elapsed="0.000047"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:18.980201" 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-08-22T23:43:18.971775" elapsed="0.008621"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:43:18.229919" elapsed="0.750570"/>
</kw>
<msg time="2026-08-22T23:43:18.980541" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:43:18.229059" elapsed="0.751552"/>
</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-08-22T23:43:18.228505" elapsed="0.752187"/>
</kw>
<msg time="2026-08-22T23:43:18.980732" 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-08-22T23:43:18.227981" elapsed="0.752796"/>
</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-08-22T23:43:18.984142" elapsed="0.000150"/>
</kw>
<msg time="2026-08-22T23:43:18.984335" 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-08-22T23:43:18.983570" 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="NOT RUN" start="2026-08-22T23:43:18.984549" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:18.984730" 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-08-22T23:43:18.981061" elapsed="0.003751"/>
</kw>
<msg time="2026-08-22T23:43:18.984903" 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-08-22T23:43:18.227108" elapsed="0.757820"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:18.985383" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:18.985127" elapsed="0.000298"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:43:18.985469" 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-08-22T23:43:18.226128" elapsed="0.759481"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:43:18.225928" elapsed="0.759718"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:43:18.225792" elapsed="0.759892"/>
</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-08-22T23:43:18.223517" elapsed="0.762223"/>
</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-08-22T23:43:18.997224" 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-08-22T23:43:18.996813" elapsed="0.000504"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:43:18.997832" 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-08-22T23:43:18.997483" elapsed="0.000378"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:43:18.997909" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:43:18.998070" 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-08-22T23:43:18.996378" elapsed="0.001718"/>
</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-08-22T23:43:18.999673" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:18.999354" elapsed="0.000347"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:43:18.999747" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:43:18.999896" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-08-22T23:43:18.999006" elapsed="0.000915"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:19.007854" 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-08-22T23:43:19.007332" elapsed="0.000573"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:19.008739" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:19.008223" elapsed="0.000564"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:43:19.014795" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.12', 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.12', 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-08-22T23:43:19.011162" elapsed="0.005670">ConnectionError: HTTPConnectionPool(host='10.30.170.12', 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.12', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:19.008860" elapsed="0.008297">ConnectionError: HTTPConnectionPool(host='10.30.170.12', 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.12', 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-08-22T23:43:19.017381" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:19.017202" elapsed="0.000506"/>
</branch>
<status status="FAIL" start="2026-08-22T23:43:19.008840" elapsed="0.008897">ConnectionError: HTTPConnectionPool(host='10.30.170.12', 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.12', 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-08-22T23:43:19.018255" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:19.018402" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:19.018360" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:19.018340" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:19.018634" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:19.018707" 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-08-22T23:43:19.002931" elapsed="0.015892">ConnectionError: HTTPConnectionPool(host='10.30.170.12', 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.12', 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-08-22T23:43:19.018913" 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-08-22T23:43:19.000129" elapsed="0.018888">ConnectionError: HTTPConnectionPool(host='10.30.170.12', 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.12', 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-08-22T23:43:19.019314" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-08-22T23:43:19.019447" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:19.019408" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:19.019390" elapsed="0.000122"/>
</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-08-22T23:43:19.019732" elapsed="0.000025"/>
</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-08-22T23:43:19.019953" elapsed="0.000024"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="NOT RUN" start="2026-08-22T23:43:19.020021" 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-08-22T23:43:18.998591" elapsed="0.021536">ConnectionError: HTTPConnectionPool(host='10.30.170.12', 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.12', 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-08-22T23:43:19.020256" elapsed="0.000019"/>
</continue>
<status status="NOT RUN" start="2026-08-22T23:43:19.020213" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:19.020193" elapsed="0.000129"/>
</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-08-22T23:43:19.020464" elapsed="0.000021"/>
</kw>
<var name="${index}">2</var>
<status status="FAIL" start="2026-08-22T23:43:18.998345" elapsed="0.022190">ConnectionError: HTTPConnectionPool(host='10.30.170.12', 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.12', 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-08-22T23:43:18.998152" elapsed="0.022468">ConnectionError: HTTPConnectionPool(host='10.30.170.12', 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.12', 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-08-22T23:43:18.995963" elapsed="0.024764">ConnectionError: HTTPConnectionPool(host='10.30.170.12', 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.12', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:18.995638" elapsed="0.025151">ConnectionError: HTTPConnectionPool(host='10.30.170.12', 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.12', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<status status="FAIL" start="2026-08-22T23:43:18.995615" elapsed="0.025206">ConnectionError: HTTPConnectionPool(host='10.30.170.12', 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.12', 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-08-22T23:43:19.021096" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:19.020890" elapsed="0.000260"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:19.020874" elapsed="0.000299"/>
</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-08-22T23:43:19.021435" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:19.021226" elapsed="0.000266"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:19.021211" elapsed="0.000304"/>
</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-08-22T23:43:18.995187" elapsed="0.026472">ConnectionError: HTTPConnectionPool(host='10.30.170.12', 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.12', 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-08-22T23:43:29.039094" 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-08-22T23:43:29.038530" elapsed="0.000599"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:43:29.039736" 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-08-22T23:43:29.039400" elapsed="0.000363"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:43:29.039814" elapsed="0.000040"/>
</return>
<msg time="2026-08-22T23:43:29.039989" 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-08-22T23:43:29.038107" elapsed="0.001907"/>
</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-08-22T23:43:29.041562" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:29.041254" elapsed="0.000350"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:43:29.041653" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:43:29.041804" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-08-22T23:43:29.040909" elapsed="0.000919"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:29.049776" 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-08-22T23:43:29.049260" elapsed="0.000565"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:29.050457" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:29.049980" elapsed="0.000523"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:43:29.393449" level="INFO">GET Request : url=http://10.30.170.12: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:29.393826" level="INFO">GET Response : url=http://10.30.170.12: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': 'Sat, 22 Aug 2026 23:43:29 GMT', 'Expires': 'Sat, 22 Aug 2026 22:43:29 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787442209,"status":200} 
 </msg>
<msg time="2026-08-22T23:43:29.394337" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:43:29.053402" elapsed="0.341244"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:29.050572" elapsed="0.344856"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:29.395912" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:29.395503" elapsed="0.000912"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:29.050553" elapsed="0.345902"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:29.403893" 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787442209,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:29.400141" elapsed="0.003858"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:29.398418" elapsed="0.005632"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:29.398387" elapsed="0.005705"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:29.407877" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:29.405291" elapsed="0.002687"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:29.404176" elapsed="0.003854"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:29.404158" elapsed="0.003911"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:29.409567" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:29.408654" elapsed="0.000974"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:29.410224" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:29.409771" elapsed="0.000544"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:29.411268" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:29.410712" elapsed="0.000603"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:29.410355" elapsed="0.001012"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:29.409751" elapsed="0.001652"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:29.412875" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:29.411936" elapsed="0.001044"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:29.413565" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:29.413125" elapsed="0.000547"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:29.414519" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:29.414002" elapsed="0.000564"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:29.413712" elapsed="0.000996"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:29.413105" elapsed="0.001641"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:43:29.414971" elapsed="0.000847"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:43:29.416838" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:29.416104" elapsed="0.000778"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:43:29.417141" 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-08-22T23:43:29.397193" elapsed="0.022771"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:29.420172" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:29.420039" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:29.420019" elapsed="0.000224"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:43:29.423510" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787442209,...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:43:29.420387" elapsed="0.003153"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:43:29.423622" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:43:29.423795" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787442209,...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:43:29.044783" elapsed="0.379039"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:43:29.423883" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:43:29.424037" level="INFO">${conf_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787442209,...</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-08-22T23:43:29.042036" elapsed="0.382028"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:29.424911" level="INFO">{
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787442209,
 "value": {
  "LocalShards": [
   "member-1-shard-default-config",
   "member-1-shard-inventory-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-08-22T23:43:29.424654" elapsed="0.000305"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:29.426263" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787442209, '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-08-22T23:43:29.425501" elapsed="0.000792"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-08-22T23:43:29.426343" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:43:29.426503" level="INFO">${manager_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787442209, '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-08-22T23:43:29.425166" elapsed="0.001363"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:43:29.426930" level="INFO">${value_object} = {'LocalShards': ['member-1-shard-default-config', 'member-1-shard-inventory-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-08-22T23:43:29.426704" elapsed="0.000253"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:43:29.427367" 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-08-22T23:43:29.427152" elapsed="0.000241"/>
</kw>
<return>
<value>${sync_status}</value>
<status status="PASS" start="2026-08-22T23:43:29.427476" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:43:29.427670" 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-08-22T23:43:29.424280" elapsed="0.003416"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-08-22T23:43:29.428063" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:29.427945" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:29.427747" elapsed="0.000385"/>
</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-08-22T23:43:29.435766" 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-08-22T23:43:29.435267" elapsed="0.000547"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:29.436433" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:29.435968" elapsed="0.000510"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:43:29.446697" level="INFO">GET Request : url=http://10.30.170.12: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:29.446833" level="INFO">GET Response : url=http://10.30.170.12: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': 'Sat, 22 Aug 2026 23:43:29 GMT', 'Expires': 'Sat, 22 Aug 2026 22:43:29 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787442209,"status":200} 
 </msg>
<msg time="2026-08-22T23:43:29.447040" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:43:29.438758" elapsed="0.008366"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:29.436547" elapsed="0.010813"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:29.447545" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:29.447389" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:29.436528" elapsed="0.011360"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:29.452696" 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787442209,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:29.450155" elapsed="0.002645"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:29.449043" elapsed="0.003809"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:29.449023" elapsed="0.003868"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:29.457226" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:29.454214" elapsed="0.003153"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:29.452974" elapsed="0.004465"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:29.452955" elapsed="0.004539"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:29.459502" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:29.458255" elapsed="0.001289"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:29.460309" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:29.459874" elapsed="0.000523"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:29.461254" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:29.460742" elapsed="0.000559"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:29.460436" elapsed="0.000917"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:29.459854" elapsed="0.001535"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:29.462819" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:29.461966" elapsed="0.000895"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:29.463462" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:29.463028" elapsed="0.000522"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:29.464439" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:29.463930" elapsed="0.000555"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:29.463642" elapsed="0.000953"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:29.462981" 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-08-22T23:43:29.464843" elapsed="0.000876"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:43:29.466626" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:29.466004" 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-08-22T23:43:29.466927" elapsed="0.002804"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:43:29.448327" elapsed="0.021541"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:29.470072" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:29.469942" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:29.469923" elapsed="0.000219"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:43:29.473374" 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-08-22T23:43:29.470287" elapsed="0.003116"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:43:29.473456" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:43:29.473641" 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-08-22T23:43:29.430899" elapsed="0.042769"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:43:29.473727" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:43:29.473877" 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-08-22T23:43:29.428337" elapsed="0.045567"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:29.474768" level="INFO">{
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787442209,
 "value": {
  "LocalShards": [
   "member-1-shard-default-operational",
   "member-1-shard-inventory-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-08-22T23:43:29.474481" elapsed="0.000334"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:29.476147" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787442209, ...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:29.475387" elapsed="0.000788"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-08-22T23:43:29.476225" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:43:29.476385" level="INFO">${manager_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787442209, ...</msg>
<var>${manager_object}</var>
<arg>${shard_manager_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-08-22T23:43:29.475046" elapsed="0.001365"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:43:29.476826" level="INFO">${value_object} = {'LocalShards': ['member-1-shard-default-operational', 'member-1-shard-inventory-operational', 'member-1-shard-topology-operational'], '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-08-22T23:43:29.476563" elapsed="0.000290"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:43:29.477217" 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-08-22T23:43:29.477005" elapsed="0.000237"/>
</kw>
<return>
<value>${sync_status}</value>
<status status="PASS" start="2026-08-22T23:43:29.477290" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:43:29.477441" 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-08-22T23:43:29.474123" elapsed="0.003343"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="PASS" start="2026-08-22T23:43:29.477509" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:43:29.477677" 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-08-22T23:43:29.040493" elapsed="0.437210"/>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="PASS" start="2026-08-22T23:43:29.477884" elapsed="0.000031"/>
</continue>
<status status="PASS" start="2026-08-22T23:43:29.477773" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:29.477756" elapsed="0.000251"/>
</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-08-22T23:43:29.478154" elapsed="0.000021"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:43:29.040264" elapsed="0.437946"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:43:29.040072" elapsed="0.438175"/>
</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-08-22T23:43:29.037687" elapsed="0.440623"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:29.037309" elapsed="0.441034"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:29.037280" elapsed="0.441088"/>
</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-08-22T23:43:29.479897" 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-08-22T23:43:29.479496" elapsed="0.000429"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:43:29.480375" 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-08-22T23:43:29.480082" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:43:29.480446" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:43:29.480633" 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-08-22T23:43:29.479119" 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-08-22T23:43:29.481675" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:29.481363" elapsed="0.000338"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:43:29.481747" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:43:29.481893" 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-08-22T23:43:29.481025" elapsed="0.000893"/>
</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-08-22T23:43:29.534316" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:29.533876" elapsed="0.000495"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:43:29.535370" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:43:29.535035" elapsed="0.000416">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:43:29.535568" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:43:29.534649" elapsed="0.000990"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:43:29.536338" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:43:29.535893" elapsed="0.000497"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:43:29.536841" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:43:29.537017" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:43:29.536663" elapsed="0.000404"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:29.537617" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:29.537312" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:29.538909" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:29.538546" elapsed="0.000409"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:43:29.539417" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:43:29.539143" 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-08-22T23:43:29.539778" 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-08-22T23:43:29.539981" 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-08-22T23:43:29.540149" elapsed="0.000062"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-08-22T23:43:29.539646" elapsed="0.000605"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-08-22T23:43:29.539493" elapsed="0.000787"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:43:29.540326" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:43:29.540490" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:43:29.538212" elapsed="0.002303"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:29.537848" elapsed="0.002720"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:29.540849" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:29.540643" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:29.537795" elapsed="0.003168"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:29.541736" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:29.541215" elapsed="0.000573"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:43:29.541869" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:43:29.532652" elapsed="0.009455"/>
</kw>
<msg time="2026-08-22T23:43:29.542188" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:43:29.518536" elapsed="0.023719"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:29.564696" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:29.586352" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:29.608003" 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-08-22T23:43:29.608227" 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-08-22T23:43:29.608406" 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-08-22T23:43:29.609593" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:29.608707" elapsed="0.001015"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:29.608689" elapsed="0.001085"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:29.609974" elapsed="0.000067"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:29.610264" elapsed="0.000066"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:29.610560" elapsed="0.000087"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:43:29.608653" elapsed="0.002102"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:43:29.608490" elapsed="0.002294"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:29.610933" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:29.611066" elapsed="0.000020"/>
</return>
<msg time="2026-08-22T23:43:29.611239" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:43:29.514305" elapsed="0.096961"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:43:29.613216" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:43:29.612729" elapsed="0.000682">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:43:29.613535" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:43:29.612029" elapsed="0.001532"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:29.613940" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:29.613651" elapsed="0.000461"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:29.614911" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:29.614317" elapsed="0.000673"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:29.614140" elapsed="0.001045"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:29.613632" elapsed="0.001580"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:43:29.627431" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:43:29.615365" elapsed="0.012097"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:43:29.627515" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:43:29.627688" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:43:29.611683" elapsed="0.016030"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:43:29.629513" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:43:29.629063" elapsed="0.000653">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-08-22T23:43:29.629839" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:43:29.628374" elapsed="0.001491"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-08-22T23:43:29.630106" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:43:29.629937" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:29.629919" elapsed="0.000270"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:29.630331" 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-08-22T23:43:29.630500" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-08-22T23:43:29.630565" elapsed="0.000085"/>
</return>
<msg time="2026-08-22T23:43:29.632798" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:43:29.628052" elapsed="0.004774"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:29.634523" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:29.634051" elapsed="0.000521"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:29.635234" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:29.634744" elapsed="0.000536"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:43:30.132716" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:30.133524" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node0crz9eooiwe2kjocfdw61ougy0.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Fri, 21-Aug-2026 23:43:30 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":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","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":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-netconf-monitoring_2010-10-04","revision":"2010-10-04","schema":"/rests/modules/ietf-netconf-monitoring?revision=2010-10-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring","conformance-type":"import"},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-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":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"odl-netconf-device_2025-12-05","revision":"2025-12-05","schema":"/rests/modules/odl-netconf-device?revision=2025-12-05","namespace":"urn:opendaylight:netconf:device","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","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":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-http-server_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-server?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["tcp-supported","tls-supported"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","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":"netconf-keystore_2024-07-08","revision":"2024-07-08","schema":"/rests/modules/netconf-keystore?revision=2024-07-08","namespace":"urn:opendaylight:netconf:keystore","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":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"ietf-netconf-client_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-netconf-client?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-client","conformance-type":"import","feature":["ssh-listen","tls-listen","central-netconf-client-supported","tls-initiate","ssh-initiate"]},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":[... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-08-22T23:43:30.134349" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:43:29.637535" elapsed="0.497023"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:29.635348" elapsed="0.499811"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:30.135773" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:30.135237" elapsed="0.001215"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:29.635328" elapsed="0.501191"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:30.144049" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","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":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-netconf-monitoring_2010-10-04","revision":"2010-10-04","schema":"/rests/modules/ietf-netconf-monitoring?revision=2010-10-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring","conformance-type":"import"},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-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":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"odl-netconf-device_2025-12-05","revision":"2025-12-05","schema":"/rests/modules/odl-netconf-device?revision=2025-12-05","namespace":"urn:opendaylight:netconf:device","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","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":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-http-server_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-server?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["tcp-supported","tls-supported"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","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":"netconf-keystore_2024-07-08","revision":"2024-07-08","schema":"/rests/modules/netconf-keystore?revision=2024-07-08","namespace":"urn:opendaylight:netconf:keystore","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":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"ietf-netconf-client_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-netconf-client?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-client","conformance-type":"import","feature":["ssh-listen","tls-listen","central-netconf-client-supported","tls-initiate","ssh-initiate"]},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"netconf-node-optional_2022-12-25","revision":"2022-12-25","schema":"/rests/modules/netconf-node-optional?revision=2022-12-25","namespace":"urn:opendaylight:netconf-node-optional","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","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":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"netconf-node-topology_2025-12-05","revision":"2025-12-05","schema":"/rests/modules/netconf-node-topology?revision=2025-12-05","namespace":"urn:opendaylight:netconf-node-topology","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"1"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:30.141205" elapsed="0.003108"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:30.139502" elapsed="0.004863"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:30.139413" elapsed="0.004993"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:30.148225" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:30.145664" elapsed="0.002664"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:30.144491" elapsed="0.003888"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:30.144473" elapsed="0.003946"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:30.149938" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:30.149041" elapsed="0.000940"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:30.150564" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:30.150123" elapsed="0.000571"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:30.151546" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:30.151021" elapsed="0.000589"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:30.150733" elapsed="0.000932"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:30.150103" elapsed="0.001598"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:30.153256" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:30.152181" elapsed="0.001117"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:30.153894" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:30.153439" elapsed="0.000543"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:30.154982" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:30.154308" elapsed="0.000721"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:30.154020" elapsed="0.001060"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:30.153419" 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-08-22T23:43:30.155320" elapsed="0.000840"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:43:30.157114" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:30.156444" 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-08-22T23:43:30.157414" elapsed="0.002778"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:43:30.137781" elapsed="0.022551"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:30.160541" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:30.160404" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:30.160385" elapsed="0.000253"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:43:30.166795" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:43:30.160783" elapsed="0.006042"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:43:30.166877" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:43:30.167048" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:43:29.633222" elapsed="0.533852"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:43:30.167138" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:43:30.167293" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-08-22T23:43:29.492094" elapsed="0.675225"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:30.167697" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:30.167404" elapsed="0.000404"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:30.167386" elapsed="0.000448"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:43:30.167869" elapsed="0.000026"/>
</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-08-22T23:43:29.486028" elapsed="0.681969"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:43:29.480859" elapsed="0.687180"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:43:29.480717" elapsed="0.687356"/>
</for>
<arg>${member_index_list}</arg>
<status status="PASS" start="2026-08-22T23:43:29.478712" elapsed="0.689422"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:29.478424" elapsed="0.689740"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:29.478408" elapsed="0.689781"/>
</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-08-22T23:43:30.168603" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:30.168247" elapsed="0.000417"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:30.168230" elapsed="0.000458"/>
</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-08-22T23:43:29.036752" elapsed="1.131988"/>
</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-08-22T23:43:18.985898" elapsed="11.182907"/>
</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-08-22T23:43:30.172152" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:43:30.171768" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:43:30.172656" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:43:30.172335" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:43:30.172727" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:43:30.172880" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:43:30.171319" elapsed="0.001587"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:43:30.173987" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:43:30.173720" elapsed="0.000293"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:43:30.174812" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:43:30.174914" level="INFO">${current_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:43:30.174674" 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-08-22T23:43:30.178091" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:30.177456" elapsed="0.000783"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:30.177437" elapsed="0.000828"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:43:30.178524" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:43:30.178699" level="INFO">${current_ssh_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:43:30.178413" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:30.179895" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.200" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:30.178874" elapsed="0.001070"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:43:30.180860" 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-08-22T23:43:30.180137" elapsed="0.000751"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:43:30.182316" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:43:30.182547" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:43:30.181727" elapsed="0.000996"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:43:30.183033" elapsed="0.000777"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:43:30.185329" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:43:30.789648" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:43:30 UTC 2026

  System load:  0.02               Processes:             122
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:41:50 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:43:30.184974" elapsed="0.604919"/>
</kw>
<msg time="2026-08-22T23:43:30.790029" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:43:30.184127" elapsed="0.606100"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:43:30.181107" elapsed="0.609347"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:43:30.791064" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-08-22T23:43:30.803866" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-08-22T23:43:30.804272" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:43:30.804362" 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-08-22T23:43:30.790740" elapsed="0.013664"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:43:30.804768" elapsed="0.000416"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:30.806372" 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-08-22T23:43:30.805553" elapsed="0.000911"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:43:30.806926" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:30.806659" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:30.806574" elapsed="0.000459"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:43:30.807294" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-08-22T23:43:30.807109" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:30.807087" elapsed="0.000336"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:43:30.807482" 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-08-22T23:43:30.813875" elapsed="0.000310"/>
</kw>
<msg time="2026-08-22T23:43:30.814272" 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-08-22T23:43:30.812334" elapsed="0.002093"/>
</kw>
<kw name="Open 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-08-22T23:43:30.814880" elapsed="0.000071"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:30.815314" elapsed="0.000067"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:43:30.808018" elapsed="0.007626"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:43:30.176832" elapsed="0.638953"/>
</kw>
<msg time="2026-08-22T23:43:30.815862" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:43:30.176178" elapsed="0.639820"/>
</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-08-22T23:43:30.175621" elapsed="0.640495"/>
</kw>
<msg time="2026-08-22T23:43:30.816180" 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-08-22T23:43:30.175093" elapsed="0.641264"/>
</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-08-22T23:43:30.820205" elapsed="0.000147"/>
</kw>
<msg time="2026-08-22T23:43:30.820396" 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-08-22T23:43:30.819682" elapsed="0.000776"/>
</kw>
<kw name="Open 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-08-22T23:43:30.820640" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:30.820804" 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-08-22T23:43:30.816782" elapsed="0.004104"/>
</kw>
<msg time="2026-08-22T23:43:30.820979" 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-08-22T23:43:30.174227" elapsed="0.646777"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:30.821432" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:30.821181" elapsed="0.000293"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:43:30.821518" 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-08-22T23:43:30.173270" elapsed="0.648392"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:43:30.173097" elapsed="0.648603"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:43:30.822720" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:43:30.822423" elapsed="0.000324"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:43:30.823540" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:43:30.823662" level="INFO">${current_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:43:30.823405" 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-08-22T23:43:30.826993" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:30.826366" elapsed="0.000780"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:30.826344" elapsed="0.000835"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:43:30.827527" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:43:30.827783" level="INFO">${current_ssh_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:43:30.827376" elapsed="0.000469"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:30.829210" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.12" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:30.828078" elapsed="0.001190"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:43:30.830239" level="INFO">${conn_id} = 65</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:43:30.829452" elapsed="0.000815"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:43:30.834221" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:43:30.834460" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:43:30.833441" elapsed="0.001119"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:43:30.834912" elapsed="0.000844"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:43:30.837287" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:43:31.160333" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:43:18 UTC 2026

  System load:  0.0                Processes:             122
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:43:18 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:43:30.836928" elapsed="0.323853"/>
</kw>
<msg time="2026-08-22T23:43:31.160966" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:43:30.836112" elapsed="0.325125"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:43:30.830487" elapsed="0.331052"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:43:31.162437" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-08-22T23:43:31.174917" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-08-22T23:43:31.175145" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:43:31.175207" 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-08-22T23:43:31.161984" elapsed="0.013255"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:43:31.175433" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:31.176788" 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-08-22T23:43:31.175938" 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-08-22T23:43:31.177845" elapsed="0.000065"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:31.177247" elapsed="0.000775"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:31.177168" elapsed="0.000948"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:43:31.178807" elapsed="0.000073"/>
</return>
<status status="PASS" start="2026-08-22T23:43:31.178325" elapsed="0.000643"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:31.178267" elapsed="0.000760"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:43:31.179132" 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">
<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-08-22T23:43:31.188695" elapsed="0.000332"/>
</kw>
<msg time="2026-08-22T23:43:31.189123" 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-08-22T23:43:31.187029" elapsed="0.002270"/>
</kw>
<kw name="Open 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-08-22T23:43:31.189923" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:31.190413" elapsed="0.000071"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:43:31.180111" elapsed="0.010679"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:43:30.825721" elapsed="0.365229"/>
</kw>
<msg time="2026-08-22T23:43:31.191036" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:43:30.824972" elapsed="0.366166"/>
</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-08-22T23:43:30.824396" elapsed="0.366871"/>
</kw>
<msg time="2026-08-22T23:43:31.191338" 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-08-22T23:43:30.823843" elapsed="0.367591"/>
</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-08-22T23:43:31.197906" elapsed="0.000244"/>
</kw>
<msg time="2026-08-22T23:43:31.198232" 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-08-22T23:43:31.196947" elapsed="0.001399"/>
</kw>
<kw name="Open 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-08-22T23:43:31.198632" elapsed="0.000037"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:31.198906" elapsed="0.000034"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:43:31.191980" elapsed="0.007063"/>
</kw>
<msg time="2026-08-22T23:43:31.199199" 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-08-22T23:43:30.822963" elapsed="0.376278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:31.200005" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:31.199574" elapsed="0.000501"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:43:31.200150" elapsed="0.000098"/>
</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-08-22T23:43:30.821984" elapsed="0.378522"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:43:30.821800" elapsed="0.378767"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:43:31.202367" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:43:31.201886" elapsed="0.000525"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:43:31.203788" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:43:31.203955" level="INFO">${current_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:43:31.203550" elapsed="0.000451"/>
</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-08-22T23:43:31.209392" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:31.208387" elapsed="0.001274"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:31.208354" elapsed="0.001360"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:43:31.210158" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:43:31.210402" level="INFO">${current_ssh_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:43:31.209970" elapsed="0.000479"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:31.212058" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.79" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:31.210709" elapsed="0.001429"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:43:31.213819" 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-08-22T23:43:31.212500" elapsed="0.001362"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:43:31.216302" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:43:31.216700" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:43:31.215263" elapsed="0.001595"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:43:31.217382" elapsed="0.001148"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:43:31.221426" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:43:31.828236" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:43:31 UTC 2026

  System load:  0.01               Processes:             121
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:41:51 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:43:31.220873" elapsed="0.607596"/>
</kw>
<msg time="2026-08-22T23:43:31.828647" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:43:31.219141" elapsed="0.609696"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:43:31.214229" elapsed="0.614819"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:43:31.829674" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-08-22T23:43:31.842030" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-08-22T23:43:31.842481" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:43:31.842622" 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-08-22T23:43:31.829313" elapsed="0.013368"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:43:31.843050" elapsed="0.000475"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:31.844951" 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-08-22T23:43:31.843992" elapsed="0.001207"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:43:31.845693" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:31.845384" elapsed="0.000383"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:31.845328" elapsed="0.000472"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:43:31.846059" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:43:31.845876" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:31.845854" elapsed="0.000321"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:43:31.846221" 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-08-22T23:43:31.852052" elapsed="0.000309"/>
</kw>
<msg time="2026-08-22T23:43:31.852444" 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-08-22T23:43:31.850515" elapsed="0.002107"/>
</kw>
<kw name="Open 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-08-22T23:43:31.853048" elapsed="0.000066"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:31.853469" 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-08-22T23:43:31.846707" elapsed="0.007055"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:43:31.207260" elapsed="0.646637"/>
</kw>
<msg time="2026-08-22T23:43:31.853973" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:43:31.206104" elapsed="0.647956"/>
</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-08-22T23:43:31.205147" elapsed="0.649025"/>
</kw>
<msg time="2026-08-22T23:43:31.854229" 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-08-22T23:43:31.204278" elapsed="0.650031"/>
</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-08-22T23:43:31.858675" elapsed="0.000146"/>
</kw>
<msg time="2026-08-22T23:43:31.858865" 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-08-22T23:43:31.858105" elapsed="0.000822"/>
</kw>
<kw name="Open 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-08-22T23:43:31.859081" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:31.859241" 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-08-22T23:43:31.854741" elapsed="0.004582"/>
</kw>
<msg time="2026-08-22T23:43:31.859414" 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-08-22T23:43:31.202821" elapsed="0.656618"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:31.859883" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:31.859633" elapsed="0.000292"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:43:31.859967" 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-08-22T23:43:31.201100" elapsed="0.658992"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:43:31.200756" elapsed="0.659374"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:43:30.172961" elapsed="1.687207"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-08-22T23:43:30.169077" elapsed="1.691153"/>
</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-08-22T23:43:18.214267" elapsed="13.646016"/>
</kw>
<arg>2</arg>
<doc>Convenience keyword that starts the specified member of the cluster.</doc>
<status status="PASS" start="2026-08-22T23:43:18.056677" elapsed="13.803679"/>
</kw>
<kw name="Get_Topology">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Topology_Core">
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:31.869211" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:31.868914" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:31.869683" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:31.869413" 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-08-22T23:43:31.902642" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:31.902992" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Fri, 21-Aug-2026 23:43:31 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '990'} 
 body={"network-topology:topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]} 
 </msg>
<msg time="2026-08-22T23:43:31.903256" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:43:31.871878" elapsed="0.031438"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:31.869798" elapsed="0.033616"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:31.903854" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:31.903474" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:31.869779" elapsed="0.034272"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:31.911953" level="INFO">{"network-topology:topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:31.906437" elapsed="0.005638"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:31.905943" elapsed="0.006212"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:31.905901" elapsed="0.006311"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:31.915625" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:31.912913" elapsed="0.002759"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:31.912337" elapsed="0.003371"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:31.912300" elapsed="0.003433"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:31.916301" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:31.915899" 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-08-22T23:43:31.916656" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:31.916401" elapsed="0.000330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:31.917226" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:31.916921" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:31.916756" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:31.916383" elapsed="0.000928"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:31.917854" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:31.917469" 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-08-22T23:43:31.918184" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:31.917952" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:31.918736" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:31.918423" elapsed="0.000372"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:31.918265" elapsed="0.000570"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:31.917934" 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-08-22T23:43:31.919007" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:43:31.919837" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:31.919519" 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-08-22T23:43:31.920020" elapsed="0.002412"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:43:31.904945" elapsed="0.017552"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:31.922690" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:31.922567" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:31.922548" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:43:31.925865" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "en...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:43:31.922906" elapsed="0.002988"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:43:31.925948" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:43:31.926111" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "en...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:43:31.864466" elapsed="0.061671"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:43:31.926196" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:43:31.926347" level="INFO">${config_topology} = {
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "en...</msg>
<var>${config_topology}</var>
<arg>${config_topology_url}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:43:31.861758" elapsed="0.064615"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:31.926806" level="INFO">{
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "encryption": {
       "encryption-alg": [
        "AEAD_AES_128_GCM",
        "AEAD_AES_256_GCM",
        "aes128-cbc",
        "aes128-ctr",
        "aes192-cbc",
        "aes192-ctr",
        "aes256-cbc",
        "aes256-ctr",
        "chacha20-poly1305"
       ]
      },
      "host-key": {
       "host-key-alg": [
        "ecdsa-sha2-nistp256",
        "ecdsa-sha2-nistp384",
        "ecdsa-sha2-nistp521",
        "rsa-sha2-256",
        "rsa-sha2-512",
        "ssh-ed25519",
        "ssh-rsa"
       ]
      },
      "key-exchange": {
       "key-exchange-alg": [
        "curve25519-sha256",
        "curve448-sha512",
        "diffie-hellman-group-exchange-sha256",
        "diffie-hellman-group14-sha256",
        "diffie-hellman-group15-sha512",
        "diffie-hellman-group16-sha512",
        "diffie-hellman-group17-sha512",
        "diffie-hellman-group18-sha512",
        "ecdh-sha2-nistp256",
        "ecdh-sha2-nistp384",
        "ecdh-sha2-nistp521",
        "mlkem1024nistp384-sha384",
        "mlkem768nistp256-sha256",
        "mlkem768x25519-sha256",
        "sntrup761x25519-sha512"
       ]
      },
      "mac": {
       "mac-alg": [
        "hmac-sha1",
        "hmac-sha2-256",
        "hmac-sha2-512"
       ]
      }
     }
    }
   }
  }
 ]
}
</msg>
<arg>${config_topology}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:31.926532" elapsed="0.000331"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:31.934474" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:31.934222" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:31.934936" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:31.934688" 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-08-22T23:43:31.948272" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:31.948557" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '990'} 
 body={"network-topology:topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]} 
 </msg>
<msg time="2026-08-22T23:43:31.948978" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:43:31.937183" elapsed="0.011857"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:31.935049" elapsed="0.014089"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:31.949540" elapsed="0.000083"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:31.949198" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:31.935030" elapsed="0.014742"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:31.957534" level="INFO">{"network-topology:topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:31.952071" elapsed="0.005533"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:31.951548" elapsed="0.006093"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:31.951503" elapsed="0.006164"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:31.960252" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:31.957946" elapsed="0.002351"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:31.957724" elapsed="0.002608"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:31.957707" elapsed="0.002650"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:31.960919" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:31.960515" 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-08-22T23:43:31.961249" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:31.961018" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:31.961808" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:31.961488" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:31.961330" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:31.960999" elapsed="0.000893"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:43:31.962412" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:31.962051" 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-08-22T23:43:31.962757" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:31.962508" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:31.963289" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:31.962995" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:31.962838" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:31.962491" 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-08-22T23:43:31.963526" elapsed="0.000370"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:43:31.964331" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:43:31.964058" 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-08-22T23:43:31.964508" 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-08-22T23:43:31.950560" elapsed="0.016387"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:31.967122" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:31.967017" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:31.966998" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:43:31.970171" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "en...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:43:31.967330" elapsed="0.002870"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:43:31.970287" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:43:31.970448" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "en...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:43:31.929742" elapsed="0.040733"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:43:31.970533" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:43:31.970702" level="INFO">${operational_topology} = {
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "en...</msg>
<var>${operational_topology}</var>
<arg>${operational_topology_url}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:43:31.927076" elapsed="0.043652"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:31.971139" level="INFO">{
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "encryption": {
       "encryption-alg": [
        "AEAD_AES_128_GCM",
        "AEAD_AES_256_GCM",
        "aes128-cbc",
        "aes128-ctr",
        "aes192-cbc",
        "aes192-ctr",
        "aes256-cbc",
        "aes256-ctr",
        "chacha20-poly1305"
       ]
      },
      "host-key": {
       "host-key-alg": [
        "ecdsa-sha2-nistp256",
        "ecdsa-sha2-nistp384",
        "ecdsa-sha2-nistp521",
        "rsa-sha2-256",
        "rsa-sha2-512",
        "ssh-ed25519",
        "ssh-rsa"
       ]
      },
      "key-exchange": {
       "key-exchange-alg": [
        "curve25519-sha256",
        "curve448-sha512",
        "diffie-hellman-group-exchange-sha256",
        "diffie-hellman-group14-sha256",
        "diffie-hellman-group15-sha512",
        "diffie-hellman-group16-sha512",
        "diffie-hellman-group17-sha512",
        "diffie-hellman-group18-sha512",
        "ecdh-sha2-nistp256",
        "ecdh-sha2-nistp384",
        "ecdh-sha2-nistp521",
        "mlkem1024nistp384-sha384",
        "mlkem768nistp256-sha256",
        "mlkem768x25519-sha256",
        "sntrup761x25519-sha512"
       ]
      },
      "mac": {
       "mac-alg": [
        "hmac-sha1",
        "hmac-sha2-256",
        "hmac-sha2-512"
       ]
      }
     }
    }
   }
  }
 ]
}
</msg>
<arg>${operational_topology}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:31.970885" elapsed="0.000310"/>
</kw>
<return>
<value>${config_topology}</value>
<value>${operational_topology}</value>
<status status="PASS" start="2026-08-22T23:43:31.971239" elapsed="0.000028"/>
</return>
<arg>${session}</arg>
<doc>Get both versions of topology (config and operational), log them and return them for further processing.</doc>
<status status="PASS" start="2026-08-22T23:43:31.861368" elapsed="0.110028"/>
</kw>
<msg time="2026-08-22T23:43:31.971494" level="INFO">${result} = ['{\n "network-topology:topology": [\n  {\n   "topology-id": "topology-netconf",\n   "topology-types": {\n    "netconf-node-topology:topology-netconf": {\n     "ssh-transport-topology-parameters": {\n...</msg>
<var>${result}</var>
<arg>${DEVICE_BOOT_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Get_Topology_Core</arg>
<arg>${session}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:43:31.860859" elapsed="0.110661"/>
</kw>
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:43:31.971570" elapsed="0.000042"/>
</return>
<msg time="2026-08-22T23:43:31.971750" level="INFO">${config_topology} = {
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "en...</msg>
<msg time="2026-08-22T23:43:31.971797" level="INFO">${operational_topology} = {
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "en...</msg>
<var>${config_topology}</var>
<var>${operational_topology}</var>
<arg>session=node2</arg>
<doc>Repeatedly try to get the topologies using Get_Topology_Core until either the request succeeds or boot timeout period expires.</doc>
<status status="PASS" start="2026-08-22T23:43:31.860512" elapsed="0.111309"/>
</kw>
<doc>Simulate node 2 restarted by admin just after device data is modified and the change propagated in the cluster, fail if node 2 fails to boot.</doc>
<status status="PASS" start="2026-08-22T23:43:17.803557" elapsed="14.168384"/>
</test>
<test id="s1-s6-t15" name="Check_Modified_Device_Data_Is_Visible_On_node2" line="182">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:43:31.975532" elapsed="0.000228"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:43:31.975269" 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-08-22T23:43:31.976830" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:31.976703" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:31.976684" elapsed="0.000216"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:43:31.981848" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:31.981740" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:31.981721" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:43:31.982917" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:43:31.982514" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:43:31.983407" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:43:31.983102" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:43:31.983478" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:43:31.983652" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:43:31.982138" 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-08-22T23:43:31.989177" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:31.989070" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:31.989050" 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-08-22T23:43:31.990389" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:31.990283" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:31.990265" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:43:31.990921" level="INFO">${karaf_connection_index} = 53</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:43:31.990622" elapsed="0.000326"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:43:31.991320" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:43:31.991104" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:43:32.029248" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:43:31.991854" elapsed="0.037492"/>
</kw>
<msg time="2026-08-22T23:43:32.029524" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:43:32.029572" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:43:31.991501" elapsed="0.038129"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:43:32.053888" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "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-08-22T23:43:32.030138" elapsed="0.023912"/>
</kw>
<msg time="2026-08-22T23:43:32.054281" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:43:32.054346" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:43:32.029798" elapsed="0.024600"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:32.054843" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:32.054506" elapsed="0.000416"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:32.054478" elapsed="0.000478"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:32.055565" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "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-08-22T23:43:32.055150" 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-08-22T23:43:32.056086" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:32.055787" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:32.055761" elapsed="0.000434"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:43:32.056241" 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-08-22T23:43:32.059114" elapsed="0.000145"/>
</kw>
<msg time="2026-08-22T23:43:32.059319" 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-08-22T23:43:32.058088" elapsed="0.001362"/>
</kw>
<kw name="Open 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-08-22T23:43:32.059739" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:32.060068" 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-08-22T23:43:32.057414" elapsed="0.002840"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:43:32.056627" 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-08-22T23:43:31.989981" elapsed="0.070433"/>
</kw>
<msg time="2026-08-22T23:43:32.060550" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:43:32.060618" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:43:31.989393" elapsed="0.071264"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:43:32.060863" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:43:32.060735" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:32.060716" elapsed="0.000229"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:32.061341" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:32.061694" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:43:32.061767" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:43:31.988705" elapsed="0.073170"/>
</kw>
<msg time="2026-08-22T23:43:32.061968" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:43:32.062010" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:43:31.984091" elapsed="0.077956"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:32.062367" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:32.062121" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:32.062103" elapsed="0.000341"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:43:31.983949" elapsed="0.078518"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:43:32.067877" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:32.067768" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:32.067749" 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-08-22T23:43:32.069097" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:32.068989" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:32.068971" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:43:32.069615" level="INFO">${karaf_connection_index} = 62</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:43:32.069304" elapsed="0.000338"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:43:32.070016" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:43:32.069802" elapsed="0.000240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:43:32.070794" 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-08-22T23:43:32.070522" elapsed="0.001148">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-08-22T23:43:32.071865" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-08-22T23:43:32.071912" 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-08-22T23:43:32.070195" elapsed="0.001741"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:43:32.072701" 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-08-22T23:43:32.072438" elapsed="0.000930">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-08-22T23:43:32.073550" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-08-22T23:43:32.073621" 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-08-22T23:43:32.072101" elapsed="0.001551"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-08-22T23:43:32.074551" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_Modified_Device_Data_Is_Visible_On_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-08-22T23:43:32.073949" elapsed="0.000685">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_Modified_Device_Data_Is_Visible_On_node2"</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:32.073731" elapsed="0.000974">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_Modified_Device_Data_Is_Visible_On_node2"</status>
</branch>
<status status="FAIL" start="2026-08-22T23:43:32.073712" elapsed="0.001025">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_Modified_Device_Data_Is_Visible_On_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-08-22T23:43:32.074931" 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-08-22T23:43:32.075159" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:32.075019" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:32.075001" elapsed="0.000234"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-08-22T23:43:32.075268" 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-08-22T23:43:32.077770" elapsed="0.000147"/>
</kw>
<msg time="2026-08-22T23:43:32.077976" 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-08-22T23:43:32.076717" elapsed="0.001387"/>
</kw>
<kw name="Open 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-08-22T23:43:32.078369" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:32.078727" 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-08-22T23:43:32.076090" elapsed="0.002821"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:43:32.075523" elapsed="0.003452"/>
</kw>
<arg>${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-08-22T23:43:32.068674" elapsed="0.010386">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_Modified_Device_Data_Is_Visible_On_node2"</status>
</kw>
<msg time="2026-08-22T23:43:32.079162" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:43:32.079205" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_Modified_Device_Data_Is_Visible_On_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-08-22T23:43:32.068091" elapsed="0.011138"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:43:32.079410" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:32.079304" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:32.079286" 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-08-22T23:43:32.080274" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:32.080169" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:32.080151" elapsed="0.000189"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:43:32.080670" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:43:32.080777" level="INFO">${current_ssh_connection_object} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:43:32.080488" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:32.081233" level="INFO">{1: 53, 2: 62, 3: 36}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:32.080977" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:32.081731" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:32.081424" elapsed="0.000351"/>
</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-08-22T23:43:32.082284" elapsed="0.000258"/>
</kw>
<msg time="2026-08-22T23:43:32.082662" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:43:32.082709" level="INFO">${old_connection_index} = 62</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-08-22T23:43:32.081928" elapsed="0.000803"/>
</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-08-22T23:43:32.083596" elapsed="0.000199"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:43:32.085006" 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-08-22T23:43:32.084427" elapsed="0.001446">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-08-22T23:43:32.083958" elapsed="0.002014"/>
</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-08-22T23:43:32.086620" elapsed="0.000280"/>
</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-08-22T23:43:32.086142" 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-08-22T23:43:32.083071" elapsed="0.003961"/>
</kw>
<status status="PASS" start="2026-08-22T23:43:32.082852" elapsed="0.004264"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:32.082833" elapsed="0.004309"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:43:32.088156" level="INFO">${ip_address} = 10.30.170.12</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:43:32.087700" elapsed="0.000482"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:43:32.088229" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:43:32.088381" level="INFO">${odl_ip} = 10.30.170.12</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:43:32.087346" elapsed="0.001060"/>
</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-08-22T23:43:32.088556" elapsed="0.000479"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:43:32.089311" level="INFO">index=67
host=10.30.170.12
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-08-22T23:43:32.089411" level="INFO">${karaf_connection_object} = index=67
host=10.30.170.12
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:43:32.089202" 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-08-22T23:43:32.089666" elapsed="0.002251"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:43:32.092379" level="INFO">Logging into '10.30.170.12:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:43:32.632417" 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-08-22T23:43:32.092077" elapsed="0.540532"/>
</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-08-22T23:43:32.647372" elapsed="0.000533"/>
</kw>
<msg time="2026-08-22T23:43:32.647996" 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-08-22T23:43:32.646127" elapsed="0.002051"/>
</kw>
<kw name="Open 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-08-22T23:43:32.648375" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:32.648541" 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-08-22T23:43:32.633855" elapsed="0.014788"/>
</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-08-22T23:43:32.633064" elapsed="0.015627"/>
</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-08-22T23:43:32.079877" elapsed="0.568865"/>
</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-08-22T23:43:32.649554" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:32.649433" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:32.649406" elapsed="0.000317"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:43:32.650101" level="INFO">${karaf_connection_index} = 67</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:43:32.649866" elapsed="0.000261"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:43:32.650451" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:43:32.650278" elapsed="0.000197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:43:32.736781" 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 "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:43:32.650982" elapsed="0.085952"/>
</kw>
<msg time="2026-08-22T23:43:32.737280" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:43:32.737329" 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 "n "e "t "c "o "n "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:43:32.650645" elapsed="0.086719"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:43:32.804933" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "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-08-22T23:43:32.738079" elapsed="0.066989"/>
</kw>
<msg time="2026-08-22T23:43:32.805216" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:43:32.805262" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:43:32.737628" elapsed="0.067714"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:32.805840" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:32.805477" elapsed="0.000427"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:32.805435" elapsed="0.000499"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:32.806410" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "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-08-22T23:43:32.806083" 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-08-22T23:43:32.806780" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:32.806548" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:32.806529" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:43:32.806899" 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-08-22T23:43:32.809576" elapsed="0.000465"/>
</kw>
<msg time="2026-08-22T23:43:32.810134" 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-08-22T23:43:32.808271" elapsed="0.002026"/>
</kw>
<kw name="Open 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-08-22T23:43:32.810458" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:32.810643" 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-08-22T23:43:32.807800" elapsed="0.002930"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:43:32.807222" elapsed="0.003556"/>
</kw>
<msg time="2026-08-22T23:43:32.810909" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</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-08-22T23:43:32.649086" elapsed="0.161863"/>
</kw>
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:43:32.810997" 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-08-22T23:43:32.067413" elapsed="0.743711"/>
</kw>
<msg time="2026-08-22T23:43:32.811224" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:43:32.811269" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:43:32.062832" elapsed="0.748482"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:32.811709" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:32.811413" elapsed="0.000354"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:32.811390" elapsed="0.000403"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:43:32.062692" elapsed="0.749131"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:43:32.817947" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:32.817837" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:32.817817" 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-08-22T23:43:32.819217" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:32.819063" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:32.819045" elapsed="0.000244"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:43:32.819754" level="INFO">${karaf_connection_index} = 36</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:43:32.819431" elapsed="0.000350"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:43:32.820151" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:43:32.819935" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:43:32.851832" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:43:32.820682" elapsed="0.031254"/>
</kw>
<msg time="2026-08-22T23:43:32.852148" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:43:32.852196" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:43:32.820332" elapsed="0.031898"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:43:32.875030" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "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-08-22T23:43:32.852782" elapsed="0.022370"/>
</kw>
<msg time="2026-08-22T23:43:32.875323" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:43:32.875369" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:43:32.852404" elapsed="0.022999"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:32.875791" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:32.875502" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:32.875473" elapsed="0.000403"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:32.876342" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "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-08-22T23:43:32.876021" 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-08-22T23:43:32.876711" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:32.876482" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:32.876463" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:43:32.876828" 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-08-22T23:43:32.879433" elapsed="0.000178"/>
</kw>
<msg time="2026-08-22T23:43:32.879674" 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-08-22T23:43:32.878392" elapsed="0.001419"/>
</kw>
<kw name="Open 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-08-22T23:43:32.880080" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:32.880410" 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-08-22T23:43:32.877751" elapsed="0.002870"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:43:32.877141" elapsed="0.003549"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:43:32.818761" elapsed="0.062026"/>
</kw>
<msg time="2026-08-22T23:43:32.880883" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:43:32.880927" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:43:32.818165" elapsed="0.062799"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:43:32.881149" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:43:32.881043" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:32.881024" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:32.881697" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:32.882099" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:43:32.882170" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:43:32.817448" elapsed="0.064834"/>
</kw>
<msg time="2026-08-22T23:43:32.882382" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:43:32.882427" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:43:32.812158" elapsed="0.070303"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:32.882897" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:32.882539" elapsed="0.000412"/>
</branch>
<status status="PASS" start="2026-08-22T23:43:32.882521" elapsed="0.000454"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:43:32.812003" elapsed="0.070996"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:43:31.983767" elapsed="0.899268"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:43:31.981355" elapsed="0.901746"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:43:31.976395" elapsed="0.906767"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:43:31.975968" elapsed="0.907244"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:43:31.972933" elapsed="0.910336"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:32.884833" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:32.884429" elapsed="0.000432"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:32.892385" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:32.892130" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:32.892848" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:32.892600" 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-08-22T23:43:32.916469" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:32.916694" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:43:32.916858" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:43:32.895061" elapsed="0.022249">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:32.892959" elapsed="0.024482">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:32.917697" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:32.917484" elapsed="0.000281"/>
</branch>
<status status="FAIL" start="2026-08-22T23:43:32.892941" elapsed="0.024848">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:32.918299" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:32.918446" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:32.918403" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:32.918383" elapsed="0.000131"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:32.918676" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:32.918748" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:43:32.887815" elapsed="0.031044">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:32.918929" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:43:32.885072" elapsed="0.033952">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:32.919249" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:32.919104" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:32.919087" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:32.919520" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:32.919379" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:32.919364" elapsed="0.000250"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:32.884062" elapsed="0.035631">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:33.922728" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:33.921608" elapsed="0.001195"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:33.936335" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:33.935940" elapsed="0.000475"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:33.936981" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:33.936651" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:43:33.948418" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:33.948686" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:43:33.948855" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:43:33.939454" elapsed="0.009823">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:33.937153" elapsed="0.012220">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:33.949643" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:33.949416" elapsed="0.000399"/>
</branch>
<status status="FAIL" start="2026-08-22T23:43:33.937119" elapsed="0.012737">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:33.950398" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:33.950556" elapsed="0.000045"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:33.950509" elapsed="0.000139"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:33.950489" elapsed="0.000203"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:33.951012" elapsed="0.000050"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:33.951146" elapsed="0.000028"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:43:33.928051" elapsed="0.023289">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:33.951447" elapsed="0.000025"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:43:33.923308" elapsed="0.028422">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:33.952393" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:33.951968" elapsed="0.000601"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:33.951926" elapsed="0.000759"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:33.953296" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:33.952854" elapsed="0.000618"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:33.952807" elapsed="0.000750"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:33.920493" elapsed="0.033369">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:34.957124" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:34.956124" elapsed="0.001072"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:34.969593" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:34.969286" elapsed="0.000364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:34.970062" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:34.969808" 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-08-22T23:43:34.981441" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:34.981681" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:43:34.981841" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:43:34.972568" elapsed="0.009793">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:34.970193" elapsed="0.012363">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:34.982889" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:34.982632" elapsed="0.000353"/>
</branch>
<status status="FAIL" start="2026-08-22T23:43:34.970167" elapsed="0.012853">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:34.983545" elapsed="0.000056"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:34.983762" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:34.983705" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:34.983680" elapsed="0.000176"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:34.984070" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:34.984224" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:43:34.964374" elapsed="0.020023">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:34.984498" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:43:34.957728" elapsed="0.026967">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:34.985170" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:34.984859" elapsed="0.000434"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:34.984822" elapsed="0.000528"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:34.985720" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:34.985454" elapsed="0.000358"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:34.985429" elapsed="0.000426"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:34.954969" elapsed="0.031016">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:35.989145" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:35.988118" elapsed="0.001099"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:36.005204" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:36.004938" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:36.005676" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:36.005410" 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-08-22T23:43:36.016723" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:36.016939" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:43:36.017182" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:43:36.008253" elapsed="0.009496">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:36.005802" elapsed="0.012068">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:36.018152" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:36.017920" elapsed="0.000373"/>
</branch>
<status status="FAIL" start="2026-08-22T23:43:36.005779" elapsed="0.012561">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:36.018943" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:36.019150" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:36.019089" elapsed="0.000125"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:36.019064" elapsed="0.000182"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:36.019485" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:36.019613" elapsed="0.000024"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:43:35.996784" elapsed="0.022988">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:36.019874" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:43:35.989877" elapsed="0.030134">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:36.020370" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:36.020126" elapsed="0.000330"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:36.020102" elapsed="0.000389"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:36.020801" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:36.020570" elapsed="0.000314"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:36.020547" elapsed="0.000371"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:35.986891" elapsed="0.034142">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:37.024085" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:37.023088" elapsed="0.001070"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:37.036260" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:37.035960" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:37.036730" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:37.036466" 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-08-22T23:43:37.047237" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:37.047414" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:43:37.047642" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:43:37.039135" elapsed="0.009016">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:37.036855" elapsed="0.011400">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:37.048481" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:37.048299" elapsed="0.000250"/>
</branch>
<status status="FAIL" start="2026-08-22T23:43:37.036831" elapsed="0.011743">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:37.049222" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:37.049437" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:37.049376" elapsed="0.000128"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:37.049347" elapsed="0.000189"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:37.049780" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:37.049886" elapsed="0.000024"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:43:37.030330" elapsed="0.019718">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:37.050152" elapsed="0.000024"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:43:37.024675" elapsed="0.025618">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:37.050673" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:37.050410" elapsed="0.000349"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:37.050385" elapsed="0.000412"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:37.051091" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:37.050878" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:37.050854" elapsed="0.000357"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:37.022086" elapsed="0.029242">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:38.054157" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:38.053193" elapsed="0.001046"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:38.066568" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:38.066180" elapsed="0.000483"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:38.067250" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:38.066889" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:43:38.078210" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:38.078368" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:43:38.078555" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:43:38.070748" elapsed="0.008350">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:38.067426" elapsed="0.011794">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:38.079505" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:38.079273" elapsed="0.000353"/>
</branch>
<status status="FAIL" start="2026-08-22T23:43:38.067396" elapsed="0.012267">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:38.080232" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:38.080434" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:38.080375" elapsed="0.000123"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:38.080350" elapsed="0.000180"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:38.080792" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:38.080899" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:43:38.059595" elapsed="0.021460">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:38.081157" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:43:38.054766" elapsed="0.026531">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:38.081646" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:38.081413" elapsed="0.000322"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:38.081389" elapsed="0.000382"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:38.082057" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:38.081850" elapsed="0.000289"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:38.081827" elapsed="0.000347"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:38.052164" elapsed="0.030126">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:39.085117" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:39.084162" elapsed="0.001027"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:39.100867" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:39.100470" elapsed="0.000468"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:39.101442" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:39.101135" 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-08-22T23:43:39.112720" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:39.112897" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:43:39.113121" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:43:39.104233" elapsed="0.009319">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:39.101606" elapsed="0.012062">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:39.113929" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:39.113720" elapsed="0.000277"/>
</branch>
<status status="FAIL" start="2026-08-22T23:43:39.101561" elapsed="0.012461">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:39.114596" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:39.114791" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:39.114735" elapsed="0.000110"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:39.114709" elapsed="0.000159"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:39.115020" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:39.115092" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:43:39.092032" elapsed="0.023175">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:39.115280" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:43:39.085821" elapsed="0.029558">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:39.115630" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:39.115462" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:39.115444" elapsed="0.000274"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:39.115916" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:39.115772" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:39.115756" elapsed="0.000240"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:39.083170" elapsed="0.032907">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:40.119103" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:40.118101" elapsed="0.001075"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:40.131005" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:40.130740" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:40.131461" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:40.131209" 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-08-22T23:43:40.142317" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:40.142482" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:43:40.142692" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:43:40.133673" elapsed="0.009406">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:40.131600" elapsed="0.011561">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:40.143352" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:40.143197" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:43:40.131562" elapsed="0.011882">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:40.143837" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:40.143977" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:40.143936" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:40.143919" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:40.144188" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:40.144260" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:43:40.125432" elapsed="0.018933">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:40.144434" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:43:40.119726" elapsed="0.024803">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:40.144768" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:40.144623" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:40.144606" elapsed="0.000244"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:40.145043" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:40.144904" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:40.144889" elapsed="0.000234"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:40.116962" elapsed="0.028238">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:41.148313" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:41.147329" elapsed="0.001059"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:41.159969" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:41.159707" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:41.160423" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:41.160173" 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-08-22T23:43:41.171869" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:41.172077" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:43:41.172318" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:43:41.163633" elapsed="0.009225">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:41.160545" elapsed="0.012429">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:41.173249" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:41.173024" elapsed="0.000318"/>
</branch>
<status status="FAIL" start="2026-08-22T23:43:41.160523" elapsed="0.012853">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:41.173932" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:41.174128" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:41.174073" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:41.174047" 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-08-22T23:43:41.174421" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:41.174519" elapsed="0.000035"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:43:41.154385" elapsed="0.020318">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:41.174800" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:43:41.148916" elapsed="0.026018">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:41.175244" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:41.175044" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:41.175021" elapsed="0.000333"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:41.175643" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:41.175428" elapsed="0.000293"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:41.175407" elapsed="0.000347"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:41.146106" elapsed="0.029755">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:42.178948" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:42.177886" elapsed="0.001142"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:42.191550" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:42.191286" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:42.192020" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:42.191771" 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-08-22T23:43:42.203142" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:42.203333" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:43:42.203518" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:43:42.194238" elapsed="0.009694">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:42.192145" elapsed="0.011872">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:42.204211" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:42.204053" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-08-22T23:43:42.192121" elapsed="0.012183">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:42.204702" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:42.204843" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:42.204802" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:42.204785" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:42.205056" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:42.205128" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:43:42.185361" elapsed="0.019872">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:42.205303" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:43:42.179745" elapsed="0.025652">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:42.205636" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:42.205476" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:42.205459" elapsed="0.000259"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:42.205914" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:42.205772" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:42.205756" elapsed="0.000237"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:42.176778" elapsed="0.029292">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:43.209112" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:43.208119" elapsed="0.001067"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:43.220988" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:43.220722" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:43.221440" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:43.221194" 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-08-22T23:43:43.232097" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:43.232278" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:43:43.232479" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:43:43.223649" elapsed="0.009431">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:43.221564" elapsed="0.011713">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:43.233775" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:43.233363" elapsed="0.000580"/>
</branch>
<status status="FAIL" start="2026-08-22T23:43:43.221539" elapsed="0.012464">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:43.234955" elapsed="0.000062"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:43.235285" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:43.235192" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:43.235150" 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-08-22T23:43:43.235835" elapsed="0.000056"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:43.236011" elapsed="0.000037"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:43:43.215327" elapsed="0.020937">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:43.236429" elapsed="0.000037"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:43:43.209751" elapsed="0.026933">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:43.237187" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:43.236871" elapsed="0.000440"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:43.236834" elapsed="0.000530"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:43.237828" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:43.237483" elapsed="0.000492"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:43.237449" elapsed="0.000579"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:43.206994" elapsed="0.031204">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:44.241227" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:44.240202" elapsed="0.001098"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:44.253329" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:44.252994" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:44.253819" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:44.253554" 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-08-22T23:43:44.262626" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:44.262835" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:43:44.263069" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:43:44.256031" elapsed="0.007444">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:44.253947" elapsed="0.009625">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:44.263871" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:44.263636" elapsed="0.000304"/>
</branch>
<status status="FAIL" start="2026-08-22T23:43:44.253923" elapsed="0.010042">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:44.264452" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:44.264616" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:44.264558" elapsed="0.000104"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:44.264539" elapsed="0.000145"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:44.264829" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:44.264899" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:43:44.247424" elapsed="0.017626">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:44.265153" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:43:44.241824" elapsed="0.023466">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:44.265639" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:44.265406" elapsed="0.000316"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:44.265382" elapsed="0.000376"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:44.266041" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:44.265835" elapsed="0.000288"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:44.265812" elapsed="0.000345"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:44.239197" elapsed="0.027073">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:45.268240" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:45.267768" elapsed="0.000514"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:45.275840" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:45.275557" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:45.276287" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:45.276040" 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-08-22T23:43:45.287242" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:45.287520" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:43:45.287883" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:43:45.278527" elapsed="0.009780">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:45.276408" elapsed="0.011981">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:45.288595" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:45.288425" elapsed="0.000238"/>
</branch>
<status status="FAIL" start="2026-08-22T23:43:45.276384" elapsed="0.012302">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:45.289080" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:45.289219" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:45.289178" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:45.289161" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:45.289429" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:45.289500" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:43:45.271037" elapsed="0.018582">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:45.289690" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:43:45.268513" elapsed="0.021272">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:45.290009" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:45.289863" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:45.289846" elapsed="0.000243"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:45.290283" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:45.290143" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:45.290127" elapsed="0.000235"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:45.267135" elapsed="0.023303">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:46.293370" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:46.292383" elapsed="0.001060"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:46.307519" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:46.307255" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:46.307990" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:46.307741" 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-08-22T23:43:46.320698" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:46.320857" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:43:46.321209" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:43:46.310184" elapsed="0.011860">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:46.308109" elapsed="0.014116">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:46.322690" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:46.322303" elapsed="0.000540"/>
</branch>
<status status="FAIL" start="2026-08-22T23:43:46.308087" elapsed="0.014813">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:46.323766" elapsed="0.000061"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:46.324076" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:46.323989" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:46.323950" 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-08-22T23:43:46.324643" elapsed="0.000055"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:46.324813" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:43:46.299534" elapsed="0.025511">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:46.325200" elapsed="0.000035"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:43:46.294024" elapsed="0.031387">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:46.325963" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:46.325636" elapsed="0.000455"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:46.325551" elapsed="0.000593"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:46.326573" elapsed="0.000081"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:46.326263" elapsed="0.000474"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:46.326229" elapsed="0.000560"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:46.291317" elapsed="0.035645">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:47.329883" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:47.328896" elapsed="0.001059"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:47.346792" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:47.346043" elapsed="0.000863"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:47.347920" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:47.347326" elapsed="0.000693"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:43:47.408155" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:47.408325" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:43:47.408521" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:43:47.399860" elapsed="0.009099">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:47.348177" elapsed="0.060902">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:47.409356" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:47.409129" elapsed="0.000320"/>
</branch>
<status status="FAIL" start="2026-08-22T23:43:47.348132" elapsed="0.061351">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:47.410062" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:47.410287" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:47.410230" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:47.410179" elapsed="0.000201"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:47.410601" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:47.410703" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:43:47.336044" elapsed="0.074808">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:47.410949" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:43:47.330501" elapsed="0.080584">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:47.411401" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:47.411197" elapsed="0.000284"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:47.411173" elapsed="0.000342"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:47.411809" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:47.411611" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:47.411569" elapsed="0.000352"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:47.327865" elapsed="0.084164">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:48.415742" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:48.414304" elapsed="0.001538"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:48.427255" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:48.426954" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:48.427766" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:48.427469" 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-08-22T23:43:48.439743" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:48.439919" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:43:48.440181" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:43:48.430494" elapsed="0.010247">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:48.427897" elapsed="0.012962">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:48.441134" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:48.440912" elapsed="0.000316"/>
</branch>
<status status="FAIL" start="2026-08-22T23:43:48.427870" elapsed="0.013392">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:48.441851" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:48.442049" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:48.441993" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:48.441968" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:48.442343" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:48.442442" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:43:48.420898" elapsed="0.021713">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:48.442713" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:43:48.416319" elapsed="0.026583">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:48.443247" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:48.443040" elapsed="0.000288"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:48.443012" elapsed="0.000349"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:48.443653" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:48.443435" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:48.443414" elapsed="0.000351"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:48.413059" elapsed="0.030816">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:49.447539" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:49.446330" elapsed="0.001337"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:49.460178" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:49.459800" elapsed="0.000447"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:49.460837" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:49.460462" 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-08-22T23:43:49.472421" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:49.472607" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:43:49.472800" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:43:49.464005" elapsed="0.009184">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:49.461008" elapsed="0.012266">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:49.473467" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:49.473312" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:43:49.460976" elapsed="0.012590">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:49.473964" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:49.474105" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:49.474064" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:49.474046" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:49.474318" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:49.474390" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:43:49.453256" elapsed="0.021242">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:49.474569" elapsed="0.000034"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:43:49.448186" elapsed="0.026500">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:49.474912" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:49.474767" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:49.474750" elapsed="0.000243"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:49.475184" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:49.475046" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:49.475031" elapsed="0.000233"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:49.444937" elapsed="0.030404">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:50.478977" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:50.477900" elapsed="0.001166"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:50.490369" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:50.490028" elapsed="0.000404"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:50.490874" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:50.490617" 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-08-22T23:43:50.504348" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:50.504551" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:43:50.504822" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:43:50.493671" elapsed="0.011633">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:50.491009" elapsed="0.014390">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:50.505648" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:50.505441" elapsed="0.000276"/>
</branch>
<status status="FAIL" start="2026-08-22T23:43:50.490980" elapsed="0.014762">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:50.506192" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:50.506371" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:50.506315" elapsed="0.000109"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:50.506288" 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-08-22T23:43:50.506612" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:50.506687" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:43:50.485262" elapsed="0.021537">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:50.506872" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:43:50.479645" elapsed="0.027327">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:50.507214" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:50.507055" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:50.507038" elapsed="0.000261"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:50.507522" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:50.507360" elapsed="0.000238"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:50.507339" elapsed="0.000284"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:50.476738" elapsed="0.030968">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:51.510818" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:51.509760" elapsed="0.001134"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:51.523408" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:51.523054" elapsed="0.000422"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:51.524035" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:51.523706" 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-08-22T23:43:51.536912" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:51.537132" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:43:51.537389" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:43:51.527159" elapsed="0.010751">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:51.524202" elapsed="0.013814">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:51.538261" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:51.538060" elapsed="0.000284"/>
</branch>
<status status="FAIL" start="2026-08-22T23:43:51.524168" elapsed="0.014207">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:51.538933" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:51.539128" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:51.539070" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:51.539044" 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-08-22T23:43:51.539409" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:51.539499" elapsed="0.000019"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:43:51.516791" elapsed="0.022873">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:51.539754" elapsed="0.000019"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:43:51.511398" elapsed="0.028479">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:51.540174" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:51.539979" elapsed="0.000265"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:51.539956" elapsed="0.000319"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:51.540594" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:51.540344" elapsed="0.000325"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:51.540323" elapsed="0.000377"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:51.508660" elapsed="0.032146">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:52.543067" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:52.542453" elapsed="0.000664"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:52.553664" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:52.553325" elapsed="0.000399"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:52.554225" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:52.553918" 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-08-22T23:43:52.565247" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:52.565657" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:43:52.566067" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:43:52.556468" elapsed="0.010446">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:52.554377" elapsed="0.012733">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:52.567651" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:52.567194" elapsed="0.000611"/>
</branch>
<status status="FAIL" start="2026-08-22T23:43:52.554347" elapsed="0.013511">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:52.568787" elapsed="0.000061"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:52.569117" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:52.569013" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:52.568971" elapsed="0.000294"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:52.569609" elapsed="0.000050"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:52.569768" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:43:52.546851" elapsed="0.023155">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:52.570159" elapsed="0.000034"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:43:52.543389" elapsed="0.026977">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:52.570891" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:52.570538" elapsed="0.000477"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:52.570502" elapsed="0.000565"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:52.571491" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:52.571184" elapsed="0.000456"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:52.571150" elapsed="0.000545"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:52.541656" elapsed="0.030212">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:53.575246" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:53.574168" elapsed="0.001171"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:53.587322" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:53.586999" elapsed="0.000384"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:53.587828" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:53.587553" 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-08-22T23:43:53.599040" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:53.599262" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:43:53.599495" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:43:53.590134" elapsed="0.009854">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:53.587956" elapsed="0.012141">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:53.600376" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:53.600150" elapsed="0.000324"/>
</branch>
<status status="FAIL" start="2026-08-22T23:43:53.587931" elapsed="0.012580">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:53.601075" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:53.601231" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:53.601190" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:53.601171" elapsed="0.000128"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:53.601451" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:53.601547" elapsed="0.000018"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:43:53.581934" elapsed="0.019797">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:53.601813" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:43:53.575887" elapsed="0.026024">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:53.602350" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:53.602015" elapsed="0.000500"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:53.601991" elapsed="0.000647"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:53.603166" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:53.602830" elapsed="0.000436"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:53.602777" elapsed="0.000522"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:53.572930" elapsed="0.030483">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:54.606390" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:54.605364" elapsed="0.001100"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:54.618774" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:54.618494" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:54.619230" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:54.618977" 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-08-22T23:43:54.629518" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:54.629698" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:43:54.629884" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:43:54.621423" elapsed="0.008863">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:54.619351" elapsed="0.011019">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:54.630563" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:54.630406" elapsed="0.000244"/>
</branch>
<status status="FAIL" start="2026-08-22T23:43:54.619328" elapsed="0.011347">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:54.631050" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:54.631193" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:54.631153" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:54.631136" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:54.631404" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:54.631477" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:43:54.612524" elapsed="0.019073">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:54.631670" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:43:54.606996" elapsed="0.024769">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:54.631990" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:54.631844" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:54.631827" elapsed="0.000246"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:54.632271" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:54.632131" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:54.632114" elapsed="0.000237"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:54.604300" elapsed="0.028129">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:55.635396" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:55.634367" elapsed="0.001102"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:55.647901" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:55.647638" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:55.648362" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:55.648114" 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-08-22T23:43:55.661809" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:55.662180" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:43:55.662562" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:43:55.650615" elapsed="0.012891">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:55.648487" elapsed="0.015240">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:55.664154" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:55.663806" elapsed="0.000500"/>
</branch>
<status status="FAIL" start="2026-08-22T23:43:55.648463" elapsed="0.015898">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:55.665225" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:55.665559" elapsed="0.000059"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:55.665445" elapsed="0.000243"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:55.665407" 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-08-22T23:43:55.666060" elapsed="0.000050"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:55.666220" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:43:55.641726" elapsed="0.024727">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:55.666669" elapsed="0.000037"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:43:55.635989" elapsed="0.030942">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:55.667503" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:55.667142" elapsed="0.000519"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:55.667100" elapsed="0.000618"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:55.668159" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:55.667841" elapsed="0.000447"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:55.667806" elapsed="0.000535"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:55.633307" elapsed="0.035210">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:56.671549" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:56.670501" elapsed="0.001152"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:56.684015" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:56.683750" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:56.684468" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:56.684222" 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-08-22T23:43:56.694815" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:56.694976" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:43:56.695162" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:43:56.686677" elapsed="0.008885">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:56.684605" elapsed="0.011055">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:56.695853" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:56.695696" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:43:56.684567" elapsed="0.011376">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:56.696321" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:56.696460" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:56.696421" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:56.696403" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:56.696685" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:56.696757" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:43:56.677821" elapsed="0.019042">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:56.696932" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:43:56.672143" elapsed="0.024883">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:56.697253" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:56.697105" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:56.697088" elapsed="0.000245"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:56.697523" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:56.697385" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:56.697370" elapsed="0.000247"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:56.669488" elapsed="0.028206">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:57.700617" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:57.699563" elapsed="0.001166"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:57.714682" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:57.714403" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:57.715135" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:57.714887" 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-08-22T23:43:57.724394" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:57.724638" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:43:57.724874" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:43:57.717359" elapsed="0.008033">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:57.715262" elapsed="0.010243">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:57.725792" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:57.725552" elapsed="0.000333"/>
</branch>
<status status="FAIL" start="2026-08-22T23:43:57.715239" elapsed="0.010679">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:57.726433" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:57.726646" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:57.726569" elapsed="0.000140"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:57.726545" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:57.726938" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:57.727038" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:43:57.706749" elapsed="0.020433">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:57.727278" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:43:57.701226" elapsed="0.026182">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:57.727736" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:57.727517" elapsed="0.000322"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:57.727495" elapsed="0.000377"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:57.728141" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:57.727946" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:57.727925" elapsed="0.000324"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:57.698542" elapsed="0.029812">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:58.731103" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:58.730133" elapsed="0.001042"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:58.745922" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:58.745660" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:58.746380" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:58.746124" 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-08-22T23:43:58.757120" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:58.757443" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:43:58.757826" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:43:58.748601" elapsed="0.010083">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:58.746499" elapsed="0.012382">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:58.759396" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:58.758963" elapsed="0.000596"/>
</branch>
<status status="FAIL" start="2026-08-22T23:43:58.746478" elapsed="0.013179">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:58.760550" elapsed="0.000091"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:58.760908" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:58.760817" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:58.760774" 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-08-22T23:43:58.761509" elapsed="0.000097"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:58.761758" elapsed="0.000045"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:43:58.737251" elapsed="0.024803">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:58.762257" elapsed="0.000041"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:43:58.731731" elapsed="0.030762">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:58.763135" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:58.762753" elapsed="0.000524"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:58.762708" elapsed="0.000629"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:58.763859" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:58.763469" elapsed="0.000532"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:58.763430" elapsed="0.000631"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:58.729146" elapsed="0.035104">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:43:59.767389" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:43:59.766380" elapsed="0.001082"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:59.780531" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:59.780170" elapsed="0.000478"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:43:59.781221" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:43:59.780869" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:43:59.792198" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:43:59.792554" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:43:59.792968" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:43:59.783439" elapsed="0.010401">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:43:59.781343" elapsed="0.012691">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:59.794485" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:59.794114" elapsed="0.000566"/>
</branch>
<status status="FAIL" start="2026-08-22T23:43:59.781321" elapsed="0.013419">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:59.795643" elapsed="0.000062"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:59.795968" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:43:59.795877" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:59.795836" 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-08-22T23:43:59.796516" elapsed="0.000096"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:43:59.796735" elapsed="0.000036"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:43:59.771875" elapsed="0.025107">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:43:59.797146" elapsed="0.000031"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:43:59.767988" elapsed="0.029301">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:59.797615" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:59.797397" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:59.797375" elapsed="0.000354"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:43:59.797995" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:43:59.797802" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:43:59.797781" elapsed="0.000323"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:43:59.765283" elapsed="0.032932">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:00.801529" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:00.800407" elapsed="0.001228"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:00.815595" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:00.815316" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:00.816048" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:00.815800" 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-08-22T23:44:00.825721" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:00.825887" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:00.826063" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:00.818487" elapsed="0.008001">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:00.816175" elapsed="0.010396">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:00.826780" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:00.826624" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:00.816150" elapsed="0.010720">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:00.827244" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:00.827382" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:00.827341" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:00.827324" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:00.827605" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:00.827677" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:00.807905" elapsed="0.019876">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:00.827849" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:00.802141" elapsed="0.025800">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:00.828172" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:00.828017" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:00.828001" elapsed="0.000250"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:00.828440" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:00.828303" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:00.828288" elapsed="0.000230"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:00.799142" elapsed="0.029475">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:01.831474" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:01.830492" elapsed="0.001055"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:01.843327" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:01.842934" elapsed="0.000473"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:01.843992" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:01.843643" 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-08-22T23:44:01.855088" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:01.855254" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:01.855429" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:01.847362" elapsed="0.008478">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:01.844163" elapsed="0.011762">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:01.856119" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:01.855962" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:01.844133" elapsed="0.012077">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:01.856601" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:01.856741" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:01.856701" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:01.856683" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:01.856952" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:01.857023" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:01.836837" elapsed="0.020300">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:01.857209" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:01.832079" elapsed="0.025231">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:01.857534" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:01.857389" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:01.857372" elapsed="0.000260"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:01.857828" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:01.857687" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:01.857671" elapsed="0.000265"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:01.829405" elapsed="0.028612">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:02.860962" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:02.859977" elapsed="0.001058"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:02.873498" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:02.873237" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:02.873988" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:02.873737" 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-08-22T23:44:02.884872" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:02.885034" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:02.885212" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:02.876378" elapsed="0.009283">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:02.874112" elapsed="0.011634">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:02.885944" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:02.885783" elapsed="0.000228"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:02.874090" elapsed="0.011945">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:02.886421" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:02.886600" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:02.886534" elapsed="0.000115"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:02.886512" elapsed="0.000159"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:02.886817" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:02.886887" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:02.867200" elapsed="0.019792">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:02.887060" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:02.861530" elapsed="0.025623">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:02.887376" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:02.887230" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:02.887214" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:02.887659" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:02.887507" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:02.887492" elapsed="0.000246"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:02.858917" elapsed="0.028898">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:03.890729" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:03.889753" elapsed="0.001049"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:03.902346" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:03.902085" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:03.902954" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:03.902548" elapsed="0.000455"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:44:03.913558" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:03.913747" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:03.913932" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:03.905346" elapsed="0.008977">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:03.903081" elapsed="0.011326">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:03.914621" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:03.914443" elapsed="0.000260"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:03.903059" elapsed="0.011670">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:03.915104" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:03.915244" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:03.915203" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:03.915186" elapsed="0.000131"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:03.915461" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:03.915561" elapsed="0.000040"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:03.896905" elapsed="0.018791">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:03.915764" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:03.891319" elapsed="0.024538">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:03.916079" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:03.915934" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:03.915918" elapsed="0.000239"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:03.916348" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:03.916209" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:03.916194" elapsed="0.000230"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:03.888711" elapsed="0.027789">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:04.919549" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:04.918512" elapsed="0.001145"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:04.930919" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:04.930658" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:04.931366" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:04.931118" 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-08-22T23:44:04.941495" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:04.941681" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:04.941859" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:04.933789" elapsed="0.008462">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:04.931491" elapsed="0.010842">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:04.942525" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:04.942369" elapsed="0.000239"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:04.931467" elapsed="0.011166">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:04.943012" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:04.943150" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:04.943110" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:04.943093" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:04.943365" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:04.943436" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:04.926203" elapsed="0.017338">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:04.943628" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:04.920186" elapsed="0.023536">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:04.943946" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:04.943801" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:04.943785" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:04.944217" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:04.944079" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:04.944063" elapsed="0.000234"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:04.917385" elapsed="0.026988">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:05.947653" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:05.946652" elapsed="0.001078"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:05.958233" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:05.957970" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:05.958702" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:05.958438" 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-08-22T23:44:05.968659" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:05.968826" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:05.969015" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:05.961124" elapsed="0.008283">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:05.958830" elapsed="0.010659">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:05.969698" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:05.969525" elapsed="0.000240"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:05.958805" elapsed="0.010985">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:05.970168" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:05.970306" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:05.970266" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:05.970248" elapsed="0.000129"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:05.970522" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:05.970611" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:05.953617" elapsed="0.017101">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:05.970788" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:05.948224" elapsed="0.022659">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:05.971107" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:05.970963" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:05.970946" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:05.971386" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:05.971241" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:05.971225" elapsed="0.000240"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:05.945507" elapsed="0.026036">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:06.974454" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:06.973433" elapsed="0.001095"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:06.986468" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:06.986195" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:06.986946" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:06.986691" 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-08-22T23:44:06.997055" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:06.997214" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:06.997397" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:06.989356" elapsed="0.008523">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:06.987072" elapsed="0.010899">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:06.998168" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:06.998009" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:06.987049" elapsed="0.011209">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:06.998666" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:06.998806" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:06.998765" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:06.998747" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:06.999016" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:06.999095" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:06.980885" elapsed="0.018317">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:06.999271" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:06.975067" elapsed="0.024301">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:06.999608" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:06.999449" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:06.999433" elapsed="0.000256"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:06.999882" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:06.999742" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:06.999727" elapsed="0.000232"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:06.972368" elapsed="0.027668">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:08.002790" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:08.001833" elapsed="0.001030"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:08.015669" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:08.015166" elapsed="0.000576"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:08.016307" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:08.015959" 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-08-22T23:44:08.027081" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:08.027248" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:08.027457" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:08.018740" elapsed="0.009265">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:08.016457" elapsed="0.011665">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:08.028398" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:08.028172" elapsed="0.000317"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:08.016433" elapsed="0.012090">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:08.029089" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:08.029283" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:08.029227" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:08.029202" 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-08-22T23:44:08.029593" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:08.029695" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:08.008953" elapsed="0.020890">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:08.029941" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:08.003384" elapsed="0.026689">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:08.030383" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:08.030184" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:08.030161" elapsed="0.000333"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:08.030783" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:08.030567" elapsed="0.000293"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:08.030545" elapsed="0.000348"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:08.000832" elapsed="0.030167">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:09.034009" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:09.032992" elapsed="0.001092"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:09.046082" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:09.045821" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:09.046530" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:09.046283" 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-08-22T23:44:09.057597" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:09.057775" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:09.057963" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:09.048934" elapsed="0.009418">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:09.046672" elapsed="0.011768">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:09.058651" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:09.058475" elapsed="0.000243"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:09.046648" elapsed="0.012095">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:09.059124" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:09.059263" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:09.059223" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:09.059206" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:09.059471" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:09.059542" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:09.040315" elapsed="0.019347">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:09.059733" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:09.034572" elapsed="0.025255">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:09.060048" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:09.059906" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:09.059890" elapsed="0.000238"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:09.060318" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:09.060181" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:09.060166" elapsed="0.000229"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:09.031918" elapsed="0.028553">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:10.063447" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:10.062458" elapsed="0.001062"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:10.075051" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:10.074674" elapsed="0.000446"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:10.075712" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:10.075333" elapsed="0.000444"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:44:10.087780" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:10.087959" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:10.088157" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:10.079104" elapsed="0.009541">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:10.075887" elapsed="0.012850">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:10.088934" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:10.088775" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:10.075854" elapsed="0.013170">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:10.089409" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:10.089547" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:10.089506" elapsed="0.000111"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:10.089489" elapsed="0.000152"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:10.089788" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:10.089861" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:10.068322" elapsed="0.021665">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:10.090057" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:10.064043" elapsed="0.026107">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:10.090373" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:10.090227" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:10.090210" elapsed="0.000249"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:10.090712" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:10.090524" elapsed="0.000247"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:10.090505" elapsed="0.000290"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:10.061326" elapsed="0.029545">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:11.094122" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:11.093010" elapsed="0.001195"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:11.105316" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:11.105045" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:11.105793" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:11.105522" 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-08-22T23:44:11.116323" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:11.116495" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:11.116711" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:11.108250" elapsed="0.008868">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:11.105917" elapsed="0.011291">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:11.117411" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:11.117246" elapsed="0.000237"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:11.105894" elapsed="0.011614">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:11.117926" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:11.118078" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:11.118031" elapsed="0.000095"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:11.118012" elapsed="0.000137"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:11.118300" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:11.118377" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:11.100679" elapsed="0.017817">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:11.118571" elapsed="0.000032"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:11.094807" elapsed="0.023883">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:11.118926" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:11.118775" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:11.118758" elapsed="0.000254"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:11.119212" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:11.119067" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:11.119051" elapsed="0.000245"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:11.091807" elapsed="0.027572">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:12.121673" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:12.121003" elapsed="0.000721"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:12.134530" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:12.134255" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:12.135004" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:12.134754" 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-08-22T23:44:12.145550" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:12.145794" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:12.146050" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:12.137236" elapsed="0.009362">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:12.135129" elapsed="0.011590">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:12.146993" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:12.146770" elapsed="0.000317"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:12.135105" elapsed="0.012017">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:12.147692" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:12.147892" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:12.147836" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:12.147810" 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-08-22T23:44:12.148214" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:12.148318" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:12.125673" elapsed="0.022795">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:12.148604" elapsed="0.000025"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:12.122053" elapsed="0.026690">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:12.149054" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:12.148852" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:12.148829" elapsed="0.000336"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:12.149435" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:12.149240" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:12.149218" elapsed="0.000326"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:12.120076" elapsed="0.029596">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:13.152530" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:13.151558" elapsed="0.001302"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:13.165221" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:13.164908" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:13.165710" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:13.165438" 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-08-22T23:44:13.175562" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:13.175748" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:13.175930" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:13.168131" elapsed="0.008195">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:13.165840" elapsed="0.010570">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:13.176644" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:13.176447" elapsed="0.000275"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:13.165813" elapsed="0.010935">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:13.177151" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:13.177295" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:13.177252" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:13.177235" elapsed="0.000129"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:13.177519" elapsed="0.000036"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:13.177649" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:13.158990" elapsed="0.018809">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:13.177899" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:13.153367" elapsed="0.024663">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:13.178345" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:13.178140" elapsed="0.000286"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:13.178118" elapsed="0.000342"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:13.178761" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:13.178541" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:13.178518" elapsed="0.000358"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:13.150485" elapsed="0.028501">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:14.181967" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:14.180935" elapsed="0.001106"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:14.196396" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:14.196132" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:14.196870" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:14.196620" 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-08-22T23:44:14.207502" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:14.207746" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:14.207981" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:14.199298" elapsed="0.009209">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:14.196995" elapsed="0.011656">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:14.208923" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:14.208701" elapsed="0.000317"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:14.196972" elapsed="0.012080">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:14.209611" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:14.209821" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:14.209759" elapsed="0.000124"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:14.209735" elapsed="0.000180"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:14.210119" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:14.210221" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:14.188195" elapsed="0.022178">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:14.210472" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:14.182543" elapsed="0.028089">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:14.210953" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:14.210745" elapsed="0.000290"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:14.210722" elapsed="0.000352"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:14.211354" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:14.211158" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:14.211132" elapsed="0.000339"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:14.179914" elapsed="0.031685">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:15.215043" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:15.213896" elapsed="0.001226"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:15.227550" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:15.227259" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:15.228042" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:15.227789" 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-08-22T23:44:15.238616" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:15.238824" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:15.239024" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:15.230507" elapsed="0.008997">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:15.228172" elapsed="0.011453">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:15.239839" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:15.239671" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:15.228147" elapsed="0.011785">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:15.240320" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:15.240481" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:15.240439" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:15.240420" elapsed="0.000128"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:15.240712" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:15.240785" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:15.221523" elapsed="0.019367">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:15.240961" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:15.215733" elapsed="0.025324">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:15.241285" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:15.241137" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:15.241120" elapsed="0.000246"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:15.241593" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:15.241421" elapsed="0.000233"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:15.241405" elapsed="0.000273"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:15.212538" elapsed="0.029220">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:16.244776" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:16.243775" elapsed="0.001074"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:16.256612" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:16.256314" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:16.257078" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:16.256829" 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-08-22T23:44:16.267331" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:16.267498" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:16.267728" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:16.259504" elapsed="0.008618">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:16.257207" elapsed="0.011014">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:16.268458" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:16.268282" elapsed="0.000245"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:16.257182" elapsed="0.011369">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:16.269001" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:16.269147" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:16.269104" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:16.269086" elapsed="0.000128"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:16.269358" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:16.269429" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:16.250932" elapsed="0.018618">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:16.269643" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:16.245334" elapsed="0.024406">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:16.269966" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:16.269820" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:16.269804" elapsed="0.000243"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:16.270256" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:16.270113" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:16.270085" elapsed="0.000252"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:16.242572" elapsed="0.027843">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:17.273344" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:17.272360" elapsed="0.001057"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:17.286136" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:17.285749" elapsed="0.000457"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:17.286785" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:17.286419" 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-08-22T23:44:17.297848" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:17.298007" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:17.298468" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:17.290153" elapsed="0.008776">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:17.286957" elapsed="0.012066">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:17.299242" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:17.299063" elapsed="0.000246"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:17.286925" elapsed="0.012408">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:17.299729" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:17.299868" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:17.299828" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:17.299811" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:17.300075" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:17.300146" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:17.279380" elapsed="0.020870">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:17.300319" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:17.273943" elapsed="0.026469">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:17.300649" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:17.300490" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:17.300473" elapsed="0.000258"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:17.300923" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:17.300784" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:17.300769" elapsed="0.000233"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:17.271296" elapsed="0.029782">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:18.304814" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:18.304191" elapsed="0.000661"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:18.318105" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:18.317727" elapsed="0.000448"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:18.318762" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:18.318391" 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-08-22T23:44:18.331162" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:18.331384" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:18.331631" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:18.322023" elapsed="0.010150">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:18.319003" elapsed="0.013288">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:18.332568" elapsed="0.000107"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:18.332342" elapsed="0.000535"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:18.318964" elapsed="0.014026">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:18.334196" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:18.334630" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:18.334459" elapsed="0.000259"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:18.334430" 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-08-22T23:44:18.334956" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:18.335055" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:18.308434" elapsed="0.026770">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:18.335300" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:18.305129" elapsed="0.030302">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:18.335978" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:18.335537" elapsed="0.000548"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:18.335515" elapsed="0.000605"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:18.336744" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:18.336401" elapsed="0.000522"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:18.336175" elapsed="0.000796"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:18.302044" elapsed="0.035052">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:19.340307" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:19.339238" elapsed="0.001157"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:19.351770" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:19.351437" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:19.352261" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:19.351995" 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-08-22T23:44:19.362966" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:19.363148" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:19.363375" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:19.354760" elapsed="0.009060">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:19.352392" elapsed="0.011525">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:19.364159" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:19.363958" elapsed="0.000271"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:19.352366" elapsed="0.011888">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:19.364710" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:19.364859" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:19.364816" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:19.364796" elapsed="0.000132"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:19.365073" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:19.365144" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:19.346733" elapsed="0.018522">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:19.365325" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:19.340925" elapsed="0.024496">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:19.365664" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:19.365501" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:19.365484" elapsed="0.000264"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:19.365942" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:19.365802" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:19.365786" elapsed="0.000236"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:19.338145" elapsed="0.027955">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:20.369041" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:20.368036" elapsed="0.001076"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:20.381201" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:20.380941" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:20.381662" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:20.381401" 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-08-22T23:44:20.391350" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:20.391504" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:20.391702" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:20.384040" elapsed="0.008046">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:20.381792" elapsed="0.010376">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:20.392358" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:20.392203" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:20.381769" elapsed="0.010678">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:20.392851" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:20.392990" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:20.392950" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:20.392932" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:20.393198" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:20.393268" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:20.375188" elapsed="0.018183">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:20.393441" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:20.369632" elapsed="0.023903">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:20.393778" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:20.393629" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:20.393612" elapsed="0.000246"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:20.394048" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:20.393911" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:20.393896" elapsed="0.000231"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:20.367003" elapsed="0.027199">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:21.397068" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:21.396089" elapsed="0.001050"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:21.408433" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:21.408074" elapsed="0.000428"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:21.409081" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:21.408737" 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-08-22T23:44:21.419250" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:21.419407" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:21.419603" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:21.412219" elapsed="0.007774">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:21.409249" elapsed="0.010826">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:21.420267" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:21.420111" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:21.409220" elapsed="0.011139">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:21.420759" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:21.420898" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:21.420859" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:21.420841" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:21.421107" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:21.421178" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:21.401923" elapsed="0.019360">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:21.421353" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:21.397661" elapsed="0.023787">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:21.421685" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:21.421527" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:21.421511" elapsed="0.000261"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:21.421964" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:21.421826" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:21.421811" elapsed="0.000234"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:21.395036" elapsed="0.027086">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:22.425175" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:22.424175" elapsed="0.001076"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:22.437931" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:22.437651" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:22.438372" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:22.438129" 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-08-22T23:44:22.448778" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:22.448942" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:22.449125" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:22.440845" elapsed="0.008665">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:22.438506" elapsed="0.011103">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:22.449826" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:22.449647" elapsed="0.000246"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:22.438481" elapsed="0.011436">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:22.450292" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:22.450429" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:22.450390" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:22.450373" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:22.450654" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:22.450725" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:22.431533" elapsed="0.019297">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:22.450899" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:22.425815" elapsed="0.025178">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:22.451215" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:22.451071" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:22.451054" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:22.451485" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:22.451347" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:22.451332" elapsed="0.000231"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:22.423093" elapsed="0.028564">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:23.454818" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:23.453768" elapsed="0.001127"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:23.465827" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:23.465551" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:23.466271" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:23.466027" 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-08-22T23:44:23.475786" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:23.475950" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:23.476134" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:23.468681" elapsed="0.007862">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:23.466398" elapsed="0.010248">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:23.476850" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:23.476691" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:23.466373" elapsed="0.010567">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:23.477312" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:23.477452" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:23.477411" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:23.477394" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:23.477676" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:23.477747" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:23.461110" elapsed="0.016748">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:23.477928" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:23.455420" elapsed="0.022601">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:23.478241" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:23.478100" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:23.478084" elapsed="0.000237"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:23.478510" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:23.478374" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:23.478359" elapsed="0.000245"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:23.452638" elapsed="0.026045">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:24.481893" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:24.480898" elapsed="0.001070"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:24.495321" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:24.495001" elapsed="0.000412"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:24.495889" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:24.495631" 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-08-22T23:44:24.507494" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:24.507815" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:24.508180" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:24.498120" elapsed="0.010874">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:24.496024" elapsed="0.013149">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:24.509627" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:24.509250" elapsed="0.000527"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:24.495993" elapsed="0.013838">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:24.510692" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:24.511001" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:24.510915" elapsed="0.000182"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:24.510877" 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-08-22T23:44:24.511515" elapsed="0.000051"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:24.511711" elapsed="0.000036"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:24.487912" elapsed="0.024033">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:24.512098" elapsed="0.000035"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:24.482462" elapsed="0.029843">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:24.512832" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:24.512479" elapsed="0.000479"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:24.512443" elapsed="0.000568"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:24.513437" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:24.513130" elapsed="0.000430"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:24.513095" elapsed="0.000548"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:24.479832" elapsed="0.033987">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:25.517053" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:25.515983" elapsed="0.001151"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:25.527993" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:25.527701" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:25.528440" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:25.528194" 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-08-22T23:44:25.538827" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:25.539151" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:25.539499" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:25.530943" elapsed="0.009369">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:25.528567" elapsed="0.011929">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:25.540953" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:25.540572" elapsed="0.000527"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:25.528542" elapsed="0.012609">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:25.542022" elapsed="0.000058"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:25.542343" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:25.542238" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:25.542200" elapsed="0.000286"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:25.542824" elapsed="0.000054"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:25.542999" elapsed="0.000035"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:25.523267" elapsed="0.019980">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:25.543411" elapsed="0.000037"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:25.517696" elapsed="0.025972">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:25.544198" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:25.543857" elapsed="0.000472"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:25.543818" elapsed="0.000568"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:25.544910" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:25.544511" elapsed="0.000542"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:25.544475" elapsed="0.000634"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:25.514863" elapsed="0.030432">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:26.548355" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:26.547345" elapsed="0.001085"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:26.559271" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:26.558912" elapsed="0.000426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:26.559915" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:26.559551" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:44:26.571044" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:26.571259" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:26.571492" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:26.563784" elapsed="0.008260">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:26.560089" elapsed="0.012070">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:26.572427" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:26.572210" elapsed="0.000308"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:26.560056" elapsed="0.012496">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:26.573092" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:26.573303" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:26.573230" elapsed="0.000137"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:26.573206" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:26.573617" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:26.573717" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:26.552861" elapsed="0.021002">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:26.573957" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:26.548964" elapsed="0.025124">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:26.574396" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:26.574196" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:26.574174" elapsed="0.000333"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:26.574798" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:26.574601" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:26.574559" elapsed="0.000354"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:26.546258" elapsed="0.028761">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:27.578124" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:27.577104" elapsed="0.001096"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:27.591541" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:27.591278" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:27.592005" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:27.591758" 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-08-22T23:44:27.602387" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:27.602594" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:27.602805" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:27.594449" elapsed="0.008792">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:27.592136" elapsed="0.011195">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:27.603528" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:27.603371" elapsed="0.000238"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:27.592108" elapsed="0.011527">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:27.604023" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:27.604163" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:27.604122" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:27.604105" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:27.604392" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:27.604462" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:27.584419" elapsed="0.020152">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:27.604656" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:27.578729" elapsed="0.026022">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:27.604974" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:27.604829" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:27.604813" elapsed="0.000245"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:27.605249" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:27.605110" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:27.605095" elapsed="0.000231"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:27.575977" elapsed="0.029428">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:28.608715" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:28.607548" elapsed="0.001244"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:28.620390" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:28.620126" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:28.620872" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:28.620619" 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-08-22T23:44:28.631117" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:28.631288" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:28.631498" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:28.623414" elapsed="0.008526">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:28.621029" elapsed="0.010998">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:28.632220" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:28.632063" elapsed="0.000239"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:28.621003" elapsed="0.011325">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:28.632731" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:28.632869" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:28.632829" elapsed="0.000097"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:28.632812" elapsed="0.000137"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:28.633095" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:28.633166" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:28.615210" elapsed="0.018061">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:28.633340" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:28.609357" elapsed="0.024075">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:28.633674" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:28.633510" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:28.633494" elapsed="0.000269"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:28.633972" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:28.633817" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:28.633802" elapsed="0.000252"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:28.606350" elapsed="0.027780">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:29.636712" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:29.635774" elapsed="0.001005"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:29.647839" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:29.647464" elapsed="0.000442"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:29.648457" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:29.648117" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:44:29.659160" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:29.659450" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:29.659804" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:29.651517" elapsed="0.009040">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:29.648640" elapsed="0.012129">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:29.661185" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:29.660845" elapsed="0.000487"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:29.648613" elapsed="0.012772">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:29.662235" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:29.662539" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:29.662455" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:29.662416" 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-08-22T23:44:29.663067" elapsed="0.000049"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:29.663225" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:29.641418" elapsed="0.022037">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:29.663643" elapsed="0.000036"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:29.637256" elapsed="0.026601">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:29.664358" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:29.664036" elapsed="0.000448"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:29.663999" elapsed="0.000539"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:29.665007" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:29.664692" elapsed="0.000440"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:29.664655" elapsed="0.000530"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:29.634865" elapsed="0.030491">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:30.668440" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:30.667381" elapsed="0.001137"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:30.681508" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:30.681101" elapsed="0.000482"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:30.682196" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:30.681848" 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-08-22T23:44:30.692199" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:30.692360" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:30.692533" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:30.684860" elapsed="0.008075">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:30.682367" elapsed="0.010689">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:30.693321" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:30.693106" elapsed="0.000308"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:30.682336" elapsed="0.011112">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:30.693999" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:30.694191" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:30.694136" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:30.694112" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:30.694483" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:30.694586" elapsed="0.000038"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:30.675054" elapsed="0.019698">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:30.694849" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:30.669090" elapsed="0.025890">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:30.695321" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:30.695119" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:30.695095" elapsed="0.000338"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:30.695725" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:30.695508" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:30.695486" elapsed="0.000351"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:30.666284" elapsed="0.029662">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:31.699332" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:31.698330" elapsed="0.001078"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:31.709917" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:31.709654" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:31.710364" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:31.710120" 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-08-22T23:44:31.720408" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:31.720573" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:31.720775" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:31.712809" elapsed="0.008397">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:31.710491" elapsed="0.010799">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:31.721483" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:31.721326" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:31.710467" elapsed="0.011106">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:31.721961" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:31.722137" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:31.722083" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:31.722054" elapsed="0.000175"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:31.722428" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:31.722526" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:31.705305" elapsed="0.017392">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:31.722797" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:31.699942" elapsed="0.022988">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:31.723240" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:31.723039" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:31.723016" elapsed="0.000336"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:31.723645" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:31.723427" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:31.723405" elapsed="0.000352"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:31.697077" elapsed="0.026789">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:32.726907" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:32.725903" elapsed="0.001078"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:32.739831" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:32.739414" elapsed="0.000487"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:32.740417" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:32.740149" 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-08-22T23:44:32.750423" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:32.750585" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:32.750812" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:32.742923" elapsed="0.008364">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:32.740553" elapsed="0.010851">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:32.751729" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:32.751455" elapsed="0.000396"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:32.740526" elapsed="0.011376">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:32.752548" elapsed="0.000078"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:32.752795" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:32.752741" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:32.752714" elapsed="0.000185"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:32.753127" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:32.753227" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:32.732937" elapsed="0.020438">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:32.753472" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:32.727510" elapsed="0.026118">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:32.754030" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:32.753776" elapsed="0.000360"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:32.753743" elapsed="0.000440"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:32.754543" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:32.754283" elapsed="0.000376"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:32.754254" elapsed="0.000443"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:32.724838" elapsed="0.030008">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:33.757863" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:33.756889" elapsed="0.001046"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:33.769675" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:33.769393" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:33.770128" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:33.769877" 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-08-22T23:44:33.780319" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:33.780679" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:33.781023" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:33.772567" elapsed="0.009271">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:33.770255" elapsed="0.011763">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:33.782442" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:33.782095" elapsed="0.000525"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:33.770231" elapsed="0.012446">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:33.783515" elapsed="0.000144"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:33.783914" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:33.783827" elapsed="0.000181"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:33.783787" 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-08-22T23:44:33.784259" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:33.784362" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:33.763716" elapsed="0.020800">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:33.784640" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:33.758426" elapsed="0.026357">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:33.785108" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:33.784898" elapsed="0.000292"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:33.784874" elapsed="0.000350"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:33.785505" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:33.785302" elapsed="0.000289"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:33.785279" elapsed="0.000366"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:33.755868" elapsed="0.029891">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:34.789793" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:34.788468" elapsed="0.001416"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:34.801673" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:34.801369" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:34.802135" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:34.801883" 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-08-22T23:44:34.815445" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:34.815719" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:34.816003" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:34.804999" elapsed="0.011989">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:34.802279" elapsed="0.014955">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:34.817716" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:34.817324" elapsed="0.000543"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:34.802248" elapsed="0.015674">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:34.818855" elapsed="0.000061"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:34.819175" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:34.819085" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:34.819045" elapsed="0.000280"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:34.819723" elapsed="0.000054"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:34.819890" elapsed="0.000035"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:34.796486" elapsed="0.023647">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:34.820286" elapsed="0.000034"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:34.790444" elapsed="0.030054">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:34.821035" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:34.820713" elapsed="0.000495"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:34.820674" elapsed="0.000610"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:34.821900" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:34.821440" elapsed="0.000630"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:34.821389" elapsed="0.000747"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:34.787014" elapsed="0.035314">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:35.825495" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:35.824627" elapsed="0.000959"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:35.837555" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:35.837253" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:35.838041" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:35.837786" 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-08-22T23:44:35.850093" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:35.850479" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:35.850917" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:35.841106" elapsed="0.010529">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:35.838197" elapsed="0.013575">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:35.852066" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:35.851832" elapsed="0.000327"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:35.838159" elapsed="0.014035">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:35.853785" elapsed="0.000190"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:35.854423" elapsed="0.000043"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:35.854292" elapsed="0.000255"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:35.854217" elapsed="0.000420"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:35.855150" elapsed="0.000057"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:35.855326" elapsed="0.000039"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:35.831071" elapsed="0.024662">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:35.855904" elapsed="0.000041"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:35.826128" elapsed="0.030007">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:35.856761" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:35.856327" elapsed="0.000584"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:35.856285" elapsed="0.000696"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:35.857519" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:35.857133" elapsed="0.000582"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:35.857087" elapsed="0.000699"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:35.823457" elapsed="0.034550">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:36.861425" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:36.860360" elapsed="0.001146"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:36.873637" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:36.873356" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:36.874106" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:36.873858" 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-08-22T23:44:36.883610" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:36.883787" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:36.883987" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:36.876319" elapsed="0.008079">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:36.874245" elapsed="0.010237">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:36.884694" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:36.884520" elapsed="0.000240"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:36.874216" elapsed="0.010568">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:36.885160" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:36.885299" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:36.885257" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:36.885240" elapsed="0.000128"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:36.885509" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:36.885582" elapsed="0.000027"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:36.865671" elapsed="0.020032">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:36.885770" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:36.862110" elapsed="0.023752">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:36.886120" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:36.885939" elapsed="0.000239"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:36.885923" elapsed="0.000279"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:36.886392" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:36.886254" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:36.886239" elapsed="0.000231"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:36.859195" elapsed="0.027351">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:37.889331" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:37.888320" elapsed="0.001085"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:37.899466" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:37.899209" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:37.899944" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:37.899690" 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-08-22T23:44:37.909614" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:37.909841" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:37.910095" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:37.902346" elapsed="0.008458">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:37.900075" elapsed="0.010847">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:37.911185" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:37.910972" elapsed="0.000304"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:37.900050" elapsed="0.011260">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:37.911852" elapsed="0.000047"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:37.912095" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:37.912036" elapsed="0.000121"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:37.912004" elapsed="0.000182"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:37.912385" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:37.912482" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:37.893554" elapsed="0.019098">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:37.912749" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:37.890000" elapsed="0.022878">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:37.913205" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:37.912985" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:37.912962" elapsed="0.000354"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:37.913600" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:37.913390" elapsed="0.000290"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:37.913369" elapsed="0.000343"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:37.887288" elapsed="0.026558">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:38.917126" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:38.916030" elapsed="0.001174"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:38.929192" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:38.928833" elapsed="0.000408"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:38.929658" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:38.929393" 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-08-22T23:44:38.940982" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:38.941172" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:38.941425" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:38.932095" elapsed="0.009894">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:38.929790" elapsed="0.012318">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:38.942380" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:38.942163" elapsed="0.000312"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:38.929764" elapsed="0.012746">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:38.943060" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:38.943257" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:38.943201" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:38.943177" 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-08-22T23:44:38.943550" elapsed="0.000052"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:38.943673" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:38.922527" elapsed="0.021328">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:38.943967" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:38.917774" elapsed="0.026327">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:38.944474" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:38.944259" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:38.944232" elapsed="0.000379"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:38.944898" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:38.944690" elapsed="0.000288"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:38.944667" elapsed="0.000344"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:38.914756" elapsed="0.030362">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:39.948206" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:39.947189" elapsed="0.001131"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:39.961386" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:39.960960" elapsed="0.000496"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:39.962072" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:39.961697" elapsed="0.000443"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:44:39.971392" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:39.971637" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:39.971893" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:39.964633" elapsed="0.007808">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:39.962274" elapsed="0.010284">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:39.972859" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:39.972636" elapsed="0.000319"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:39.962240" elapsed="0.010750">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:39.973568" elapsed="0.000061"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:39.973789" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:39.973734" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:39.973709" elapsed="0.000172"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:39.974081" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:39.974185" elapsed="0.000024"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:39.954818" elapsed="0.019519">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:39.974433" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:39.949112" elapsed="0.025452">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:39.974903" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:39.974701" elapsed="0.000282"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:39.974677" elapsed="0.000338"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:39.975285" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:39.975091" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:39.975069" elapsed="0.000328"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:39.946049" elapsed="0.029455">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:40.979172" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:40.978145" elapsed="0.001108"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:40.990493" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:40.990228" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:40.990956" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:40.990709" 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-08-22T23:44:41.000682" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:41.000853" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:41.001044" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:40.993428" elapsed="0.008069">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:40.991083" elapsed="0.010502">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:41.001800" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:41.001635" elapsed="0.000232"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:40.991059" elapsed="0.010832">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:41.002312" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:41.002508" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:41.002452" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:41.002427" elapsed="0.000198"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:41.002828" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:41.002929" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:40.985441" elapsed="0.017634">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:41.003173" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:40.979789" elapsed="0.023516">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:41.003640" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:41.003417" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:41.003394" elapsed="0.000362"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:41.004035" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:41.003837" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:41.003815" elapsed="0.000333"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:40.976911" elapsed="0.027346">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:42.007377" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:42.006345" elapsed="0.001108"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:42.018205" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:42.017941" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:42.018671" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:42.018407" 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-08-22T23:44:42.028332" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:42.028542" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:42.028800" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:42.021114" elapsed="0.008266">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:42.018798" elapsed="0.010696">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:42.029789" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:42.029543" elapsed="0.000338"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:42.018775" elapsed="0.011140">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:42.030437" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:42.030655" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:42.030581" elapsed="0.000135"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:42.030551" 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-08-22T23:44:42.030953" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:42.031051" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:42.012008" elapsed="0.019186">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:42.031291" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:42.007988" elapsed="0.023432">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:42.031754" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:42.031530" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:42.031507" elapsed="0.000360"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:42.032138" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:42.031943" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:42.031921" elapsed="0.000328"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:42.005218" elapsed="0.027180">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:43.035516" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:43.034510" elapsed="0.001117"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:43.045678" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:43.045402" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:43.046124" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:43.045879" 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-08-22T23:44:43.056028" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:43.056200" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:43.056391" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:43.048557" elapsed="0.008260">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:43.046252" elapsed="0.010654">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:43.057098" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:43.056943" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:43.046226" elapsed="0.010964">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:43.057570" elapsed="0.000043"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:43.057730" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:43.057687" elapsed="0.000091"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:43.057670" elapsed="0.000130"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:43.057945" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:43.058016" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:43.041049" elapsed="0.017073">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:43.058192" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:43.036134" elapsed="0.022152">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:43.058548" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:43.058365" elapsed="0.000257"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:43.058349" elapsed="0.000299"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:43.058845" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:43.058703" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:43.058687" elapsed="0.000238"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:43.033346" elapsed="0.025658">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:44.062236" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:44.061172" elapsed="0.001144"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:44.073343" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:44.073064" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:44.073823" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:44.073558" 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-08-22T23:44:44.081975" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:44.082156" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:44.082368" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:44.076292" elapsed="0.006507">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:44.073955" elapsed="0.008931">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:44.083084" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:44.082926" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:44.073928" elapsed="0.009246">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:44.083604" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:44.083750" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:44.083707" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:44.083688" elapsed="0.000129"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:44.083959" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:44.084060" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:44.068622" elapsed="0.015548">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:44.084238" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:44.062884" elapsed="0.021445">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:44.084794" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:44.084406" elapsed="0.000472"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:44.084390" elapsed="0.000523"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:44.085196" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:44.084991" elapsed="0.000285"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:44.084968" elapsed="0.000342"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:44.060010" elapsed="0.025413">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:45.088550" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:45.087514" elapsed="0.001155"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:45.098715" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:45.098435" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:45.099164" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:45.098916" 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-08-22T23:44:45.108339" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:45.108553" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:45.108917" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:45.101605" elapsed="0.007912">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:45.099293" elapsed="0.010375">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:45.109948" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:45.109724" elapsed="0.000318"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:45.099267" elapsed="0.010810">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:45.110637" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:45.110839" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:45.110779" elapsed="0.000126"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:45.110754" elapsed="0.000183"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:45.111140" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:45.111241" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:45.092819" elapsed="0.018574">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:45.111493" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:45.089228" elapsed="0.022422">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:45.111973" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:45.111767" elapsed="0.000289"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:45.111743" elapsed="0.000348"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:45.112367" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:45.112168" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:45.112146" elapsed="0.000336"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:45.086356" elapsed="0.026260">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:46.115606" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:46.114630" elapsed="0.001054"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:46.126292" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:46.126023" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:46.126762" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:46.126495" 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-08-22T23:44:46.149984" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:46.150164" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:46.150382" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:46.129246" elapsed="0.021558">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:46.126889" elapsed="0.024009">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:46.151129" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:46.150938" elapsed="0.000259"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:46.126864" elapsed="0.024357">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:46.151670" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:46.151816" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:46.151775" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:46.151755" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:46.152025" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:46.152096" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:46.120174" elapsed="0.032030">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:46.152274" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:46.116181" elapsed="0.036190">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:46.152609" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:46.152449" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:46.152433" elapsed="0.000257"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:46.152883" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:46.152744" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:46.152728" elapsed="0.000245"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:46.113529" elapsed="0.039527">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:47.156022" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:47.154992" elapsed="0.001105"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:47.168850" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:47.168455" elapsed="0.000465"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:47.169492" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:47.169172" 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-08-22T23:44:47.179661" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:47.179878" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:47.180156" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:47.171926" elapsed="0.008799">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:47.169638" elapsed="0.011204">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:47.181145" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:47.180891" elapsed="0.000365"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:47.169612" elapsed="0.011687">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:47.181891" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:47.182084" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:47.182030" elapsed="0.000115"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:47.182006" elapsed="0.000169"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:47.182374" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:47.182470" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:47.162339" elapsed="0.020298">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:47.182734" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:47.156633" elapsed="0.026229">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:47.183163" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:47.182968" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:47.182945" elapsed="0.000327"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:47.183534" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:47.183345" elapsed="0.000287"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:47.183323" elapsed="0.000343"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:47.153952" elapsed="0.029819">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:48.186933" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:48.185862" elapsed="0.001151"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:48.197999" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:48.197735" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:48.198451" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:48.198206" 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-08-22T23:44:48.208279" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:48.208536" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:48.208804" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:48.200888" elapsed="0.008441">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:48.198596" elapsed="0.010847">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:48.209729" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:48.209492" elapsed="0.000330"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:48.198556" elapsed="0.011299">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:48.210379" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:48.210568" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:48.210513" elapsed="0.000138"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:48.210489" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:48.210880" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:48.210978" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:48.191739" elapsed="0.019383">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:48.211218" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:48.187536" elapsed="0.023813">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:48.211685" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:48.211459" elapsed="0.000306"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:48.211435" elapsed="0.000363"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:48.212073" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:48.211874" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:48.211852" elapsed="0.000367"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:48.184769" elapsed="0.027565">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:49.215271" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:49.214291" elapsed="0.001053"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:49.229846" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:49.229566" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:49.230296" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:49.230050" 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-08-22T23:44:49.239526" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:49.239712" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:49.239897" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:49.232510" elapsed="0.007810">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:49.230416" elapsed="0.010001">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:49.240754" elapsed="0.000549"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:49.240484" elapsed="0.001136"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:49.230394" elapsed="0.011298">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:49.242395" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:49.242627" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:49.242546" elapsed="0.000154"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:49.242521" 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-08-22T23:44:49.242954" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:49.243056" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:49.221384" elapsed="0.021840">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:49.243322" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:49.215923" elapsed="0.027550">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:49.243816" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:49.243607" elapsed="0.000289"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:49.243566" elapsed="0.000363"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:49.244195" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:49.244003" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:49.243982" elapsed="0.000322"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:49.213250" elapsed="0.031161">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:50.247568" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:50.246542" elapsed="0.001131"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:50.258849" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:50.258569" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:50.259295" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:50.259051" 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-08-22T23:44:50.269762" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:50.269922" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:50.270141" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:50.261808" elapsed="0.008999">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:50.259418" elapsed="0.011567">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:50.271400" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:50.271060" elapsed="0.000489"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:50.259394" elapsed="0.012241">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:50.272458" elapsed="0.000057"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:50.272792" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:50.272707" elapsed="0.000181"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:50.272667" 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-08-22T23:44:50.273292" elapsed="0.000075"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:50.273505" elapsed="0.000041"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:50.253749" elapsed="0.020071">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:50.274007" elapsed="0.000047"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:50.248172" elapsed="0.026104">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:50.274819" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:50.274460" elapsed="0.000491"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:50.274422" elapsed="0.000603"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:50.275477" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:50.275159" elapsed="0.000479"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:50.275123" elapsed="0.000571"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:50.245362" elapsed="0.030509">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:51.278862" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:51.277897" elapsed="0.001036"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:51.289525" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:51.289163" elapsed="0.000443"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:51.290027" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:51.289773" 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-08-22T23:44:51.300373" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:51.300668" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:51.300927" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:51.292945" elapsed="0.008456">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:51.290177" elapsed="0.011326">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:51.301796" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:51.301546" elapsed="0.000322"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:51.290152" elapsed="0.011740">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:51.302339" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:51.302492" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:51.302449" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:51.302426" elapsed="0.000132"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:51.302720" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:51.302791" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:51.284041" elapsed="0.018862">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:51.302973" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:51.279419" elapsed="0.023651">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:51.303297" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:51.303151" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:51.303133" elapsed="0.000244"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:51.303572" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:51.303431" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:51.303415" elapsed="0.000252"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:51.276872" elapsed="0.026873">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:52.307457" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:52.306175" elapsed="0.001364"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:52.319683" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:52.319292" elapsed="0.000471"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:52.320228" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:52.319941" 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-08-22T23:44:52.332227" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:52.332451" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:52.332723" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:52.324062" elapsed="0.009090">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:52.320396" elapsed="0.012861">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:52.333565" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:52.333303" elapsed="0.000353"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:52.320364" elapsed="0.013316">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:52.334150" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:52.334310" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:52.334260" elapsed="0.000113"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:52.334238" 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-08-22T23:44:52.334551" elapsed="0.000040"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:52.334649" elapsed="0.000018"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:52.312771" elapsed="0.021997">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:52.334928" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:52.308005" elapsed="0.027034">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:52.335276" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:52.335123" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:52.335105" elapsed="0.000250"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:52.335615" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:52.335408" elapsed="0.000291"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:52.335393" elapsed="0.000340"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:52.304852" elapsed="0.030997">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:53.338874" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:53.337839" elapsed="0.001110"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:53.350983" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:53.350689" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:53.351457" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:53.351199" 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-08-22T23:44:53.361502" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:53.361763" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:53.362015" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:53.353994" elapsed="0.008572">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:53.351605" elapsed="0.011105">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:53.362992" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:53.362763" elapsed="0.000327"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:53.351562" elapsed="0.011564">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:53.363724" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:53.363933" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:53.363873" elapsed="0.000128"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:53.363847" elapsed="0.000187"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:53.364248" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:53.364353" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:53.344113" elapsed="0.020401">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:53.364641" elapsed="0.000024"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:53.339458" elapsed="0.025344">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:53.365139" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:53.364920" elapsed="0.000324"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:53.364896" elapsed="0.000385"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:53.365570" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:53.365361" elapsed="0.000314"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:53.365338" elapsed="0.000372"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:53.336810" elapsed="0.029016">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:54.367457" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:54.366994" elapsed="0.000501"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:54.375112" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:54.374849" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:54.375561" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:54.375314" 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-08-22T23:44:54.385364" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:54.385530" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:54.385742" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:54.377986" elapsed="0.008145">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:54.375707" elapsed="0.010507">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:54.386410" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:54.386252" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:54.375683" elapsed="0.010818">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:54.386927" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:54.387068" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:54.387027" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:54.387008" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:54.387279" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:54.387350" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:54.370269" elapsed="0.017188">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:54.387526" elapsed="0.000018"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:54.367750" elapsed="0.019890">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:54.387868" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:54.387721" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:54.387704" elapsed="0.000244"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:54.388144" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:54.388003" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:54.387987" elapsed="0.000237"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:54.366412" elapsed="0.021890">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:55.391385" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:55.390320" elapsed="0.001143"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:55.404200" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:55.403917" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:55.404674" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:55.404408" 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-08-22T23:44:55.414055" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:55.414225" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:55.414427" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:55.407162" elapsed="0.007690">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:55.404800" elapsed="0.010137">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:55.415136" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:55.414975" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:55.404778" elapsed="0.010448">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:55.415644" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:55.415787" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:55.415745" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:55.415727" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:55.415998" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:55.416067" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:55.398048" elapsed="0.018158">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:55.416278" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:55.392031" elapsed="0.024355">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:55.416704" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:55.416464" elapsed="0.000371"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:55.416448" elapsed="0.000421"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:55.417135" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:55.416943" elapsed="0.000337"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:55.416922" elapsed="0.000391"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:55.389201" elapsed="0.028219">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:56.420708" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:56.419711" elapsed="0.001072"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:56.431522" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:56.431256" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:56.431989" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:56.431741" 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-08-22T23:44:56.442110" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:56.442266" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:56.442457" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:56.434674" elapsed="0.008206">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:56.432113" elapsed="0.010852">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:56.443159" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:56.443002" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:56.432091" elapsed="0.011162">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:56.443648" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:56.443788" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:56.443747" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:56.443730" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:56.444000" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:56.444072" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:56.425378" elapsed="0.018800">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:56.444249" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:56.421280" elapsed="0.023063">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:56.444567" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:56.444423" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:56.444407" elapsed="0.000257"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:56.444858" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:56.444718" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:56.444702" elapsed="0.000236"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:56.418630" elapsed="0.026387">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:57.448838" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:57.447467" elapsed="0.001456"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:57.460342" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:57.460072" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:57.460839" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:57.460547" 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-08-22T23:44:57.470630" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:57.470796" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:57.471083" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:57.463343" elapsed="0.008272">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:57.460972" elapsed="0.010824">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:57.472154" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:57.471863" elapsed="0.000414"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:57.460945" elapsed="0.011378">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:57.473031" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:57.473233" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:57.473176" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:57.473151" elapsed="0.000175"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:57.473558" elapsed="0.000062"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:57.473694" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:57.455345" elapsed="0.018504">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:57.473954" elapsed="0.000030"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:57.449468" elapsed="0.024643">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:57.474428" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:57.474225" elapsed="0.000284"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:57.474201" elapsed="0.000346"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:57.474906" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:57.474686" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:57.474651" elapsed="0.000390"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:57.445988" elapsed="0.029186">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:58.478651" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:58.477415" elapsed="0.001316"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:58.489522" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:58.489261" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:58.489985" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:58.489737" 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-08-22T23:44:58.500508" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:58.500691" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:58.500873" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:58.492406" elapsed="0.008854">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:58.490121" elapsed="0.011221">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:58.501535" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:58.501379" elapsed="0.000238"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:58.490098" elapsed="0.011544">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:58.502024" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:58.502162" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:58.502122" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:58.502105" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:58.502372" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:58.502443" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:58.484846" elapsed="0.017701">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:58.502633" elapsed="0.000018"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:58.479257" elapsed="0.023476">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:58.502956" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:58.502812" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:58.502796" elapsed="0.000239"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:58.503228" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:58.503089" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:58.503073" elapsed="0.000233"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:58.476335" elapsed="0.027048">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:44:59.506712" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:44:59.505330" elapsed="0.001472"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:59.517963" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:59.517701" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:44:59.518408" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:44:59.518163" 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-08-22T23:44:59.527881" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:44:59.528036" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:44:59.528214" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:44:59.520892" elapsed="0.007722">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:44:59.518541" elapsed="0.010157">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:59.528888" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:59.528734" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:44:59.518510" elapsed="0.010469">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:59.529350" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:59.529519" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:44:59.529477" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:59.529457" elapsed="0.000143"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:59.529794" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:44:59.529894" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:44:59.512900" elapsed="0.017139">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:44:59.530136" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:44:59.507328" elapsed="0.022939">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:59.530595" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:59.530377" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:59.530354" elapsed="0.000361"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:44:59.530984" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:44:59.530791" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:44:59.530769" elapsed="0.000326"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:44:59.504256" elapsed="0.026945">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:00.534102" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:00.533129" elapsed="0.001046"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:00.544613" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:00.544340" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:00.545060" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:00.544814" 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-08-22T23:45:00.554070" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:00.554234" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:00.554411" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:00.547440" elapsed="0.007458">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:00.545184" elapsed="0.009828">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:00.555278" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:00.555062" elapsed="0.000310"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:00.545161" elapsed="0.010245">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:00.555946" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:00.556138" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:00.556083" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:00.556059" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:00.556429" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:00.556529" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:00.538543" elapsed="0.018151">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:00.556792" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:00.534757" elapsed="0.022166">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:00.557234" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:00.557033" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:00.557010" elapsed="0.000337"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:00.557639" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:00.557424" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:00.557402" elapsed="0.000351"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:00.532104" elapsed="0.025757">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:01.561112" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:01.560017" elapsed="0.001175"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:01.575062" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:01.574758" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:01.575568" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:01.575282" elapsed="0.000353"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:45:01.584910" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:01.585085" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:01.585298" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:01.577792" elapsed="0.007920">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:01.575715" elapsed="0.010080">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:01.585988" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:01.585831" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:01.575690" elapsed="0.010388">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:01.586470" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:01.586628" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:01.586570" elapsed="0.000103"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:01.586552" elapsed="0.000145"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:01.586842" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:01.586913" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:01.567495" elapsed="0.019524">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:01.587088" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:01.561762" elapsed="0.025420">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:01.587404" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:01.587261" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:01.587244" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:01.587726" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:01.587568" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:01.587522" elapsed="0.000283"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:01.558816" elapsed="0.029065">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:02.590886" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:02.589888" elapsed="0.001071"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:02.602960" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:02.602692" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:02.603407" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:02.603160" 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-08-22T23:45:02.613226" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:02.613390" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:02.613566" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:02.605873" elapsed="0.008148">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:02.603531" elapsed="0.010573">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:02.614295" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:02.614140" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:02.603507" elapsed="0.010879">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:02.614810" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:02.615001" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:02.614946" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:02.614922" elapsed="0.000170"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:02.615290" elapsed="0.000035"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:02.615392" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:02.597343" elapsed="0.018194">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:02.615656" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:02.591455" elapsed="0.024337">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:02.616100" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:02.615901" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:02.615878" elapsed="0.000332"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:02.616474" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:02.616283" elapsed="0.000268"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:02.616262" elapsed="0.000327"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:02.588791" elapsed="0.028018">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:03.619800" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:03.618748" elapsed="0.001124"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:03.631606" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:03.631314" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:03.632074" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:03.631824" 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-08-22T23:45:03.641359" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:03.641525" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:03.641739" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:03.634561" elapsed="0.007571">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:03.632200" elapsed="0.010017">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:03.642434" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:03.642257" elapsed="0.000242"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:03.632177" elapsed="0.010346">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:03.642973" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:03.643117" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:03.643077" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:03.643058" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:03.643327" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:03.643397" elapsed="0.000055"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:03.625935" elapsed="0.017619">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:03.643639" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:03.620359" elapsed="0.023381">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:03.644067" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:03.643855" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:03.643831" elapsed="0.000354"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:03.644466" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:03.644263" elapsed="0.000283"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:03.644240" elapsed="0.000345"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:03.617741" elapsed="0.026978">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:04.647708" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:04.646701" elapsed="0.001080"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:04.659642" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:04.659359" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:04.660095" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:04.659849" 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-08-22T23:45:04.670841" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:04.671024" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:04.671224" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:04.662553" elapsed="0.009139">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:04.660222" elapsed="0.011594">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:04.672262" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:04.671893" elapsed="0.000515"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:04.660199" elapsed="0.012262">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:04.673362" elapsed="0.000060"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:04.673703" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:04.673612" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:04.673543" 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-08-22T23:45:04.674171" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:04.674327" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:04.654002" elapsed="0.020557">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:04.674746" elapsed="0.000035"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:04.648269" elapsed="0.026686">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:04.675472" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:04.675128" elapsed="0.000496"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:04.675092" elapsed="0.000589"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:04.676113" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:04.675802" elapsed="0.000434"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:04.675767" elapsed="0.000521"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:04.645693" elapsed="0.030768">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:05.679387" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:05.678410" elapsed="0.001050"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:05.690860" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:05.690598" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:05.691324" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:05.691061" 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-08-22T23:45:05.701208" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:05.701419" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:05.701725" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:05.693897" elapsed="0.008373">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:05.691450" elapsed="0.010942">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:05.702698" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:05.702443" elapsed="0.000358"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:05.691426" elapsed="0.011415">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:05.703401" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:05.703631" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:05.703548" elapsed="0.000151"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:05.703521" 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-08-22T23:45:05.703967" elapsed="0.000036"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:05.704079" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:05.684337" elapsed="0.019901">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:05.704346" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:05.679981" elapsed="0.024508">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:05.704865" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:05.704647" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:05.704615" elapsed="0.000373"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:05.705276" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:05.705069" elapsed="0.000292"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:05.705047" elapsed="0.000349"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:05.677336" elapsed="0.028176">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:06.708481" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:06.707489" elapsed="0.001067"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:06.720150" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:06.719889" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:06.720619" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:06.720354" 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-08-22T23:45:06.730269" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:06.730436" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:06.730636" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:06.723060" elapsed="0.008008">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:06.720752" elapsed="0.010402">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:06.731347" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:06.731190" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:06.720729" elapsed="0.010712">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:06.731857" elapsed="0.000046"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:06.732082" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:06.732025" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:06.731999" elapsed="0.000175"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:06.732376" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:06.732477" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:06.714962" elapsed="0.017684">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:06.732747" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:06.709089" elapsed="0.023791">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:06.733193" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:06.732991" elapsed="0.000282"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:06.732968" elapsed="0.000339"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:06.733600" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:06.733384" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:06.733362" elapsed="0.000353"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:06.706385" elapsed="0.027439">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:07.736945" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:07.735932" elapsed="0.001088"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:07.748335" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:07.748074" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:07.748814" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:07.748536" 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-08-22T23:45:07.759165" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:07.759394" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:07.759714" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:07.751339" elapsed="0.008910">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:07.748939" elapsed="0.011428">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:07.760675" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:07.760418" elapsed="0.000353"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:07.748917" elapsed="0.011889">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:07.761352" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:07.761549" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:07.761494" elapsed="0.000140"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:07.761468" elapsed="0.000199"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:07.761924" elapsed="0.000036"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:07.762041" elapsed="0.000024"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:07.741895" elapsed="0.020318">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:07.762325" elapsed="0.000025"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:07.737516" elapsed="0.024961">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:07.762855" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:07.762635" elapsed="0.000322"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:07.762604" elapsed="0.000387"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:07.763265" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:07.763069" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:07.763047" elapsed="0.000329"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:07.734825" elapsed="0.028661">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:08.766415" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:08.765369" elapsed="0.001123"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:08.778184" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:08.777790" elapsed="0.000463"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:08.778838" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:08.778467" 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-08-22T23:45:08.788812" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:08.789031" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:08.789255" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:08.781247" elapsed="0.008543">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:08.778976" elapsed="0.010929">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:08.790199" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:08.789973" elapsed="0.000319"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:08.778952" elapsed="0.011374">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:08.790877" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:08.791068" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:08.791014" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:08.790990" elapsed="0.000170"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:08.791360" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:08.791459" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:08.771737" elapsed="0.019890">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:08.791726" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:08.767033" elapsed="0.024826">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:08.792168" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:08.791969" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:08.791946" elapsed="0.000334"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:08.792547" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:08.792355" elapsed="0.000292"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:08.792333" elapsed="0.000347"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:08.764280" elapsed="0.028507">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:09.795771" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:09.794769" elapsed="0.001075"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:09.808400" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:09.807973" elapsed="0.000497"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:09.809017" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:09.808705" 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-08-22T23:45:09.818390" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:09.818543" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:09.818747" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:09.811416" elapsed="0.007800">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:09.809142" elapsed="0.010187">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:09.819617" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:09.819378" elapsed="0.000333"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:09.809120" elapsed="0.010624">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:09.820293" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:09.820484" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:09.820429" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:09.820405" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:09.820798" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:09.820896" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:09.801642" elapsed="0.019400">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:09.821139" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:09.796368" elapsed="0.024903">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:09.821600" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:09.821380" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:09.821358" elapsed="0.000357"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:09.821983" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:09.821790" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:09.821768" elapsed="0.000324"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:09.793694" elapsed="0.028505">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:10.825510" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:10.824326" elapsed="0.001411"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:10.836335" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:10.836070" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:10.836845" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:10.836566" 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-08-22T23:45:10.846319" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:10.846490" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:10.846708" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:10.839323" elapsed="0.007803">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:10.836976" elapsed="0.010236">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:10.847428" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:10.847250" elapsed="0.000252"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:10.836952" elapsed="0.010576">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:10.847934" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:10.848079" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:10.848037" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:10.848019" elapsed="0.000128"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:10.848293" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:10.848365" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:10.830235" elapsed="0.018252">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:10.848561" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:10.826168" elapsed="0.022511">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:10.848909" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:10.848761" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:10.848744" elapsed="0.000249"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:10.849190" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:10.849048" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:10.849032" elapsed="0.000240"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:10.823176" elapsed="0.026175">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:11.851405" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:11.850773" elapsed="0.000681"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:11.862093" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:11.861817" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:11.862556" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:11.862295" 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-08-22T23:45:11.871808" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:11.871972" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:11.872150" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:11.864975" elapsed="0.007562">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:11.862698" elapsed="0.009942">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:11.872833" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:11.872676" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:11.862675" elapsed="0.010248">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:11.873303" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:11.873441" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:11.873400" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:11.873383" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:11.873666" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:11.873738" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:11.855506" elapsed="0.018335">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:11.873911" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:11.851794" elapsed="0.022215">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:11.874230" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:11.874088" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:11.874072" elapsed="0.000238"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:11.874501" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:11.874363" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:11.874347" elapsed="0.000265"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:11.850020" elapsed="0.024673">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:12.877654" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:12.876665" elapsed="0.001063"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:12.888564" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:12.888306" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:12.889025" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:12.888782" 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-08-22T23:45:12.898203" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:12.898359" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:12.898542" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:12.891450" elapsed="0.007513">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:12.889151" elapsed="0.009932">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:12.899348" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:12.899132" elapsed="0.000310"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:12.889127" elapsed="0.010349">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:12.900018" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:12.900212" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:12.900157" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:12.900132" 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-08-22T23:45:12.900506" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:12.900628" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:12.882389" elapsed="0.018387">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:12.900873" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:12.878220" elapsed="0.022783">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:12.901314" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:12.901114" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:12.901091" elapsed="0.000337"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:12.901718" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:12.901503" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:12.901482" elapsed="0.000350"/>
</if>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:12.875624" elapsed="0.026316">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<msg time="2026-08-22T23:45:12.902078" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 1 minute 40 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${DEVICE_BOOT_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>node2</arg>
<arg>${modified_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:43:32.883447" elapsed="100.018764">Keyword 'Check_Config_Data' failed after retrying for 1 minute 40 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:45:12.903986" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:45:12.903370" elapsed="0.000656"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-08-22T23:45:12.904340" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:12.904138" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:12.904113" elapsed="0.000318"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:45:12.904693" elapsed="0.000308"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:45:12.906240" level="FAIL">'5761' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:45:12.905750" elapsed="0.000575">'5761' does not contain '-'</status>
</kw>
<msg time="2026-08-22T23:45:12.906507" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:45:12.905228" elapsed="0.001316"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:45:12.907312" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=5761</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:45:12.906801" elapsed="0.000549"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:12.908008" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5761</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:12.907575" elapsed="0.000462"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:45:12.908485" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:45:12.908191" elapsed="0.000321"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-08-22T23:45:12.909053" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5761

Keyword 'Check_Config_Data' failed after retrying for 1 minute 40 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-08-22T23:45:12.908682" elapsed="0.000420"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:12.909497" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5761</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:12.909255" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-08-22T23:45:12.910240" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=5761'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-08-22T23:45:12.909892" elapsed="0.000397"/>
</kw>
<status status="PASS" start="2026-08-22T23:45:12.909628" elapsed="0.000696"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:12.909609" elapsed="0.000740"/>
</if>
<arg>5761</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:45:12.902838" elapsed="0.007559"/>
</kw>
<doc>Check that the device data modification is propagated to node 2 as well.</doc>
<tag>critical</tag>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=5761</tag>
<status status="FAIL" start="2026-08-22T23:43:31.972276" elapsed="100.938167">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5761

Keyword 'Check_Config_Data' failed after retrying for 1 minute 40 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</test>
<test id="s1-s6-t16" name="Kill_node3_Before_Delete" 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-08-22T23:45:12.915975" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:45:12.915707" 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-08-22T23:45:12.917232" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:12.917123" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:12.917104" 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-08-22T23:45:12.922319" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:12.922211" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:12.922193" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:45:12.923414" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:45:12.923029" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:45:12.923925" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:45:12.923615" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:45:12.923998" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:45:12.924156" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:45:12.922628" elapsed="0.001554"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:45:12.929738" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:12.929628" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:12.929607" 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-08-22T23:45:12.931018" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:12.930908" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:12.930890" elapsed="0.000447"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:45:12.931812" level="INFO">${karaf_connection_index} = 53</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:45:12.931487" elapsed="0.000351"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:45:12.932221" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:45:12.931997" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:45:12.970745" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:45:12.932761" elapsed="0.038091"/>
</kw>
<msg time="2026-08-22T23:45:12.971033" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:45:12.971080" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:45:12.932402" elapsed="0.038715"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:45:12.993482" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "3 "_ "B "e "f "o "r "e "_ "D "e "l "e "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:45:12.971672" elapsed="0.021944"/>
</kw>
<msg time="2026-08-22T23:45:12.993786" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:45:12.993833" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "3 "_ "B "e "f "o "r "e "_ "D "e "l "e "t "e "[K"
[?1l&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-08-22T23:45:12.971313" elapsed="0.022559"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:12.994191" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:12.993956" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:12.993934" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:12.994735" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "3 "_ "B "e "f "o "r "e "_ "D "e "l "e "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:12.994412" 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-08-22T23:45:12.995076" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:12.994864" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:12.994846" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:45:12.995188" 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-08-22T23:45:12.997730" elapsed="0.000149"/>
</kw>
<msg time="2026-08-22T23:45:12.997939" 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-08-22T23:45:12.996701" elapsed="0.001372"/>
</kw>
<kw name="Open 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-08-22T23:45:12.998347" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:12.998707" 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-08-22T23:45:12.996053" elapsed="0.002842"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:45:12.995493" elapsed="0.003467"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:45:12.930607" elapsed="0.068451"/>
</kw>
<msg time="2026-08-22T23:45:12.999152" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:45:12.999197" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "3 "_ "B "e "f "o "r "e "_ "D "e "l "e "t "e "[K"
[?1l&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-08-22T23:45:12.929957" elapsed="0.069280"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:45:12.999461" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:45:12.999347" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:12.999295" elapsed="0.000250"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:12.999965" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:13.000294" elapsed="0.000064"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:45:13.000407" 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-08-22T23:45:12.929273" elapsed="0.071245"/>
</kw>
<msg time="2026-08-22T23:45:13.000725" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:45:13.000772" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "3 "_ "B "e "f "o "r "e "_ "D "e "l "e "t "e "[K"
[?1l&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-08-22T23:45:12.924556" elapsed="0.076255"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:13.001136" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:13.000887" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.000870" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:45:12.924416" elapsed="0.076822"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:45:13.006646" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:13.006520" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.006501" 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-08-22T23:45:13.007919" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:13.007811" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.007792" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:45:13.008438" level="INFO">${karaf_connection_index} = 67</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:45:13.008134" elapsed="0.000331"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:45:13.008855" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:45:13.008639" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:45:13.066644" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:45:13.009373" elapsed="0.057374"/>
</kw>
<msg time="2026-08-22T23:45:13.066911" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:45:13.066958" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:45:13.009043" elapsed="0.057952"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:45:13.096747" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "3 "_ "B "e "f "o "r "e "_ "D "e "l "e "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:45:13.067538" elapsed="0.029309"/>
</kw>
<msg time="2026-08-22T23:45:13.097005" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:45:13.097051" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "3 "_ "B "e "f "o "r "e "_ "D "e "l "e "t "e "[K"
[?1l&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-08-22T23:45:13.067188" elapsed="0.029901"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:13.097392" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:13.097166" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.097146" elapsed="0.000324"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:13.098178" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "3 "_ "B "e "f "o "r "e "_ "D "e "l "e "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:13.097673" 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-08-22T23:45:13.098544" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:13.098315" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.098296" elapsed="0.000358"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:45:13.098687" 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-08-22T23:45:13.101171" elapsed="0.000148"/>
</kw>
<msg time="2026-08-22T23:45:13.101378" 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-08-22T23:45:13.100154" 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-08-22T23:45:13.101837" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:13.102169" 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-08-22T23:45:13.099481" elapsed="0.002872"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:45:13.098947" elapsed="0.003470"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:45:13.007477" elapsed="0.095038"/>
</kw>
<msg time="2026-08-22T23:45:13.102631" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:45:13.102678" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "3 "_ "B "e "f "o "r "e "_ "D "e "l "e "t "e "[K"
[?1l&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-08-22T23:45:13.006865" elapsed="0.095852"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:45:13.102901" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:45:13.102794" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.102776" 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-08-22T23:45:13.103367" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:13.103721" elapsed="0.000040"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:45:13.103809" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:45:13.006181" elapsed="0.097740"/>
</kw>
<msg time="2026-08-22T23:45:13.104014" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:45:13.104057" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "3 "_ "B "e "f "o "r "e "_ "D "e "l "e "t "e "[K"
[?1l&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-08-22T23:45:13.001504" elapsed="0.102592"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:13.104415" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:13.104171" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.104153" elapsed="0.000339"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:45:13.001366" elapsed="0.103150"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:45:13.109985" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:13.109876" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.109856" 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-08-22T23:45:13.111196" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:13.111087" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.111069" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:45:13.111723" level="INFO">${karaf_connection_index} = 36</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:45:13.111404" elapsed="0.000345"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:45:13.112135" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:45:13.111919" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:45:13.146950" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:45:13.112676" elapsed="0.034407"/>
</kw>
<msg time="2026-08-22T23:45:13.147265" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:45:13.147312" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:45:13.112318" elapsed="0.035031"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:45:13.165376" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "3 "_ "B "e "f "o "r "e "_ "D "e "l "e "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:45:13.147977" elapsed="0.017502"/>
</kw>
<msg time="2026-08-22T23:45:13.165749" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:45:13.165796" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "3 "_ "B "e "f "o "r "e "_ "D "e "l "e "t "e "[K"
[?1l&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-08-22T23:45:13.147542" elapsed="0.018294"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:13.166172" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:13.165919" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.165896" elapsed="0.000357"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:13.166711" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "3 "_ "B "e "f "o "r "e "_ "D "e "l "e "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:13.166394" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:13.167056" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:13.166843" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.166825" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:45:13.167167" 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-08-22T23:45:13.170028" elapsed="0.000149"/>
</kw>
<msg time="2026-08-22T23:45:13.170238" 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-08-22T23:45:13.168982" elapsed="0.001387"/>
</kw>
<kw name="Open 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-08-22T23:45:13.170665" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:13.170995" 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-08-22T23:45:13.168344" elapsed="0.002843"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:45:13.167449" elapsed="0.003802"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:45:13.110785" elapsed="0.060564"/>
</kw>
<msg time="2026-08-22T23:45:13.171441" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:45:13.171485" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "3 "_ "B "e "f "o "r "e "_ "D "e "l "e "t "e "[K"
[?1l&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-08-22T23:45:13.110206" elapsed="0.061318"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:45:13.171731" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:45:13.171623" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.171603" 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-08-22T23:45:13.172239" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:13.172572" elapsed="0.000094"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:45:13.172715" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:45:13.109520" elapsed="0.063304"/>
</kw>
<msg time="2026-08-22T23:45:13.172918" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:45:13.172962" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "K "i "l "l "_ "n "o "d "e "3 "_ "B "e "f "o "r "e "_ "D "e "l "e "t "e "[K"
[?1l&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-08-22T23:45:13.104812" elapsed="0.068188"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:13.173320" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:13.173074" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.173057" elapsed="0.000340"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:45:13.104674" elapsed="0.068747"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:45:12.924238" elapsed="0.249214"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:45:12.921849" elapsed="0.251663"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:45:12.916833" elapsed="0.256856"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:45:12.916392" elapsed="0.257348"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:45:12.911252" elapsed="0.262544"/>
</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-08-22T23:45:13.176964" 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-08-22T23:45:13.176646" elapsed="0.000344"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:45:13.177428" 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-08-22T23:45:13.177142" elapsed="0.000311"/>
</kw>
<return>
<value>${index_list}</value>
<status status="PASS" start="2026-08-22T23:45:13.177498" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:45:13.177667" level="INFO">${index_list} = [3]</msg>
<var>${index_list}</var>
<arg>${member}</arg>
<status status="PASS" start="2026-08-22T23:45:13.176312" elapsed="0.001380"/>
</kw>
<kw name="Return_Member_IP" owner="ClusterManagement">
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-08-22T23:45:13.178502" 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-08-22T23:45:13.178196" elapsed="0.000331"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:45:13.178965" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:45:13.178694" elapsed="0.000296"/>
</kw>
<return>
<value>${member_ip}</value>
<status status="PASS" start="2026-08-22T23:45:13.179037" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:45:13.179320" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:45:13.177881" elapsed="0.001463"/>
</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-08-22T23:45:13.186336" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:13.186224" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.186205" elapsed="0.000200"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:45:13.187453" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:45:13.187034" elapsed="0.000447"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:45:13.187985" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:45:13.187664" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:45:13.188063" elapsed="0.000067"/>
</return>
<msg time="2026-08-22T23:45:13.188264" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:45:13.186646" 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-08-22T23:45:13.193834" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:13.193717" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.193695" 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-08-22T23:45:13.195006" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:13.194898" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.194880" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:45:13.195441" level="INFO">${karaf_connection_index} = 53</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:45:13.195215" elapsed="0.000251"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:45:13.195842" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:45:13.195642" elapsed="0.000224"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:45:13.229760" 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 "0 ". "7 "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-08-22T23:45:13.196390" elapsed="0.033525"/>
</kw>
<msg time="2026-08-22T23:45:13.230083" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:45:13.230130" 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-08-22T23:45:13.196021" elapsed="0.034147"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:45:13.248201" 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-08-22T23:45:13.230892" elapsed="0.017370"/>
</kw>
<msg time="2026-08-22T23:45:13.248487" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:45:13.248533" 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-08-22T23:45:13.230424" elapsed="0.018136"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:13.248929" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:13.248675" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.248645" elapsed="0.000368"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:13.249410" 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-08-22T23:45:13.249153" 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-08-22T23:45:13.249758" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:13.249526" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.249508" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:45:13.249876" 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-08-22T23:45:13.251700" elapsed="0.000208"/>
</kw>
<msg time="2026-08-22T23:45:13.252009" 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-08-22T23:45:13.251141" elapsed="0.000942"/>
</kw>
<kw name="Open 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-08-22T23:45:13.252242" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:13.252436" 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-08-22T23:45:13.250750" elapsed="0.001771"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:45:13.250198" elapsed="0.002371"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:45:13.194595" elapsed="0.058091"/>
</kw>
<msg time="2026-08-22T23:45:13.252783" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:45:13.252826" 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-08-22T23:45:13.194059" elapsed="0.058795"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:45:13.253274" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:45:13.252934" elapsed="0.000401"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.252915" elapsed="0.000445"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:13.253792" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:13.254126" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:45:13.254199" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:45:13.193345" elapsed="0.060961"/>
</kw>
<msg time="2026-08-22T23:45:13.254401" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:45:13.254444" 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-08-22T23:45:13.188703" elapsed="0.065767"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:13.254817" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:13.254545" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.254528" elapsed="0.000367"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:45:13.188543" elapsed="0.066375"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:45:13.260330" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:13.260221" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.260203" 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-08-22T23:45:13.261556" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:13.261449" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.261430" elapsed="0.000216"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:45:13.262012" level="INFO">${karaf_connection_index} = 67</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:45:13.261789" elapsed="0.000256"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:45:13.262366" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:45:13.262196" elapsed="0.000195"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:45:13.315497" 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 "0 ". "7 "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-08-22T23:45:13.262896" elapsed="0.052726"/>
</kw>
<msg time="2026-08-22T23:45:13.315752" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:45:13.315798" 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-08-22T23:45:13.262546" elapsed="0.053291"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:45:13.318461" 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-08-22T23:45:13.316429" elapsed="0.002093"/>
</kw>
<msg time="2026-08-22T23:45:13.318633" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:45:13.318678" 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-08-22T23:45:13.316041" elapsed="0.002664"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:13.319019" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:13.318790" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.318765" elapsed="0.000335"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:13.319494" 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-08-22T23:45:13.319242" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:13.319837" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:13.319626" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.319606" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:45:13.319949" 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-08-22T23:45:13.321698" elapsed="0.000204"/>
</kw>
<msg time="2026-08-22T23:45:13.322001" 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-08-22T23:45:13.321156" elapsed="0.000917"/>
</kw>
<kw name="Open 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-08-22T23:45:13.322230" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:13.322390" 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-08-22T23:45:13.320785" elapsed="0.001688"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:45:13.320233" elapsed="0.002288"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:45:13.261147" elapsed="0.061493"/>
</kw>
<msg time="2026-08-22T23:45:13.322737" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:45:13.322781" 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-08-22T23:45:13.260578" elapsed="0.062230"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:45:13.322992" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:45:13.322885" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.322867" 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-08-22T23:45:13.323718" 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-08-22T23:45:13.324104" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:45:13.324177" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:45:13.259881" elapsed="0.064406"/>
</kw>
<msg time="2026-08-22T23:45:13.324381" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:45:13.324423" 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-08-22T23:45:13.255183" elapsed="0.069266"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:13.324821" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:13.324524" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.324507" elapsed="0.000392"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:45:13.255047" elapsed="0.069876"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:45:13.330326" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:13.330219" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.330200" 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-08-22T23:45:13.331477" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:13.331369" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.331351" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:45:13.331930" level="INFO">${karaf_connection_index} = 36</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:45:13.331705" elapsed="0.000251"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:45:13.332282" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:45:13.332110" elapsed="0.000197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:45:13.363286" 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 "0 ". "7 "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-08-22T23:45:13.332839" elapsed="0.030554"/>
</kw>
<msg time="2026-08-22T23:45:13.363521" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:45:13.363567" 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-08-22T23:45:13.332462" elapsed="0.031161"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:45:13.365771" 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-08-22T23:45:13.364217" elapsed="0.001612"/>
</kw>
<msg time="2026-08-22T23:45:13.365924" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:45:13.365968" 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-08-22T23:45:13.363828" elapsed="0.002167"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:13.366308" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:13.366079" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.366056" elapsed="0.000332"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:13.366804" 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-08-22T23:45:13.366531" elapsed="0.000322"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:13.367129" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:13.366918" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.366901" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:45:13.367242" 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-08-22T23:45:13.369080" elapsed="0.000200"/>
</kw>
<msg time="2026-08-22T23:45:13.369381" 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-08-22T23:45:13.368501" elapsed="0.000950"/>
</kw>
<kw name="Open 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-08-22T23:45:13.369695" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:13.369860" 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-08-22T23:45:13.368125" elapsed="0.001818"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:45:13.367530" elapsed="0.002459"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:45:13.331070" elapsed="0.039017"/>
</kw>
<msg time="2026-08-22T23:45:13.370181" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:45:13.370225" 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-08-22T23:45:13.330543" elapsed="0.039709"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:45:13.370435" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:45:13.370329" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.370311" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:13.370938" 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-08-22T23:45:13.371275" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:45:13.371348" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:45:13.329874" elapsed="0.041582"/>
</kw>
<msg time="2026-08-22T23:45:13.371552" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:45:13.371620" 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-08-22T23:45:13.325185" elapsed="0.046465"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:13.372187" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:13.371728" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.371711" elapsed="0.000556"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:45:13.325049" elapsed="0.047242"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:45:13.188350" elapsed="0.183973"/>
</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-08-22T23:45:13.184099" elapsed="0.188285"/>
</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-08-22T23:45:13.374080" 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-08-22T23:45:13.373703" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:45:13.374561" 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-08-22T23:45:13.374265" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:45:13.374653" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:45:13.374809" 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-08-22T23:45:13.373275" elapsed="0.001559"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:45:13.375810" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:45:13.375405" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:45:13.376294" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:45:13.375992" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:45:13.376364" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:45:13.376518" 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-08-22T23:45:13.375036" elapsed="0.001507"/>
</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-08-22T23:45:13.378076" 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-08-22T23:45:13.377706" elapsed="0.000397"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:45:13.378551" 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-08-22T23:45:13.378258" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:45:13.378641" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:45:13.378796" 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-08-22T23:45:13.377316" elapsed="0.001505"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:45:13.379875" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:45:13.379601" elapsed="0.000300"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:45:13.380663" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:45:13.380764" level="INFO">${current_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:45:13.380519" 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-08-22T23:45:13.384205" elapsed="0.000079"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:13.383503" elapsed="0.000873"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:13.383483" elapsed="0.000921"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:45:13.384686" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:45:13.384854" level="INFO">${current_ssh_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:45:13.384555" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:13.386026" 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.79" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:13.385051" elapsed="0.001041"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:45:13.387053" level="INFO">${conn_id} = 68</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:45:13.386264" elapsed="0.000816"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:45:13.388716" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:45:13.389018" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:45:13.388087" elapsed="0.001032"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:45:13.389411" elapsed="0.000721"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:45:13.391414" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:45:13.987226" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:45:13 UTC 2026

  System load:  0.0                Processes:             122
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:43:31 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:45:13.391094" elapsed="0.596299"/>
</kw>
<msg time="2026-08-22T23:45:13.987543" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:45:13.390433" elapsed="0.597243"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:45:13.387346" elapsed="0.600588"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:45:13.988563" level="INFO">Executing command 'ps axf | grep org.apache.karaf | grep -v grep | awk '{print "kill -9 " $1}' | sh'.</msg>
<msg time="2026-08-22T23:45:14.011119" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:45:14.011419" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:45:14.011518" 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-08-22T23:45:13.988205" elapsed="0.023364"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:45:14.012089" elapsed="0.000467"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:14.014217" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:14.013007" elapsed="0.001310"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:45:14.014982" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:14.014533" elapsed="0.000743"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:14.014479" elapsed="0.000859"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:45:14.015866" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-08-22T23:45:14.015463" elapsed="0.000616"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:14.015428" elapsed="0.000689"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:45:14.016166" 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-08-22T23:45:14.022093" elapsed="0.000205"/>
</kw>
<msg time="2026-08-22T23:45:14.022385" 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-08-22T23:45:14.020809" elapsed="0.001733"/>
</kw>
<kw name="Open 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-08-22T23:45:14.022983" elapsed="0.000067"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:14.023470" 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-08-22T23:45:14.016650" elapsed="0.007129"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:45:13.382901" elapsed="0.641012"/>
</kw>
<msg time="2026-08-22T23:45:14.023987" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:45:13.382078" elapsed="0.641964"/>
</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-08-22T23:45:13.381471" elapsed="0.642653"/>
</kw>
<msg time="2026-08-22T23:45:14.024166" 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-08-22T23:45:13.380976" elapsed="0.643237"/>
</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-08-22T23:45:14.027520" elapsed="0.000158"/>
</kw>
<msg time="2026-08-22T23:45:14.027721" 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-08-22T23:45:14.027054" elapsed="0.000728"/>
</kw>
<kw name="Open 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-08-22T23:45:14.027936" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:14.028094" 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-08-22T23:45:14.024508" elapsed="0.003668"/>
</kw>
<msg time="2026-08-22T23:45:14.028268" 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-08-22T23:45:13.380114" elapsed="0.648179"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:14.028748" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:14.028477" elapsed="0.000314"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:45:14.028835" 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-08-22T23:45:13.379185" elapsed="0.649775"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:45:13.379011" elapsed="0.649986"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:45:13.378877" elapsed="0.650157"/>
</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-08-22T23:45:13.376831" elapsed="0.652263"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:45:14.029634" 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-08-22T23:45:14.029296" elapsed="0.000366"/>
</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-08-22T23:45:14.029814" elapsed="0.000216"/>
</kw>
<if>
<branch type="IF" condition="not ${confirm}">
<return>
<value>${updated_index_list}</value>
<status status="NOT RUN" start="2026-08-22T23:45:14.030213" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:14.030107" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:14.030088" elapsed="0.000192"/>
</if>
<kw name="Sleep" owner="BuiltIn">
<msg time="2026-08-22T23:45:15.030938" level="INFO">Slept 1 second.</msg>
<msg time="2026-08-22T23:45:15.031093" 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-08-22T23:45:14.030418" elapsed="1.000812"/>
</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-08-22T23:45:15.035259" 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-08-22T23:45:15.034534" elapsed="0.000772"/>
</kw>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:45:15.036631" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:45:15.036198" elapsed="0.000473"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:45:15.037791" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:45:15.037936" level="INFO">${current_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:45:15.037574" elapsed="0.000400"/>
</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-08-22T23:45:15.043746" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:15.043042" elapsed="0.000804"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:15.042964" elapsed="0.000955"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:45:15.044636" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:45:15.044930" level="INFO">${current_ssh_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:45:15.044224" elapsed="0.000816"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:15.046024" level="INFO">Attempting to execute command "ps axf | grep org.apache.karaf | grep -v grep | wc -l" on remote system "10.30.170.79" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:15.045342" elapsed="0.000905"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:45:15.047504" 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-08-22T23:45:15.046553" elapsed="0.001072"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:45:15.049217" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:45:15.049299" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:45:15.048926" 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-08-22T23:45:15.049559" elapsed="0.000361"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:45:15.050988" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:45:15.357061" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:45:13 UTC 2026

  System load:  0.0                Processes:             122
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:45:13 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:45:15.050560" elapsed="0.306632"/>
</kw>
<msg time="2026-08-22T23:45:15.357342" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:45:15.050142" elapsed="0.307285"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:45:15.047995" elapsed="0.309668"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:45:15.358450" level="INFO">Executing command 'ps axf | grep org.apache.karaf | grep -v grep | wc -l'.</msg>
<msg time="2026-08-22T23:45:15.380963" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:45:15.381673" level="INFO">${stdout} = 0</msg>
<msg time="2026-08-22T23:45:15.382053" 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-08-22T23:45:15.358002" elapsed="0.024266"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:45:15.382917" elapsed="0.001190"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:15.386562" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:15.385395" elapsed="0.001748"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:45:15.388265" elapsed="0.000068"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:15.387471" elapsed="0.000965"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:15.387367" elapsed="0.001246"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:45:15.389471" elapsed="0.000209"/>
</return>
<status status="PASS" start="2026-08-22T23:45:15.388918" elapsed="0.000876"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:15.388829" elapsed="0.001114"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:45:15.390139" 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">
<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-08-22T23:45:15.395610" elapsed="0.000153"/>
</kw>
<msg time="2026-08-22T23:45:15.395806" 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-08-22T23:45:15.395064" 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="NOT RUN" start="2026-08-22T23:45:15.396151" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:15.396416" 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-08-22T23:45:15.391481" elapsed="0.005084"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:45:15.041155" elapsed="0.355683"/>
</kw>
<msg time="2026-08-22T23:45:15.396947" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:45:15.039774" elapsed="0.357227"/>
</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-08-22T23:45:15.038991" elapsed="0.358091"/>
</kw>
<msg time="2026-08-22T23:45:15.397123" 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-08-22T23:45:15.038195" elapsed="0.358975"/>
</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-08-22T23:45:15.400510" elapsed="0.000212"/>
</kw>
<msg time="2026-08-22T23:45:15.400765" 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-08-22T23:45:15.399991" 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="NOT RUN" start="2026-08-22T23:45:15.400984" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:15.401144" 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-08-22T23:45:15.397455" elapsed="0.003770"/>
</kw>
<msg time="2026-08-22T23:45:15.401318" 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-08-22T23:45:15.036977" elapsed="0.364367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:15.401789" level="INFO">0</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:15.401514" elapsed="0.000320"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:45:15.401876" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:45:15.402192" 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-08-22T23:45:15.035619" elapsed="0.366600"/>
</kw>
<return>
<value>${count}</value>
<status status="PASS" start="2026-08-22T23:45:15.402268" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:45:15.402418" 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-08-22T23:45:15.033521" elapsed="0.368922"/>
</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-08-22T23:45:15.402617" 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-08-22T23:45:15.032417" elapsed="0.370628"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:45:15.031933" elapsed="0.371144"/>
</iter>
<var>${index}</var>
<value>@{kill_index_list}</value>
<status status="PASS" start="2026-08-22T23:45:15.031423" elapsed="0.371693"/>
</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-08-22T23:45:15.406320" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:45:15.405933" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:45:15.406871" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:45:15.406505" elapsed="0.000399"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:45:15.406953" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:45:15.407122" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:45:15.405537" elapsed="0.001610"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:45:15.408251" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:45:15.407976" elapsed="0.000301"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:45:15.409032" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:45:15.409132" level="INFO">${current_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:45:15.408910" elapsed="0.000248"/>
</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-08-22T23:45:15.413998" elapsed="0.000078"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:15.413306" elapsed="0.000863"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:15.413287" elapsed="0.000909"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:45:15.414460" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:45:15.414642" level="INFO">${current_ssh_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:45:15.414347" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:15.415838" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.200" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:15.414846" elapsed="0.001057"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:45:15.416850" level="INFO">${conn_id} = 70</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:45:15.416078" elapsed="0.000800"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:45:15.418522" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:45:15.418807" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:45:15.417984" 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-08-22T23:45:15.419194" elapsed="0.000656"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:45:15.421132" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:45:16.004202" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:45:15 UTC 2026

  System load:  0.0                Processes:             120
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:43:30 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:45:15.420809" elapsed="0.583664"/>
</kw>
<msg time="2026-08-22T23:45:16.004650" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:45:15.420150" elapsed="0.584617"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:45:15.417138" elapsed="0.587801"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:45:16.005647" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-08-22T23:45:16.018341" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-08-22T23:45:16.018694" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:45:16.018803" 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-08-22T23:45:16.005217" elapsed="0.013641"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:45:16.019374" elapsed="0.000542"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:16.021726" 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-08-22T23:45:16.020365" elapsed="0.001513"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:45:16.022518" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:16.022104" elapsed="0.000704"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:16.022045" elapsed="0.000824"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:45:16.023349" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-08-22T23:45:16.022994" elapsed="0.000659"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:16.022959" elapsed="0.000758"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:45:16.023796" 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-08-22T23:45:16.029371" elapsed="0.000151"/>
</kw>
<msg time="2026-08-22T23:45:16.029603" 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-08-22T23:45:16.028411" elapsed="0.001302"/>
</kw>
<kw name="Open 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-08-22T23:45:16.030000" elapsed="0.000047"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:16.030318" elapsed="0.000044"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:45:16.024502" elapsed="0.006006"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:45:15.412686" elapsed="0.617941"/>
</kw>
<msg time="2026-08-22T23:45:16.030682" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:45:15.410339" elapsed="0.620394"/>
</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-08-22T23:45:15.409816" elapsed="0.620997"/>
</kw>
<msg time="2026-08-22T23:45:16.030854" 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-08-22T23:45:15.409307" elapsed="0.621592"/>
</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-08-22T23:45:16.034261" elapsed="0.000142"/>
</kw>
<msg time="2026-08-22T23:45:16.034446" 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-08-22T23:45:16.033806" elapsed="0.000702"/>
</kw>
<kw name="Open 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-08-22T23:45:16.034682" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:16.034843" 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-08-22T23:45:16.031187" elapsed="0.003737"/>
</kw>
<msg time="2026-08-22T23:45:16.035017" 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-08-22T23:45:15.408489" elapsed="0.626553"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:16.035466" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:16.035217" elapsed="0.000291"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:45:16.035551" elapsed="0.000045"/>
</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-08-22T23:45:15.407524" elapsed="0.628214"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:45:15.407343" elapsed="0.628432"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:45:16.036763" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:45:16.036470" elapsed="0.000319"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:45:16.037557" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:45:16.037675" level="INFO">${current_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:45:16.037434" 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-08-22T23:45:16.040856" elapsed="0.000075"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:16.040176" elapsed="0.000846"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:16.040156" elapsed="0.000893"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:45:16.041311" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:45:16.041497" level="INFO">${current_ssh_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:45:16.041200" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:16.042660" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.12" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:16.041717" elapsed="0.001007"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:45:16.043650" 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-08-22T23:45:16.042895" elapsed="0.000782"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:45:16.045459" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:45:16.045821" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:45:16.044900" elapsed="0.001018"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:45:16.046208" elapsed="0.000618"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:45:16.048140" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:45:16.646591" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:45:16 UTC 2026

  System load:  0.2                Processes:             121
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:43:31 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:45:16.047816" elapsed="0.598948"/>
</kw>
<msg time="2026-08-22T23:45:16.646922" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:45:16.047123" elapsed="0.599931"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:45:16.043940" elapsed="0.603287"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:45:16.647908" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-08-22T23:45:16.660646" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-08-22T23:45:16.660958" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:45:16.661063" 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-08-22T23:45:16.647506" elapsed="0.013613"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:45:16.661681" elapsed="0.000496"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:16.664012" 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-08-22T23:45:16.662645" elapsed="0.001637"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:45:16.664990" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:16.664511" elapsed="0.000731"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:16.664451" elapsed="0.000855"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:45:16.665861" elapsed="0.000068"/>
</return>
<status status="PASS" start="2026-08-22T23:45:16.665438" elapsed="0.000703"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:16.665401" elapsed="0.000806"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:45:16.666290" 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">
<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-08-22T23:45:16.672685" elapsed="0.000208"/>
</kw>
<msg time="2026-08-22T23:45:16.672980" 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-08-22T23:45:16.671362" elapsed="0.001782"/>
</kw>
<kw name="Open 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-08-22T23:45:16.673553" elapsed="0.000089"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:16.674028" 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-08-22T23:45:16.667153" elapsed="0.007142"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:45:16.039549" elapsed="0.634881"/>
</kw>
<msg time="2026-08-22T23:45:16.674504" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:45:16.038909" elapsed="0.635666"/>
</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-08-22T23:45:16.038357" elapsed="0.636364"/>
</kw>
<msg time="2026-08-22T23:45:16.674778" 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-08-22T23:45:16.037856" elapsed="0.636987"/>
</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-08-22T23:45:16.678823" elapsed="0.000144"/>
</kw>
<msg time="2026-08-22T23:45:16.679011" 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-08-22T23:45:16.678310" 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="NOT RUN" start="2026-08-22T23:45:16.679247" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:16.679407" 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-08-22T23:45:16.675280" elapsed="0.004207"/>
</kw>
<msg time="2026-08-22T23:45:16.679596" 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-08-22T23:45:16.037002" elapsed="0.642621"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:16.680073" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:16.679821" elapsed="0.000294"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:45:16.680158" 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-08-22T23:45:16.036060" elapsed="0.644224"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:45:16.035877" elapsed="0.644444"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:45:16.681306" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:45:16.681033" elapsed="0.000300"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:45:16.682094" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:45:16.682195" level="INFO">${current_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:45:16.681970" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:16.685464" elapsed="0.000075"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:16.684799" elapsed="0.000848"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:16.684779" elapsed="0.000897"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:45:16.685936" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:45:16.686091" level="INFO">${current_ssh_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:45:16.685825" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:16.687255" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.79" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:16.686285" elapsed="0.001034"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:45:16.688247" level="INFO">${conn_id} = 72</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:45:16.687488" elapsed="0.000786"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:45:16.689868" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:45:16.690130" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:45:16.689258" elapsed="0.000970"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:45:16.690516" elapsed="0.000736"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:45:16.692519" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:45:17.012056" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:45:13 UTC 2026

  System load:  0.0                Processes:             122
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:45:15 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:45:16.692197" elapsed="0.320025"/>
</kw>
<msg time="2026-08-22T23:45:17.012371" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:45:16.691550" elapsed="0.320936"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:45:16.688532" elapsed="0.324147"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:45:17.013321" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-08-22T23:45:17.025684" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-08-22T23:45:17.025975" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:45:17.026074" 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-08-22T23:45:17.012959" elapsed="0.013166"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:45:17.026641" elapsed="0.000477"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:17.028797" 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-08-22T23:45:17.027531" elapsed="0.001404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:45:17.029689" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:17.029147" elapsed="0.000785"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:17.029092" elapsed="0.000901"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:45:17.030469" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-08-22T23:45:17.030118" elapsed="0.000655"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:17.030083" elapsed="0.000753"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:45:17.030915" 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-08-22T23:45:17.037296" elapsed="0.000205"/>
</kw>
<msg time="2026-08-22T23:45:17.037611" 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-08-22T23:45:17.036052" elapsed="0.001712"/>
</kw>
<kw name="Open 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-08-22T23:45:17.038242" elapsed="0.000065"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:17.038711" elapsed="0.000071"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:45:17.031672" elapsed="0.007312"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:45:16.684167" elapsed="0.354955"/>
</kw>
<msg time="2026-08-22T23:45:17.039196" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:45:16.683500" elapsed="0.355766"/>
</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-08-22T23:45:16.682887" elapsed="0.356492"/>
</kw>
<msg time="2026-08-22T23:45:17.039436" 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-08-22T23:45:16.682373" elapsed="0.357130"/>
</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-08-22T23:45:17.043314" elapsed="0.000142"/>
</kw>
<msg time="2026-08-22T23:45:17.043498" 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-08-22T23:45:17.042867" elapsed="0.000693"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:17.043733" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:17.043912" 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-08-22T23:45:17.039936" elapsed="0.004070"/>
</kw>
<msg time="2026-08-22T23:45:17.044112" 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-08-22T23:45:16.681547" elapsed="0.362590"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:17.044561" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:17.044313" elapsed="0.000306"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:45:17.044662" 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-08-22T23:45:16.680623" elapsed="0.364164"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:45:16.680422" elapsed="0.364403"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:45:15.407203" elapsed="1.637661"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-08-22T23:45:15.403333" elapsed="1.641593"/>
</kw>
<return>
<value>${updated_index_list}</value>
<status status="PASS" start="2026-08-22T23:45:17.044967" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:45:17.045135" 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-08-22T23:45:13.372730" elapsed="3.672431"/>
</kw>
<return>
<value>${updated_index_list}</value>
<status status="PASS" start="2026-08-22T23:45:17.045213" elapsed="0.000025"/>
</return>
<arg>3</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-08-22T23:45:13.174053" elapsed="3.871282"/>
</kw>
<doc>Simulate node 3 crashes just before device data is deleted, fail if node 3 survives.</doc>
<status status="PASS" start="2026-08-22T23:45:12.910693" elapsed="4.134761"/>
</test>
<test id="s1-s6-t17" name="Delete_Device_Data_With_node3_Down" 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-08-22T23:45:17.049288" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:45:17.049024" elapsed="0.000530"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:45:17.050570" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:17.050458" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:17.050439" elapsed="0.000219"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:45:17.055735" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:17.055625" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:17.055606" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:45:17.056832" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:45:17.056434" elapsed="0.000462"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:45:17.057369" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:45:17.057059" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:45:17.057441" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:45:17.057614" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:45:17.056027" elapsed="0.001614"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:45:17.063032" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:17.062924" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:17.062905" 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-08-22T23:45:17.064339" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:17.064228" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:17.064209" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:45:17.064904" level="INFO">${karaf_connection_index} = 53</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:45:17.064556" elapsed="0.000375"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:45:17.065300" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:45:17.065086" elapsed="0.000239"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:45:17.110794" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:45:17.065839" elapsed="0.045196"/>
</kw>
<msg time="2026-08-22T23:45:17.111280" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:45:17.111329" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:45:17.065481" elapsed="0.045884"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:45:17.133550" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "n "o "d "e "3 "_ "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-08-22T23:45:17.112104" elapsed="0.021563"/>
</kw>
<msg time="2026-08-22T23:45:17.133826" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:45:17.133871" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "n "o "d "e ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:45:17.111653" elapsed="0.022253"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:17.134257" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:17.134003" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:17.133974" elapsed="0.000368"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:17.134814" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "n "o "d "e "3 "_ "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-08-22T23:45:17.134487" 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-08-22T23:45:17.135159" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:17.134946" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:17.134928" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:45:17.135275" 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-08-22T23:45:17.137883" elapsed="0.000156"/>
</kw>
<msg time="2026-08-22T23:45:17.138100" 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-08-22T23:45:17.136866" elapsed="0.001364"/>
</kw>
<kw name="Open 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-08-22T23:45:17.138503" elapsed="0.000098"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:17.138860" elapsed="0.000131"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:45:17.136189" elapsed="0.002917"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:45:17.135618" 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-08-22T23:45:17.063833" elapsed="0.075438"/>
</kw>
<msg time="2026-08-22T23:45:17.139365" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:45:17.139411" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "n "o "d "e ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:45:17.063247" elapsed="0.076200"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:45:17.139657" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:45:17.139525" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:17.139506" elapsed="0.000236"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:17.140146" 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-08-22T23:45:17.140499" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:45:17.140571" elapsed="0.000090"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:45:17.062571" elapsed="0.078188"/>
</kw>
<msg time="2026-08-22T23:45:17.140857" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:45:17.140902" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "n "o "d "e ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:45:17.058021" elapsed="0.082916"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:17.141268" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:17.141015" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:17.140997" elapsed="0.000351"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:45:17.057879" elapsed="0.083494"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:45:17.146871" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:17.146745" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:17.146726" 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-08-22T23:45:17.148120" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:17.148012" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:17.147993" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:45:17.148666" level="INFO">${karaf_connection_index} = 67</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:45:17.148346" elapsed="0.000346"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:45:17.149064" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:45:17.148847" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:45:17.193176" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:45:17.149577" elapsed="0.043794"/>
</kw>
<msg time="2026-08-22T23:45:17.193616" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:45:17.193665" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:45:17.149244" elapsed="0.044457"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:45:17.219605" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "n "o "d "e "3 "_ "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-08-22T23:45:17.194385" elapsed="0.025392"/>
</kw>
<msg time="2026-08-22T23:45:17.219972" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:45:17.220020" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "n "o "d "e ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:45:17.193942" elapsed="0.026116"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:17.220578" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:17.220249" elapsed="0.000413"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:17.220213" elapsed="0.000476"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:17.221191" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "n "o "d "e "3 "_ "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-08-22T23:45:17.220836" 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-08-22T23:45:17.221537" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:17.221323" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:17.221305" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:45:17.221676" 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-08-22T23:45:17.224274" elapsed="0.000154"/>
</kw>
<msg time="2026-08-22T23:45:17.224518" 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-08-22T23:45:17.223238" elapsed="0.001438"/>
</kw>
<kw name="Open 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-08-22T23:45:17.224949" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:17.225284" 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-08-22T23:45:17.222568" elapsed="0.002899"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:45:17.221997" 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="PASS" start="2026-08-22T23:45:17.147709" elapsed="0.077947"/>
</kw>
<msg time="2026-08-22T23:45:17.225752" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:45:17.225796" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "n "o "d "e ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:45:17.147119" elapsed="0.078714"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:45:17.226018" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:45:17.225911" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:17.225892" 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-08-22T23:45:17.226507" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:17.226873" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:45:17.226945" 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-08-22T23:45:17.146386" elapsed="0.080668"/>
</kw>
<msg time="2026-08-22T23:45:17.227152" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:45:17.227197" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "n "o "d "e ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:45:17.141704" elapsed="0.085528"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:17.227558" elapsed="0.000130"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:17.227309" elapsed="0.000415"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:17.227291" elapsed="0.000458"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:45:17.141503" elapsed="0.086270"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:45:17.233155" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:17.233047" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:17.233028" 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-08-22T23:45:17.234362" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:17.234254" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:17.234236" elapsed="0.000236"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:45:17.234949" level="INFO">${karaf_connection_index} = 36</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:45:17.234645" elapsed="0.000331"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:45:17.235348" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:45:17.235132" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:45:17.236152" 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-08-22T23:45:17.235885" elapsed="0.001063">OSError: Socket is closed</status>
</kw>
<msg time="2026-08-22T23:45:17.237143" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-08-22T23:45:17.237191" 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-08-22T23:45:17.235529" elapsed="0.001687"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:45:27.238345" 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-08-22T23:45:17.237748" elapsed="10.001511">No match found for 'opendaylight-user.*root.*&gt;' in 10 seconds
Output:
.</status>
</kw>
<msg time="2026-08-22T23:45:27.239526" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-08-22T23:45:27.239576" 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-08-22T23:45:17.237385" elapsed="10.002239"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.240885" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Delete_Device_Data_With_node3_Down"</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-08-22T23:45:27.240098" elapsed="0.000853">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Delete_Device_Data_With_node3_Down"</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:27.239748" elapsed="0.001276">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Delete_Device_Data_With_node3_Down"</status>
</branch>
<status status="FAIL" start="2026-08-22T23:45:27.239709" elapsed="0.001352">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Delete_Device_Data_With_node3_Down"</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-08-22T23:45:27.241230" 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-08-22T23:45:27.241463" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:27.241320" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:27.241301" elapsed="0.000239"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-08-22T23:45:27.241598" 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-08-22T23:45:27.244280" elapsed="0.000168"/>
</kw>
<msg time="2026-08-22T23:45:27.244523" 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-08-22T23:45:27.243199" 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-08-22T23:45:27.244945" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.245271" 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-08-22T23:45:27.242511" 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-08-22T23:45:27.241916" 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="FAIL" start="2026-08-22T23:45:17.233954" elapsed="10.011670">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Delete_Device_Data_With_node3_Down"</status>
</kw>
<msg time="2026-08-22T23:45:27.245730" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:45:27.245775" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Delete_Device_Data_With_node3_Down"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:45:17.233371" elapsed="10.012427"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:45:27.245983" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:27.245875" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.245856" 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-08-22T23:45:27.246913" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:27.246807" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.246789" elapsed="0.000190"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:45:27.247386" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:45:27.247492" level="INFO">${current_ssh_connection_object} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:45:27.247256" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.248010" level="INFO">{1: 53, 2: 67, 3: 36}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:27.247741" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.248476" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:27.248204" elapsed="0.000317"/>
</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-08-22T23:45:27.249054" elapsed="0.000264"/>
</kw>
<msg time="2026-08-22T23:45:27.249418" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:45:27.249464" level="INFO">${old_connection_index} = 36</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-08-22T23:45:27.248693" elapsed="0.000793"/>
</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-08-22T23:45:27.250314" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:45:27.251599" 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-08-22T23:45:27.251165" elapsed="0.001408">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-08-22T23:45:27.250692" elapsed="0.002005"/>
</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-08-22T23:45:27.253326" elapsed="0.000367"/>
</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-08-22T23:45:27.252867" elapsed="0.000908"/>
</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-08-22T23:45:27.249805" elapsed="0.004017"/>
</kw>
<status status="PASS" start="2026-08-22T23:45:27.249563" elapsed="0.004309"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.249544" elapsed="0.004353"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:45:27.254780" level="INFO">${ip_address} = 10.30.170.79</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:45:27.254429" elapsed="0.000378"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:45:27.254856" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:45:27.255010" level="INFO">${odl_ip} = 10.30.170.79</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:45:27.254102" elapsed="0.000933"/>
</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-08-22T23:45:27.255186" elapsed="0.000534"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:45:27.255997" level="INFO">index=73
host=10.30.170.79
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-08-22T23:45:27.256105" level="INFO">${karaf_connection_object} = index=73
host=10.30.170.79
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:45:27.255886" 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-08-22T23:45:27.256287" elapsed="0.002352"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:45:27.259059" level="INFO">Logging into '10.30.170.79:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:45:27.260490" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.79</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-08-22T23:45:27.258799" elapsed="0.002088">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.79</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-08-22T23:45:27.274566" elapsed="0.000617"/>
</kw>
<msg time="2026-08-22T23:45:27.275269" 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-08-22T23:45:27.273327" elapsed="0.002087"/>
</kw>
<kw name="Open 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-08-22T23:45:27.275572" elapsed="0.000039"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.275751" 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-08-22T23:45:27.261682" elapsed="0.014198"/>
</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-08-22T23:45:27.261156" elapsed="0.014772"/>
</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-08-22T23:45:27.246451" elapsed="0.029557">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.79</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-08-22T23:45:27.276346" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:45:27.276433" 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-08-22T23:45:17.232703" elapsed="10.043835">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.79</status>
</kw>
<msg time="2026-08-22T23:45:27.276743" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:45:27.276787" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.79</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:45:17.228046" elapsed="10.048766"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.277142" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:27.276891" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.276873" elapsed="0.000347"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:45:17.227907" elapsed="10.049337"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:45:17.057698" elapsed="10.219588"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:45:17.055245" elapsed="10.222106"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:45:17.050164" elapsed="10.227246"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:45:17.049727" elapsed="10.227738"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:45:17.046572" elapsed="10.230949"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.278150" level="INFO">${mapping} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>RESTCONF_ROOT=${RESTCONF_ROOT}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:45:27.277713" elapsed="0.000464"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.321285" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:27.320912" elapsed="0.000402"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:45:27.322074" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:45:27.321821" elapsed="0.000319">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:45:27.322232" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:45:27.321473" elapsed="0.000783"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.322818" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:45:27.322416" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:45:27.323150" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:45:27.323352" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:45:27.323003" elapsed="0.000386"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.323874" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:27.323606" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.324996" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:27.324733" elapsed="0.000309"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.325468" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:45:27.325199" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.326173" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:45:27.325875" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:45:27.326970" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:45:27.326715" elapsed="0.000281"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:45:27.327048" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:45:27.327206" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:45:27.326383" elapsed="0.000847"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:45:27.327378" elapsed="0.000257"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:45:27.325741" elapsed="0.001936"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.328218" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:45:27.327922" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:45:27.329177" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:45:27.328784" elapsed="0.000419"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:45:27.329254" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:45:27.329405" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:45:27.328425" elapsed="0.001005"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:45:27.329600" elapsed="0.000227"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:45:27.327793" elapsed="0.002075"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:45:27.325546" elapsed="0.004356"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:45:27.329946" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:45:27.330104" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:45:27.324376" elapsed="0.005754"/>
</kw>
<status status="PASS" start="2026-08-22T23:45:27.324057" elapsed="0.006104"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.330348" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:27.330186" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.324035" elapsed="0.006399"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.331185" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:45:27.330597" elapsed="0.000616"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:45:27.331263" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:45:27.320260" elapsed="0.011127"/>
</kw>
<msg time="2026-08-22T23:45:27.331441" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:45:27.307814" elapsed="0.023674"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.343672" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.355897" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.368203" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.368394" 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-08-22T23:45:27.368596" 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-08-22T23:45:27.368962" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:27.368820" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:27.368805" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.369179" 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-08-22T23:45:27.369344" 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-08-22T23:45:27.369505" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:45:27.368777" elapsed="0.000780"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:45:27.368672" elapsed="0.000925"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.369744" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:27.369820" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:45:27.369940" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:45:27.303512" elapsed="0.066454"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.371057" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:27.370808" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:45:27.505122" level="INFO">DELETE Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:27.505226" level="INFO">DELETE Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:27.505425" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:45:27.373210" elapsed="0.132273"/>
</kw>
<status status="PASS" start="2026-08-22T23:45:27.371170" elapsed="0.134403"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.505998" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:27.505664" elapsed="0.000470"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.371152" elapsed="0.135031"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.515017" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:27.508483" elapsed="0.006579"/>
</kw>
<status status="PASS" start="2026-08-22T23:45:27.508001" elapsed="0.007098"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.507961" elapsed="0.007163"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.517726" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:27.515400" elapsed="0.002374"/>
</kw>
<status status="PASS" start="2026-08-22T23:45:27.515181" elapsed="0.002628"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.515164" elapsed="0.002670"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.518389" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:45:27.518006" 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-08-22T23:45:27.518741" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:27.518489" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.519290" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:27.518986" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-08-22T23:45:27.518824" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.518471" elapsed="0.000904"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.519910" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:45:27.519531" 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-08-22T23:45:27.520239" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:27.520007" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.520818" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:27.520477" elapsed="0.000368"/>
</kw>
<status status="PASS" start="2026-08-22T23:45:27.520321" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.519990" 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-08-22T23:45:27.521051" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:45:27.521862" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:45:27.521560" 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-08-22T23:45:27.522041" elapsed="0.002301"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_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-08-22T23:45:27.506990" elapsed="0.017416"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:45:27.524453" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:45:27.526699" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-08-22T23:45:27.370227" elapsed="0.156499"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:45:27.526781" elapsed="0.000027"/>
</return>
<arg>${directory_with_template_folders}${/}datamod1</arg>
<arg>${mapping}</arg>
<arg>session=node1</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-08-22T23:45:27.278951" elapsed="0.247954"/>
</kw>
<arg>${MASTER_CONNECT_TIMEOUT}</arg>
<arg>1s</arg>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${directory_with_template_folders}${/}datamod1</arg>
<arg>${mapping}</arg>
<arg>session=node1</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:45:27.278340" elapsed="0.248620"/>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.528139" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:45:27.527735" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-08-22T23:45:27.528384" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:45:27.528241" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.528223" elapsed="0.000241"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.528666" elapsed="0.000024"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.528844" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.529024" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.529234" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.529400" elapsed="0.000020"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.529563" elapsed="0.000034"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.529741" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.529982" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:27.529826" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:27.529809" elapsed="0.000251"/>
</if>
<arg>5762</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:45:27.527362" elapsed="0.002747"/>
</kw>
<doc>Check that the data removal requests work when node 3 is down.
As ODL may be in the process of connecting possible new master to the device,
the action is retried few times.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-08-22T23:45:17.045851" elapsed="10.484302"/>
</test>
<test id="s1-s6-t18" name="Check_Device_Data_Removal_Is_Visible_On_Nodes_Without_node3" line="214">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:45:27.533760" elapsed="0.000224"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:45:27.533476" 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-08-22T23:45:27.535042" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:27.534927" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.534906" 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-08-22T23:45:27.540209" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:27.540104" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.540086" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.541286" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:45:27.540903" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.541793" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:45:27.541471" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:45:27.541864" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:45:27.542020" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:45:27.540499" 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-08-22T23:45:27.547442" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:27.547336" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.547317" 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-08-22T23:45:27.548705" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:27.548560" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.548542" elapsed="0.000230"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:45:27.549217" level="INFO">${karaf_connection_index} = 53</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:45:27.548915" elapsed="0.000329"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:45:27.549641" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:45:27.549398" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:45:27.587486" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:45:27.550155" elapsed="0.037513"/>
</kw>
<msg time="2026-08-22T23:45:27.587919" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:45:27.587989" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:45:27.549824" elapsed="0.038219"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:45:27.617621" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "R "e "m "o "v "a "l "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "N "o "d "e "s "_ "W "i "t "h "o "u "t "_ "n "o "d "e "3 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:45:27.588960" elapsed="0.028776"/>
</kw>
<msg time="2026-08-22T23:45:27.617897" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:45:27.617944" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "R "e "m "o "v "a "l "_ "I "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:45:27.588377" elapsed="0.029604"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.618288" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:27.618060" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.618039" elapsed="0.000334"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.618840" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "R "e "m "o "v "a "l "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "N "o "d "e "s "_ "W "i "t "h "o "u "t "_ "n "o "d "e "3 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:27.618514" 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-08-22T23:45:27.619199" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:27.618986" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.618968" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:45:27.619311" 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-08-22T23:45:27.621906" elapsed="0.000151"/>
</kw>
<msg time="2026-08-22T23:45:27.622117" 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-08-22T23:45:27.620793" elapsed="0.001456"/>
</kw>
<kw name="Open 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-08-22T23:45:27.622521" elapsed="0.000095"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.622881" 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-08-22T23:45:27.620127" 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-08-22T23:45:27.619597" 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="PASS" start="2026-08-22T23:45:27.548261" elapsed="0.074961"/>
</kw>
<msg time="2026-08-22T23:45:27.623314" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:45:27.623358" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "R "e "m "o "v "a "l "_ "I "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:45:27.547671" elapsed="0.075725"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:45:27.623787" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-08-22T23:45:27.623472" elapsed="0.000378"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.623454" elapsed="0.000420"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.624278" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.624638" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:45:27.624711" 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-08-22T23:45:27.547001" elapsed="0.077845"/>
</kw>
<msg time="2026-08-22T23:45:27.624939" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:45:27.624981" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "R "e "m "o "v "a "l "_ "I "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:45:27.542414" elapsed="0.082604"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.625341" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:27.625093" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.625076" elapsed="0.000375"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:45:27.542273" elapsed="0.083205"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:45:27.630951" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:27.630843" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.630824" 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-08-22T23:45:27.632176" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:27.632068" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.632049" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:45:27.632699" level="INFO">${karaf_connection_index} = 67</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:45:27.632385" elapsed="0.000340"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:45:27.633120" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:45:27.632904" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:45:27.679163" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:45:27.633658" elapsed="0.045604"/>
</kw>
<msg time="2026-08-22T23:45:27.679437" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:45:27.679483" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:45:27.633302" elapsed="0.046218"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:45:27.723476" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "R "e "m "o "v "a "l "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "N "o "d "e "s "_ "W "i "t "h "o "u "t "_ "n "o "d "e "3 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:45:27.680059" elapsed="0.043544"/>
</kw>
<msg time="2026-08-22T23:45:27.723762" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:45:27.723808" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "R "e "m "o "v "a "l "_ "I "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:45:27.679707" elapsed="0.044137"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.724139" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:27.723920" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.723901" elapsed="0.000316"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.724673" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "R "e "m "o "v "a "l "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "N "o "d "e "s "_ "W "i "t "h "o "u "t "_ "n "o "d "e "3 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:27.724358" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.725058" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:27.724815" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.724798" elapsed="0.000338"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:45:27.725169" 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-08-22T23:45:27.727675" elapsed="0.000153"/>
</kw>
<msg time="2026-08-22T23:45:27.727889" 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-08-22T23:45:27.726618" 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-08-22T23:45:27.728279" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.728628" 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-08-22T23:45:27.725988" elapsed="0.002822"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:45:27.725426" elapsed="0.003462"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:45:27.631762" elapsed="0.097225"/>
</kw>
<msg time="2026-08-22T23:45:27.729079" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:45:27.729123" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "R "e "m "o "v "a "l "_ "I "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:45:27.631170" elapsed="0.098027"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:45:27.729385" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:45:27.729277" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.729258" 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-08-22T23:45:27.730079" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.730418" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:45:27.730491" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:45:27.630488" elapsed="0.100192"/>
</kw>
<msg time="2026-08-22T23:45:27.730777" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:45:27.730821" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "R "e "m "o "v "a "l "_ "I "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:45:27.625852" elapsed="0.105007"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.731186" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:27.730935" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.730918" elapsed="0.000346"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:45:27.625705" elapsed="0.105583"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:45:27.736701" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:27.736591" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.736559" 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-08-22T23:45:27.737940" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:27.737832" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.737814" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:45:27.738443" level="INFO">${karaf_connection_index} = 73</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:45:27.738150" elapsed="0.000319"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:45:27.738857" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:45:27.738643" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:45:27.739670" 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-08-22T23:45:27.739376" elapsed="0.000953">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-08-22T23:45:27.740513" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-08-22T23:45:27.740559" 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-08-22T23:45:27.739040" elapsed="0.001565"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:45:27.741390" 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-08-22T23:45:27.741144" elapsed="0.000908">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-08-22T23:45:27.742232" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-08-22T23:45:27.742279" 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-08-22T23:45:27.740774" elapsed="0.001528"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.743232" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_Device_Data_Removal_Is_Visible_On_Nodes_Without_node3"</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-08-22T23:45:27.742630" elapsed="0.000664">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_Device_Data_Removal_Is_Visible_On_Nodes_Without_node3"</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:27.742383" elapsed="0.000982">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_Device_Data_Removal_Is_Visible_On_Nodes_Without_node3"</status>
</branch>
<status status="FAIL" start="2026-08-22T23:45:27.742361" elapsed="0.001037">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_Device_Data_Removal_Is_Visible_On_Nodes_Without_node3"</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-08-22T23:45:27.743630" 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-08-22T23:45:27.743862" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:27.743721" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:27.743703" elapsed="0.000236"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-08-22T23:45:27.743974" 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-08-22T23:45:27.746687" elapsed="0.000152"/>
</kw>
<msg time="2026-08-22T23:45:27.746902" 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-08-22T23:45:27.745626" 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-08-22T23:45:27.747298" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.747688" 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-08-22T23:45:27.744819" elapsed="0.003052"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:45:27.744243" 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="FAIL" start="2026-08-22T23:45:27.737507" elapsed="0.010515">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_Device_Data_Removal_Is_Visible_On_Nodes_Without_node3"</status>
</kw>
<msg time="2026-08-22T23:45:27.748125" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:45:27.748170" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_Device_Data_Removal_Is_Visible_On_Nodes_Without_node3"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:45:27.736946" elapsed="0.011248"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:45:27.748384" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:27.748271" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.748252" 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-08-22T23:45:27.749342" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:27.749236" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.749217" elapsed="0.000192"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:45:27.749723" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:45:27.749828" level="INFO">${current_ssh_connection_object} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:45:27.749558" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.750263" level="INFO">{1: 53, 2: 67, 3: 73}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:27.750002" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.750723" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:27.750456" 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-08-22T23:45:27.751277" elapsed="0.000256"/>
</kw>
<msg time="2026-08-22T23:45:27.751663" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:45:27.751710" level="INFO">${old_connection_index} = 73</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-08-22T23:45:27.750922" elapsed="0.000811"/>
</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-08-22T23:45:27.752533" elapsed="0.000212"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:45:27.753825" 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-08-22T23:45:27.753402" elapsed="0.001274">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-08-22T23:45:27.752927" 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-08-22T23:45:27.755396" elapsed="0.000298"/>
</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-08-22T23:45:27.754943" elapsed="0.000834"/>
</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-08-22T23:45:27.752028" elapsed="0.003796"/>
</kw>
<status status="PASS" start="2026-08-22T23:45:27.751809" elapsed="0.004100"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.751790" elapsed="0.004145"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:45:27.756805" level="INFO">${ip_address} = 10.30.170.79</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:45:27.756463" elapsed="0.000368"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:45:27.756909" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:45:27.757062" level="INFO">${odl_ip} = 10.30.170.79</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:45:27.756138" elapsed="0.000949"/>
</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-08-22T23:45:27.757237" elapsed="0.000447"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:45:27.757961" level="INFO">index=74
host=10.30.170.79
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-08-22T23:45:27.758063" level="INFO">${karaf_connection_object} = index=74
host=10.30.170.79
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:45:27.757851" elapsed="0.000238"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:45:27.758234" elapsed="0.002569"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:45:27.761245" level="INFO">Logging into '10.30.170.79:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:45:27.762027" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.79</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-08-22T23:45:27.760983" elapsed="0.001422">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.79</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-08-22T23:45:27.776275" elapsed="0.000401"/>
</kw>
<msg time="2026-08-22T23:45:27.776764" 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-08-22T23:45:27.774889" elapsed="0.002034"/>
</kw>
<kw name="Open 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-08-22T23:45:27.777084" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.777245" 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-08-22T23:45:27.763214" elapsed="0.014112"/>
</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-08-22T23:45:27.762701" elapsed="0.014671"/>
</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-08-22T23:45:27.748942" elapsed="0.028510">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.79</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-08-22T23:45:27.777877" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:45:27.777951" 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-08-22T23:45:27.736238" elapsed="0.041816">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.79</status>
</kw>
<msg time="2026-08-22T23:45:27.778158" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:45:27.778202" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.79</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:45:27.731547" elapsed="0.046678"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.778550" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:27.778301" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.778282" elapsed="0.000362"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:45:27.731410" elapsed="0.047259"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:45:27.542100" elapsed="0.236600"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:45:27.539743" elapsed="0.239017"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:45:27.534632" elapsed="0.244223"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:45:27.534189" elapsed="0.244714"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:45:27.531166" elapsed="0.247792"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.780535" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:27.780155" elapsed="0.000454"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.788139" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:27.787888" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.788599" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:27.788338" 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-08-22T23:45:27.807018" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:27.807173" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:45:27.807271" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:45:27.790880" elapsed="0.016416"/>
</kw>
<status status="PASS" start="2026-08-22T23:45:27.788713" elapsed="0.018626"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.807722" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:27.807366" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.788695" elapsed="0.019220"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.815640" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:27.810202" elapsed="0.005551"/>
</kw>
<status status="PASS" start="2026-08-22T23:45:27.809723" elapsed="0.006109"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.809682" elapsed="0.006207"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.819464" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:27.816501" elapsed="0.003011"/>
</kw>
<status status="PASS" start="2026-08-22T23:45:27.816014" elapsed="0.003534"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.815978" elapsed="0.003596"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.820145" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:45:27.819756" 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-08-22T23:45:27.820487" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:27.820244" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.821072" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:27.820751" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-08-22T23:45:27.820571" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.820226" elapsed="0.000934"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.821705" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:45:27.821320" 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-08-22T23:45:27.822144" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:27.821803" elapsed="0.000402"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.822728" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:27.822391" elapsed="0.000365"/>
</kw>
<status status="PASS" start="2026-08-22T23:45:27.822231" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.821785" 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-08-22T23:45:27.823014" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:45:27.823839" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:45:27.823532" 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-08-22T23:45:27.824019" elapsed="0.002339"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:45:27.808737" elapsed="0.017690"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:45:27.826618" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-08-22T23:45:27.826496" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.826478" 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-08-22T23:45:27.826853" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:27.826923" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:45:27.829287" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:45:27.783274" elapsed="0.046043"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:45:27.829376" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:45:27.829528" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:45:27.780823" elapsed="0.048732"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:45:27.829851" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-08-22T23:45:27.829642" elapsed="0.000568"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.829624" elapsed="0.000612"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.830492" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:27.830291" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-08-22T23:45:27.830275" elapsed="0.000298"/>
</if>
<arg>node1</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="PASS" start="2026-08-22T23:45:27.779786" elapsed="0.050852"/>
</kw>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>node1</arg>
<arg>${empty_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:45:27.779132" elapsed="0.051556"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.832153" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:27.831774" elapsed="0.000406"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.839807" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:27.839540" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:27.840250" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:27.840005" 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-08-22T23:45:27.848992" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:27.849121" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:27.849231" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:27.842430" elapsed="0.007289">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:27.840361" elapsed="0.009474">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.850108" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:27.849885" elapsed="0.000319"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:27.840343" elapsed="0.009897">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.850805" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:27.851004" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:27.850949" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:27.850923" elapsed="0.000176"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.851308" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:27.851411" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:27.835208" elapsed="0.016355">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:27.851687" elapsed="0.000024"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:27.832389" elapsed="0.019439">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.852155" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:27.851944" elapsed="0.000292"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:27.851920" elapsed="0.000351"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:27.852554" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:27.852351" elapsed="0.000307"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:27.852328" elapsed="0.000365"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:27.831395" elapsed="0.021413">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:28.855793" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:28.854805" elapsed="0.001059"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:28.867119" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:28.866847" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:28.867568" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:28.867321" 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-08-22T23:45:28.877527" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:28.877765" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:28.878036" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:28.869772" elapsed="0.008788">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:28.867706" elapsed="0.010991">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:28.878965" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:28.878747" elapsed="0.000309"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:28.867682" elapsed="0.011407">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:28.879641" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:28.879834" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:28.879779" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:28.879755" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:28.880132" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:28.880231" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:28.860892" elapsed="0.019485">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:28.880479" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:28.856358" elapsed="0.024274">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:28.880944" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:28.880744" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:28.880721" elapsed="0.000333"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:28.881321" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:28.881128" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:28.881107" elapsed="0.000328"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:28.853697" elapsed="0.027844">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:29.884473" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:29.883481" elapsed="0.001063"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:29.895971" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:29.895708" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:29.896424" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:29.896172" 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-08-22T23:45:29.905512" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:29.905696" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:29.905880" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:29.898621" elapsed="0.007645">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:29.896542" elapsed="0.009807">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:29.906546" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:29.906385" elapsed="0.000244"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:29.896521" elapsed="0.010133">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:29.907057" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:29.907195" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:29.907155" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:29.907138" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:29.907401" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:29.907471" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:29.891063" elapsed="0.016524">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:29.907660" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:29.885065" elapsed="0.022690">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:29.907978" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:29.907834" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:29.907818" elapsed="0.000239"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:29.908249" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:29.908110" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:29.908094" elapsed="0.000233"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:29.882400" elapsed="0.026003">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:30.911330" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:30.910336" elapsed="0.001064"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:30.921770" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:30.921491" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:30.922218" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:30.921971" 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-08-22T23:45:30.930992" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:30.931155" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:30.931334" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:30.924409" elapsed="0.007447">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:30.922336" elapsed="0.009634">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:30.932233" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:30.932019" elapsed="0.000306"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:30.922315" elapsed="0.010043">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:30.932905" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:30.933096" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:30.933043" elapsed="0.000113"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:30.933019" elapsed="0.000167"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:30.933380" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:30.933477" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:30.915867" elapsed="0.017774">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:30.933739" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:30.911985" elapsed="0.021886">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:30.934177" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:30.933981" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:30.933957" elapsed="0.000331"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:30.934558" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:30.934362" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:30.934341" elapsed="0.000348"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:30.909274" elapsed="0.025523">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:31.938039" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:31.936986" elapsed="0.001132"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:31.949758" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:31.949476" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:31.950207" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:31.949959" 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-08-22T23:45:31.959199" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:31.959386" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:31.959625" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:31.952412" elapsed="0.007640">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:31.950336" elapsed="0.009804">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:31.960335" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:31.960179" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:31.950308" elapsed="0.010117">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:31.960848" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:31.960991" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:31.960947" elapsed="0.000091"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:31.960930" elapsed="0.000129"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:31.961204" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:31.961273" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:31.944856" elapsed="0.016524">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:31.961452" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:31.938659" elapsed="0.022887">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:31.961782" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:31.961639" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:31.961622" elapsed="0.000238"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:31.962050" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:31.961912" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:31.961897" elapsed="0.000229"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:31.935772" elapsed="0.026431">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:32.965220" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:32.964208" elapsed="0.001086"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:32.977242" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:32.976980" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:32.977749" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:32.977479" 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-08-22T23:45:32.988350" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:32.988537" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:32.988758" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:32.980133" elapsed="0.009041">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:32.977870" elapsed="0.011393">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:32.989491" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:32.989300" elapsed="0.000259"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:32.977847" elapsed="0.011752">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:32.989991" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:32.990133" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:32.990091" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:32.990074" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:32.990343" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:32.990413" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:32.972462" elapsed="0.018061">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:32.990607" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:32.965887" elapsed="0.024817">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:32.990927" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:32.990783" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:32.990767" elapsed="0.000239"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:32.991197" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:32.991059" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:32.991044" elapsed="0.000232"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:32.963123" elapsed="0.028229">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:33.994262" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:33.993242" elapsed="0.001095"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:34.006559" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:34.006164" elapsed="0.000491"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:34.007251" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:34.006885" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:45:34.017673" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:34.017884" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:34.018153" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:34.010307" elapsed="0.008401">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:34.007428" elapsed="0.011400">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:34.019106" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:34.018880" elapsed="0.000318"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:34.007394" elapsed="0.011838">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:34.019795" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:34.019991" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:34.019935" elapsed="0.000124"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:34.019911" elapsed="0.000179"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:34.020288" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:34.020387" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:33.999768" elapsed="0.020768">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:34.020654" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:33.994864" elapsed="0.025921">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:34.021094" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:34.020894" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:34.020871" elapsed="0.000334"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:34.021473" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:34.021279" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:34.021257" elapsed="0.000346"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:33.992218" elapsed="0.029496">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:35.024809" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:35.023798" elapsed="0.001086"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:35.038023" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:35.037645" elapsed="0.000449"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:35.038680" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:35.038309" elapsed="0.000469"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:45:35.047774" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:35.047941" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:35.048129" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:35.041161" elapsed="0.007362">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:35.038895" elapsed="0.009773">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:35.048934" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:35.048718" elapsed="0.000308"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:35.038862" elapsed="0.010197">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:35.049621" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:35.049816" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:35.049762" elapsed="0.000115"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:35.049736" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:35.050106" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:35.050203" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:35.031015" elapsed="0.019334">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:35.050444" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:35.025382" elapsed="0.025191">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:35.050954" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:35.050704" elapsed="0.000330"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:35.050681" elapsed="0.000386"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:35.051335" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:35.051142" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:35.051120" elapsed="0.000324"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:35.022669" elapsed="0.028887">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:36.054532" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:36.053544" elapsed="0.001095"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:36.067502" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:36.067190" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:36.067970" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:36.067721" 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-08-22T23:45:36.077080" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:36.077245" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:36.077432" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:36.070185" elapsed="0.007657">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:36.068094" elapsed="0.009831">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:36.078117" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:36.077962" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:36.068070" elapsed="0.010139">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:36.078601" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:36.078744" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:36.078703" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:36.078684" elapsed="0.000128"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:36.078957" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:36.079029" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:36.060791" elapsed="0.018345">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:36.079206" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:36.055135" elapsed="0.024191">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:36.079553" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:36.079409" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:36.079393" elapsed="0.000258"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:36.079845" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:36.079705" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:36.079689" elapsed="0.000236"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:36.052456" elapsed="0.027547">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:37.083001" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:37.082007" elapsed="0.001066"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:37.094254" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:37.093883" elapsed="0.000439"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:37.094913" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:37.094538" 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-08-22T23:45:37.104426" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:37.104599" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:37.104785" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:37.097695" elapsed="0.007481">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:37.095081" elapsed="0.010179">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:37.105452" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:37.105295" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:37.095051" elapsed="0.010493">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:37.105947" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:37.106088" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:37.106047" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:37.106030" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:37.106299" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:37.106371" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:37.087459" elapsed="0.019017">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:37.106548" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:37.083563" elapsed="0.023100">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:37.106889" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:37.106744" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:37.106727" elapsed="0.000242"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:37.107164" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:37.107023" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:37.107007" elapsed="0.000237"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:37.080943" elapsed="0.026380">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:38.110231" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:38.109250" elapsed="0.001053"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:38.123416" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:38.123050" elapsed="0.000435"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:38.124075" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:38.123725" 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-08-22T23:45:38.133206" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:38.133361" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:38.133543" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:38.126516" elapsed="0.007440">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:38.124241" elapsed="0.009798">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:38.134231" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:38.134074" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:38.124212" elapsed="0.010109">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:38.134722" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:38.134861" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:38.134820" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:38.134802" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:38.135072" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:38.135146" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:38.116404" elapsed="0.018848">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:38.135322" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:38.110824" elapsed="0.024591">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:38.135653" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:38.135494" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:38.135477" elapsed="0.000257"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:38.135928" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:38.135788" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:38.135772" elapsed="0.000234"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:38.108189" elapsed="0.027896">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:39.139054" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:39.138070" elapsed="0.001056"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:39.150703" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:39.150422" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:39.151165" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:39.150914" 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-08-22T23:45:39.160022" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:39.160189" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:39.160369" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:39.153371" elapsed="0.007499">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:39.151287" elapsed="0.009700">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:39.161253" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:39.161035" elapsed="0.000311"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:39.151265" elapsed="0.010114">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:39.161926" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:39.162117" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:39.162062" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:39.162037" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:39.162406" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:39.162504" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:39.144305" elapsed="0.018367">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:39.162770" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:39.139657" elapsed="0.023246">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:39.163210" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:39.163011" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:39.162989" elapsed="0.000331"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:39.163609" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:39.163394" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:39.163373" elapsed="0.000349"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:39.137017" elapsed="0.026822">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:40.166740" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:40.165737" elapsed="0.001074"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:40.178246" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:40.177986" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:40.178712" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:40.178448" 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-08-22T23:45:40.187926" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:40.188132" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:40.188355" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:40.180886" elapsed="0.007994">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:40.178832" elapsed="0.010162">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:40.189257" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:40.189042" elapsed="0.000307"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:40.178811" elapsed="0.010593">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:40.189955" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:40.190147" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:40.190091" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:40.190067" elapsed="0.000170"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:40.190435" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:40.190534" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:40.171678" elapsed="0.019021">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:40.190797" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:40.167354" elapsed="0.023574">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:40.191235" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:40.191038" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:40.191015" elapsed="0.000331"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:40.191634" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:40.191421" elapsed="0.000292"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:40.191399" elapsed="0.000347"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:40.164670" elapsed="0.027307">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:41.194948" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:41.193963" elapsed="0.001057"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:41.206939" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:41.206558" elapsed="0.000448"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:41.207564" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:41.207218" 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-08-22T23:45:41.217019" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:41.217183" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:41.217365" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:41.210504" elapsed="0.007266">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:41.207782" elapsed="0.010072">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:41.218132" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:41.217889" elapsed="0.000313"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:41.207744" elapsed="0.010484">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:41.218629" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:41.218825" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:41.218768" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:41.218742" elapsed="0.000176"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:41.219116" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:41.219214" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:41.200220" elapsed="0.019146">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:41.219461" elapsed="0.000026"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:41.195511" elapsed="0.024106">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:41.219927" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:41.219728" elapsed="0.000282"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:41.219705" elapsed="0.000337"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:41.220308" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:41.220116" elapsed="0.000267"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:41.220094" elapsed="0.000320"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:41.192894" elapsed="0.027633">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:42.223689" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:42.222673" elapsed="0.001095"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:42.235244" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:42.234981" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:42.235715" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:42.235446" 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-08-22T23:45:42.245129" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:42.245296" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:42.245480" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:42.238080" elapsed="0.007907">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:42.235837" elapsed="0.010264">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:42.246366" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:42.246151" elapsed="0.000346"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:42.235814" elapsed="0.010718">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:42.247086" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:42.247279" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:42.247223" elapsed="0.000121"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:42.247198" elapsed="0.000177"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:42.247573" elapsed="0.000051"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:42.247692" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:42.228656" elapsed="0.019182">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:42.247932" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:42.224265" elapsed="0.023796">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:42.248363" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:42.248167" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:42.248145" elapsed="0.000327"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:42.248758" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:42.248545" elapsed="0.000290"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:42.248524" elapsed="0.000343"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:42.221464" elapsed="0.027513">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:43.252051" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:43.251033" elapsed="0.001092"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:43.263836" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:43.263557" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:43.264284" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:43.264037" 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-08-22T23:45:43.273704" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:43.273873" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:43.274053" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:43.266465" elapsed="0.007976">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:43.264408" elapsed="0.010116">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:43.274739" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:43.274561" elapsed="0.000246"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:43.264382" elapsed="0.010450">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:43.275248" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:43.275388" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:43.275347" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:43.275330" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:43.275613" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:43.275684" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:43.258149" elapsed="0.017659">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:43.275906" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:43.252652" elapsed="0.023386">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:43.276343" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:43.276146" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:43.276123" elapsed="0.000330"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:43.276740" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:43.276527" elapsed="0.000291"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:43.276506" elapsed="0.000345"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:43.249919" elapsed="0.027039">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:44.279745" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:44.278741" elapsed="0.001077"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:44.291837" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:44.291403" elapsed="0.000482"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:44.292287" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:44.292037" 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-08-22T23:45:44.300617" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:44.300798" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:44.301018" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:44.294465" elapsed="0.007057">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:44.292406" elapsed="0.009250">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:44.301924" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:44.301706" elapsed="0.000310"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:44.292383" elapsed="0.009666">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:44.302595" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:44.302787" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:44.302734" elapsed="0.000113"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:44.302709" elapsed="0.000168"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:44.303076" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:44.303173" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:44.285093" elapsed="0.018223">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:44.303413" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:44.280304" elapsed="0.023265">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:44.303898" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:44.303698" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:44.303675" elapsed="0.000334"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:44.304275" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:44.304083" elapsed="0.000267"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:44.304062" elapsed="0.000321"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:44.277758" elapsed="0.026732">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:45.307089" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:45.306143" elapsed="0.001013"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:45.319418" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:45.319157" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:45.319885" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:45.319636" 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-08-22T23:45:45.328648" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:45.328803" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:45.329013" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:45.322085" elapsed="0.007426">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:45.320002" elapsed="0.009641">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:45.329908" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:45.329692" elapsed="0.000309"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:45.319981" elapsed="0.010054">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:45.330559" elapsed="0.000056"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:45.330775" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:45.330721" elapsed="0.000113"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:45.330692" elapsed="0.000172"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:45.331059" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:45.331156" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:45.311525" elapsed="0.019774">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:45.331394" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:45.307663" elapsed="0.023860">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:45.331852" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:45.331653" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:45.331630" elapsed="0.000333"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:45.332278" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:45.332075" elapsed="0.000282"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:45.332050" elapsed="0.000339"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:45.305198" elapsed="0.027299">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:46.335300" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:46.334323" elapsed="0.001049"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:46.346390" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:46.346028" elapsed="0.000430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:46.347038" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:46.346693" 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-08-22T23:45:46.399862" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:46.400078" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:46.400331" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:46.393137" elapsed="0.007774">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:46.347204" elapsed="0.053831">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:46.401312" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:46.401086" elapsed="0.000321"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:46.347176" elapsed="0.054265">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:46.402015" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:46.402213" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:46.402158" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:46.402133" 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-08-22T23:45:46.402504" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:46.402623" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:46.339959" elapsed="0.062816">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:46.402879" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:46.335895" elapsed="0.067117">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:46.403376" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:46.403123" elapsed="0.000354"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:46.403100" elapsed="0.000416"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:46.403888" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:46.403645" elapsed="0.000333"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:46.403616" elapsed="0.000399"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:46.333308" elapsed="0.070830">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:47.407223" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:47.406248" elapsed="0.001044"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:47.418539" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:47.418274" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:47.419031" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:47.418779" 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-08-22T23:45:47.428355" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:47.428522" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:47.428719" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:47.421282" elapsed="0.007862">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:47.419153" elapsed="0.010086">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:47.429440" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:47.429284" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:47.419131" elapsed="0.010398">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:47.429963" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:47.430154" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:47.430099" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:47.430075" elapsed="0.000170"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:47.430440" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:47.430538" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:47.413496" elapsed="0.017208">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:47.430800" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:47.407812" elapsed="0.023122">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:47.431239" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:47.431042" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:47.431019" elapsed="0.000330"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:47.431634" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:47.431422" elapsed="0.000290"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:47.431401" elapsed="0.000343"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:47.405244" elapsed="0.026606">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:48.434935" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:48.433935" elapsed="0.001071"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:48.446378" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:48.446113" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:48.446843" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:48.446594" 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-08-22T23:45:48.456532" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:48.456723" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:48.456920" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:48.449042" elapsed="0.008278">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:48.446968" elapsed="0.010439">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:48.457634" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:48.457445" elapsed="0.000256"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:48.446942" elapsed="0.010784">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:48.458121" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:48.458264" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:48.458221" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:48.458203" elapsed="0.000131"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:48.458476" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:48.458545" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:48.441156" elapsed="0.017514">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:48.458739" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:48.435497" elapsed="0.023337">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:48.459054" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:48.458911" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:48.458895" elapsed="0.000236"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:48.459323" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:48.459184" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:48.459168" elapsed="0.000231"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:48.432832" elapsed="0.026643">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:49.462486" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:49.461417" elapsed="0.001141"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:49.474774" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:49.474472" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:49.475229" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:49.474979" 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-08-22T23:45:49.484603" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:49.484764" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:49.484940" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:49.477426" elapsed="0.007895">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:49.475352" elapsed="0.010052">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:49.485612" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:49.485440" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:49.475329" elapsed="0.010377">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:49.486084" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:49.486240" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:49.486199" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:49.486180" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:49.486453" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:49.486524" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:49.468668" elapsed="0.017978">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:49.486718" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:49.463090" elapsed="0.023724">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:49.487040" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:49.486894" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:49.486878" elapsed="0.000243"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:49.487315" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:49.487175" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:49.487160" elapsed="0.000234"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:49.460334" elapsed="0.027138">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:50.491347" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:50.490101" elapsed="0.001307"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:50.501483" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:50.501218" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:50.501975" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:50.501703" 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-08-22T23:45:50.511754" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:50.511931" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:50.512167" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:50.504269" elapsed="0.008452">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:50.502103" elapsed="0.010754">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:50.513201" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:50.512908" elapsed="0.000412"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:50.502078" elapsed="0.011288">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:50.513998" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:50.514197" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:50.514142" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:50.514116" 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-08-22T23:45:50.514548" elapsed="0.000067"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:50.514736" elapsed="0.000032"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:50.495455" elapsed="0.019493">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:50.515055" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:50.491815" elapsed="0.023376">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:50.515522" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:50.515300" elapsed="0.000328"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:50.515277" elapsed="0.000386"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:50.515953" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:50.515741" elapsed="0.000315"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:50.515718" elapsed="0.000372"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:50.488643" elapsed="0.027559">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:51.519416" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:51.518296" elapsed="0.001200"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:51.531985" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:51.531713" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:51.532435" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:51.532187" 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-08-22T23:45:51.541923" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:51.542098" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:51.542298" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:51.534647" elapsed="0.008074">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:51.532561" elapsed="0.010244">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:51.542998" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:51.542842" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:51.532536" elapsed="0.010551">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:51.543483" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:51.543639" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:51.543596" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:51.543564" elapsed="0.000143"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:51.543848" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:51.543922" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:51.526039" elapsed="0.017992">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:51.544101" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:51.520058" elapsed="0.024137">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:51.544414" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:51.544273" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:51.544257" elapsed="0.000236"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:51.544701" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:51.544546" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:51.544531" elapsed="0.000249"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:51.517171" elapsed="0.027686">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:52.547844" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:52.546832" elapsed="0.001088"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:52.559896" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:52.559620" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:52.560490" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:52.560097" 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-08-22T23:45:52.573177" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:52.573668" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:52.574188" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:52.562720" elapsed="0.012528">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:52.560636" elapsed="0.014856">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:52.576249" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:52.575640" elapsed="0.000811"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:52.560612" elapsed="0.015907">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:52.577358" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:52.577535" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:52.577486" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:52.577459" elapsed="0.000172"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:52.577805" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:52.577889" elapsed="0.000018"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:52.554001" elapsed="0.024036">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:52.578120" elapsed="0.000018"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:52.548414" elapsed="0.029826">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:52.578521" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:52.578335" elapsed="0.000265"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:52.578312" elapsed="0.000317"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:52.578859" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:52.578696" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:52.578677" elapsed="0.000277"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:52.545780" elapsed="0.033268">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:53.581972" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:53.581010" elapsed="0.001033"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:53.595846" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:53.595540" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:53.596341" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:53.596063" 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-08-22T23:45:53.605819" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:53.606005" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:53.606203" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:53.598547" elapsed="0.008072">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:53.596466" elapsed="0.010240">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:53.606917" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:53.606744" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:53.596443" elapsed="0.010567">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:53.607426" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:53.607567" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:53.607527" elapsed="0.000104"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:53.607509" elapsed="0.000144"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:53.607797" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:53.607868" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:53.588050" elapsed="0.019928">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:53.608054" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:53.582529" elapsed="0.025620">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:53.608415" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:53.608229" elapsed="0.000244"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:53.608212" elapsed="0.000284"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:53.608708" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:53.608550" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:53.608535" elapsed="0.000253"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:53.579936" elapsed="0.028930">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:54.611669" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:54.610705" elapsed="0.001037"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:54.622866" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:54.622593" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:54.623319" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:54.623073" 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-08-22T23:45:54.634852" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:54.635019" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:54.635215" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:54.625545" elapsed="0.010079">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:54.623444" elapsed="0.012267">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:54.635916" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:54.635749" elapsed="0.000234"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:54.623420" elapsed="0.012587">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:54.636411" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:54.636551" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:54.636511" elapsed="0.000101"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:54.636492" elapsed="0.000143"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:54.636779" elapsed="0.000055"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:54.636887" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:54.618059" elapsed="0.018938">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:54.637065" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:54.612228" elapsed="0.024930">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:54.637382" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:54.637236" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:54.637220" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:54.637667" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:54.637513" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:54.637498" elapsed="0.000248"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:54.609697" elapsed="0.028126">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:55.639870" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:55.639375" elapsed="0.000533"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:55.647484" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:55.647222" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:55.647982" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:55.647730" 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-08-22T23:45:55.657399" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:55.657564" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:55.657767" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:55.650285" elapsed="0.007870">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:55.648104" elapsed="0.010134">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:55.658427" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:55.658272" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:55.648082" elapsed="0.010436">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:55.658920" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:55.659058" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:55.659017" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:55.659000" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:55.659268" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:55.659337" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:55.642671" elapsed="0.016771">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:55.659512" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:55.640140" elapsed="0.019481">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:55.659846" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:55.659702" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:55.659685" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:55.660125" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:55.659980" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:55.659964" elapsed="0.000241"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:55.638621" elapsed="0.021662">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:56.661979" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:56.661513" elapsed="0.000498"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:56.672119" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:56.671860" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:56.672568" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:56.672320" 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-08-22T23:45:56.681682" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:56.681838" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:56.682031" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:56.674790" elapsed="0.007679">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:56.672703" elapsed="0.009910">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:56.682882" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:56.682664" elapsed="0.000310"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:56.672682" elapsed="0.010326">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:56.683526" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:56.683738" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:56.683685" elapsed="0.000113"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:56.683659" elapsed="0.000169"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:56.684025" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:56.684124" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:56.664744" elapsed="0.019525">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:56.684366" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:56.662238" elapsed="0.022260">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:56.684829" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:56.684628" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:56.684604" elapsed="0.000338"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:56.685210" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:56.685016" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:56.684994" elapsed="0.000327"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:56.660938" elapsed="0.024491">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:57.688461" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:57.687439" elapsed="0.001095"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:57.699770" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:57.699489" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:57.700228" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:57.699974" 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-08-22T23:45:57.710285" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:57.710522" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:57.710794" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:57.702458" elapsed="0.008850">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:57.700348" elapsed="0.011074">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:57.711708" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:57.711470" elapsed="0.000332"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:57.700326" elapsed="0.011509">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:57.712363" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:57.712554" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:57.712499" elapsed="0.000137"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:57.712475" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:57.712867" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:57.712965" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:57.693334" elapsed="0.019776">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:57.713207" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:57.689057" elapsed="0.024280">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:57.713665" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:57.713446" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:57.713422" elapsed="0.000356"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:57.714064" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:57.713862" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:57.713840" elapsed="0.000334"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:57.686318" elapsed="0.027963">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:58.717303" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:58.716324" elapsed="0.001051"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:58.732328" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:58.731873" elapsed="0.000538"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:58.733036" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:58.732669" 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-08-22T23:45:58.744031" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:58.744208" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:58.744413" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:58.736364" elapsed="0.008476">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:58.733216" elapsed="0.011710">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:58.745123" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:58.744962" elapsed="0.000228"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:58.733182" elapsed="0.012032">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:58.745648" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:58.745790" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:58.745748" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:58.745731" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:58.746001" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:58.746073" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:58.722364" elapsed="0.023817">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:58.746252" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:58.717895" elapsed="0.028452">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:58.746570" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:58.746426" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:58.746409" elapsed="0.000256"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:58.746860" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:58.746719" elapsed="0.000237"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:58.746703" elapsed="0.000279"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:58.715221" elapsed="0.031840">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:45:59.750004" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:45:59.749018" elapsed="0.001060"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:59.761409" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:59.761041" elapsed="0.000437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:45:59.762061" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:45:59.761713" 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-08-22T23:45:59.772695" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:45:59.772858" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:45:59.773039" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:45:59.765479" elapsed="0.007951">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:45:59.762232" elapsed="0.011281">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:59.773720" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:59.773548" elapsed="0.000239"/>
</branch>
<status status="FAIL" start="2026-08-22T23:45:59.762201" elapsed="0.011610">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:59.774191" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:59.774330" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:45:59.774289" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:59.774272" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:59.774540" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:45:59.774628" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:45:59.754914" elapsed="0.019820">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:45:59.774803" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:45:59.750568" elapsed="0.024329">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:59.775120" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:59.774976" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:59.774959" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:45:59.775393" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:45:59.775253" elapsed="0.000236"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:45:59.775238" elapsed="0.000280"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:45:59.747997" elapsed="0.027624">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:00.778629" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:00.777636" elapsed="0.001069"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:00.789518" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:00.789255" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:00.789988" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:00.789739" 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-08-22T23:46:00.798503" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:00.798685" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:00.798857" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:00.792393" elapsed="0.006851">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:00.790112" elapsed="0.009213">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:00.799565" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:00.799360" elapsed="0.000321"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:00.790091" elapsed="0.009624">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:00.800259" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:00.800454" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:00.800395" elapsed="0.000125"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:00.800371" elapsed="0.000180"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:00.800770" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:00.800871" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:00.783181" elapsed="0.017836">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:00.801114" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:00.779208" elapsed="0.022037">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:00.801556" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:00.801355" elapsed="0.000314"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:00.801332" elapsed="0.000372"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:00.801977" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:00.801780" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:00.801758" elapsed="0.000331"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:00.776515" elapsed="0.025683">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:01.805128" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:01.804125" elapsed="0.001077"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:01.817146" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:01.816783" elapsed="0.000432"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:01.817637" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:01.817375" 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-08-22T23:46:01.826824" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:01.826992" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:01.827197" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:01.820011" elapsed="0.007767">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:01.817761" elapsed="0.010132">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:01.828162" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:01.827943" elapsed="0.000311"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:01.817739" elapsed="0.010551">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:01.828863" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:01.829057" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:01.829002" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:01.828978" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:01.829351" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:01.829450" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:01.810654" elapsed="0.018962">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:01.829716" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:01.805725" elapsed="0.024121">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:01.830152" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:01.829955" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:01.829932" elapsed="0.000332"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:01.830533" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:01.830339" elapsed="0.000307"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:01.830318" elapsed="0.000364"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:01.803094" elapsed="0.027697">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:02.834017" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:02.832832" elapsed="0.001284"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:02.847246" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:02.846985" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:02.847708" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:02.847447" 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-08-22T23:46:02.856781" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:02.856942" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:02.857151" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:02.850129" elapsed="0.007413">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:02.847832" elapsed="0.009809">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:02.857834" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:02.857678" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:02.847811" elapsed="0.010113">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:02.858295" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:02.858433" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:02.858393" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:02.858376" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:02.858657" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:02.858730" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:02.840315" elapsed="0.018520">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:02.858905" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:02.834670" elapsed="0.024328">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:02.859219" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:02.859076" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:02.859060" elapsed="0.000238"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:02.859489" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:02.859351" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:02.859336" elapsed="0.000231"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:02.831763" elapsed="0.027897">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:03.862659" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:03.861659" elapsed="0.001075"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:03.874242" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:03.873981" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:03.874703" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:03.874441" 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-08-22T23:46:03.885323" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:03.885486" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:03.885722" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:03.877158" elapsed="0.008953">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:03.874831" elapsed="0.011363">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:03.886539" elapsed="0.000086"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:03.886229" elapsed="0.000497"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:03.874807" elapsed="0.011974">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:03.887651" elapsed="0.000060"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:03.887959" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:03.887873" elapsed="0.000183"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:03.887834" 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-08-22T23:46:03.888427" elapsed="0.000050"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:03.888616" elapsed="0.000036"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:03.868799" elapsed="0.020058">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:03.889015" elapsed="0.000035"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:03.863228" elapsed="0.026001">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:03.889771" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:03.889406" elapsed="0.000497"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:03.889369" elapsed="0.000589"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:03.890387" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:03.890079" elapsed="0.000432"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:03.890045" elapsed="0.000520"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:03.860517" elapsed="0.030260">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:04.893751" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:04.892766" elapsed="0.001058"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:04.905975" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:04.905713" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:04.906433" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:04.906186" 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-08-22T23:46:04.915181" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:04.915338" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:04.915514" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:04.908827" elapsed="0.007094">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:04.906556" elapsed="0.009447">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:04.916194" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:04.916039" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:04.906534" elapsed="0.009752">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:04.916683" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:04.916822" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:04.916782" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:04.916764" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:04.917032" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:04.917104" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:04.899936" elapsed="0.017274">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:04.917280" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:04.894374" elapsed="0.023006">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:04.917615" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:04.917458" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:04.917442" elapsed="0.000256"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:04.917889" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:04.917751" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:04.917736" elapsed="0.000233"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:04.891719" elapsed="0.026328">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:05.921047" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:05.920056" elapsed="0.001064"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:05.932041" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:05.931777" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:05.932533" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:05.932243" 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-08-22T23:46:05.941627" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:05.941792" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:05.941972" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:05.934958" elapsed="0.007401">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:05.932675" elapsed="0.009772">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:05.942687" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:05.942484" elapsed="0.000273"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:05.932651" elapsed="0.010131">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:05.943164" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:05.943304" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:05.943263" elapsed="0.000094"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:05.943246" elapsed="0.000147"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:05.943611" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:05.943715" elapsed="0.000028"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:05.927319" elapsed="0.016550">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:05.943968" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:05.921642" elapsed="0.022458">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:05.944446" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:05.944211" elapsed="0.000325"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:05.944188" elapsed="0.000382"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:05.944861" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:05.944668" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:05.944645" elapsed="0.000328"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:05.919010" elapsed="0.026072">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:06.948168" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:06.947116" elapsed="0.001128"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:06.960198" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:06.959932" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:06.960667" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:06.960403" 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-08-22T23:46:06.970021" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:06.970189" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:06.970386" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:06.963069" elapsed="0.007733">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:06.960798" elapsed="0.010091">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:06.971081" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:06.970926" elapsed="0.000258"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:06.960772" elapsed="0.010445">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:06.971614" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:06.971753" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:06.971713" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:06.971695" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:06.971962" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:06.972032" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:06.954330" elapsed="0.017809">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:06.972208" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:06.948770" elapsed="0.023531">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:06.972635" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:06.972417" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:06.972394" elapsed="0.000356"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:06.973020" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:06.972825" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:06.972803" elapsed="0.000326"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:06.946032" elapsed="0.027205">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:07.976228" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:07.975194" elapsed="0.001110"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:07.988142" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:07.987812" elapsed="0.000384"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:07.988622" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:07.988357" 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-08-22T23:46:07.997931" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:07.998093" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:07.998277" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:07.991003" elapsed="0.007688">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:07.988748" elapsed="0.010028">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:07.998966" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:07.998811" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:07.988725" elapsed="0.010333">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:07.999432" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:07.999570" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:07.999530" elapsed="0.000103"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:07.999512" elapsed="0.000143"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:07.999828" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:07.999902" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:07.982310" elapsed="0.017698">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:08.000079" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:07.976826" elapsed="0.023348">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:08.000433" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:08.000254" elapsed="0.000259"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:08.000237" elapsed="0.000309"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:08.000841" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:08.000645" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:08.000622" elapsed="0.000331"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:07.974134" elapsed="0.026927">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:09.004146" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:09.003131" elapsed="0.001146"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:09.017017" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:09.016753" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:09.017462" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:09.017217" 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-08-22T23:46:09.026538" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:09.026731" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:09.026933" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:09.019893" elapsed="0.007445">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:09.017605" elapsed="0.009819">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:09.027640" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:09.027462" elapsed="0.000247"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:09.017564" elapsed="0.010170">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:09.028131" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:09.028307" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:09.028264" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:09.028244" 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-08-22T23:46:09.028526" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:09.028612" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:09.010813" elapsed="0.017910">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:09.028793" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:09.004812" elapsed="0.024074">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:09.029108" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:09.028964" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:09.028948" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:09.029396" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:09.029240" elapsed="0.000235"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:09.029225" elapsed="0.000282"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:09.002022" elapsed="0.027614">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:10.032653" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:10.031653" elapsed="0.001131"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:10.045211" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:10.044945" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:10.045673" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:10.045411" 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-08-22T23:46:10.055172" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:10.055342" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:10.055540" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:10.048070" elapsed="0.007893">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:10.045801" elapsed="0.010248">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:10.056251" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:10.056087" elapsed="0.000230"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:10.045776" elapsed="0.010566">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:10.056779" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:10.056921" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:10.056881" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:10.056863" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:10.057133" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:10.057204" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:10.039205" elapsed="0.018110">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:10.057385" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:10.033299" elapsed="0.024182">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:10.057725" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:10.057561" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:10.057544" elapsed="0.000264"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:10.058004" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:10.057863" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:10.057847" elapsed="0.000237"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:10.030531" elapsed="0.027633">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:11.061176" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:11.060172" elapsed="0.001135"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:11.075844" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:11.075539" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:11.076301" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:11.076055" 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-08-22T23:46:11.085284" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:11.085463" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:11.085685" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:11.078516" elapsed="0.007615">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:11.076425" elapsed="0.009805">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:11.086448" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:11.086269" elapsed="0.000248"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:11.076400" elapsed="0.010142">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:11.087003" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:11.087150" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:11.087109" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:11.087090" elapsed="0.000130"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:11.087365" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:11.087436" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:11.068141" elapsed="0.019407">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:11.087635" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:11.061845" elapsed="0.025887">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:11.087955" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:11.087811" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:11.087794" elapsed="0.000243"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:11.088230" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:11.088090" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:11.088075" elapsed="0.000234"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:11.059086" elapsed="0.029302">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:12.091414" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:12.090414" elapsed="0.001078"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:12.102856" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:12.102575" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:12.103306" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:12.103058" 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-08-22T23:46:12.112188" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:12.112354" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:12.112535" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:12.105716" elapsed="0.007232">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:12.103434" elapsed="0.009597">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:12.113224" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:12.113067" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:12.103408" elapsed="0.009906">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:12.113715" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:12.113899" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:12.113857" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:12.113837" elapsed="0.000131"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:12.114111" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:12.114182" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:12.097902" elapsed="0.016384">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:12.114355" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:12.092021" elapsed="0.022450">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:12.114803" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:12.114600" elapsed="0.000282"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:12.114558" elapsed="0.000356"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:12.115181" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:12.114988" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:12.114967" elapsed="0.000322"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:12.089301" elapsed="0.026094">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:13.118428" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:13.117356" elapsed="0.001161"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:13.133263" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:13.132996" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:13.133737" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:13.133467" 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-08-22T23:46:13.142770" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:13.142938" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:13.143126" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:13.136232" elapsed="0.007287">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:13.133867" elapsed="0.009753">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:13.143817" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:13.143658" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:13.133841" elapsed="0.010065">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:13.144277" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:13.144416" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:13.144374" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:13.144358" elapsed="0.000130"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:13.144651" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:13.144723" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:13.124662" elapsed="0.020167">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:13.144898" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:13.119061" elapsed="0.025930">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:13.145214" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:13.145069" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:13.145052" elapsed="0.000242"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:13.145493" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:13.145348" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:13.145332" elapsed="0.000239"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:13.116292" elapsed="0.029377">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:14.148719" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:14.147716" elapsed="0.001077"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:14.160048" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:14.159772" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:14.160497" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:14.160250" 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-08-22T23:46:14.169368" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:14.169540" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:14.169741" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:14.162925" elapsed="0.007242">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:14.160636" elapsed="0.009616">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:14.170444" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:14.170286" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:14.160614" elapsed="0.009925">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:14.171001" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:14.171142" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:14.171103" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:14.171086" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:14.171352" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:14.171422" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:14.155239" elapsed="0.016292">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:14.171618" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:14.149285" elapsed="0.022428">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:14.171933" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:14.171792" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:14.171775" elapsed="0.000236"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:14.172200" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:14.172063" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:14.172048" elapsed="0.000229"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:14.146575" elapsed="0.025777">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:15.175421" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:15.174381" elapsed="0.001119"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:15.188220" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:15.187958" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:15.188690" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:15.188421" 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-08-22T23:46:15.198369" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:15.198711" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:15.199046" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:15.191101" elapsed="0.008774">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:15.188818" elapsed="0.011237">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:15.200473" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:15.200130" elapsed="0.000518"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:15.188793" elapsed="0.011909">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:15.201529" elapsed="0.000083"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:15.201859" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:15.201773" elapsed="0.000180"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:15.201735" 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-08-22T23:46:15.202314" elapsed="0.000046"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:15.202467" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:15.181872" elapsed="0.020854">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:15.202881" elapsed="0.000034"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:15.176024" elapsed="0.027060">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:15.203641" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:15.203255" elapsed="0.000514"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:15.203219" elapsed="0.000603"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:15.204247" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:15.203940" elapsed="0.000427"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:15.203906" elapsed="0.000513"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:15.173293" elapsed="0.031335">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:16.207653" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:16.206548" elapsed="0.001189"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:16.218411" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:16.218129" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:16.218891" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:16.218644" 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-08-22T23:46:16.227822" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:16.228003" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:16.228188" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:16.221323" elapsed="0.007279">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:16.219020" elapsed="0.009666">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:16.228893" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:16.228724" elapsed="0.000235"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:16.218995" elapsed="0.009989">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:16.229390" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:16.229530" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:16.229489" elapsed="0.000105"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:16.229470" elapsed="0.000149"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:16.229762" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:16.229831" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:16.212211" elapsed="0.017727">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:16.230007" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:16.208309" elapsed="0.021792">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:16.230323" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:16.230179" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:16.230162" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:16.230615" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:16.230456" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:16.230440" elapsed="0.000254"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:16.205486" elapsed="0.025284">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:17.233867" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:17.232851" elapsed="0.001091"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:17.251679" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:17.251020" elapsed="0.000777"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:17.252770" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:17.252143" 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-08-22T23:46:17.261966" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:17.262141" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:17.262336" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:17.255717" elapsed="0.007122">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:17.253032" elapsed="0.009922">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:17.263222" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:17.263003" elapsed="0.000308"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:17.252988" elapsed="0.010357">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:17.263923" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:17.264118" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:17.264063" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:17.264039" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:17.264411" elapsed="0.000061"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:17.264554" elapsed="0.000041"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:17.240904" elapsed="0.023826">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:17.264827" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:17.234450" elapsed="0.030511">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:17.265273" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:17.265070" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:17.265046" elapsed="0.000337"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:17.265706" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:17.265459" elapsed="0.000331"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:17.265436" elapsed="0.000387"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:17.231700" elapsed="0.034246">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:18.269035" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:18.267956" elapsed="0.001158"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:18.281598" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:18.281297" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:18.282059" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:18.281810" 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-08-22T23:46:18.290466" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:18.290718" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:18.290974" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:18.284459" elapsed="0.007043">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:18.282184" elapsed="0.009472">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:18.291984" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:18.291713" elapsed="0.000368"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:18.282161" elapsed="0.009955">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:18.292721" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:18.292922" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:18.292865" elapsed="0.000162"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:18.292839" 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-08-22T23:46:18.293264" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:18.293365" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:18.275728" elapsed="0.017789">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:18.293642" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:18.269679" elapsed="0.024099">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:18.294091" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:18.293890" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:18.293867" elapsed="0.000338"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:18.294474" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:18.294280" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:18.294259" elapsed="0.000350"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:18.266876" elapsed="0.027848">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:19.297823" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:19.296735" elapsed="0.001161"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:19.310398" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:19.310127" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:19.310893" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:19.310633" 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-08-22T23:46:19.320381" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:19.320548" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:19.320794" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:19.313305" elapsed="0.007887">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:19.311020" elapsed="0.010258">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:19.321474" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:19.321314" elapsed="0.000256"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:19.310996" elapsed="0.010616">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:19.322018" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:19.322162" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:19.322120" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:19.322102" elapsed="0.000129"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:19.322375" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:19.322448" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:19.304618" elapsed="0.017937">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:19.322649" elapsed="0.000018"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:19.298425" elapsed="0.024335">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:19.322995" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:19.322846" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:19.322828" elapsed="0.000248"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:19.323285" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:19.323133" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:19.323116" elapsed="0.000253"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:19.295647" elapsed="0.027803">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:20.326608" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:20.325511" elapsed="0.001179"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:20.338501" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:20.338237" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:20.338974" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:20.338724" 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-08-22T23:46:20.347992" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:20.348174" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:20.348375" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:20.341385" elapsed="0.007442">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:20.339103" elapsed="0.009813">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:20.349113" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:20.348955" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:20.339076" elapsed="0.010130">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:20.349605" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:20.349748" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:20.349707" elapsed="0.000099"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:20.349690" elapsed="0.000139"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:20.349975" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:20.350090" elapsed="0.000018"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:20.332903" elapsed="0.017304">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:20.350280" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:20.327194" elapsed="0.023181">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:20.350617" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:20.350456" elapsed="0.000251"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:20.350440" elapsed="0.000300"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:20.351023" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:20.350827" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:20.350801" elapsed="0.000337"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:20.324370" elapsed="0.026878">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:21.354133" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:21.353159" elapsed="0.001045"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:21.365062" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:21.364692" elapsed="0.000437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:21.365703" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:21.365339" 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-08-22T23:46:21.376843" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:21.376999" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:21.377173" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:21.369014" elapsed="0.008540">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:21.365870" elapsed="0.011784">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:21.377845" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:21.377691" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:21.365841" elapsed="0.012096">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:21.378317" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:21.378455" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:21.378416" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:21.378398" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:21.378711" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:21.378787" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:21.358634" elapsed="0.020265">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:21.378970" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:21.354860" elapsed="0.024206">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:21.379289" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:21.379146" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:21.379130" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:21.379566" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:21.379426" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:21.379410" elapsed="0.000253"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:21.352147" elapsed="0.027614">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:22.382641" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:22.381665" elapsed="0.001051"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:22.395104" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:22.394828" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:22.395556" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:22.395310" 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-08-22T23:46:22.419792" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:22.420093" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:22.420428" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:22.397943" elapsed="0.023297">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:22.395698" elapsed="0.025723">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:22.421873" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:22.421496" elapsed="0.000525"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:22.395675" elapsed="0.026399">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:22.422942" elapsed="0.000058"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:22.423314" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:22.423211" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:22.423168" 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-08-22T23:46:22.423815" elapsed="0.000053"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:22.423983" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:22.388903" elapsed="0.035313">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:22.424372" elapsed="0.000035"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:22.383240" elapsed="0.041388">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:22.425237" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:22.424888" elapsed="0.000487"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:22.424835" elapsed="0.000613"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:22.425962" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:22.425618" elapsed="0.000491"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:22.425540" elapsed="0.000621"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:22.380641" elapsed="0.045814">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:23.429625" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:23.428631" elapsed="0.001075"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:23.445231" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:23.444863" elapsed="0.000436"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:23.445883" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:23.445514" 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-08-22T23:46:23.460510" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:23.460696" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:23.461075" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:23.448990" elapsed="0.012904">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:23.446051" elapsed="0.016024">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:23.462495" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:23.462151" elapsed="0.000524"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:23.446021" elapsed="0.016709">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:23.463601" elapsed="0.000089"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:23.463942" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:23.463855" elapsed="0.000183"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:23.463816" 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-08-22T23:46:23.464401" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:23.464559" elapsed="0.000063"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:23.435963" elapsed="0.028863">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:23.464982" elapsed="0.000034"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:23.430209" elapsed="0.034983">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:23.465719" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:23.465366" elapsed="0.000481"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:23.465329" elapsed="0.000571"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:23.466333" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:23.466022" elapsed="0.000437"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:23.465986" elapsed="0.000525"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:23.427402" elapsed="0.039313">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:24.469741" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:24.468746" elapsed="0.001070"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:24.481039" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:24.480752" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:24.481494" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:24.481249" 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-08-22T23:46:24.490883" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:24.491055" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:24.491248" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:24.483940" elapsed="0.007728">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:24.481644" elapsed="0.010111">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:24.491954" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:24.491797" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:24.481615" elapsed="0.010430">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:24.492475" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:24.492634" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:24.492590" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:24.492557" elapsed="0.000143"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:24.492909" elapsed="0.000037"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:24.493025" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:24.475873" elapsed="0.017299">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:24.493268" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:24.470309" elapsed="0.023088">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:24.493724" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:24.493505" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:24.493482" elapsed="0.000355"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:24.494104" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:24.493911" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:24.493890" elapsed="0.000323"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:24.467670" elapsed="0.026649">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:25.496845" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:25.496131" elapsed="0.000765"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:25.506793" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:25.506510" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:25.507246" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:25.506997" 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-08-22T23:46:25.518328" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:25.518545" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:25.518827" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:25.509760" elapsed="0.009603">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:25.507377" elapsed="0.012104">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:25.519776" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:25.519533" elapsed="0.000338"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:25.507351" elapsed="0.012554">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:25.520432" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:25.520647" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:25.520569" elapsed="0.000164"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:25.520545" 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-08-22T23:46:25.520966" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:25.521065" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:25.500745" elapsed="0.020469">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:25.521313" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:25.497214" elapsed="0.024231">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:25.521778" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:25.521555" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:25.521532" elapsed="0.000361"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:25.522161" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:25.521968" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:25.521946" elapsed="0.000326"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:25.495249" elapsed="0.027131">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:26.525314" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:26.524269" elapsed="0.001137"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:26.537601" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:26.537310" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:26.538057" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:26.537805" 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-08-22T23:46:26.547712" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:26.547876" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:26.548059" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:26.540523" elapsed="0.007926">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:26.538184" elapsed="0.010348">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:26.548744" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:26.548569" elapsed="0.000244"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:26.538160" elapsed="0.010681">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:26.549249" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:26.549406" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:26.549364" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:26.549346" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:26.549632" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:26.549705" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:26.531616" elapsed="0.018202">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:26.549941" elapsed="0.000027"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:26.525960" elapsed="0.024123">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:26.550405" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:26.550197" elapsed="0.000290"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:26.550173" elapsed="0.000347"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:26.550814" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:26.550617" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:26.550593" elapsed="0.000335"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:26.523242" elapsed="0.027795">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:27.554021" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:27.552968" elapsed="0.001128"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:27.566284" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:27.566023" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:27.566747" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:27.566482" 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-08-22T23:46:27.575957" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:27.576122" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:27.576309" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:27.569273" elapsed="0.007451">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:27.566878" elapsed="0.009931">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:27.577003" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:27.576845" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:27.566854" elapsed="0.010240">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:27.577475" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:27.577630" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:27.577572" elapsed="0.000103"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:27.577555" elapsed="0.000141"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:27.577920" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:27.578002" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:27.560199" elapsed="0.017913">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:27.578182" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:27.554625" elapsed="0.023651">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:27.578501" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:27.578355" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:27.578338" elapsed="0.000261"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:27.578809" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:27.578656" elapsed="0.000250"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:27.578640" elapsed="0.000306"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:27.551948" elapsed="0.027112">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:28.581995" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:28.580988" elapsed="0.001083"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:28.594564" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:28.594297" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:28.595033" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:28.594783" 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-08-22T23:46:28.604732" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:28.604901" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:28.605173" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:28.597424" elapsed="0.008139">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:28.595159" elapsed="0.010502">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:28.605858" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:28.605697" elapsed="0.000228"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:28.595135" elapsed="0.010814">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:28.606385" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:28.606524" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:28.606484" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:28.606466" elapsed="0.000145"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:28.606757" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:28.606835" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:28.588479" elapsed="0.018532">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:28.607118" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:28.582644" elapsed="0.024604">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:28.607554" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:28.607357" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:28.607334" elapsed="0.000353"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:28.607953" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:28.607761" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:28.607739" elapsed="0.000323"/>
</if>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:28.579950" elapsed="0.028217">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<msg time="2026-08-22T23:46:28.608298" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>node2</arg>
<arg>${empty_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:45:27.830853" elapsed="60.777574">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:46:28.610179" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:46:28.609558" elapsed="0.000660"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-08-22T23:46:28.610541" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:28.610339" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.610313" elapsed="0.000339"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:46:28.610917" elapsed="0.000302"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:46:28.612450" level="FAIL">'5762' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:46:28.611967" elapsed="0.000566">'5762' does not contain '-'</status>
</kw>
<msg time="2026-08-22T23:46:28.612739" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:46:28.611444" elapsed="0.001330"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:46:28.613469" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=5762</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:46:28.613006" elapsed="0.000500"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:28.614154" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5762</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:28.613747" elapsed="0.000444"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:46:28.614906" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:46:28.614449" elapsed="0.000496"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-08-22T23:46:28.615488" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5762

Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-08-22T23:46:28.615122" elapsed="0.000414"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:28.615944" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5762</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:28.615704" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-08-22T23:46:28.616647" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=5762'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-08-22T23:46:28.616290" elapsed="0.000405"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:28.616055" elapsed="0.000674"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.616037" elapsed="0.000716"/>
</if>
<arg>5762</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:46:28.609056" elapsed="0.007742"/>
</kw>
<doc>Check that the device data removal is propagated in the cluster even when node 3 is down.</doc>
<tag>critical</tag>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=5762</tag>
<status status="FAIL" start="2026-08-22T23:45:27.530481" elapsed="61.086363">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5762

Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</test>
<test id="s1-s6-t19" name="Restart_node3_After_Delete_And_Dump_Its_Topology_Data" line="221">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:46:28.620632" elapsed="0.000213"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:46:28.620319" 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-08-22T23:46:28.621905" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:28.621795" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.621776" 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-08-22T23:46:28.627227" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:28.626981" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.626962" elapsed="0.000335"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:46:28.628290" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:46:28.627910" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:46:28.628801" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:46:28.628476" elapsed="0.000352"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:46:28.628872" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:46:28.629032" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:46:28.627520" elapsed="0.001537"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:46:28.634735" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:28.634616" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.634557" 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-08-22T23:46:28.636008" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:28.635901" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.635883" elapsed="0.000236"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:46:28.636602" level="INFO">${karaf_connection_index} = 53</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:46:28.636270" elapsed="0.000361"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:46:28.637023" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:46:28.636792" elapsed="0.000257"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:46:28.674856" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:46:28.637543" elapsed="0.037425"/>
</kw>
<msg time="2026-08-22T23:46:28.675157" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:46:28.675205" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:46:28.637208" elapsed="0.038035"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:46:28.708738" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "R "e "s "t "a "r "t "_ "n "o "d "e "3 "_ "A "f "t "e "r "_ "D "e "l "e "t "e "_ "A "n "d "_ "D "u "m "p "_ "I "t "s "_ "T "o "p "o "l "o "g "y "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:46:28.675820" elapsed="0.033045"/>
</kw>
<msg time="2026-08-22T23:46:28.709041" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:46:28.709088" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "R "e "s "t "a "r "t "_ "n "o "d "e "3 "_ "A "f "t "e "r "_ "D "e "l "e "t "e "_ "A ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:46:28.675421" elapsed="0.033704"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:28.709478" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:28.709220" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.709192" elapsed="0.000371"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:28.710059" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "R "e "s "t "a "r "t "_ "n "o "d "e "3 "_ "A "f "t "e "r "_ "D "e "l "e "t "e "_ "A "n "d "_ "D "u "m "p "_ "I "t "s "_ "T "o "p "o "l "o "g "y "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:28.709741" 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-08-22T23:46:28.710432" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:28.710203" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.710185" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:46:28.710548" 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-08-22T23:46:28.713157" elapsed="0.000154"/>
</kw>
<msg time="2026-08-22T23:46:28.713372" 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-08-22T23:46:28.712068" elapsed="0.001439"/>
</kw>
<kw name="Open 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-08-22T23:46:28.713807" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:28.714136" 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-08-22T23:46:28.711423" elapsed="0.002899"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:46:28.710872" 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-08-22T23:46:28.635595" elapsed="0.078949"/>
</kw>
<msg time="2026-08-22T23:46:28.714658" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:46:28.714704" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "R "e "s "t "a "r "t "_ "n "o "d "e "3 "_ "A "f "t "e "r "_ "D "e "l "e "t "e "_ "A ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:46:28.634965" elapsed="0.079778"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:46:28.714926" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:46:28.714819" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.714801" 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-08-22T23:46:28.715407" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:28.715812" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:46:28.715886" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:46:28.634029" elapsed="0.081967"/>
</kw>
<msg time="2026-08-22T23:46:28.716091" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:46:28.716135" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "R "e "s "t "a "r "t "_ "n "o "d "e "3 "_ "A "f "t "e "r "_ "D "e "l "e "t "e "_ "A ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:46:28.629432" elapsed="0.086741"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:28.716498" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:28.716249" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.716231" elapsed="0.000360"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:46:28.629293" elapsed="0.087324"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:46:28.722003" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:28.721893" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.721874" 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-08-22T23:46:28.723345" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:28.723238" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.723220" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:46:28.723881" level="INFO">${karaf_connection_index} = 67</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:46:28.723555" elapsed="0.000352"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:46:28.724277" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:46:28.724063" elapsed="0.000239"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:46:28.770305" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:46:28.724805" elapsed="0.045631"/>
</kw>
<msg time="2026-08-22T23:46:28.770630" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:46:28.770678" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:46:28.724457" elapsed="0.046258"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:46:28.807601" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "R "e "s "t "a "r "t "_ "n "o "d "e "3 "_ "A "f "t "e "r "_ "D "e "l "e "t "e "_ "A "n "d "_ "D "u "m "p "_ "I "t "s "_ "T "o "p "o "l "o "g "y "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:46:28.771224" elapsed="0.036505"/>
</kw>
<msg time="2026-08-22T23:46:28.807895" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:46:28.807942" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "R "e "s "t "a "r "t "_ "n "o "d "e "3 "_ "A "f "t "e "r "_ "D "e "l "e "t "e "_ "A ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:46:28.770884" elapsed="0.037095"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:28.808288" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:28.808060" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.808039" elapsed="0.000329"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:28.808842" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "R "e "s "t "a "r "t "_ "n "o "d "e "3 "_ "A "f "t "e "r "_ "D "e "l "e "t "e "_ "A "n "d "_ "D "u "m "p "_ "I "t "s "_ "T "o "p "o "l "o "g "y "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:28.808511" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:28.809203" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:28.808985" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.808967" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:46:28.809315" 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-08-22T23:46:28.811877" elapsed="0.000195"/>
</kw>
<msg time="2026-08-22T23:46:28.812135" 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-08-22T23:46:28.810817" 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-08-22T23:46:28.812532" elapsed="0.000094"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:28.812882" 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-08-22T23:46:28.810143" 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-08-22T23:46:28.809606" elapsed="0.003522"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:46:28.722935" elapsed="0.090290"/>
</kw>
<msg time="2026-08-22T23:46:28.813316" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:46:28.813359" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "R "e "s "t "a "r "t "_ "n "o "d "e "3 "_ "A "f "t "e "r "_ "D "e "l "e "t "e "_ "A ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:46:28.722220" elapsed="0.091176"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:46:28.813608" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:46:28.813472" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.813453" 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-08-22T23:46:28.814081" 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-08-22T23:46:28.814473" elapsed="0.000032"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:46:28.814558" 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-08-22T23:46:28.721522" elapsed="0.093175"/>
</kw>
<msg time="2026-08-22T23:46:28.814791" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:46:28.814835" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "R "e "s "t "a "r "t "_ "n "o "d "e "3 "_ "A "f "t "e "r "_ "D "e "l "e "t "e "_ "A ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:46:28.716887" elapsed="0.097985"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:28.815198" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:28.814946" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.814928" elapsed="0.000347"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:46:28.716749" elapsed="0.098549"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:46:28.820735" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:28.820624" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.820605" 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-08-22T23:46:28.821941" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:28.821833" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.821815" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:46:28.822470" level="INFO">${karaf_connection_index} = 74</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:46:28.822147" elapsed="0.000350"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:46:28.822884" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:46:28.822669" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:46:28.823673" 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-08-22T23:46:28.823401" elapsed="0.001131">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-08-22T23:46:28.824739" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-08-22T23:46:28.824785" 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-08-22T23:46:28.823067" elapsed="0.001741"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:46:28.825548" 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-08-22T23:46:28.825312" elapsed="0.000894">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-08-22T23:46:28.826466" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-08-22T23:46:28.826514" 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-08-22T23:46:28.824974" elapsed="0.001564"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-08-22T23:46:28.827774" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Restart_node3_After_Delete_And_Dump_Its_Topology_Data"</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-08-22T23:46:28.826881" elapsed="0.000980">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Restart_node3_After_Delete_And_Dump_Its_Topology_Data"</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:28.826637" elapsed="0.001322">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Restart_node3_After_Delete_And_Dump_Its_Topology_Data"</status>
</branch>
<status status="FAIL" start="2026-08-22T23:46:28.826617" elapsed="0.001388">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Restart_node3_After_Delete_And_Dump_Its_Topology_Data"</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-08-22T23:46:28.828225" 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-08-22T23:46:28.828538" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:28.828344" elapsed="0.000291"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:28.828321" elapsed="0.000348"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-08-22T23:46:28.828715" 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-08-22T23:46:28.832064" elapsed="0.000152"/>
</kw>
<msg time="2026-08-22T23:46:28.832276" 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-08-22T23:46:28.830818" elapsed="0.001583"/>
</kw>
<kw name="Open 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-08-22T23:46:28.832689" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:28.833047" 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-08-22T23:46:28.829891" elapsed="0.003338"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:46:28.829069" elapsed="0.004226"/>
</kw>
<arg>${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-08-22T23:46:28.821509" elapsed="0.011870">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Restart_node3_After_Delete_And_Dump_Its_Topology_Data"</status>
</kw>
<msg time="2026-08-22T23:46:28.833480" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:46:28.833524" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Restart_node3_After_Delete_And_Dump_Its_Topology_Data"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:46:28.820953" elapsed="0.012595"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:46:28.833814" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:28.833703" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.833682" 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-08-22T23:46:28.834750" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:28.834571" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.834553" elapsed="0.000264"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:46:28.835100" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:46:28.835204" level="INFO">${current_ssh_connection_object} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:46:28.834971" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:28.835699" level="INFO">{1: 53, 2: 67, 3: 74}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:28.835378" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:28.836134" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:28.835892" 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-08-22T23:46:28.836700" elapsed="0.000257"/>
</kw>
<msg time="2026-08-22T23:46:28.837055" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:46:28.837102" level="INFO">${old_connection_index} = 74</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-08-22T23:46:28.836330" elapsed="0.000795"/>
</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-08-22T23:46:28.837993" elapsed="0.000194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:46:28.839409" 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-08-22T23:46:28.838873" elapsed="0.001386">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-08-22T23:46:28.838352" elapsed="0.002003"/>
</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-08-22T23:46:28.841007" 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-08-22T23:46:28.840525" elapsed="0.000834"/>
</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-08-22T23:46:28.837461" elapsed="0.003945"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:28.837239" elapsed="0.004217"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.837219" elapsed="0.004262"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:46:28.842335" level="INFO">${ip_address} = 10.30.170.79</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:46:28.842030" elapsed="0.000333"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:46:28.842685" elapsed="0.000055"/>
</return>
<msg time="2026-08-22T23:46:28.842901" level="INFO">${odl_ip} = 10.30.170.79</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:46:28.841707" elapsed="0.001220"/>
</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-08-22T23:46:28.843091" elapsed="0.000452"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:46:28.843915" level="INFO">index=75
host=10.30.170.79
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-08-22T23:46:28.844018" level="INFO">${karaf_connection_object} = index=75
host=10.30.170.79
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:46:28.843795" elapsed="0.000249"/>
</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-08-22T23:46:28.844190" elapsed="0.002318"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:46:28.846955" level="INFO">Logging into '10.30.170.79:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:46:28.848349" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.79</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-08-22T23:46:28.846691" elapsed="0.002060">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.79</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-08-22T23:46:28.862484" elapsed="0.000481"/>
</kw>
<msg time="2026-08-22T23:46:28.863052" 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-08-22T23:46:28.861032" elapsed="0.002184"/>
</kw>
<kw name="Open 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-08-22T23:46:28.863376" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:28.863711" elapsed="0.000033"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:46:28.849528" elapsed="0.014282"/>
</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-08-22T23:46:28.849025" elapsed="0.014831"/>
</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-08-22T23:46:28.834262" elapsed="0.029675">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.79</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-08-22T23:46:28.864268" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:46:28.864341" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_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-08-22T23:46:28.820269" elapsed="0.044177">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.79</status>
</kw>
<msg time="2026-08-22T23:46:28.864623" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:46:28.864669" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.79</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:46:28.815560" elapsed="0.049132"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:28.865023" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:28.864771" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.864752" elapsed="0.000350"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:46:28.815421" elapsed="0.049705"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:46:28.629115" elapsed="0.236041"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:46:28.626453" elapsed="0.238763"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:46:28.621491" elapsed="0.243782"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:46:28.621052" elapsed="0.244268"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:46:28.617927" elapsed="0.247448"/>
</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-08-22T23:46:28.868828" 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-08-22T23:46:28.868493" elapsed="0.000361"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:46:28.869290" 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-08-22T23:46:28.869005" elapsed="0.000311"/>
</kw>
<return>
<value>${index_list}</value>
<status status="PASS" start="2026-08-22T23:46:28.869360" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:46:28.869511" level="INFO">${index_list} = [3]</msg>
<var>${index_list}</var>
<arg>${member}</arg>
<status status="PASS" start="2026-08-22T23:46:28.868174" elapsed="0.001362"/>
</kw>
<kw name="Return_Member_IP" owner="ClusterManagement">
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-08-22T23:46:28.870363" 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-08-22T23:46:28.870058" elapsed="0.000331"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:46:28.870841" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:46:28.870562" elapsed="0.000305"/>
</kw>
<return>
<value>${member_ip}</value>
<status status="PASS" start="2026-08-22T23:46:28.870913" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:46:28.871061" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:46:28.869738" elapsed="0.001348"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:46:28.873646" level="INFO">${msg} = Starting ODL3 10.30.170.79</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-08-22T23:46:28.871242" elapsed="0.002431"/>
</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-08-22T23:46:28.880445" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:28.880335" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.880316" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:46:28.881502" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:46:28.881125" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:46:28.882012" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:46:28.881700" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:46:28.882082" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:46:28.882238" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:46:28.880751" elapsed="0.001512"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:46:28.889252" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:28.889142" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.889124" 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-08-22T23:46:28.890420" elapsed="0.000053"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:28.890308" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.890290" elapsed="0.000322"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:46:28.891008" level="INFO">${karaf_connection_index} = 53</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:46:28.890770" elapsed="0.000264"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:46:28.891365" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:46:28.891189" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:46:28.922685" level="INFO">log: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 "0 ". "7 "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-08-22T23:46:28.891910" elapsed="0.030941"/>
</kw>
<msg time="2026-08-22T23:46:28.923047" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:46:28.923096" level="INFO">${message_write} = log: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-08-22T23:46:28.891547" elapsed="0.031585"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:46:28.925114" 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-08-22T23:46:28.923652" elapsed="0.001520"/>
</kw>
<msg time="2026-08-22T23:46:28.925267" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:46:28.925310" 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-08-22T23:46:28.923299" elapsed="0.002037"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:28.925643" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:28.925411" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.925391" elapsed="0.000332"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:28.926114" 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-08-22T23:46:28.925862" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:28.926436" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:28.926227" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.926209" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:46:28.926556" 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-08-22T23:46:28.928387" elapsed="0.000229"/>
</kw>
<msg time="2026-08-22T23:46:28.928732" 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-08-22T23:46:28.927743" elapsed="0.001059"/>
</kw>
<kw name="Open 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-08-22T23:46:28.928961" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:28.929122" 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-08-22T23:46:28.927368" elapsed="0.001836"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:46:28.926854" elapsed="0.002397"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:46:28.890004" elapsed="0.039344"/>
</kw>
<msg time="2026-08-22T23:46:28.929442" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:46:28.929609" 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-08-22T23:46:28.889473" elapsed="0.040180"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:46:28.929849" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-08-22T23:46:28.929738" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.929718" 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-08-22T23:46:28.930339" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:28.930742" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:46:28.930854" 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-08-22T23:46:28.888799" elapsed="0.042169"/>
</kw>
<msg time="2026-08-22T23:46:28.931067" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:46:28.931112" 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-08-22T23:46:28.882664" elapsed="0.048476"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:28.931473" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:28.931219" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.931201" elapsed="0.000353"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:46:28.882508" elapsed="0.049098"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:46:28.937421" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:28.937309" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.937289" 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-08-22T23:46:28.938655" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:28.938528" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.938507" elapsed="0.000217"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:46:28.939084" level="INFO">${karaf_connection_index} = 67</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:46:28.938864" elapsed="0.000246"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:46:28.939439" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:46:28.939264" elapsed="0.000200"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:46:28.979211" level="INFO">log: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 "0 ". "7 "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-08-22T23:46:28.939971" elapsed="0.039315"/>
</kw>
<msg time="2026-08-22T23:46:28.979387" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:46:28.979433" level="INFO">${message_write} = log: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-08-22T23:46:28.939637" elapsed="0.039833"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:46:28.982405" 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-08-22T23:46:28.979998" elapsed="0.002466"/>
</kw>
<msg time="2026-08-22T23:46:28.982573" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:46:28.982631" 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-08-22T23:46:28.979653" elapsed="0.003005"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:28.982951" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:28.982733" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.982714" elapsed="0.000314"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:28.983419" 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-08-22T23:46:28.983169" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:28.983763" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:28.983533" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.983514" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:46:28.983874" 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-08-22T23:46:28.985622" elapsed="0.000204"/>
</kw>
<msg time="2026-08-22T23:46:28.985924" 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-08-22T23:46:28.984998" elapsed="0.000992"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:28.986146" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:28.986344" 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-08-22T23:46:28.984640" elapsed="0.001786"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:46:28.984127" elapsed="0.002378"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:46:28.938188" elapsed="0.048443"/>
</kw>
<msg time="2026-08-22T23:46:28.986725" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:46:28.986768" 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-08-22T23:46:28.937669" elapsed="0.049126"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:46:28.986979" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:46:28.986872" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.986853" 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-08-22T23:46:28.987444" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:28.987798" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:46:28.987871" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:46:28.936852" elapsed="0.051126"/>
</kw>
<msg time="2026-08-22T23:46:28.988071" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:46:28.988114" 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-08-22T23:46:28.931935" elapsed="0.056206"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:28.988463" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:28.988216" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.988199" elapsed="0.000342"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:46:28.931749" elapsed="0.056815"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:46:28.994243" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:28.994131" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.994112" 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-08-22T23:46:28.995426" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:28.995320" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:28.995302" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:46:28.995869" level="INFO">${karaf_connection_index} = 75</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:46:28.995650" elapsed="0.000251"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:46:28.996224" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:46:28.996054" elapsed="0.000206"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:46:28.996948" 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-08-22T23:46:28.996758" elapsed="0.000692">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-08-22T23:46:28.997560" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-08-22T23:46:28.997623" 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-08-22T23:46:28.996416" elapsed="0.001232"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:46:28.998324" 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-08-22T23:46:28.998145" elapsed="0.000702">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-08-22T23:46:28.998957" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-08-22T23:46:28.999001" 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-08-22T23:46:28.997812" elapsed="0.001212"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-08-22T23:46:28.999692" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL3 10.30.170.79"</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-08-22T23:46:28.999358" elapsed="0.000395">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL3 10.30.170.79"</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:28.999136" elapsed="0.000685">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL3 10.30.170.79"</status>
</branch>
<status status="FAIL" start="2026-08-22T23:46:28.999116" elapsed="0.000737">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL3 10.30.170.79"</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-08-22T23:46:29.000009" 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-08-22T23:46:29.000232" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:29.000094" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:29.000078" elapsed="0.000228"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-08-22T23:46:29.000339" 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">
<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-08-22T23:46:29.002077" elapsed="0.000203"/>
</kw>
<msg time="2026-08-22T23:46:29.002377" 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-08-22T23:46:29.001464" elapsed="0.000978"/>
</kw>
<kw name="Open 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-08-22T23:46:29.002661" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:29.002825" 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-08-22T23:46:29.001107" elapsed="0.001799"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:46:29.000605" elapsed="0.002347"/>
</kw>
<arg>${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-08-22T23:46:28.995021" elapsed="0.008012">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL3 10.30.170.79"</status>
</kw>
<msg time="2026-08-22T23:46:29.003132" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:46:29.003176" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL3 10.30.170.79"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:46:28.994463" elapsed="0.008736"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:46:29.003383" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:29.003275" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:29.003257" 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-08-22T23:46:29.004443" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:29.004332" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:29.004310" elapsed="0.000201"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:46:29.004809" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:46:29.004912" level="INFO">${current_ssh_connection_object} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:46:29.004684" elapsed="0.000254"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:29.005345" level="INFO">{1: 53, 2: 67, 3: 75}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:29.005087" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:29.005811" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:29.005539" elapsed="0.000316"/>
</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-08-22T23:46:29.006364" elapsed="0.000223"/>
</kw>
<msg time="2026-08-22T23:46:29.006689" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:46:29.006735" level="INFO">${old_connection_index} = 75</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-08-22T23:46:29.006009" elapsed="0.000749"/>
</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-08-22T23:46:29.007553" elapsed="0.000183"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:46:29.008372" 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-08-22T23:46:29.008225" elapsed="0.000589">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-08-22T23:46:29.007901" elapsed="0.000974"/>
</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-08-22T23:46:29.009404" elapsed="0.000100"/>
</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-08-22T23:46:29.009082" elapsed="0.000468"/>
</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-08-22T23:46:29.007053" elapsed="0.002558"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:29.006833" elapsed="0.002828"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:29.006815" elapsed="0.002872"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:46:29.010540" level="INFO">${ip_address} = 10.30.170.79</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:46:29.010242" elapsed="0.000326"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:46:29.010634" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:46:29.010787" level="INFO">${odl_ip} = 10.30.170.79</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:46:29.009889" elapsed="0.000922"/>
</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-08-22T23:46:29.010963" elapsed="0.000437"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:46:29.011717" level="INFO">index=76
host=10.30.170.79
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-08-22T23:46:29.011819" level="INFO">${karaf_connection_object} = index=76
host=10.30.170.79
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:46:29.011566" elapsed="0.000279"/>
</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-08-22T23:46:29.011990" elapsed="0.002358"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:46:29.014803" level="INFO">Logging into '10.30.170.79:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:46:29.015526" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.79</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-08-22T23:46:29.014525" elapsed="0.001393">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.79</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-08-22T23:46:29.019704" elapsed="0.000192"/>
</kw>
<msg time="2026-08-22T23:46:29.019938" 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-08-22T23:46:29.019165" elapsed="0.000834"/>
</kw>
<kw name="Open 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-08-22T23:46:29.020153" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:29.020309" 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-08-22T23:46:29.016710" elapsed="0.003680"/>
</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-08-22T23:46:29.016185" elapsed="0.004250"/>
</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-08-22T23:46:29.003869" elapsed="0.016643">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.79</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-08-22T23:46:29.020855" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:46:29.020933" 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-08-22T23:46:28.993675" elapsed="0.027358">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.79</status>
</kw>
<msg time="2026-08-22T23:46:29.021138" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:46:29.021181" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.79</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:46:28.988845" elapsed="0.032359"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:29.021525" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:29.021279" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:29.021261" elapsed="0.000360"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:46:28.988707" elapsed="0.032972"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:46:28.882318" elapsed="0.139393"/>
</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-08-22T23:46:28.878254" elapsed="0.143516"/>
</kw>
<kw name="Start_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:46:29.028749" level="INFO">${base_command} = /tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/start</msg>
<var>${base_command}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/bin/start</arg>
<arg>${NODE_START_COMMAND}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:46:29.028255" elapsed="0.000523"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:46:29.029353" level="INFO">${command} = /tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/start</msg>
<var>${command}</var>
<arg>"""${export_java_home}""" != ""</arg>
<arg>export JAVA_HOME="${export_java_home}"; ${base_command}</arg>
<arg>${base_command}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:46:29.028943" elapsed="0.000437"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-08-22T23:46:29.029812" level="INFO">${epoch} = 1787442389.02974</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-08-22T23:46:29.029539" elapsed="0.000300"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:46:29.030395" level="INFO">${gc_filepath} = /tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log/gc_1787442389.02974.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-08-22T23:46:29.030000" elapsed="0.000421"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:46:29.030985" level="INFO">${gc_options} = -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log/gc_1787442389.02974.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-08-22T23:46:29.030607" elapsed="0.000405"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:46:29.032490" 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-08-22T23:46:29.032124" elapsed="0.000394"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:46:29.032984" 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-08-22T23:46:29.032689" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:46:29.033055" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:46:29.033211" 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-08-22T23:46:29.031756" elapsed="0.001481"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:46:29.034279" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:46:29.034013" elapsed="0.000293"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:46:29.035096" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:46:29.035196" level="INFO">${current_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:46:29.034982" elapsed="0.000240"/>
</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-08-22T23:46:29.038570" elapsed="0.000102"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:29.037886" elapsed="0.000879"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:29.037866" elapsed="0.000928"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:46:29.039055" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:46:29.039212" level="INFO">${current_ssh_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:46:29.038943" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:29.040370" level="INFO">Attempting to execute command "/tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/start -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log/gc_1787442389.02974.log" on remote system "10.30.170.79" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:29.039405" elapsed="0.001030"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:46:29.041395" level="INFO">${conn_id} = 77</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:46:29.040631" elapsed="0.000791"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:46:29.043045" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:46:29.043309" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:46:29.042410" elapsed="0.000998"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:46:29.043926" elapsed="0.000605"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:46:29.045849" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:46:29.756370" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:46:29 UTC 2026

  System load:  0.0                Processes:             122
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:45:16 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:46:29.045481" elapsed="0.711078"/>
</kw>
<msg time="2026-08-22T23:46:29.756731" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:46:29.044850" elapsed="0.712003"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:46:29.041705" elapsed="0.715332"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:46:29.757753" level="INFO">Executing command '/tmp/netconf-karaf-9.0.4-SNAPSHOT/bin/start -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/netconf-karaf-9.0.4-SNAPSHOT/data/log/gc_1787442389.02974.log'.</msg>
<msg time="2026-08-22T23:46:29.781022" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:46:29.781359" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:46:29.781464" 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-08-22T23:46:29.757338" elapsed="0.024180"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:46:29.782083" elapsed="0.000546"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:29.784433" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:29.783107" elapsed="0.001432"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:46:29.785266" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:29.784824" elapsed="0.000697"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:29.784764" elapsed="0.000865"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:46:29.786163" elapsed="0.000065"/>
</return>
<status status="PASS" start="2026-08-22T23:46:29.785768" elapsed="0.000686"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:29.785729" elapsed="0.000795"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:46:29.786662" 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">
<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-08-22T23:46:29.793560" elapsed="0.000259"/>
</kw>
<msg time="2026-08-22T23:46:29.793916" 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-08-22T23:46:29.791960" elapsed="0.002124"/>
</kw>
<kw name="Open 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-08-22T23:46:29.794500" elapsed="0.000068"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:29.795149" elapsed="0.000075"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:46:29.787523" elapsed="0.007926"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:46:29.037263" elapsed="0.758368"/>
</kw>
<msg time="2026-08-22T23:46:29.795709" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:46:29.036409" elapsed="0.759383"/>
</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-08-22T23:46:29.035884" elapsed="0.760041"/>
</kw>
<msg time="2026-08-22T23:46:29.795983" 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-08-22T23:46:29.035373" elapsed="0.760747"/>
</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-08-22T23:46:29.799689" elapsed="0.000157"/>
</kw>
<msg time="2026-08-22T23:46:29.799894" 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-08-22T23:46:29.799140" 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-08-22T23:46:29.800251" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:29.800410" 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-08-22T23:46:29.796434" elapsed="0.004056"/>
</kw>
<msg time="2026-08-22T23:46:29.800600" 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-08-22T23:46:29.034556" elapsed="0.766071"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:29.801079" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:29.800826" elapsed="0.000293"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:46:29.801163" 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-08-22T23:46:29.033613" elapsed="0.767680"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:46:29.033423" elapsed="0.767907"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:46:29.033290" elapsed="0.768079"/>
</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-08-22T23:46:29.031226" elapsed="0.770202"/>
</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-08-22T23:46:29.813170" 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-08-22T23:46:29.812789" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:46:29.813671" 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-08-22T23:46:29.813354" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:46:29.813744" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:46:29.813900" 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-08-22T23:46:29.812384" elapsed="0.001540"/>
</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-08-22T23:46:29.815463" 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-08-22T23:46:29.815163" elapsed="0.000326"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:46:29.815535" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:46:29.815702" 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-08-22T23:46:29.814790" elapsed="0.000937"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:29.823942" 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-08-22T23:46:29.823439" elapsed="0.000551"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:29.824635" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:29.824141" elapsed="0.000540"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:46:29.830194" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.79', 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.79', 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-08-22T23:46:29.827035" elapsed="0.005212">ConnectionError: HTTPConnectionPool(host='10.30.170.79', 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.79', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:29.824751" elapsed="0.007808">ConnectionError: HTTPConnectionPool(host='10.30.170.79', 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.79', 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-08-22T23:46:29.832842" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:29.832678" elapsed="0.000463"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:29.824731" elapsed="0.008439">ConnectionError: HTTPConnectionPool(host='10.30.170.79', 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.79', 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-08-22T23:46:29.833680" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:29.833821" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:29.833782" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:29.833764" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:29.834033" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:29.834103" 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-08-22T23:46:29.818716" elapsed="0.015502">ConnectionError: HTTPConnectionPool(host='10.30.170.79', 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.79', 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-08-22T23:46:29.834291" 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-08-22T23:46:29.815936" elapsed="0.018456">ConnectionError: HTTPConnectionPool(host='10.30.170.79', 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.79', 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-08-22T23:46:29.834642" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-08-22T23:46:29.834770" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:29.834734" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:29.834717" 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-08-22T23:46:29.835060" 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-08-22T23:46:29.835280" elapsed="0.000023"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="NOT RUN" start="2026-08-22T23:46:29.835346" 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-08-22T23:46:29.814402" elapsed="0.021047">ConnectionError: HTTPConnectionPool(host='10.30.170.79', 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.79', 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-08-22T23:46:29.835572" elapsed="0.000043"/>
</continue>
<status status="NOT RUN" start="2026-08-22T23:46:29.835530" elapsed="0.000113"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:29.835513" elapsed="0.000152"/>
</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-08-22T23:46:29.835808" elapsed="0.000024"/>
</kw>
<var name="${index}">3</var>
<status status="FAIL" start="2026-08-22T23:46:29.814170" elapsed="0.021752">ConnectionError: HTTPConnectionPool(host='10.30.170.79', 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.79', 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-08-22T23:46:29.813981" elapsed="0.022108">ConnectionError: HTTPConnectionPool(host='10.30.170.79', 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.79', 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-08-22T23:46:29.811819" elapsed="0.024512">ConnectionError: HTTPConnectionPool(host='10.30.170.79', 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.79', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:29.811482" elapsed="0.024992">ConnectionError: HTTPConnectionPool(host='10.30.170.79', 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.79', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<status status="FAIL" start="2026-08-22T23:46:29.811461" elapsed="0.025313">ConnectionError: HTTPConnectionPool(host='10.30.170.79', 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.79', 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-08-22T23:46:29.837433" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:29.836956" elapsed="0.000607"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:29.836916" elapsed="0.000740"/>
</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-08-22T23:46:29.838290" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:29.837790" elapsed="0.000634"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:29.837751" elapsed="0.000729"/>
</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-08-22T23:46:29.811059" elapsed="0.027654">ConnectionError: HTTPConnectionPool(host='10.30.170.79', 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.79', 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-08-22T23:46:39.855861" 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-08-22T23:46:39.855379" elapsed="0.000515"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:46:39.856399" 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-08-22T23:46:39.856082" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:46:39.856476" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:46:39.856667" 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-08-22T23:46:39.854965" elapsed="0.001728"/>
</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-08-22T23:46:39.858212" 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-08-22T23:46:39.857906" elapsed="0.000333"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:46:39.858287" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:46:39.858438" 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-08-22T23:46:39.857543" elapsed="0.000920"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:39.866308" 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-08-22T23:46:39.865820" elapsed="0.000538"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:39.867010" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:39.866511" elapsed="0.000546"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:46:40.260007" level="INFO">GET Request : url=http://10.30.170.79: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:40.260349" level="INFO">GET Response : url=http://10.30.170.79: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': 'Sat, 22 Aug 2026 23:46:40 GMT', 'Expires': 'Sat, 22 Aug 2026 22:46:40 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787442400,"status":200} 
 </msg>
<msg time="2026-08-22T23:46:40.260835" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:46:39.869346" elapsed="0.391675"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:39.867125" elapsed="0.394429"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:40.262117" elapsed="0.000192"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:40.261676" elapsed="0.001335"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:39.867106" elapsed="0.395966"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.270378" 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787442400,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:40.267779" elapsed="0.002703"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:40.265987" elapsed="0.004545"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:40.265941" elapsed="0.004630"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.274385" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:40.271870" elapsed="0.002615"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:40.270680" elapsed="0.003855"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:40.270662" elapsed="0.003912"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.276007" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:46:40.275116" elapsed="0.000934"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:40.276647" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:40.276193" elapsed="0.000543"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.277589" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:40.277069" elapsed="0.000644"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:40.276774" elapsed="0.000991"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:40.276169" elapsed="0.001633"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.279184" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:46:40.278275" elapsed="0.000952"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:40.279838" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:40.279367" elapsed="0.000558"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.280776" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:40.280245" elapsed="0.000577"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:40.279963" elapsed="0.000910"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:40.279347" 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-08-22T23:46:40.281111" elapsed="0.000842"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:46:40.282969" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:46:40.282275" elapsed="0.000736"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:46:40.283301" 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-08-22T23:46:40.264179" elapsed="0.021898"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:40.286283" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:40.286149" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:40.286130" elapsed="0.000225"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:46:40.289651" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787442400,...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:46:40.286502" elapsed="0.003180"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:46:40.289736" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:46:40.289907" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787442400,...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:46:39.861326" elapsed="0.428608"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:46:40.289992" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:46:40.290183" level="INFO">${conf_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787442400,...</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-08-22T23:46:39.858690" elapsed="0.431520"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.291058" level="INFO">{
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787442400,
 "value": {
  "LocalShards": [
   "member-1-shard-default-config",
   "member-1-shard-inventory-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-08-22T23:46:40.290802" elapsed="0.000304"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.292434" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787442400, '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-08-22T23:46:40.291707" elapsed="0.000755"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-08-22T23:46:40.292512" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:46:40.292698" level="INFO">${manager_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787442400, '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-08-22T23:46:40.291314" elapsed="0.001412"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:46:40.293278" level="INFO">${value_object} = {'LocalShards': ['member-1-shard-default-config', 'member-1-shard-inventory-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-08-22T23:46:40.292880" elapsed="0.000427"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:46:40.293719" 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-08-22T23:46:40.293461" elapsed="0.000285"/>
</kw>
<return>
<value>${sync_status}</value>
<status status="PASS" start="2026-08-22T23:46:40.293796" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:46:40.293948" 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-08-22T23:46:40.290424" elapsed="0.003549"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-08-22T23:46:40.294150" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:40.294041" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:40.294024" 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-08-22T23:46:40.301796" 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-08-22T23:46:40.301306" elapsed="0.000537"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.302450" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:40.301994" elapsed="0.000502"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:46:40.310559" level="INFO">GET Request : url=http://10.30.170.79: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:40.310773" level="INFO">GET Response : url=http://10.30.170.79: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': 'Sat, 22 Aug 2026 23:46:40 GMT', 'Expires': 'Sat, 22 Aug 2026 22:46:40 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787442400,"status":200} 
 </msg>
<msg time="2026-08-22T23:46:40.311013" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:46:40.304786" elapsed="0.006334"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:40.302563" elapsed="0.008867"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:40.311726" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:40.311470" elapsed="0.000681"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:40.302544" elapsed="0.009641"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.319200" 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"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1787442400,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:40.315585" elapsed="0.003808"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:40.313981" elapsed="0.005482"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:40.313953" elapsed="0.005565"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.323687" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:40.321183" elapsed="0.002607"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:40.319667" elapsed="0.004172"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:40.319640" elapsed="0.004238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.325330" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:46:40.324378" 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-08-22T23:46:40.325973" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:40.325511" elapsed="0.000550"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.326923" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:40.326387" elapsed="0.000581"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:40.326100" elapsed="0.000920"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:40.325490" elapsed="0.001566"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.328504" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:46:40.327548" 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-08-22T23:46:40.329254" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:40.328801" elapsed="0.000543"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.330238" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:40.329709" elapsed="0.000574"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:40.329383" elapsed="0.000952"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:40.328780" elapsed="0.001592"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:46:40.330581" elapsed="0.000840"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:46:40.332310" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:46:40.331719" elapsed="0.000634"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:46:40.332663" 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-08-22T23:46:40.312819" elapsed="0.022841"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:40.335861" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:40.335734" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:40.335715" elapsed="0.000214"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:46:40.339269" 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-08-22T23:46:40.336073" elapsed="0.003227"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:46:40.339358" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:46:40.339525" 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-08-22T23:46:40.296988" elapsed="0.042564"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:46:40.339635" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:46:40.339788" 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-08-22T23:46:40.294418" elapsed="0.045396"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.340711" level="INFO">{
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1787442400,
 "value": {
  "LocalShards": [
   "member-1-shard-default-operational",
   "member-1-shard-inventory-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-08-22T23:46:40.340409" elapsed="0.000593"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.342341" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787442400, ...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:46:40.341568" elapsed="0.000802"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-08-22T23:46:40.342420" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:46:40.342588" level="INFO">${manager_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1787442400, ...</msg>
<var>${manager_object}</var>
<arg>${shard_manager_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-08-22T23:46:40.341222" elapsed="0.001434"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:46:40.343039" level="INFO">${value_object} = {'LocalShards': ['member-1-shard-default-operational', 'member-1-shard-inventory-operational', 'member-1-shard-topology-operational'], '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-08-22T23:46:40.342812" elapsed="0.000254"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:46:40.343433" 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-08-22T23:46:40.343219" elapsed="0.000239"/>
</kw>
<return>
<value>${sync_status}</value>
<status status="PASS" start="2026-08-22T23:46:40.343506" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:46:40.343679" 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-08-22T23:46:40.340041" elapsed="0.003664"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="PASS" start="2026-08-22T23:46:40.343749" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:46:40.343901" 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-08-22T23:46:39.857168" elapsed="0.486759"/>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="PASS" start="2026-08-22T23:46:40.344117" elapsed="0.000031"/>
</continue>
<status status="PASS" start="2026-08-22T23:46:40.344002" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:40.343983" elapsed="0.000221"/>
</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-08-22T23:46:40.344350" elapsed="0.000022"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:46:39.856940" elapsed="0.487466"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:46:39.856752" elapsed="0.487690"/>
</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-08-22T23:46:39.854530" elapsed="0.489974"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:39.854179" elapsed="0.490358"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:39.854151" elapsed="0.490411"/>
</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-08-22T23:46:40.346178" 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-08-22T23:46:40.345801" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.346771" 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-08-22T23:46:40.346363" elapsed="0.000434"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:46:40.346843" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:46:40.346996" 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-08-22T23:46:40.345382" elapsed="0.001638"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.348040" 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-08-22T23:46:40.347742" elapsed="0.000325"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:46:40.348112" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:46:40.348258" 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-08-22T23:46:40.347381" elapsed="0.000902"/>
</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-08-22T23:46:40.402387" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:40.401933" elapsed="0.000508"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:46:40.403377" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:46:40.403093" elapsed="0.000365">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:46:40.403641" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:46:40.402719" elapsed="0.000974"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.404394" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:46:40.403946" elapsed="0.000500"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:46:40.404904" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:46:40.405078" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:46:40.404723" elapsed="0.000404"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.405731" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:40.405370" elapsed="0.000447"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.406973" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:40.406714" elapsed="0.000304"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.407445" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:46:40.407175" 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-08-22T23:46:40.407812" 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-08-22T23:46:40.408012" 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-08-22T23:46:40.408182" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-08-22T23:46:40.407679" elapsed="0.000560"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-08-22T23:46:40.407517" elapsed="0.000751"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:46:40.408313" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:46:40.408475" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:46:40.406321" elapsed="0.002179"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:40.405958" elapsed="0.002594"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:40.408858" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:40.408600" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:40.405906" elapsed="0.003064"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.409742" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:46:40.409225" elapsed="0.000568"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:46:40.409871" elapsed="0.000061"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:46:40.400716" elapsed="0.009384"/>
</kw>
<msg time="2026-08-22T23:46:40.410178" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:46:40.386533" elapsed="0.023712"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:40.432027" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:40.453821" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:40.475460" 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-08-22T23:46:40.475678" 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-08-22T23:46:40.475854" 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-08-22T23:46:40.476994" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:40.476114" elapsed="0.001005"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:40.476098" elapsed="0.001070"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:40.477363" elapsed="0.000066"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:40.477674" elapsed="0.000068"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:40.477973" elapsed="0.000066"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:46:40.476055" elapsed="0.002090"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:46:40.475929" elapsed="0.002251"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:40.478347" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:40.478425" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:46:40.478546" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:46:40.382308" elapsed="0.096265"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:46:40.480360" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:46:40.479869" elapsed="0.000677">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:46:40.480692" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:46:40.479296" elapsed="0.001421"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:40.481071" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:40.480789" elapsed="0.000455"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.482056" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:40.481443" elapsed="0.000692"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:40.481271" elapsed="0.001009"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:40.480771" elapsed="0.001534"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.494478" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:46:40.482457" elapsed="0.012048"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:46:40.494558" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:46:40.494731" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:46:40.478971" elapsed="0.015784"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:46:40.496557" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:46:40.496114" elapsed="0.000663">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-08-22T23:46:40.496935" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:46:40.495416" elapsed="0.001544"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-08-22T23:46:40.497200" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:46:40.497032" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:40.497013" 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-08-22T23:46:40.497427" 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-08-22T23:46:40.497676" elapsed="0.000024"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-08-22T23:46:40.497747" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:46:40.499846" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:46:40.495091" elapsed="0.004781"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.501565" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:40.501099" elapsed="0.000538"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.502248" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:40.501790" elapsed="0.000502"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:46:40.954932" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:40.955817" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node0jtxliz1y0a4y1qy0bf63804ds0.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Fri, 21-Aug-2026 23:46:40 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":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","cms-enveloped-data-format","csr-generation","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cms-encrypted-data-format","cleartext-private-keys","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-netconf-monitoring_2010-10-04","revision":"2010-10-04","schema":"/rests/modules/ietf-netconf-monitoring?revision=2010-10-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring","conformance-type":"import"},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["https-listen","http-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"odl-netconf-device_2025-12-05","revision":"2025-12-05","schema":"/rests/modules/odl-netconf-device?revision=2025-12-05","namespace":"urn:opendaylight:netconf:device","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-http-server_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-server?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["tcp-supported","tls-supported"]},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"netconf-keystore_2024-07-08","revision":"2024-07-08","schema":"/rests/modules/netconf-keystore?revision=2024-07-08","namespace":"urn:opendaylight:netconf:keystore","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["url","xpath","rollback-on-error","validate","candidate","startup","confirmed-commit","writable-running"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-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_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["tcp-client-keepalives","local-binding-supported"]},{"name":"ietf-netconf-client_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-netconf-client?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-client","conformance-type":"import","feature":["ssh-listen","tls-listen","tls-initiate","central-netconf-client-supported","ssh-initiate"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":[... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-08-22T23:46:40.956638" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:46:40.504559" elapsed="0.452270"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:40.502359" elapsed="0.455006"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:40.957912" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:40.957441" elapsed="0.001148"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:40.502340" elapsed="0.456423"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.967348" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","cms-enveloped-data-format","csr-generation","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cms-encrypted-data-format","cleartext-private-keys","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-netconf-monitoring_2010-10-04","revision":"2010-10-04","schema":"/rests/modules/ietf-netconf-monitoring?revision=2010-10-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring","conformance-type":"import"},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["https-listen","http-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"odl-netconf-device_2025-12-05","revision":"2025-12-05","schema":"/rests/modules/odl-netconf-device?revision=2025-12-05","namespace":"urn:opendaylight:netconf:device","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-http-server_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-server?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["tcp-supported","tls-supported"]},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"netconf-keystore_2024-07-08","revision":"2024-07-08","schema":"/rests/modules/netconf-keystore?revision=2024-07-08","namespace":"urn:opendaylight:netconf:keystore","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["url","xpath","rollback-on-error","validate","candidate","startup","confirmed-commit","writable-running"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-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_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["tcp-client-keepalives","local-binding-supported"]},{"name":"ietf-netconf-client_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-netconf-client?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-client","conformance-type":"import","feature":["ssh-listen","tls-listen","tls-initiate","central-netconf-client-supported","ssh-initiate"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"netconf-node-optional_2022-12-25","revision":"2022-12-25","schema":"/rests/modules/netconf-node-optional?revision=2022-12-25","namespace":"urn:opendaylight:netconf-node-optional","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","arbitrary-names","if-mib"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert: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":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"netconf-node-topology_2025-12-05","revision":"2025-12-05","schema":"/rests/modules/netconf-node-topology?revision=2025-12-05","namespace":"urn:opendaylight:netconf-node-topology","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-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-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","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":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"1"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:40.964485" elapsed="0.003288"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:40.962179" elapsed="0.005649"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:40.962128" elapsed="0.005741"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.971590" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:40.969072" elapsed="0.002647"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:40.967956" elapsed="0.003813"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:40.967937" elapsed="0.003871"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.973296" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:46:40.972318" elapsed="0.001020"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:40.973932" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:40.973475" elapsed="0.000544"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.974928" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:40.974348" elapsed="0.000624"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:40.974058" elapsed="0.000965"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:40.973455" elapsed="0.001605"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.976395" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:46:40.975537" elapsed="0.000900"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:40.977078" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:40.976573" elapsed="0.000592"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.978013" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:40.977486" elapsed="0.000571"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:40.977203" elapsed="0.000905"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:40.976553" elapsed="0.001591"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:46:40.978351" elapsed="0.000873"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:46:40.980172" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:46:40.979501" 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-08-22T23:46:40.980467" elapsed="0.002667"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:46:40.960241" elapsed="0.023026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:40.983475" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:40.983342" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:40.983323" elapsed="0.000224"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:46:40.989862" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:46:40.983711" elapsed="0.006183"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:46:40.989948" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:46:40.990120" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:46:40.500254" elapsed="0.489893"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:46:40.990214" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:46:40.990369" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-08-22T23:46:40.360049" elapsed="0.630347"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:40.990755" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:40.990481" elapsed="0.000387"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:40.990464" elapsed="0.000430"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:46:40.990929" elapsed="0.000026"/>
</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-08-22T23:46:40.353952" elapsed="0.637103"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:46:40.347216" elapsed="0.643882"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:46:40.347076" elapsed="0.644057"/>
</for>
<arg>${member_index_list}</arg>
<status status="PASS" start="2026-08-22T23:46:40.344996" elapsed="0.646197"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:40.344662" elapsed="0.646559"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:40.344643" elapsed="0.646603"/>
</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-08-22T23:46:40.991657" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:40.991304" elapsed="0.000414"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:40.991288" elapsed="0.000454"/>
</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-08-22T23:46:39.853649" elapsed="1.138144"/>
</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-08-22T23:46:29.801603" elapsed="11.190254"/>
</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-08-22T23:46:40.995491" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:46:40.995102" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:46:40.996040" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:46:40.995726" elapsed="0.000365"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:46:40.996140" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:46:40.996319" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:46:40.994690" elapsed="0.001655"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:46:40.997436" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:46:40.997165" elapsed="0.000298"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:46:40.998274" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:46:40.998378" level="INFO">${current_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:46:40.998133" 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-08-22T23:46:41.001510" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:41.000933" elapsed="0.000740"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:41.000914" elapsed="0.000787"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:46:41.001958" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:46:41.002111" level="INFO">${current_ssh_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:46:41.001848" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:41.003085" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.200" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:41.002286" elapsed="0.000847"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:46:41.004034" level="INFO">${conn_id} = 78</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:46:41.003329" elapsed="0.000732"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:46:41.005510" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:46:41.005807" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:46:41.004930" elapsed="0.000972"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:46:41.006205" elapsed="0.000783"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:46:41.008664" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:46:41.603546" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:46:41 UTC 2026

  System load:  0.02               Processes:             119
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:45:15 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:46:41.008089" elapsed="0.595707"/>
</kw>
<msg time="2026-08-22T23:46:41.603925" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:46:41.007301" elapsed="0.596815"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:46:41.004305" elapsed="0.600014"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:46:41.604911" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-08-22T23:46:41.618104" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-08-22T23:46:41.618514" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:46:41.618662" 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-08-22T23:46:41.604562" elapsed="0.014157"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:46:41.619088" elapsed="0.000468"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:41.620903" 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-08-22T23:46:41.620016" elapsed="0.000993"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:46:41.621557" elapsed="0.000082"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:41.621187" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:41.621134" 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-08-22T23:46:41.622212" elapsed="0.000061"/>
</return>
<status status="PASS" start="2026-08-22T23:46:41.621889" elapsed="0.000459"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:41.621854" elapsed="0.000547"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:46:41.622477" 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-08-22T23:46:41.629097" elapsed="0.000276"/>
</kw>
<msg time="2026-08-22T23:46:41.629441" 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-08-22T23:46:41.627737" elapsed="0.001819"/>
</kw>
<kw name="Open 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-08-22T23:46:41.629983" elapsed="0.000051"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:41.630322" 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-08-22T23:46:41.623241" elapsed="0.007275"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:46:41.000287" elapsed="0.630363"/>
</kw>
<msg time="2026-08-22T23:46:41.630819" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:46:40.999639" elapsed="0.631266"/>
</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-08-22T23:46:40.999073" elapsed="0.631916"/>
</kw>
<msg time="2026-08-22T23:46:41.631032" 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-08-22T23:46:40.998558" elapsed="0.632601"/>
</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-08-22T23:46:41.634707" elapsed="0.000150"/>
</kw>
<msg time="2026-08-22T23:46:41.634900" 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-08-22T23:46:41.634074" 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-08-22T23:46:41.635120" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:41.635281" 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-08-22T23:46:41.631457" elapsed="0.003924"/>
</kw>
<msg time="2026-08-22T23:46:41.635480" 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-08-22T23:46:40.997696" elapsed="0.637810"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:41.636064" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:41.635786" elapsed="0.000322"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:46:41.636153" 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-08-22T23:46:40.996730" elapsed="0.639550"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:46:40.996537" elapsed="0.639780"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:46:41.637344" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:46:41.637069" elapsed="0.000302"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:46:41.638459" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:46:41.638566" level="INFO">${current_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:46:41.638066" elapsed="0.000550"/>
</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-08-22T23:46:41.641832" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:41.641199" elapsed="0.000784"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:41.641179" elapsed="0.000832"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:46:41.642274" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:46:41.642473" level="INFO">${current_ssh_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:46:41.642162" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:41.643511" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.12" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:41.642692" elapsed="0.000868"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:46:41.644444" 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-08-22T23:46:41.643746" elapsed="0.000725"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:46:41.645994" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:46:41.646228" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:46:41.645316" elapsed="0.001011"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:46:41.646746" elapsed="0.000698"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:46:41.649023" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:46:42.238125" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:46:41 UTC 2026

  System load:  0.05               Processes:             121
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:45:16 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:46:41.648662" elapsed="0.589823"/>
</kw>
<msg time="2026-08-22T23:46:42.238629" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:46:41.647805" elapsed="0.591003"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:46:41.644712" elapsed="0.594305"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:46:42.239625" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-08-22T23:46:42.252456" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-08-22T23:46:42.252952" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:46:42.253056" 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-08-22T23:46:42.239269" elapsed="0.013840"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:46:42.253515" elapsed="0.000513"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:42.255511" 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-08-22T23:46:42.254656" 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-08-22T23:46:42.256167" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:42.255830" elapsed="0.000444"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.255781" elapsed="0.000544"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:46:42.256766" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-08-22T23:46:42.256441" elapsed="0.000457"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.256407" elapsed="0.000543"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:46:42.257023" 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-08-22T23:46:42.265711" elapsed="0.000362"/>
</kw>
<msg time="2026-08-22T23:46:42.266194" 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-08-22T23:46:42.263907" elapsed="0.002457"/>
</kw>
<kw name="Open 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-08-22T23:46:42.266966" elapsed="0.000121"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:42.267464" 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-08-22T23:46:42.257746" elapsed="0.010020"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:46:41.640531" elapsed="0.627378"/>
</kw>
<msg time="2026-08-22T23:46:42.267985" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:46:41.639876" elapsed="0.628202"/>
</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-08-22T23:46:41.639292" elapsed="0.628886"/>
</kw>
<msg time="2026-08-22T23:46:42.268219" 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-08-22T23:46:41.638782" elapsed="0.629495"/>
</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-08-22T23:46:42.271722" elapsed="0.000147"/>
</kw>
<msg time="2026-08-22T23:46:42.271912" 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-08-22T23:46:42.271143" elapsed="0.000832"/>
</kw>
<kw name="Open 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-08-22T23:46:42.272131" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:42.272312" 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-08-22T23:46:42.268561" elapsed="0.003950"/>
</kw>
<msg time="2026-08-22T23:46:42.272647" 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-08-22T23:46:41.637592" elapsed="0.635084"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:42.273108" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:42.272855" elapsed="0.000294"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:46:42.273193" 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-08-22T23:46:41.636625" elapsed="0.636745"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:46:41.636419" elapsed="0.636992"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:46:42.274489" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:46:42.274190" elapsed="0.000327"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:46:42.275358" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:46:42.275458" level="INFO">${current_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:46:42.275232" elapsed="0.000253"/>
</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-08-22T23:46:42.278615" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:42.278015" elapsed="0.000747"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.277995" elapsed="0.000794"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:46:42.279049" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:46:42.279206" level="INFO">${current_ssh_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:46:42.278939" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:42.280231" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.79" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:42.279411" elapsed="0.000868"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:46:42.281137" level="INFO">${conn_id} = 80</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:46:42.280430" elapsed="0.000734"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:46:42.282832" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:46:42.283059" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:46:42.282167" elapsed="0.000988"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:46:42.283526" elapsed="0.000805"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:46:42.285931" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:46:42.623695" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:46:29 UTC 2026

  System load:  0.0                Processes:             122
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:46:29 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:46:42.285507" elapsed="0.338494"/>
</kw>
<msg time="2026-08-22T23:46:42.624219" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:46:42.284724" elapsed="0.339827"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:46:42.281374" elapsed="0.343657"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:46:42.626203" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-08-22T23:46:42.638474" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-08-22T23:46:42.638706" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:46:42.638752" 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-08-22T23:46:42.625560" elapsed="0.013215"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:46:42.638942" elapsed="0.000234"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:42.640387" 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-08-22T23:46:42.639529" elapsed="0.001090"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:46:42.641126" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:42.640793" elapsed="0.000439"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.640742" 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-08-22T23:46:42.641726" elapsed="0.000061"/>
</return>
<status status="PASS" start="2026-08-22T23:46:42.641400" elapsed="0.000462"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.641367" elapsed="0.000549"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:46:42.641992" 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-08-22T23:46:42.649229" elapsed="0.000225"/>
</kw>
<msg time="2026-08-22T23:46:42.649514" 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-08-22T23:46:42.648023" elapsed="0.001700"/>
</kw>
<kw name="Open 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-08-22T23:46:42.650024" elapsed="0.000047"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:42.650355" elapsed="0.000048"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:46:42.642749" elapsed="0.007902"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:46:42.277366" elapsed="0.373386"/>
</kw>
<msg time="2026-08-22T23:46:42.650804" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:46:42.276720" elapsed="0.374148"/>
</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-08-22T23:46:42.276151" elapsed="0.374796"/>
</kw>
<msg time="2026-08-22T23:46:42.650987" 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-08-22T23:46:42.275654" elapsed="0.375392"/>
</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-08-22T23:46:42.654730" elapsed="0.000148"/>
</kw>
<msg time="2026-08-22T23:46:42.654921" 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-08-22T23:46:42.654092" elapsed="0.000905"/>
</kw>
<kw name="Open 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-08-22T23:46:42.655155" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:42.655423" 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-08-22T23:46:42.651333" elapsed="0.004180"/>
</kw>
<msg time="2026-08-22T23:46:42.655622" 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-08-22T23:46:42.274755" elapsed="0.380894"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:42.656070" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:42.655821" elapsed="0.000290"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:46:42.656153" 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-08-22T23:46:42.273742" elapsed="0.382536"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:46:42.273517" elapsed="0.382800"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:46:40.996402" elapsed="1.659951"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-08-22T23:46:40.992144" elapsed="1.664269"/>
</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-08-22T23:46:29.022030" elapsed="13.634435"/>
</kw>
<arg>3</arg>
<doc>Convenience keyword that starts the specified member of the cluster.</doc>
<status status="PASS" start="2026-08-22T23:46:28.865704" elapsed="13.790832"/>
</kw>
<kw name="Get_Topology">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Topology_Core">
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:42.665040" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:42.664747" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:42.665489" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:42.665240" 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-08-22T23:46:42.705939" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:42.706273" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Fri, 21-Aug-2026 23:46:42 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '990'} 
 body={"network-topology:topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]} 
 </msg>
<msg time="2026-08-22T23:46:42.706532" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:46:42.667680" elapsed="0.038944"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:42.665618" elapsed="0.041107"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:42.707128" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:42.706787" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.665586" elapsed="0.041776"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:42.715649" level="INFO">{"network-topology:topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:42.709702" elapsed="0.006071"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:42.709184" elapsed="0.006666"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.709143" elapsed="0.006763"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:42.718706" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:42.716373" elapsed="0.002380"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:42.716032" elapsed="0.002756"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.715995" elapsed="0.002818"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:46:42.719364" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:46:42.718975" 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-08-22T23:46:42.719730" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:42.719463" elapsed="0.000332"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:42.720287" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:42.719981" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:42.719819" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.719445" elapsed="0.000925"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:46:42.720913" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:46:42.720527" 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-08-22T23:46:42.721239" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:42.721009" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:42.721796" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:42.721475" elapsed="0.000388"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:42.721319" elapsed="0.000582"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.720992" 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-08-22T23:46:42.722072" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:46:42.722907" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:46:42.722607" 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-08-22T23:46:42.723086" elapsed="0.002349"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:46:42.708197" elapsed="0.017301"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:42.725692" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:42.725568" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.725549" elapsed="0.000211"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:46:42.728778" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "en...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:46:42.725904" elapsed="0.002904"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:46:42.728860" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:46:42.729019" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "en...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:46:42.660400" elapsed="0.068645"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:46:42.729102" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:46:42.729250" level="INFO">${config_topology} = {
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "en...</msg>
<var>${config_topology}</var>
<arg>${config_topology_url}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:46:42.657967" elapsed="0.071309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:42.729710" level="INFO">{
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "encryption": {
       "encryption-alg": [
        "AEAD_AES_128_GCM",
        "AEAD_AES_256_GCM",
        "aes128-cbc",
        "aes128-ctr",
        "aes192-cbc",
        "aes192-ctr",
        "aes256-cbc",
        "aes256-ctr",
        "chacha20-poly1305"
       ]
      },
      "host-key": {
       "host-key-alg": [
        "ecdsa-sha2-nistp256",
        "ecdsa-sha2-nistp384",
        "ecdsa-sha2-nistp521",
        "rsa-sha2-256",
        "rsa-sha2-512",
        "ssh-ed25519",
        "ssh-rsa"
       ]
      },
      "key-exchange": {
       "key-exchange-alg": [
        "curve25519-sha256",
        "curve448-sha512",
        "diffie-hellman-group-exchange-sha256",
        "diffie-hellman-group14-sha256",
        "diffie-hellman-group15-sha512",
        "diffie-hellman-group16-sha512",
        "diffie-hellman-group17-sha512",
        "diffie-hellman-group18-sha512",
        "ecdh-sha2-nistp256",
        "ecdh-sha2-nistp384",
        "ecdh-sha2-nistp521",
        "mlkem1024nistp384-sha384",
        "mlkem768nistp256-sha256",
        "mlkem768x25519-sha256",
        "sntrup761x25519-sha512"
       ]
      },
      "mac": {
       "mac-alg": [
        "hmac-sha1",
        "hmac-sha2-256",
        "hmac-sha2-512"
       ]
      }
     }
    }
   }
  }
 ]
}
</msg>
<arg>${config_topology}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:42.729434" elapsed="0.000332"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:42.736986" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:42.736738" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:42.737422" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:42.737180" 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-08-22T23:46:42.749555" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:42.749877" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '990'} 
 body={"network-topology:topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]} 
 </msg>
<msg time="2026-08-22T23:46:42.750188" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:46:42.740525" elapsed="0.009725"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:42.737531" elapsed="0.012815"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:42.750782" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:42.750407" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.737513" elapsed="0.013467"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:42.757974" level="INFO">{"network-topology:topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:42.753293" elapsed="0.004735"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:42.752808" elapsed="0.005255"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.752766" elapsed="0.005322"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:42.760751" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:42.758363" elapsed="0.002433"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:42.758145" elapsed="0.002685"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.758128" elapsed="0.002727"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:46:42.761389" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:46:42.761015" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:42.761737" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:42.761485" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:42.762276" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:42.761978" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:42.761819" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.761467" elapsed="0.000892"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:46:42.762898" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:46:42.762514" 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-08-22T23:46:42.763221" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:42.762993" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:42.763770" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:42.763457" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:42.763301" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.762976" 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-08-22T23:46:42.764004" elapsed="0.000370"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:46:42.764835" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:46:42.764537" 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-08-22T23:46:42.765011" elapsed="0.002323"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:46:42.751791" elapsed="0.015615"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:42.767584" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:42.767475" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.767456" elapsed="0.000209"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:46:42.770651" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "en...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:46:42.767808" elapsed="0.002873"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:46:42.770766" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:46:42.770930" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "en...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:46:42.732404" elapsed="0.038553"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:46:42.771015" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:46:42.771169" level="INFO">${operational_topology} = {
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "en...</msg>
<var>${operational_topology}</var>
<arg>${operational_topology_url}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:46:42.729974" elapsed="0.041221"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:42.771621" level="INFO">{
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "encryption": {
       "encryption-alg": [
        "AEAD_AES_128_GCM",
        "AEAD_AES_256_GCM",
        "aes128-cbc",
        "aes128-ctr",
        "aes192-cbc",
        "aes192-ctr",
        "aes256-cbc",
        "aes256-ctr",
        "chacha20-poly1305"
       ]
      },
      "host-key": {
       "host-key-alg": [
        "ecdsa-sha2-nistp256",
        "ecdsa-sha2-nistp384",
        "ecdsa-sha2-nistp521",
        "rsa-sha2-256",
        "rsa-sha2-512",
        "ssh-ed25519",
        "ssh-rsa"
       ]
      },
      "key-exchange": {
       "key-exchange-alg": [
        "curve25519-sha256",
        "curve448-sha512",
        "diffie-hellman-group-exchange-sha256",
        "diffie-hellman-group14-sha256",
        "diffie-hellman-group15-sha512",
        "diffie-hellman-group16-sha512",
        "diffie-hellman-group17-sha512",
        "diffie-hellman-group18-sha512",
        "ecdh-sha2-nistp256",
        "ecdh-sha2-nistp384",
        "ecdh-sha2-nistp521",
        "mlkem1024nistp384-sha384",
        "mlkem768nistp256-sha256",
        "mlkem768x25519-sha256",
        "sntrup761x25519-sha512"
       ]
      },
      "mac": {
       "mac-alg": [
        "hmac-sha1",
        "hmac-sha2-256",
        "hmac-sha2-512"
       ]
      }
     }
    }
   }
  }
 ]
}
</msg>
<arg>${operational_topology}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:42.771350" elapsed="0.000329"/>
</kw>
<return>
<value>${config_topology}</value>
<value>${operational_topology}</value>
<status status="PASS" start="2026-08-22T23:46:42.771722" elapsed="0.000028"/>
</return>
<arg>${session}</arg>
<doc>Get both versions of topology (config and operational), log them and return them for further processing.</doc>
<status status="PASS" start="2026-08-22T23:46:42.657589" elapsed="0.114290"/>
</kw>
<msg time="2026-08-22T23:46:42.771978" level="INFO">${result} = ['{\n "network-topology:topology": [\n  {\n   "topology-id": "topology-netconf",\n   "topology-types": {\n    "netconf-node-topology:topology-netconf": {\n     "ssh-transport-topology-parameters": {\n...</msg>
<var>${result}</var>
<arg>${DEVICE_BOOT_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Get_Topology_Core</arg>
<arg>${session}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:46:42.657026" elapsed="0.114978"/>
</kw>
<return>
<value>${result}</value>
<status status="PASS" start="2026-08-22T23:46:42.772053" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:46:42.772216" level="INFO">${config_topology} = {
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "en...</msg>
<msg time="2026-08-22T23:46:42.772263" level="INFO">${operational_topology} = {
 "network-topology:topology": [
  {
   "topology-id": "topology-netconf",
   "topology-types": {
    "netconf-node-topology:topology-netconf": {
     "ssh-transport-topology-parameters": {
      "en...</msg>
<var>${config_topology}</var>
<var>${operational_topology}</var>
<arg>session=node3</arg>
<doc>Repeatedly try to get the topologies using Get_Topology_Core until either the request succeeds or boot timeout period expires.</doc>
<status status="PASS" start="2026-08-22T23:46:42.656713" elapsed="0.115574"/>
</kw>
<doc>Simulate node 3 restarted by admin just after device data is deleted and the change propagated in the cluster, fail if node 3 fails to boot.</doc>
<status status="PASS" start="2026-08-22T23:46:28.617201" elapsed="14.155205"/>
</test>
<test id="s1-s6-t20" name="Check_Device_Data_Removal_Is_Visible_On_node3" line="226">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:46:42.776367" elapsed="0.000303"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:46:42.776104" elapsed="0.000628"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:46:42.777727" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:42.777615" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.777582" 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-08-22T23:46:42.782685" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:42.782562" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.782544" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:46:42.783739" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:46:42.783344" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:46:42.784221" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:46:42.783921" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:46:42.784290" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:46:42.784441" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:46:42.782971" elapsed="0.001495"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:46:42.789927" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:42.789821" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.789802" 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-08-22T23:46:42.791153" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:42.791048" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.791030" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:46:42.791682" level="INFO">${karaf_connection_index} = 53</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:46:42.791365" elapsed="0.000343"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:46:42.792078" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:46:42.791862" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:46:42.819718" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:46:42.792614" elapsed="0.027233"/>
</kw>
<msg time="2026-08-22T23:46:42.820006" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:46:42.820052" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:46:42.792259" elapsed="0.027828"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:46:42.839276" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "R "e "m "o "v "a "l "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "n "o "d "e "3 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:46:42.820641" elapsed="0.018771"/>
</kw>
<msg time="2026-08-22T23:46:42.839618" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:46:42.839668" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "R "e "m "o "v "a "l "_ "I "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:46:42.820267" elapsed="0.019438"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:42.840079" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:42.839806" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.839776" elapsed="0.000388"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:42.840663" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "R "e "m "o "v "a "l "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "n "o "d "e "3 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:42.840308" elapsed="0.000428"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:42.841017" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:42.840804" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.840786" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:46:42.841133" 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-08-22T23:46:42.843898" elapsed="0.000157"/>
</kw>
<msg time="2026-08-22T23:46:42.844117" 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-08-22T23:46:42.842684" elapsed="0.001563"/>
</kw>
<kw name="Open 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-08-22T23:46:42.844516" elapsed="0.000100"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:42.844877" 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-08-22T23:46:42.842036" 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-08-22T23:46:42.841433" 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-08-22T23:46:42.790748" elapsed="0.054475"/>
</kw>
<msg time="2026-08-22T23:46:42.845373" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:46:42.845418" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "R "e "m "o "v "a "l "_ "I "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:46:42.790144" elapsed="0.055311"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:46:42.845665" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:46:42.845531" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.845513" 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-08-22T23:46:42.846186" 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-08-22T23:46:42.846530" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:46:42.846681" 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-08-22T23:46:42.789449" elapsed="0.057347"/>
</kw>
<msg time="2026-08-22T23:46:42.846892" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:46:42.846937" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "R "e "m "o "v "a "l "_ "I "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:46:42.784908" elapsed="0.062067"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:42.847299" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:42.847051" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.847034" elapsed="0.000342"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:46:42.784767" elapsed="0.062637"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:46:42.852896" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:42.852788" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.852769" elapsed="0.000338"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:46:42.854284" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:42.854177" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.854158" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:46:42.854822" level="INFO">${karaf_connection_index} = 67</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:46:42.854494" elapsed="0.000355"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:46:42.855220" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:46:42.855003" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:46:42.894034" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:46:42.855752" elapsed="0.038385"/>
</kw>
<msg time="2026-08-22T23:46:42.894308" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:46:42.894354" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:46:42.855402" elapsed="0.038988"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:46:42.919619" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "R "e "m "o "v "a "l "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "n "o "d "e "3 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:46:42.894940" elapsed="0.024792"/>
</kw>
<msg time="2026-08-22T23:46:42.919888" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:46:42.919933" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "R "e "m "o "v "a "l "_ "I "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:46:42.894557" elapsed="0.025413"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:42.920269" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:42.920047" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.920026" elapsed="0.000321"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:42.920817" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "R "e "m "o "v "a "l "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "n "o "d "e "3 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:42.920488" 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-08-22T23:46:42.921387" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:42.921167" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.920974" elapsed="0.000490"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:46:42.921497" 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-08-22T23:46:42.923944" elapsed="0.000146"/>
</kw>
<msg time="2026-08-22T23:46:42.924150" 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-08-22T23:46:42.922922" elapsed="0.001355"/>
</kw>
<kw name="Open 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-08-22T23:46:42.924546" elapsed="0.000150"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:42.924960" 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-08-22T23:46:42.922296" elapsed="0.002844"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:46:42.921770" elapsed="0.003434"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:46:42.853848" elapsed="0.071454"/>
</kw>
<msg time="2026-08-22T23:46:42.925394" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:46:42.925438" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "R "e "m "o "v "a "l "_ "I "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:46:42.853260" elapsed="0.072215"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:46:42.925676" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:46:42.925551" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.925532" 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-08-22T23:46:42.926144" 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-08-22T23:46:42.926470" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:46:42.926541" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:46:42.852429" elapsed="0.074239"/>
</kw>
<msg time="2026-08-22T23:46:42.926761" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:46:42.926805" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "R "e "m "o "v "a "l "_ "I "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:46:42.847738" elapsed="0.079103"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:42.927161" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:42.926916" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.926899" elapsed="0.000373"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:46:42.847534" elapsed="0.079761"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:46:42.932784" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:42.932675" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.932656" 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-08-22T23:46:42.933994" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:42.933887" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.933868" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:46:42.934492" level="INFO">${karaf_connection_index} = 76</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:46:42.934201" elapsed="0.000317"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:46:42.934909" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:46:42.934693" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:46:42.935728" 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-08-22T23:46:42.935449" elapsed="0.001005">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-08-22T23:46:42.936659" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-08-22T23:46:42.936707" 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-08-22T23:46:42.935091" elapsed="0.001640"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:46:42.937664" 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-08-22T23:46:42.937234" elapsed="0.001101">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-08-22T23:46:42.938516" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-08-22T23:46:42.938562" 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-08-22T23:46:42.936898" elapsed="0.001715"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-08-22T23:46:42.939538" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_Device_Data_Removal_Is_Visible_On_node3"</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-08-22T23:46:42.938918" elapsed="0.000705">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_Device_Data_Removal_Is_Visible_On_node3"</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:42.938691" elapsed="0.001006">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_Device_Data_Removal_Is_Visible_On_node3"</status>
</branch>
<status status="FAIL" start="2026-08-22T23:46:42.938671" elapsed="0.001059">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_Device_Data_Removal_Is_Visible_On_node3"</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-08-22T23:46:42.939888" 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-08-22T23:46:42.940115" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:42.939976" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:42.939959" elapsed="0.000231"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-08-22T23:46:42.940224" 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">
<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-08-22T23:46:42.942796" elapsed="0.000150"/>
</kw>
<msg time="2026-08-22T23:46:42.943005" 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-08-22T23:46:42.941721" 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="NOT RUN" start="2026-08-22T23:46:42.943399" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:42.943784" 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-08-22T23:46:42.941057" elapsed="0.002905"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:46:42.940477" 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="FAIL" start="2026-08-22T23:46:42.933557" elapsed="0.010555">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_Device_Data_Removal_Is_Visible_On_node3"</status>
</kw>
<msg time="2026-08-22T23:46:42.944218" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:46:42.944262" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-clustering.txt.Outages.Check_Device_Data_Removal_Is_Visible_On_node3"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:46:42.933001" elapsed="0.011285"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:46:42.944469" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:42.944361" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.944343" 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-08-22T23:46:42.945343" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:42.945238" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.945220" elapsed="0.000190"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:46:42.945715" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:46:42.945819" level="INFO">${current_ssh_connection_object} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:46:42.945562" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:42.946253" level="INFO">{1: 53, 2: 67, 3: 76}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:42.945994" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:42.946833" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:42.946484" elapsed="0.000393"/>
</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-08-22T23:46:42.947395" elapsed="0.000296"/>
</kw>
<msg time="2026-08-22T23:46:42.947791" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:46:42.947837" level="INFO">${old_connection_index} = 76</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-08-22T23:46:42.947033" elapsed="0.000827"/>
</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-08-22T23:46:42.948680" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:46:42.949937" 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-08-22T23:46:42.949515" elapsed="0.001278">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-08-22T23:46:42.949041" elapsed="0.001850"/>
</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-08-22T23:46:42.951514" elapsed="0.000323"/>
</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-08-22T23:46:42.951061" elapsed="0.000860"/>
</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-08-22T23:46:42.948155" elapsed="0.003812"/>
</kw>
<status status="PASS" start="2026-08-22T23:46:42.947936" elapsed="0.004081"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:42.947918" elapsed="0.004125"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:46:42.953086" level="INFO">${ip_address} = 10.30.170.79</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:46:42.952573" elapsed="0.000540"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:46:42.953181" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:46:42.953336" level="INFO">${odl_ip} = 10.30.170.79</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:46:42.952253" elapsed="0.001107"/>
</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-08-22T23:46:42.953514" elapsed="0.000457"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:46:42.954250" level="INFO">index=81
host=10.30.170.79
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-08-22T23:46:42.954349" level="INFO">${karaf_connection_object} = index=81
host=10.30.170.79
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:46:42.954140" 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-08-22T23:46:42.954525" elapsed="0.002386"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:46:42.957340" level="INFO">Logging into '10.30.170.79:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:46:43.479873" 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-08-22T23:46:42.957075" elapsed="0.522973"/>
</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-08-22T23:46:43.494547" elapsed="0.000446"/>
</kw>
<msg time="2026-08-22T23:46:43.495085" 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-08-22T23:46:43.493189" elapsed="0.002068"/>
</kw>
<kw name="Open 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-08-22T23:46:43.495423" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:43.495713" 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-08-22T23:46:43.481213" elapsed="0.014590"/>
</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-08-22T23:46:43.480466" elapsed="0.015386"/>
</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-08-22T23:46:42.944942" elapsed="0.550962"/>
</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-08-22T23:46:43.496858" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:43.496586" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:43.496557" elapsed="0.000378"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:46:43.497347" level="INFO">${karaf_connection_index} = 81</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:46:43.497077" elapsed="0.000297"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:46:43.497724" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:46:43.497528" elapsed="0.000222"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:46:43.585292" 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 "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:46:43.498242" elapsed="0.087141"/>
</kw>
<msg time="2026-08-22T23:46:43.585488" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:46:43.585533" 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 "n "e "t "c "o "n "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:46:43.497907" elapsed="0.087664"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:46:43.653073" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "R "e "m "o "v "a "l "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "n "o "d "e "3 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:46:43.586098" elapsed="0.067149"/>
</kw>
<msg time="2026-08-22T23:46:43.653386" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:46:43.653435" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "R "e "m "o "v "a "l "_ "I "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:46:43.585757" elapsed="0.067717"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:43.653852" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:43.653572" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:43.653544" elapsed="0.000391"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:43.654366" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "R "e "m "o "v "a "l "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "n "o "d "e "3 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:43.654079" elapsed="0.000358"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:43.655018" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:43.654506" elapsed="0.000569"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:43.654488" elapsed="0.000611"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:46:43.655134" 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-08-22T23:46:43.657782" elapsed="0.000393"/>
</kw>
<msg time="2026-08-22T23:46:43.658263" 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-08-22T23:46:43.656375" elapsed="0.002043"/>
</kw>
<kw name="Open 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-08-22T23:46:43.658582" elapsed="0.000043"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:43.658768" 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-08-22T23:46:43.655975" elapsed="0.002880"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:46:43.655418" elapsed="0.003483"/>
</kw>
<msg time="2026-08-22T23:46:43.659054" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "R "e "m "o "v "a "l "_ "I "s ...</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-08-22T23:46:43.496258" elapsed="0.162907"/>
</kw>
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:46:43.659217" 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-08-22T23:46:42.932316" elapsed="0.727030"/>
</kw>
<msg time="2026-08-22T23:46:43.659443" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:46:43.659486" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "R "e "m "o "v "a "l "_ "I "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:46:42.927553" elapsed="0.731970"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:43.659919" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:43.659629" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-08-22T23:46:43.659609" elapsed="0.000390"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:46:42.927416" elapsed="0.732608"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:46:42.784558" elapsed="0.875502"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:46:42.782204" elapsed="0.877916"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:46:42.777311" elapsed="0.882867"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:46:42.776884" elapsed="0.883342"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:46:42.773588" elapsed="0.886695"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:43.661986" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:43.661486" elapsed="0.000528"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:43.669584" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:43.669308" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:43.670050" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:43.669803" 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-08-22T23:46:43.687771" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:43.687989" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:43.688174" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:43.672240" elapsed="0.016865">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:43.670167" elapsed="0.019125">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:43.689748" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:43.689369" elapsed="0.000528"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:43.670146" elapsed="0.019805">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:43.690810" elapsed="0.000058"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:43.691219" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:43.691132" elapsed="0.000182"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:43.691090" 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-08-22T23:46:43.691722" elapsed="0.000050"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:43.691884" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:43.664771" elapsed="0.027347">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:43.692271" elapsed="0.000042"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:43.662234" elapsed="0.030283">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:43.693055" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:43.692731" elapsed="0.000449"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:43.692691" elapsed="0.000543"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:43.693702" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:43.693355" elapsed="0.000472"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:43.693320" elapsed="0.000560"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:43.661116" elapsed="0.032939">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:44.697370" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:44.696328" elapsed="0.001114"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:44.709276" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:44.709011" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:44.709747" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:44.709478" 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-08-22T23:46:44.721320" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:44.721540" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:44.721752" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:44.712024" elapsed="0.010268">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:44.709875" elapsed="0.012536">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:44.722718" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:44.722463" elapsed="0.000440"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:44.709848" elapsed="0.013092">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:44.723500" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:44.723722" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:44.723664" elapsed="0.000121"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:44.723637" elapsed="0.000178"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:44.724071" elapsed="0.000039"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:44.724194" elapsed="0.000026"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:44.702990" elapsed="0.021378">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:44.724467" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:44.698734" elapsed="0.025888">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:44.724938" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:44.724736" elapsed="0.000282"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:44.724713" elapsed="0.000338"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:44.725322" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:44.725126" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:44.725105" elapsed="0.000326"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:44.695105" elapsed="0.030436">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:45.728476" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:45.727441" elapsed="0.001107"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:45.739480" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:45.739216" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:45.739950" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:45.739700" 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-08-22T23:46:45.750194" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:45.750372" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:45.750529" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:45.742170" elapsed="0.008913">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:45.740070" elapsed="0.011210">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:45.751555" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:45.751332" elapsed="0.000342"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:45.740047" elapsed="0.011662">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:45.752239" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:45.752431" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:45.752376" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:45.752352" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:45.752745" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:45.752845" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:45.733359" elapsed="0.019634">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:45.753089" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:45.729081" elapsed="0.024140">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:45.753571" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:45.753330" elapsed="0.000335"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:45.753308" elapsed="0.000412"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:45.753994" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:45.753797" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:45.753775" elapsed="0.000325"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:45.726400" elapsed="0.027809">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:46.757271" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:46.756198" elapsed="0.001151"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:46.770358" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:46.770096" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:46.770826" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:46.770560" 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-08-22T23:46:46.781319" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:46.781482" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:46.781628" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:46.773027" elapsed="0.009080">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:46.770949" elapsed="0.011244">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:46.782527" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:46.782230" elapsed="0.000487"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:46.770924" elapsed="0.011849">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:46.783648" elapsed="0.000064"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:46.783966" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:46.783877" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:46.783837" 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-08-22T23:46:46.784439" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:46.784630" elapsed="0.000037"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:46.765078" elapsed="0.019796">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:46.785031" elapsed="0.000035"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:46.757947" elapsed="0.027295">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:46.785789" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:46.785420" elapsed="0.000499"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:46.785382" elapsed="0.000590"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:46.786399" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:46.786092" elapsed="0.000429"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:46.786057" elapsed="0.000516"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:46.755109" elapsed="0.031674">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:47.790011" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:47.788955" elapsed="0.001132"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:47.801354" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:47.801092" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:47.801845" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:47.801554" elapsed="0.000358"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:46:47.812391" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:47.812560" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:47.812778" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:47.804123" elapsed="0.009058">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:47.802026" elapsed="0.011241">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:47.813707" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:47.813312" elapsed="0.000552"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:47.801991" elapsed="0.011928">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:47.814798" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:47.815106" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:47.815018" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:47.814979" elapsed="0.000274"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:47.815582" elapsed="0.000074"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:47.815767" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:47.796788" elapsed="0.019214">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:47.816155" elapsed="0.000034"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:47.790628" elapsed="0.025760">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:47.816916" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:47.816563" elapsed="0.000478"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:47.816527" elapsed="0.000567"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:47.817520" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:47.817212" elapsed="0.000464"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:47.817178" elapsed="0.000552"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:47.787791" elapsed="0.030112">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:48.821234" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:48.820017" elapsed="0.001295"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:48.832557" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:48.832284" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:48.833043" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:48.832790" 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-08-22T23:46:48.844394" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:48.844759" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:48.845122" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:48.835299" elapsed="0.010803">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:48.833174" elapsed="0.013125">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:48.846830" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:48.846398" elapsed="0.000585"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:48.833147" elapsed="0.013891">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:48.847934" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:48.848245" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:48.848158" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:48.848118" 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-08-22T23:46:48.848742" elapsed="0.000050"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:48.848901" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:48.826898" elapsed="0.022238">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:48.849289" elapsed="0.000034"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:48.821958" elapsed="0.027535">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:48.850094" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:48.849766" elapsed="0.000454"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:48.849724" elapsed="0.000548"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:48.850662" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:48.850407" elapsed="0.000333"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:48.850368" elapsed="0.000404"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:48.818897" elapsed="0.031982">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:49.854019" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:49.852935" elapsed="0.001162"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:49.867607" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:49.867329" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:49.868060" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:49.867812" 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-08-22T23:46:49.879326" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:49.879551" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:49.879820" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:49.870333" elapsed="0.010006">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:49.868184" elapsed="0.012275">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:49.880748" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:49.880510" elapsed="0.000333"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:49.868161" elapsed="0.012717">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:49.881400" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:49.881615" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:49.881536" elapsed="0.000144"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:49.881513" elapsed="0.000198"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:49.881976" elapsed="0.000039"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:49.882100" elapsed="0.000026"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:49.861014" elapsed="0.021255">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:49.882370" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:49.854661" elapsed="0.027841">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:49.882844" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:49.882642" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:49.882618" elapsed="0.000339"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:49.883223" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:49.883031" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:49.883010" elapsed="0.000322"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:49.851803" elapsed="0.031636">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:50.887091" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:50.885995" elapsed="0.001189"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:50.898439" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:50.898179" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:50.898901" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:50.898656" 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-08-22T23:46:50.909217" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:50.909417" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:50.909812" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:50.901128" elapsed="0.009668">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:50.899024" elapsed="0.011959">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:50.911406" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:50.911063" elapsed="0.000504"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:50.899000" elapsed="0.012651">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:50.912470" elapsed="0.000058"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:50.912811" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:50.912723" elapsed="0.000183"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:50.912683" 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-08-22T23:46:50.913289" elapsed="0.000049"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:50.913447" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:50.893769" elapsed="0.019939">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:50.913865" elapsed="0.000035"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:50.887749" elapsed="0.026337">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:50.914609" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:50.914263" elapsed="0.000475"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:50.914227" elapsed="0.000564"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:50.915214" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:50.914909" elapsed="0.000426"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:50.914875" elapsed="0.000512"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:50.884757" elapsed="0.030801">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:51.918685" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:51.917675" elapsed="0.001089"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:51.932966" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:51.932704" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:51.933420" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:51.933170" 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-08-22T23:46:51.943614" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:51.943779" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:51.943962" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:51.935667" elapsed="0.008684">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:51.933546" elapsed="0.010940">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:51.944967" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:51.944573" elapsed="0.000546"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:51.933524" elapsed="0.011649">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:51.946032" elapsed="0.000060"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:51.946339" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:51.946253" elapsed="0.000182"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:51.946214" 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-08-22T23:46:51.946835" elapsed="0.000051"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:51.946998" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:51.928291" elapsed="0.018938">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:51.947384" elapsed="0.000034"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:51.919261" elapsed="0.028396">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:51.948154" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:51.947837" elapsed="0.000443"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:51.947800" elapsed="0.000535"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:51.948816" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:51.948455" elapsed="0.000490"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:51.948420" elapsed="0.000579"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:51.916527" elapsed="0.032646">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:52.952209" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:52.951126" elapsed="0.001159"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:52.962874" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:52.962610" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:52.963326" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:52.963078" 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-08-22T23:46:52.973701" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:52.973910" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:52.974133" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:52.965552" elapsed="0.009117">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:52.963448" elapsed="0.011337">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:52.975051" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:52.974833" elapsed="0.000311"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:52.963426" elapsed="0.011753">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:52.975730" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:52.975924" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:52.975868" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:52.975844" elapsed="0.000172"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:52.976215" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:52.976315" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:52.956542" elapsed="0.019921">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:52.976564" elapsed="0.000043"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:52.952813" elapsed="0.023910">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:52.977031" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:52.976833" elapsed="0.000316"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:52.976810" elapsed="0.000373"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:52.977456" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:52.977260" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:52.977238" elapsed="0.000330"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:52.950088" elapsed="0.027612">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:53.980654" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:53.979670" elapsed="0.001057"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:53.991993" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:53.991729" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:53.992442" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:53.992195" 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-08-22T23:46:54.002563" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:54.002804" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:54.003075" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:53.994666" elapsed="0.009004">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:53.992568" elapsed="0.011223">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:54.004091" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:54.003843" elapsed="0.000348"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:53.992544" elapsed="0.011683">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:54.004810" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:54.005013" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:54.004955" elapsed="0.000122"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:54.004929" elapsed="0.000181"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:54.005323" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:54.005429" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:53.985458" elapsed="0.020179">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:54.005751" elapsed="0.000024"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:53.981216" elapsed="0.024680">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:54.006272" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:54.006049" elapsed="0.000308"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:54.006021" elapsed="0.000372"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:54.006701" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:54.006473" elapsed="0.000312"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:54.006451" elapsed="0.000369"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:53.978613" elapsed="0.028322">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:55.010228" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:55.009142" elapsed="0.001187"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:55.020639" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:55.020360" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:55.021106" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:55.020846" 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-08-22T23:46:55.031864" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:55.032027" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:55.032221" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:55.023360" elapsed="0.009470">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:55.021231" elapsed="0.011806">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:55.033491" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:55.033120" elapsed="0.000553"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:55.021208" elapsed="0.012520">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:55.034618" elapsed="0.000060"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:55.034927" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:55.034840" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:55.034801" 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-08-22T23:46:55.035421" elapsed="0.000049"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:55.035608" elapsed="0.000037"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:55.015763" elapsed="0.020084">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:55.036004" elapsed="0.000035"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:55.010897" elapsed="0.025319">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:55.036743" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:55.036392" elapsed="0.000479"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:55.036354" elapsed="0.000570"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:55.037370" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:55.037045" elapsed="0.000459"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:55.037010" elapsed="0.000547"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:55.007876" elapsed="0.029896">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:56.041052" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:56.040043" elapsed="0.001083"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:56.051771" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:56.051489" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:56.052222" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:56.051974" 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-08-22T23:46:56.064797" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:56.065012" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:56.065250" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:56.054575" elapsed="0.011215">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:56.052349" elapsed="0.013559">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:56.066172" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:56.065958" elapsed="0.000308"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:56.052323" elapsed="0.014022">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:56.067138" elapsed="0.000060"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:56.067448" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:56.067361" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:56.067322" 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-08-22T23:46:56.067953" elapsed="0.000050"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:56.068113" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:56.045493" elapsed="0.022854">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:56.068506" elapsed="0.000034"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:56.041662" elapsed="0.027089">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:56.069244" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:56.068928" elapsed="0.000442"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:56.068891" elapsed="0.000532"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:56.069881" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:56.069542" elapsed="0.000464"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:56.069507" elapsed="0.000552"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:56.038942" elapsed="0.031288">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:57.073447" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:57.072356" elapsed="0.001171"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:57.084137" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:57.083872" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:57.084604" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:57.084340" 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-08-22T23:46:57.095192" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:57.095375" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:57.095615" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:57.086855" elapsed="0.009182">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:57.084738" elapsed="0.011388">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:57.096336" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:57.096167" elapsed="0.000235"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:57.084710" elapsed="0.011717">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:57.096837" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:57.096979" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:57.096936" elapsed="0.000091"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:57.096919" elapsed="0.000130"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:57.097194" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:57.097264" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:57.077930" elapsed="0.019443">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:57.097442" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:57.074130" elapsed="0.023406">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:57.097808" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:57.097632" elapsed="0.000235"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:57.097615" elapsed="0.000276"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:57.098086" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:57.097945" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:57.097929" elapsed="0.000235"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:57.071264" elapsed="0.026978">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:58.100520" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:58.099803" elapsed="0.000771"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:58.109854" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:58.109535" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:58.110319" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:58.110064" 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-08-22T23:46:58.121851" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:58.122099" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:58.122392" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:58.112729" elapsed="0.010299">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:58.110451" elapsed="0.012703">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:58.123484" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:58.123216" elapsed="0.000388"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:58.110423" elapsed="0.013220">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:58.124254" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:58.124460" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:58.124401" elapsed="0.000131"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:58.124369" elapsed="0.000198"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:58.124796" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:58.124930" elapsed="0.000024"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:58.104456" elapsed="0.020629">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:58.125179" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:58.100950" elapsed="0.024356">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:58.125626" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:58.125412" elapsed="0.000288"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:58.125389" elapsed="0.000341"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:58.125993" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:58.125801" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:58.125780" elapsed="0.000322"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:58.099002" elapsed="0.027203">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:46:59.129125" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:46:59.128152" elapsed="0.001044"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:59.140800" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:59.140489" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:46:59.141249" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:46:59.141003" 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-08-22T23:46:59.151697" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:46:59.151867" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:46:59.152070" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:46:59.143423" elapsed="0.009036">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:46:59.141372" elapsed="0.011174">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:59.153020" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:59.152631" elapsed="0.000548"/>
</branch>
<status status="FAIL" start="2026-08-22T23:46:59.141348" elapsed="0.011888">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:59.154192" elapsed="0.000062"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:59.154519" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:46:59.154425" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:59.154383" 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-08-22T23:46:59.155052" elapsed="0.000052"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:46:59.155220" elapsed="0.000036"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:46:59.135235" elapsed="0.020233">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:46:59.155680" elapsed="0.000039"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:46:59.129724" elapsed="0.026182">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:59.156435" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:59.156091" elapsed="0.000475"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:59.156052" elapsed="0.000603"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:46:59.157120" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:46:59.156784" elapsed="0.000467"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:46:59.156747" elapsed="0.000560"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:46:59.127080" elapsed="0.030410">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:00.160517" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:00.159523" elapsed="0.001099"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:00.171672" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:00.171384" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:00.172132" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:00.171879" 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-08-22T23:47:00.187785" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:00.187994" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:00.188268" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:00.174339" elapsed="0.014474">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:00.172255" elapsed="0.016679">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:00.189216" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:00.188986" elapsed="0.000326"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:00.172232" elapsed="0.017114">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:00.189921" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:00.190141" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:00.190061" elapsed="0.000144"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:00.190036" elapsed="0.000200"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:00.190438" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:00.190538" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:00.165173" elapsed="0.025544">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:00.190827" elapsed="0.000024"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:00.161125" elapsed="0.029841">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:00.191293" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:00.191082" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:00.191058" elapsed="0.000355"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:00.191721" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:00.191493" elapsed="0.000313"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:00.191470" elapsed="0.000372"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:00.158449" elapsed="0.033508">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:01.194983" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:01.193998" elapsed="0.001060"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:01.205750" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:01.205469" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:01.206203" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:01.205954" 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-08-22T23:47:01.216904" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:01.217111" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:01.217342" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:01.208774" elapsed="0.009090">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:01.206328" elapsed="0.011649">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:01.218245" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:01.218026" elapsed="0.000311"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:01.206305" elapsed="0.012066">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:01.218913" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:01.219103" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:01.219049" elapsed="0.000114"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:01.219025" elapsed="0.000168"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:01.219391" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:01.219490" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:01.199404" elapsed="0.020250">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:01.219751" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:01.195551" elapsed="0.024330">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:01.220187" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:01.219989" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:01.219966" elapsed="0.000331"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:01.220632" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:01.220418" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:01.220395" elapsed="0.000350"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:01.192937" elapsed="0.027915">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:02.223681" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:02.222692" elapsed="0.001067"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:02.235368" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:02.235111" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:02.235834" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:02.235571" 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-08-22T23:47:02.246612" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:02.246819" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:02.247032" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:02.238010" elapsed="0.009522">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:02.235955" elapsed="0.011714">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:02.247931" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:02.247718" elapsed="0.000306"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:02.235932" elapsed="0.012127">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:02.248592" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:02.248786" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:02.248731" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:02.248707" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:02.249076" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:02.249176" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:02.228743" elapsed="0.020579">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:02.249421" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:02.224247" elapsed="0.025308">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:02.249896" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:02.249695" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:02.249669" elapsed="0.000340"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:02.250279" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:02.250085" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:02.250064" elapsed="0.000361"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:02.221666" elapsed="0.028867">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:03.253112" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:03.252178" elapsed="0.001001"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:03.264759" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:03.264403" elapsed="0.000403"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:03.265202" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:03.264959" 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-08-22T23:47:03.274652" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:03.274823" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:03.275042" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:03.267363" elapsed="0.008144">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:03.265315" elapsed="0.010322">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:03.275899" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:03.275686" elapsed="0.000304"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:03.265296" elapsed="0.010727">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:03.276561" elapsed="0.000057"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:03.276771" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:03.276719" elapsed="0.000110"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:03.276695" elapsed="0.000164"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:03.277056" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:03.277153" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:03.258215" elapsed="0.019081">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:03.277391" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:03.253684" elapsed="0.023837">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:03.277858" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:03.277656" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:03.277632" elapsed="0.000337"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:03.278233" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:03.278044" elapsed="0.000265"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:03.278022" elapsed="0.000319"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:03.251241" elapsed="0.027209">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:04.281243" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:04.280264" elapsed="0.001051"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:04.293456" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:04.293194" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:04.293957" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:04.293674" 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-08-22T23:47:04.303251" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:04.303407" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:04.303603" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:04.296143" elapsed="0.007844">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:04.294078" elapsed="0.009990">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:04.304257" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:04.304103" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:04.294056" elapsed="0.010291">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:04.304746" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:04.304883" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:04.304844" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:04.304826" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:04.305089" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:04.305160" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:04.285641" elapsed="0.019622">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:04.305333" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:04.281915" elapsed="0.023513">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:04.305664" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:04.305506" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:04.305490" elapsed="0.000260"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:04.305986" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:04.305844" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:04.305827" elapsed="0.000237"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:04.279238" elapsed="0.026905">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:05.309219" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:05.308146" elapsed="0.001146"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:05.320251" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:05.319992" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:05.320712" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:05.320450" 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-08-22T23:47:05.329855" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:05.330062" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:05.330291" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:05.323171" elapsed="0.007659">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:05.320832" elapsed="0.010117">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:05.331230" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:05.330999" elapsed="0.000355"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:05.320810" elapsed="0.010583">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:05.332003" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:05.332201" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:05.332145" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:05.332120" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:05.332493" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:05.332612" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:05.314014" elapsed="0.018748">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:05.332859" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:05.309820" elapsed="0.023171">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:05.333299" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:05.333099" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:05.333077" elapsed="0.000334"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:05.333699" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:05.333485" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:05.333464" elapsed="0.000348"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:05.307000" elapsed="0.026920">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:06.337111" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:06.336088" elapsed="0.001097"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:06.349697" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:06.349311" elapsed="0.000456"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:06.350178" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:06.349924" 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-08-22T23:47:06.359317" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:06.359482" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:06.359678" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:06.352598" elapsed="0.007554">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:06.350304" elapsed="0.009961">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:06.360528" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:06.360314" elapsed="0.000330"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:06.350280" elapsed="0.010435">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:06.361251" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:06.361443" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:06.361387" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:06.361363" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:06.361755" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:06.361854" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:06.342870" elapsed="0.019129">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:06.362096" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:06.337713" elapsed="0.024513">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:06.362532" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:06.362334" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:06.362312" elapsed="0.000354"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:06.362975" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:06.362739" elapsed="0.000325"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:06.362718" elapsed="0.000378"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:06.334946" elapsed="0.028256">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:07.365871" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:07.365175" elapsed="0.001000"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:07.378072" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:07.377703" elapsed="0.000433"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:07.378560" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:07.378304" 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-08-22T23:47:07.389448" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:07.389722" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:07.390061" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:07.381037" elapsed="0.009673">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:07.378710" elapsed="0.012134">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:07.391153" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:07.390900" elapsed="0.000351"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:07.378683" elapsed="0.012603">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:07.391926" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:07.392136" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:07.392077" elapsed="0.000126"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:07.392049" elapsed="0.000185"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:07.392446" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:07.392550" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:07.371376" elapsed="0.021354">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:07.392834" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:07.366510" elapsed="0.026463">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:07.393303" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:07.393088" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:07.393064" elapsed="0.000357"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:07.393728" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:07.393501" elapsed="0.000313"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:07.393478" elapsed="0.000371"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:07.364317" elapsed="0.029697">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:08.397145" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:08.396106" elapsed="0.001115"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:08.408479" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:08.408212" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:08.408951" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:08.408700" 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-08-22T23:47:08.419844" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:08.420019" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:08.420213" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:08.411440" elapsed="0.009210">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:08.409081" elapsed="0.011655">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:08.420936" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:08.420773" elapsed="0.000230"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:08.409057" elapsed="0.011971">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:08.421414" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:08.421554" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:08.421513" elapsed="0.000102"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:08.421496" elapsed="0.000142"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:08.421784" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:08.421855" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:08.403551" elapsed="0.018412">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:08.422033" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:08.397762" elapsed="0.024365">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:08.422349" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:08.422206" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:08.422189" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:08.422638" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:08.422483" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:08.422467" elapsed="0.000252"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:08.394935" elapsed="0.027862">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:09.426003" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:09.424975" elapsed="0.001103"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:09.439281" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:09.438919" elapsed="0.000432"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:09.439930" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:09.439562" 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-08-22T23:47:09.451842" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:09.452005" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:09.452205" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:09.443253" elapsed="0.009427">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:09.440104" elapsed="0.012663">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:09.453229" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:09.452810" elapsed="0.000572"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:09.440071" elapsed="0.013365">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:09.454313" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:09.454650" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:09.454533" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:09.454494" 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-08-22T23:47:09.455117" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:09.455271" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:09.432432" elapsed="0.023072">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:09.455688" elapsed="0.000035"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:09.426574" elapsed="0.029325">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:09.456414" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:09.456072" elapsed="0.000468"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:09.456036" elapsed="0.000585"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:09.457083" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:09.456743" elapsed="0.000461"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:09.456708" elapsed="0.000548"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:09.423710" elapsed="0.033719">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:10.460532" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:10.459495" elapsed="0.001148"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:10.471616" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:10.471236" elapsed="0.000449"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:10.472241" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:10.471898" 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-08-22T23:47:10.482146" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:10.482316" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:10.482510" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:10.475252" elapsed="0.007676">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:10.472415" elapsed="0.010600">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:10.483224" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:10.483054" elapsed="0.000237"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:10.472382" elapsed="0.010934">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:10.483734" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:10.483876" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:10.483835" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:10.483817" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:10.484100" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:10.484172" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:10.465161" elapsed="0.019120">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:10.484349" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:10.461144" elapsed="0.023298">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:10.484679" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:10.484520" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:10.484504" elapsed="0.000255"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:10.484952" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:10.484813" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:10.484797" elapsed="0.000232"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:10.458378" elapsed="0.026729">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:11.488200" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:11.487174" elapsed="0.001101"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:11.499376" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:11.499115" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:11.499840" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:11.499591" 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-08-22T23:47:11.509916" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:11.510084" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:11.510345" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:11.502258" elapsed="0.008528">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:11.499968" elapsed="0.010905">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:11.511270" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:11.510916" elapsed="0.000499"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:11.499944" elapsed="0.011524">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:11.512338" elapsed="0.000058"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:11.512676" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:11.512557" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:11.512518" 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-08-22T23:47:11.513198" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:11.513353" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:11.494438" elapsed="0.019208">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:11.513805" elapsed="0.000035"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:11.488798" elapsed="0.025214">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:11.514687" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:11.514184" elapsed="0.000641"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:11.514148" elapsed="0.000736"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:11.515340" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:11.515026" elapsed="0.000435"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:11.514985" elapsed="0.000527"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:11.486020" elapsed="0.029705">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:12.518748" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:12.517717" elapsed="0.001106"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:12.531044" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:12.530780" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:12.531489" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:12.531245" 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-08-22T23:47:12.542179" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:12.542364" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:12.542574" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:12.534029" elapsed="0.008991">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:12.531634" elapsed="0.011478">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:12.543390" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:12.543155" elapsed="0.000328"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:12.531607" elapsed="0.011901">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:12.543974" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:12.544141" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:12.544095" elapsed="0.000094"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:12.544070" elapsed="0.000142"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:12.544361" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:12.544432" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:12.525445" elapsed="0.019099">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:12.544637" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:12.519315" elapsed="0.025428">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:12.544978" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:12.544825" elapsed="0.000245"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:12.544807" elapsed="0.000287"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:12.545293" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:12.545150" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:12.545133" elapsed="0.000238"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:12.516683" elapsed="0.028767">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:13.548477" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:13.547472" elapsed="0.001076"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:13.561202" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:13.560935" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:13.561692" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:13.561415" 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-08-22T23:47:13.573283" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:13.573637" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:13.574021" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:13.564312" elapsed="0.010549">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:13.561822" elapsed="0.013229">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:13.575492" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:13.575132" elapsed="0.000554"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:13.561795" elapsed="0.013978">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:13.576772" elapsed="0.000118"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:13.577166" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:13.577076" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:13.577030" 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-08-22T23:47:13.577665" elapsed="0.000049"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:13.577823" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:13.554845" elapsed="0.023181">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:13.578129" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:13.549064" elapsed="0.029206">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:13.578618" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:13.578387" elapsed="0.000315"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:13.578362" elapsed="0.000375"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:13.579022" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:13.578815" elapsed="0.000288"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:13.578793" elapsed="0.000345"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:13.546315" elapsed="0.032938">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:14.582478" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:14.581358" elapsed="0.001199"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:14.595115" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:14.594818" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:14.595629" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:14.595328" 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-08-22T23:47:14.605067" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:14.605376" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:14.605792" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:14.598122" elapsed="0.008488">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:14.595762" elapsed="0.011038">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:14.607253" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:14.606879" elapsed="0.000522"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:14.595737" elapsed="0.011716">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:14.608338" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:14.608675" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:14.608558" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:14.608519" elapsed="0.000301"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:14.609133" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:14.609287" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:14.589131" elapsed="0.020465">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:14.609758" elapsed="0.000035"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:14.583120" elapsed="0.026848">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:14.610341" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:14.610120" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:14.610092" elapsed="0.000358"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:14.610736" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:14.610522" elapsed="0.000292"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:14.610501" elapsed="0.000345"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:14.580194" elapsed="0.030759">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:15.613878" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:15.612894" elapsed="0.001055"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:15.628887" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:15.628626" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:15.629333" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:15.629091" 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-08-22T23:47:15.639068" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:15.639224" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:15.639409" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:15.631750" elapsed="0.008068">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:15.629457" elapsed="0.010445">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:15.640100" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:15.639939" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:15.629433" elapsed="0.010756">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:15.640566" elapsed="0.000043"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:15.640721" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:15.640682" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:15.640664" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:15.640930" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:15.641000" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:15.620272" elapsed="0.020837">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:15.641178" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:15.614462" elapsed="0.026809">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:15.641493" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:15.641350" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:15.641334" elapsed="0.000238"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:15.641782" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:15.641643" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:15.641627" elapsed="0.000233"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:15.611861" elapsed="0.030076">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:16.645559" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:16.644563" elapsed="0.001106"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:16.659198" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:16.658868" elapsed="0.000388"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:16.659692" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:16.659416" 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-08-22T23:47:16.669887" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:16.670073" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:16.670334" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:16.662033" elapsed="0.008810">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:16.659817" elapsed="0.011121">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:16.671244" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:16.670981" elapsed="0.000362"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:16.659794" elapsed="0.011585">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:16.672061" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:16.672271" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:16.672212" elapsed="0.000124"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:16.672185" elapsed="0.000184"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:16.672600" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:16.672705" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:16.651937" elapsed="0.020929">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:16.672968" elapsed="0.000024"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:16.646166" elapsed="0.026943">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:16.673436" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:16.673224" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:16.673200" elapsed="0.000353"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:16.673857" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:16.673652" elapsed="0.000285"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:16.673629" elapsed="0.000342"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:16.643425" elapsed="0.030660">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:17.677187" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:17.676076" elapsed="0.001188"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:17.687658" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:17.687368" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:17.688110" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:17.687863" 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-08-22T23:47:17.698695" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:17.698858" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:17.699054" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:17.690538" elapsed="0.008921">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:17.688235" elapsed="0.011309">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:17.699762" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:17.699598" elapsed="0.000229"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:17.688210" elapsed="0.011642">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:17.700245" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:17.700386" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:17.700345" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:17.700327" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:17.700629" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:17.700716" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:17.682996" elapsed="0.017832">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:17.700898" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:17.678033" elapsed="0.022962">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:17.701228" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:17.701079" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:17.701059" elapsed="0.000250"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:17.701508" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:17.701363" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:17.701348" elapsed="0.000266"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:17.674984" elapsed="0.026738">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:18.704729" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:18.703694" elapsed="0.001110"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:18.716693" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:18.716414" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:18.717162" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:18.716895" 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-08-22T23:47:18.727724" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:18.727925" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:18.728141" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:18.719573" elapsed="0.008977">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:18.717300" elapsed="0.011362">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:18.728903" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:18.728704" elapsed="0.000279"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:18.717271" elapsed="0.011737">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:18.729441" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:18.729606" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:18.729547" elapsed="0.000107"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:18.729527" elapsed="0.000149"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:18.729824" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:18.729896" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:18.710874" elapsed="0.019147">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:18.730094" elapsed="0.000018"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:18.705300" elapsed="0.024894">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:18.730426" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:18.730277" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:18.730259" elapsed="0.000249"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:18.730729" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:18.730563" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:18.730547" elapsed="0.000264"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:18.702570" elapsed="0.028321">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:19.734077" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:19.733003" elapsed="0.001151"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:19.745612" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:19.745328" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:19.746072" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:19.745820" 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-08-22T23:47:19.756923" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:19.757090" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:19.757279" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:19.748533" elapsed="0.009161">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:19.746212" elapsed="0.011583">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:19.757996" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:19.757837" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:19.746186" elapsed="0.011902">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:19.758485" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:19.758644" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:19.758601" elapsed="0.000091"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:19.758568" elapsed="0.000145"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:19.758857" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:19.758927" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:19.740479" elapsed="0.018553">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:19.759102" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:19.734700" elapsed="0.024496">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:19.759420" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:19.759274" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:19.759258" elapsed="0.000242"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:19.759709" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:19.759553" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:19.759538" elapsed="0.000251"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:19.731823" elapsed="0.028081">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:20.762760" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:20.761726" elapsed="0.001106"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:20.774971" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:20.774566" elapsed="0.000454"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:20.775420" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:20.775174" 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-08-22T23:47:20.785857" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:20.786015" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:20.786220" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:20.777831" elapsed="0.008808">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:20.775546" elapsed="0.011179">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:20.786922" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:20.786761" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:20.775523" elapsed="0.011488">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:20.787397" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:20.787537" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:20.787496" elapsed="0.000103"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:20.787479" elapsed="0.000143"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:20.787768" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:20.787838" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:20.768948" elapsed="0.018997">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:20.788014" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:20.763325" elapsed="0.024784">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:20.788337" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:20.788193" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:20.788176" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:20.788625" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:20.788469" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:20.788454" elapsed="0.000251"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:20.760690" elapsed="0.028095">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:21.791749" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:21.790750" elapsed="0.001075"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:21.803390" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:21.803124" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:21.803852" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:21.803604" 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-08-22T23:47:21.814361" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:21.814526" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:21.814751" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:21.806259" elapsed="0.008884">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:21.803978" elapsed="0.011254">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:21.815423" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:21.815269" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:21.803954" elapsed="0.011562">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:21.815917" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:21.816057" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:21.816016" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:21.815999" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:21.816274" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:21.816345" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:21.798272" elapsed="0.018179">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:21.816521" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:21.792337" elapsed="0.024295">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:21.816855" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:21.816713" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:21.816697" elapsed="0.000237"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:21.817124" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:21.816987" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:21.816972" elapsed="0.000230"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:21.789664" elapsed="0.027615">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:22.820331" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:22.819293" elapsed="0.001113"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:22.834230" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:22.833966" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:22.834693" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:22.834429" 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-08-22T23:47:22.844688" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:22.844844" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:22.845031" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:22.837132" elapsed="0.008372">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:22.834820" elapsed="0.010820">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:22.845905" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:22.845691" elapsed="0.000307"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:22.834796" elapsed="0.011237">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:22.846564" elapsed="0.000058"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:22.846778" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:22.846723" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:22.846699" elapsed="0.000170"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:22.847067" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:22.847166" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:22.826425" elapsed="0.020887">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:22.847427" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:22.820934" elapsed="0.026625">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:22.847893" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:22.847696" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:22.847673" elapsed="0.000330"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:22.848270" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:22.848078" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:22.848057" elapsed="0.000322"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:22.818225" elapsed="0.030262">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:23.851667" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:23.850645" elapsed="0.001099"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:23.865669" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:23.865393" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:23.866120" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:23.865872" 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-08-22T23:47:23.876962" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:23.877131" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:23.877331" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:23.868588" elapsed="0.009164">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:23.866270" elapsed="0.011568">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:23.878037" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:23.877875" elapsed="0.000244"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:23.866239" elapsed="0.011904">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:23.878531" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:23.878696" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:23.878654" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:23.878636" elapsed="0.000128"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:23.878908" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:23.878978" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:23.858056" elapsed="0.021039">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:23.879166" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:23.852239" elapsed="0.027027">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:23.879487" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:23.879345" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:23.879328" elapsed="0.000237"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:23.879774" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:23.879635" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:23.879619" elapsed="0.000232"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:23.849434" elapsed="0.030494">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:24.882995" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:24.881951" elapsed="0.001118"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:24.895021" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:24.894761" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:24.895470" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:24.895222" 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-08-22T23:47:24.905645" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:24.905807" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:24.905998" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:24.897872" elapsed="0.008516">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:24.895608" elapsed="0.010863">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:24.906679" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:24.906506" elapsed="0.000248"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:24.895570" elapsed="0.011209">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:24.907155" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:24.907293" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:24.907253" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:24.907236" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:24.907500" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:24.907570" elapsed="0.000031"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:24.889192" elapsed="0.018500">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:24.907761" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:24.883562" elapsed="0.024293">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:24.908075" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:24.907934" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:24.907918" elapsed="0.000237"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:24.908344" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:24.908207" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:24.908192" elapsed="0.000230"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:24.880867" elapsed="0.027637">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:25.911430" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:25.910391" elapsed="0.001111"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:25.925506" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:25.925237" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:25.925974" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:25.925724" 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-08-22T23:47:25.936316" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:25.936559" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:25.936846" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:25.928439" elapsed="0.008956">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:25.926100" elapsed="0.011409">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:25.937803" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:25.937558" elapsed="0.000339"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:25.926077" elapsed="0.011855">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:25.938452" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:25.938671" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:25.938613" elapsed="0.000121"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:25.938567" elapsed="0.000197"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:25.938998" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:25.939100" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:25.917527" elapsed="0.021718">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:25.939342" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:25.912028" elapsed="0.027448">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:25.939815" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:25.939609" elapsed="0.000286"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:25.939564" elapsed="0.000365"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:25.940200" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:25.940005" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:25.939983" elapsed="0.000326"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:25.909338" elapsed="0.031095">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:26.943419" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:26.942443" elapsed="0.001049"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:26.954064" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:26.953804" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:26.954512" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:26.954263" 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-08-22T23:47:26.965108" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:26.965416" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:26.965790" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:26.956947" elapsed="0.009625">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:26.954653" elapsed="0.012132">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:26.967231" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:26.966865" elapsed="0.000516"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:26.954628" elapsed="0.012807">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:26.968320" elapsed="0.000057"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:26.968744" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:26.968654" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:26.968608" 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-08-22T23:47:26.969209" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:26.969347" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:26.949468" elapsed="0.020037">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:26.969628" elapsed="0.000024"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:26.944017" elapsed="0.025751">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:26.970092" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:26.969881" elapsed="0.000293"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:26.969857" elapsed="0.000351"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:26.970491" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:26.970285" elapsed="0.000285"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:26.970263" elapsed="0.000362"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:26.941362" elapsed="0.029377">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:27.973767" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:27.972769" elapsed="0.001072"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:27.984216" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:27.983957" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:27.984674" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:27.984413" 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-08-22T23:47:27.994328" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:27.994487" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:27.994696" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:27.987078" elapsed="0.008051">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:27.984799" elapsed="0.010415">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:27.995421" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:27.995252" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:27.984775" elapsed="0.010737">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:27.995920" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:27.996059" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:27.996018" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:27.996000" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:27.996282" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:27.996359" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:27.979702" elapsed="0.016764">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:27.996535" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:27.974336" elapsed="0.022308">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:27.996867" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:27.996725" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:27.996708" elapsed="0.000238"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:27.997136" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:27.996999" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:27.996984" elapsed="0.000230"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:27.971699" elapsed="0.025591">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:29.000238" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:28.999245" elapsed="0.001066"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:29.013783" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:29.013500" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:29.014248" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:29.013985" 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-08-22T23:47:29.023736" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:29.023900" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:29.024083" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:29.016447" elapsed="0.008027">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:29.014375" elapsed="0.010179">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:29.024762" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:29.024606" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:29.014348" elapsed="0.010503">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:29.025233" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:29.025369" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:29.025329" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:29.025312" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:29.025589" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:29.025661" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:29.006383" elapsed="0.019383">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:29.025833" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:29.000838" elapsed="0.025089">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:29.026163" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:29.026004" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:29.025987" elapsed="0.000260"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:29.026446" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:29.026301" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:29.026285" elapsed="0.000240"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:28.998153" elapsed="0.028465">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:30.029661" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:30.028637" elapsed="0.001102"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:30.041994" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:30.041700" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:30.042442" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:30.042197" 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-08-22T23:47:30.052974" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:30.053147" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:30.053348" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:30.044877" elapsed="0.008938">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:30.042567" elapsed="0.011344">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:30.054123" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:30.053953" elapsed="0.000237"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:30.042543" elapsed="0.011672">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:30.054675" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:30.054823" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:30.054782" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:30.054763" elapsed="0.000128"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:30.055037" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:30.055109" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:30.035897" elapsed="0.019322">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:30.055287" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:30.030266" elapsed="0.025116">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:30.055643" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:30.055467" elapsed="0.000245"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:30.055445" elapsed="0.000295"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:30.055973" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:30.055797" elapsed="0.000235"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:30.055781" elapsed="0.000275"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:30.027502" elapsed="0.028632">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:31.059000" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:31.058025" elapsed="0.001047"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:31.072784" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:31.072505" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:31.073233" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:31.072986" 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-08-22T23:47:31.083330" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:31.083520" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:31.083789" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:31.075723" elapsed="0.008608">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:31.073357" elapsed="0.011095">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:31.084753" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:31.084503" elapsed="0.000351"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:31.073335" elapsed="0.011556">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:31.085440" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:31.085665" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:31.085604" elapsed="0.000127"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:31.085559" 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-08-22T23:47:31.085994" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:31.086101" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:31.065075" elapsed="0.021181">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:31.086360" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:31.059555" elapsed="0.026944">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:31.086851" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:31.086638" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:31.086613" elapsed="0.000358"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:31.087257" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:31.087050" elapsed="0.000291"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:31.087027" elapsed="0.000349"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:31.056983" elapsed="0.030507">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:32.090511" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:32.089475" elapsed="0.001184"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:32.103176" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:32.102918" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:32.103634" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:32.103375" 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-08-22T23:47:32.113556" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:32.113739" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:32.113921" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:32.106127" elapsed="0.008179">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:32.103826" elapsed="0.010564">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:32.114612" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:32.114426" elapsed="0.000253"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:32.103801" elapsed="0.010902">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:32.115083" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:32.115220" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:32.115181" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:32.115163" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:32.115434" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:32.115504" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:32.097209" elapsed="0.018415">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:32.115695" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:32.091192" elapsed="0.024596">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:32.116010" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:32.115866" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:32.115850" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:32.116283" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:32.116143" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:32.116128" elapsed="0.000234"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:32.088376" elapsed="0.028068">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:33.119466" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:33.118423" elapsed="0.001150"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:33.131595" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:33.131256" elapsed="0.000396"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:33.132075" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:33.131810" 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-08-22T23:47:33.141623" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:33.141789" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:33.141974" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:33.134500" elapsed="0.007864">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:33.132204" elapsed="0.010248">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:33.142662" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:33.142489" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:33.132179" elapsed="0.010575">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:33.143135" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:33.143274" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:33.143233" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:33.143215" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:33.143502" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:33.143588" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:33.125841" elapsed="0.017856">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:33.143767" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:33.120125" elapsed="0.023741">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:33.144089" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:33.143945" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:33.143928" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:33.144360" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:33.144220" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:33.144205" elapsed="0.000233"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:33.117326" elapsed="0.027190">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:34.147545" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:34.146540" elapsed="0.001110"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:34.158675" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:34.158295" elapsed="0.000449"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:34.159299" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:34.158956" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:47:34.170491" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:34.170689" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:34.170877" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:34.162644" elapsed="0.008625">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:34.159467" elapsed="0.011886">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:34.171546" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:34.171390" elapsed="0.000256"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:34.159437" elapsed="0.012234">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:34.172060" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:34.172199" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:34.172158" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:34.172141" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:34.172410" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:34.172482" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:34.152198" elapsed="0.020407">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:34.172677" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:34.148149" elapsed="0.024638">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:34.173017" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:34.172869" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:34.172852" elapsed="0.000246"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:34.173291" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:34.173152" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:34.173136" elapsed="0.000235"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:34.145444" elapsed="0.028004">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:35.176486" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:35.175489" elapsed="0.001070"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:35.190175" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:35.189913" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:35.190726" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:35.190419" 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-08-22T23:47:35.198864" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:35.199034" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:35.199238" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:35.193157" elapsed="0.006516">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:35.190855" elapsed="0.008908">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:35.199985" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:35.199803" elapsed="0.000248"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:35.190830" elapsed="0.009245">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:35.200500" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:35.200663" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:35.200620" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:35.200599" elapsed="0.000132"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:35.200876" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:35.200947" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:35.182997" elapsed="0.018060">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:35.201126" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:35.177091" elapsed="0.024130">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:35.201446" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:35.201300" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:35.201283" elapsed="0.000246"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:35.201739" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:35.201597" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:35.201567" elapsed="0.000249"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:35.174325" elapsed="0.027569">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:36.204945" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:36.203868" elapsed="0.001151"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:36.216735" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:36.216446" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:36.217188" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:36.216939" 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-08-22T23:47:36.226192" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:36.226373" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:36.226621" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:36.219636" elapsed="0.007394">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:36.217316" elapsed="0.009802">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:36.227336" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:36.227158" elapsed="0.000245"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:36.217292" elapsed="0.010135">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:36.227860" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:36.228005" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:36.227962" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:36.227944" elapsed="0.000129"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:36.228237" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:36.228309" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:36.211149" elapsed="0.017269">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:36.228488" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:36.205516" elapsed="0.023083">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:36.228830" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:36.228683" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:36.228664" elapsed="0.000244"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:36.229102" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:36.228961" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:36.228946" elapsed="0.000232"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:36.202804" elapsed="0.026453">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:37.232255" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:37.231199" elapsed="0.001134"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:37.243708" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:37.243322" elapsed="0.000454"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:37.244334" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:37.243990" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:47:37.255738" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:37.255913" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:37.256107" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:37.247706" elapsed="0.008792">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:37.244506" elapsed="0.012093">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:37.256937" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:37.256781" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:37.244474" elapsed="0.012552">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:37.257406" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:37.257544" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:37.257504" elapsed="0.000099"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:37.257487" elapsed="0.000139"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:37.257770" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:37.257840" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:37.237145" elapsed="0.020799">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:37.258013" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:37.232896" elapsed="0.025211">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:37.258352" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:37.258206" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:37.258169" elapsed="0.000262"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:37.258644" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:37.258484" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:37.258469" elapsed="0.000254"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:37.230072" elapsed="0.028728">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:38.260552" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:38.260023" elapsed="0.000597"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:38.269817" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:38.269536" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:38.270266" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:38.270020" 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-08-22T23:47:38.279958" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:38.280269" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:38.280695" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:38.272718" elapsed="0.008774">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:38.270395" elapsed="0.011321">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:38.282169" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:38.281796" elapsed="0.000521"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:38.270369" elapsed="0.012001">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:38.283279" elapsed="0.000060"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:38.283612" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:38.283498" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:38.283460" 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-08-22T23:47:38.284097" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:38.284253" elapsed="0.000032"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:38.263428" elapsed="0.021083">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:38.284699" elapsed="0.000035"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:38.260863" elapsed="0.024059">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:38.285413" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:38.285096" elapsed="0.000441"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:38.285060" elapsed="0.000559"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:38.286062" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:38.285742" elapsed="0.000445"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:38.285707" elapsed="0.000532"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:38.259394" elapsed="0.027015">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:39.289358" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:39.288370" elapsed="0.001060"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:39.300635" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:39.300267" elapsed="0.000417"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:39.301077" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:39.300835" 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-08-22T23:47:39.311066" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:39.311228" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:39.311405" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:39.303462" elapsed="0.008426">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:39.301202" elapsed="0.010802">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:39.312270" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:39.312054" elapsed="0.000309"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:39.301179" elapsed="0.011219">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:39.312947" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:39.313141" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:39.313086" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:39.313061" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:39.313435" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:39.313535" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:39.294177" elapsed="0.019526">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:39.313801" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:39.289959" elapsed="0.023974">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:39.314241" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:39.314043" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:39.314019" elapsed="0.000336"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:39.314645" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:39.314430" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:39.314408" elapsed="0.000352"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:39.287322" elapsed="0.027565">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:40.318123" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:40.317066" elapsed="0.001133"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:40.329990" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:40.329724" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:40.330441" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:40.330192" 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-08-22T23:47:40.340168" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:40.340348" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:40.340557" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:40.332883" elapsed="0.008245">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:40.330573" elapsed="0.010673">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:40.341534" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:40.341297" elapsed="0.000352"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:40.330545" elapsed="0.011138">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:40.342211" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:40.342405" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:40.342348" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:40.342323" elapsed="0.000175"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:40.342717" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:40.342816" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:40.323446" elapsed="0.019518">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:40.343059" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:40.318740" elapsed="0.024447">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:40.343490" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:40.343295" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:40.343272" elapsed="0.000348"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:40.343887" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:40.343694" elapsed="0.000268"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:40.343673" elapsed="0.000321"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:40.315908" elapsed="0.028192">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:41.347237" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:41.346184" elapsed="0.001128"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:41.361242" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:41.360979" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:41.361707" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:41.361444" 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-08-22T23:47:41.371783" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:41.371999" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:41.372287" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:41.363899" elapsed="0.008947">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:41.361833" elapsed="0.011130">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:41.373241" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:41.373019" elapsed="0.000313"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:41.361807" elapsed="0.011559">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:41.373920" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:41.374113" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:41.374057" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:41.374033" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:41.374402" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:41.374499" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:41.351758" elapsed="0.022914">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:41.374769" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:41.347848" elapsed="0.027049">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:41.375202" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:41.375005" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:41.374983" elapsed="0.000328"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:41.375594" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:41.375385" elapsed="0.000288"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:41.375363" elapsed="0.000343"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:41.345052" elapsed="0.030759">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:42.378877" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:42.377843" elapsed="0.001113"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:42.391060" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:42.390784" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:42.391505" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:42.391261" 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-08-22T23:47:42.443288" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:42.443469" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:42.443720" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:42.435946" elapsed="0.008182">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:42.391651" elapsed="0.052575">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:42.444466" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:42.444268" elapsed="0.000266"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:42.391624" elapsed="0.052934">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:42.445011" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:42.445157" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:42.445116" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:42.445096" elapsed="0.000128"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:42.445367" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:42.445437" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:42.384966" elapsed="0.060581">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:42.445639" elapsed="0.000019"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:42.379449" elapsed="0.066289">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:42.445964" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:42.445818" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:42.445801" elapsed="0.000243"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:42.446240" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:42.446098" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:42.446082" elapsed="0.000237"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:42.376754" elapsed="0.069642">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:43.449369" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:43.448352" elapsed="0.001090"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:43.464631" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:43.464352" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:43.465093" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:43.464844" 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-08-22T23:47:43.474731" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:43.474919" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:43.475133" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:43.467350" elapsed="0.008200">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:43.465221" elapsed="0.010442">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:43.475908" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:43.475706" elapsed="0.000270"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:43.465195" elapsed="0.010805">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:43.476444" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:43.476612" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:43.476553" elapsed="0.000109"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:43.476532" elapsed="0.000152"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:43.476829" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:43.476900" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:43.455622" elapsed="0.021390">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:43.477082" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:43.450024" elapsed="0.027153">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:43.477403" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:43.477257" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:43.477239" elapsed="0.000243"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:43.477722" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:43.477535" elapsed="0.000245"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:43.477520" elapsed="0.000283"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:43.447286" elapsed="0.030596">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:44.480854" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:44.479884" elapsed="0.001042"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:44.493951" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:44.492981" elapsed="0.001038"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:44.494451" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:44.494200" 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-08-22T23:47:44.504438" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:44.504681" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:44.504963" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:44.496832" elapsed="0.008711">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:44.494603" elapsed="0.011082">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:44.505963" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:44.505740" elapsed="0.000317"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:44.494556" elapsed="0.011535">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:44.506655" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:44.506855" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:44.506799" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:44.506774" 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-08-22T23:47:44.507147" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:44.507245" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:44.485366" elapsed="0.022026">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:44.507491" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:44.481556" elapsed="0.026089">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:44.507958" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:44.507758" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:44.507735" elapsed="0.000336"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:44.508339" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:44.508146" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:44.508124" elapsed="0.000325"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:44.478851" elapsed="0.029706">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:45.511493" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:45.510517" elapsed="0.001050"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:45.522879" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:45.522485" elapsed="0.000462"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:45.523501" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:45.523159" 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-08-22T23:47:45.534027" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:45.534194" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:45.534391" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:45.526420" elapsed="0.008445">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:45.523690" elapsed="0.011295">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:45.535270" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:45.535038" elapsed="0.000328"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:45.523658" elapsed="0.011743">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:45.535979" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:45.536179" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:45.536122" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:45.536097" elapsed="0.000176"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:45.536472" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:45.536573" elapsed="0.000056"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:45.516189" elapsed="0.020573">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:45.536861" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:45.512094" elapsed="0.024904">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:45.537305" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:45.537106" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:45.537084" elapsed="0.000332"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:45.537704" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:45.537490" elapsed="0.000293"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:45.537469" elapsed="0.000346"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:45.509426" elapsed="0.028497">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:46.540795" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:46.539713" elapsed="0.001154"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:46.553069" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:46.552708" elapsed="0.000428"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:46.553715" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:46.553348" 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-08-22T23:47:46.564057" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:46.564264" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:46.564444" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:46.556809" elapsed="0.008117">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:46.553879" elapsed="0.011169">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:46.565310" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:46.565096" elapsed="0.000304"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:46.553849" elapsed="0.011585">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:46.565973" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:46.566164" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:46.566109" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:46.566085" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:46.566452" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:46.566549" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:46.546227" elapsed="0.020491">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:46.566816" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:46.541361" elapsed="0.025588">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:46.567256" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:46.567058" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:46.567035" elapsed="0.000332"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:46.567655" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:46.567442" elapsed="0.000293"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:46.567421" elapsed="0.000346"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:46.538726" elapsed="0.029149">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:47.570806" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:47.569825" elapsed="0.001053"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:47.583780" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:47.583383" elapsed="0.000465"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:47.584405" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:47.584060" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:47:47.594744" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:47.594913" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:47.595108" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:47.587467" elapsed="0.008039">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:47.584572" elapsed="0.011038">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:47.595848" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:47.595666" elapsed="0.000250"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:47.584541" elapsed="0.011398">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:47.596350" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:47.596492" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:47.596451" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:47.596433" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:47.596720" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:47.596791" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:47.576940" elapsed="0.019959">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:47.596969" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:47.571370" elapsed="0.025692">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:47.597283" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:47.597140" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:47.597124" elapsed="0.000237"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:47.597552" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:47.597414" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:47.597399" elapsed="0.000246"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:47.568768" elapsed="0.028954">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:48.600777" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:48.599777" elapsed="0.001076"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:48.612252" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:48.611991" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:48.612717" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:48.612454" 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-08-22T23:47:48.622289" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:48.622457" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:48.622665" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:48.614906" elapsed="0.008152">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:48.612847" elapsed="0.010333">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:48.623378" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:48.623222" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:48.612822" elapsed="0.010646">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:48.623867" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:48.624007" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:48.623966" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:48.623948" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:48.624216" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:48.624288" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:48.606894" elapsed="0.017500">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:48.624464" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:48.601353" elapsed="0.023206">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:48.624800" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:48.624657" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:48.624640" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:48.625071" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:48.624934" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:48.624919" elapsed="0.000233"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:48.598637" elapsed="0.026593">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:49.628235" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:49.627231" elapsed="0.001080"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:49.639997" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:49.639733" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:49.640445" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:49.640200" 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-08-22T23:47:49.652409" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:49.652608" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:49.652820" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:49.642664" elapsed="0.010555">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:49.640570" elapsed="0.012739">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:49.653531" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:49.653349" elapsed="0.000271"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:49.640544" elapsed="0.013102">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:49.654063" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:49.654208" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:49.654166" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:49.654147" elapsed="0.000130"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:49.654420" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:49.654491" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:49.634406" elapsed="0.020246">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:49.654729" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:49.628838" elapsed="0.025993">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:49.655165" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:49.654928" elapsed="0.000374"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:49.654910" elapsed="0.000450"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:49.655860" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:49.655488" elapsed="0.000508"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:49.655451" elapsed="0.000602"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:49.626118" elapsed="0.030124">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:50.659437" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:50.658381" elapsed="0.001133"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:50.671287" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:50.671024" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:50.671757" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:50.671490" 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-08-22T23:47:50.681271" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:50.681452" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:50.681672" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:50.673960" elapsed="0.008109">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:50.671887" elapsed="0.010317">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:50.682433" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:50.682247" elapsed="0.000255"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:50.671861" elapsed="0.010665">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:50.683012" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:50.683210" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:50.683154" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:50.683128" elapsed="0.000176"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:50.683525" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:50.683647" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:50.665906" elapsed="0.017894">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:50.683900" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:50.660051" elapsed="0.023981">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:50.684344" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:50.684141" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:50.684118" elapsed="0.000337"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:50.684764" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:50.684530" elapsed="0.000314"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:50.684508" elapsed="0.000369"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:50.657219" elapsed="0.027767">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:51.687380" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:51.686714" elapsed="0.000717"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:51.698111" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:51.697744" elapsed="0.000437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:51.698763" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:51.698395" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:47:51.712427" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:51.712822" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:51.713198" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:51.701868" elapsed="0.012421">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:51.698941" elapsed="0.015580">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:51.715034" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:51.714645" elapsed="0.000548"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:51.698901" elapsed="0.016352">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:51.716245" elapsed="0.000075"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:51.716628" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:51.716500" elapsed="0.000239"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:51.716457" 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-08-22T23:47:51.717146" elapsed="0.000053"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:51.717337" elapsed="0.000041"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:51.691278" elapsed="0.026382">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:51.717839" elapsed="0.000040"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:51.687775" elapsed="0.030298">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:51.718670" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:51.718268" elapsed="0.000542"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:51.718222" elapsed="0.000645"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:51.719385" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:51.719023" elapsed="0.000499"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:51.718982" elapsed="0.000628"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:51.685915" elapsed="0.033891">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:52.722792" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:52.721810" elapsed="0.001053"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:52.735114" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:52.734701" elapsed="0.000493"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:52.735818" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:52.735430" elapsed="0.000454"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:47:52.745899" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:52.746066" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:52.746271" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:52.738791" elapsed="0.007898">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:52.735995" elapsed="0.010784">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:52.747004" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:52.746820" elapsed="0.000252"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:52.735962" elapsed="0.011135">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:52.747520" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:52.747679" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:52.747637" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:52.747618" elapsed="0.000129"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:52.747891" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:52.747962" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:52.727936" elapsed="0.020136">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:52.748143" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:52.723353" elapsed="0.024884">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:52.748460" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:52.748316" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:52.748299" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:52.748749" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:52.748608" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:52.748591" elapsed="0.000237"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:52.720786" elapsed="0.028119">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:53.751729" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:53.750770" elapsed="0.001031"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:53.766686" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:53.766402" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:53.767141" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:53.766893" 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-08-22T23:47:53.776007" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:53.776221" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:53.776463" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:53.769378" elapsed="0.007674">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:53.767263" elapsed="0.009912">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:53.777465" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:53.777228" elapsed="0.000341"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:53.767240" elapsed="0.010388">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:53.778195" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:53.778399" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:53.778340" elapsed="0.000124"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:53.778314" elapsed="0.000182"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:53.778729" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:53.778836" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:53.757835" elapsed="0.021160">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:53.779098" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:53.752286" elapsed="0.026952">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:53.779567" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:53.779354" elapsed="0.000318"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:53.779330" elapsed="0.000377"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:53.779996" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:53.779787" elapsed="0.000290"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:53.779764" elapsed="0.000349"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:53.749766" elapsed="0.030462">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:54.783244" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:54.782232" elapsed="0.001088"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:54.796682" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:54.796296" elapsed="0.000456"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:54.797228" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:54.796968" 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-08-22T23:47:54.807140" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:54.807366" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:54.807675" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:54.799440" elapsed="0.008803">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:54.797349" elapsed="0.011013">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:54.808660" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:54.808412" elapsed="0.000344"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:54.797326" elapsed="0.011464">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:54.809336" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:54.809532" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:54.809477" elapsed="0.000139"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:54.809452" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:54.809846" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:54.809944" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:54.787817" elapsed="0.022274">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:54.810189" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:54.783881" elapsed="0.026439">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:54.810653" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:54.810429" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:54.810407" elapsed="0.000361"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:54.811035" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:54.810843" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:54.810822" elapsed="0.000323"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:54.781116" elapsed="0.030136">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:55.814506" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:55.813424" elapsed="0.001192"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:55.825618" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:55.825216" elapsed="0.000477"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:55.826310" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:55.825911" elapsed="0.000465"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:47:55.835832" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:55.836104" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:55.836411" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:55.829352" elapsed="0.007670">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:55.826492" elapsed="0.010671">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:55.837538" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:55.837226" elapsed="0.000439"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:55.826455" elapsed="0.011248">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:55.838347" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:55.838556" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:55.838497" elapsed="0.000147"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:55.838468" 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-08-22T23:47:55.838881" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:55.838986" elapsed="0.000026"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:55.819170" elapsed="0.020012">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:55.839298" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:55.815158" elapsed="0.024277">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:55.839815" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:55.839547" elapsed="0.000352"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:55.839523" elapsed="0.000416"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:55.840261" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:55.840033" elapsed="0.000307"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:55.840006" elapsed="0.000368"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:55.812254" elapsed="0.028236">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:56.843680" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:56.842557" elapsed="0.001203"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:56.858918" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:56.858623" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:56.859400" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:56.859152" 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-08-22T23:47:56.869693" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:56.869875" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:56.870109" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:56.861865" elapsed="0.008681">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:56.859539" elapsed="0.011114">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:56.870846" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:56.870692" elapsed="0.000219"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:56.859503" elapsed="0.011432">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:56.871348" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:56.871486" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:56.871446" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:56.871429" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:56.871713" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:56.871784" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:56.849918" elapsed="0.021979">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:56.871967" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:56.844264" elapsed="0.027803">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:56.872287" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:56.872145" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:56.872129" elapsed="0.000237"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:56.872556" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:56.872419" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:56.872403" elapsed="0.000246"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:56.841427" elapsed="0.031299">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:57.875782" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:57.874776" elapsed="0.001083"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:57.887271" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:57.887004" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:57.887735" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:57.887471" 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-08-22T23:47:57.897201" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:57.897376" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:57.897557" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:57.890129" elapsed="0.007840">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:57.887863" elapsed="0.010188">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:57.898241" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:57.898087" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:57.887838" elapsed="0.010494">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:57.898752" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:57.898893" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:57.898852" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:57.898834" elapsed="0.000128"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:57.899109" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:57.899180" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:57.882147" elapsed="0.017140">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:57.899357" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:57.876356" elapsed="0.023095">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:57.899685" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:57.899528" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:57.899512" elapsed="0.000252"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:57.899955" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:57.899817" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:57.899802" elapsed="0.000230"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:57.873663" elapsed="0.026450">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:58.903216" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:58.902198" elapsed="0.001095"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:58.915018" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:58.914751" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:58.915468" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:58.915224" 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-08-22T23:47:58.924909" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:58.925075" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:58.925273" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:58.917862" elapsed="0.007818">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:58.915609" elapsed="0.010155">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:58.925953" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:58.925800" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:58.915569" elapsed="0.010476">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:58.926458" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:58.926617" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:58.926559" elapsed="0.000106"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:58.926542" elapsed="0.000145"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:58.926831" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:58.926904" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:58.909331" elapsed="0.017678">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:58.927081" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:58.903828" elapsed="0.023348">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:58.927399" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:58.927257" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:58.927240" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:58.927695" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:58.927536" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:58.927520" elapsed="0.000257"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:58.901053" elapsed="0.026802">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:47:59.931422" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:47:59.930440" elapsed="0.001071"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:59.942855" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:59.942460" elapsed="0.000463"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:47:59.943489" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:47:59.943133" elapsed="0.000419"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:47:59.954533" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:47:59.954729" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:47:59.954908" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:47:59.946724" elapsed="0.008696">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:47:59.943685" elapsed="0.011850">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:59.955825" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:59.955606" elapsed="0.000312"/>
</branch>
<status status="FAIL" start="2026-08-22T23:47:59.943654" elapsed="0.012298">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:59.956479" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:59.956695" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:47:59.956638" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:59.956611" elapsed="0.000178"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:59.956990" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:47:59.957090" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:47:59.936301" elapsed="0.020937">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:47:59.957335" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:47:59.932034" elapsed="0.025432">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:59.957855" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:59.957594" elapsed="0.000342"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:59.957553" elapsed="0.000417"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:47:59.958243" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:47:59.958045" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:47:59.958023" elapsed="0.000330"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:47:59.929303" elapsed="0.029158">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:00.961443" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:00.960401" elapsed="0.001117"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:00.973720" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:00.973437" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:00.974171" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:00.973924" 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-08-22T23:48:00.983626" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:00.983797" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:48:00.984003" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:00.976611" elapsed="0.007818">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:00.974302" elapsed="0.010218">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:00.984751" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:00.984560" elapsed="0.000260"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:00.974276" elapsed="0.010568">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:00.985281" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:00.985470" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:00.985413" elapsed="0.000128"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:00.985381" elapsed="0.000184"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:00.985734" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:00.985806" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:48:00.967766" elapsed="0.018151">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:00.985986" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:00.962053" elapsed="0.024029">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:00.986313" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:00.986168" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:00.986150" elapsed="0.000245"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:00.986607" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:00.986450" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:00.986434" elapsed="0.000254"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:48:00.959307" elapsed="0.027460">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:01.989933" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:01.988912" elapsed="0.001092"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:02.005465" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:02.004997" elapsed="0.000545"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:02.006186" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:02.005804" elapsed="0.000452"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:48:02.018405" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:02.018781" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:48:02.019174" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:02.009809" elapsed="0.010198">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:02.006374" elapsed="0.013824">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:02.020782" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:02.020292" elapsed="0.000645"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:02.006340" elapsed="0.014649">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:02.021730" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:02.021957" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:02.021895" elapsed="0.000126"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:02.021851" elapsed="0.000200"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:02.022260" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:02.022358" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:48:01.996928" elapsed="0.025586">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:02.022639" elapsed="0.000025"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:01.990565" elapsed="0.032214">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:02.023158" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:02.022890" elapsed="0.000366"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:02.022866" elapsed="0.000433"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:02.023575" elapsed="0.000090"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:02.023378" elapsed="0.000338"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:02.023355" elapsed="0.000393"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:48:01.987723" elapsed="0.036138">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:03.026004" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:03.025318" elapsed="0.000736"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:03.035524" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:03.035250" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:03.035992" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:03.035747" 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-08-22T23:48:03.045564" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:03.045808" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:48:03.046051" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:03.038403" elapsed="0.008166">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:03.036133" elapsed="0.010574">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:03.046977" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:03.046756" elapsed="0.000315"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:03.036094" elapsed="0.011010">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:03.047666" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:03.047863" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:03.047806" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:03.047781" elapsed="0.000176"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:03.048182" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:03.048284" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:48:03.029893" elapsed="0.018540">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:03.048531" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:03.026373" elapsed="0.022311">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:03.048994" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:03.048796" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:03.048772" elapsed="0.000335"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:03.049426" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:03.049196" elapsed="0.000308"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:03.049169" elapsed="0.000368"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:48:03.024542" elapsed="0.025125">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:04.052767" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:04.051729" elapsed="0.001112"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:04.064417" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:04.064157" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:04.064888" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:04.064640" 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-08-22T23:48:04.073737" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:04.073893" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:48:04.074075" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:04.067267" elapsed="0.007194">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:04.065012" elapsed="0.009533">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:04.074756" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:04.074597" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:04.064990" elapsed="0.009858">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:04.075231" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:04.075368" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:04.075328" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:04.075311" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:04.075591" elapsed="0.000038"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:04.075680" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:48:04.059148" elapsed="0.016638">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:04.075856" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:04.053337" elapsed="0.022614">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:04.076173" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:04.076030" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:04.076014" elapsed="0.000239"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:04.076445" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:04.076306" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:04.076291" elapsed="0.000233"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:48:04.050543" elapsed="0.026073">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:05.079523" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:05.078473" elapsed="0.001155"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:05.093423" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:05.093158" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:05.093887" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:05.093638" 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-08-22T23:48:05.103105" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:05.103359" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:48:05.103617" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:05.096437" elapsed="0.007590">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:05.094010" elapsed="0.010111">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:05.104371" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:05.104162" elapsed="0.000278"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:05.093988" elapsed="0.010477">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:05.104909" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:05.105054" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:05.105013" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:05.104993" elapsed="0.000130"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:05.105272" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:05.105345" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:48:05.085614" elapsed="0.019842">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:05.105528" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:05.080121" elapsed="0.025527">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:05.105875" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:05.105729" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:05.105712" elapsed="0.000245"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:05.106151" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:05.106011" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:05.105995" elapsed="0.000242"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:48:05.077456" elapsed="0.028858">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:06.109291" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:06.108299" elapsed="0.001067"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:06.120244" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:06.119883" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:06.120895" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:06.120528" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:48:06.133332" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:06.133541" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:48:06.133798" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:06.123945" elapsed="0.010397">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:06.121062" elapsed="0.013395">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:06.134764" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:06.134515" elapsed="0.000341"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:06.121032" elapsed="0.013858">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:06.135403" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:06.135610" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:06.135537" elapsed="0.000137"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:06.135513" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:06.135903" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:06.136001" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:48:06.113870" elapsed="0.022276">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:06.136241" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:06.109892" elapsed="0.026478">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:06.136695" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:06.136478" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:06.136455" elapsed="0.000354"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:06.137076" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:06.136884" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:06.136862" elapsed="0.000332"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:48:06.107231" elapsed="0.030073">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:07.140364" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:07.139324" elapsed="0.001117"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:07.153667" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:07.153385" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:07.154115" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:07.153870" 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-08-22T23:48:07.163284" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:07.163544" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:48:07.163877" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:07.156396" elapsed="0.008020">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:07.154254" elapsed="0.010285">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:07.164881" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:07.164628" elapsed="0.000349"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:07.154229" elapsed="0.010782">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:07.165601" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:07.165803" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:07.165746" elapsed="0.000121"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:07.165719" elapsed="0.000178"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:07.166095" elapsed="0.000072"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:07.166240" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:48:07.145424" elapsed="0.020973">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:07.166495" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:07.140973" elapsed="0.025674">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:07.166961" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:07.166760" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:07.166736" elapsed="0.000338"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:07.167341" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:07.167148" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:07.167126" elapsed="0.000325"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:48:07.138259" elapsed="0.029299">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:08.170704" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:08.169563" elapsed="0.001217"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:08.182335" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:08.182073" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:08.182807" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:08.182543" 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-08-22T23:48:08.193638" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:08.193863" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:48:08.194114" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:08.185190" elapsed="0.009480">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:08.182932" elapsed="0.011858">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:08.195078" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:08.194842" elapsed="0.000332"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:08.182908" elapsed="0.012300">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:08.195791" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:08.195989" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:08.195933" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:08.195907" elapsed="0.000176"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:08.196289" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:08.196397" elapsed="0.000024"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:48:08.176817" elapsed="0.019735">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:08.196672" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:08.171277" elapsed="0.025533">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:08.197120" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:08.196920" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:08.196897" elapsed="0.000335"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:08.197499" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:08.197306" elapsed="0.000287"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:08.197285" elapsed="0.000373"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:48:08.168488" elapsed="0.029282">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:09.200748" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:09.199762" elapsed="0.001059"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:09.215254" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:09.214989" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:09.215730" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:09.215463" 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-08-22T23:48:09.225373" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:09.225620" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:48:09.225877" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:09.218268" elapsed="0.008141">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:09.215856" elapsed="0.010667">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:09.226814" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:09.226573" elapsed="0.000333"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:09.215833" elapsed="0.011107">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:09.227472" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:09.227689" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:09.227631" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:09.227605" elapsed="0.000176"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:09.227981" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:09.228080" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:48:09.206978" elapsed="0.021248">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:09.228338" elapsed="0.000026"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:09.201373" elapsed="0.027119">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:09.228822" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:09.228621" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:09.228596" elapsed="0.000337"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:09.229232" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:09.229006" elapsed="0.000308"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:09.228985" elapsed="0.000361"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:48:09.198693" elapsed="0.030768">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:10.232445" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:10.231458" elapsed="0.001059"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:10.247097" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:10.246835" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:10.247549" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:10.247301" 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-08-22T23:48:10.256738" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:10.256923" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:48:10.257114" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:10.249982" elapsed="0.007638">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:10.247693" elapsed="0.010045">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:10.258006" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:10.257789" elapsed="0.000309"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:10.247669" elapsed="0.010463">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:10.258679" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:10.258875" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:10.258818" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:10.258793" 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-08-22T23:48:10.259169" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:10.259269" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:48:10.238847" elapsed="0.020571">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:10.259518" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:10.233094" elapsed="0.026579">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:10.259988" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:10.259787" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:10.259763" elapsed="0.000338"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:10.260374" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:10.260177" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:10.260155" elapsed="0.000332"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:48:10.230380" elapsed="0.030269">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:11.263668" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:11.262655" elapsed="0.001088"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:11.274701" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:11.274317" elapsed="0.000453"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:11.275330" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:11.274987" 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-08-22T23:48:11.287072" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:11.287229" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:48:11.287440" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:11.278697" elapsed="0.009153">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:11.275498" elapsed="0.012434">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:11.288152" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:11.287967" elapsed="0.000255"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:11.275468" elapsed="0.012780">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:11.288751" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:11.288943" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:11.288888" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:11.288864" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:11.289233" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:11.289333" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:48:11.268098" elapsed="0.021385">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:11.289599" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:11.264367" elapsed="0.025368">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:11.290042" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:11.289845" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:11.289822" elapsed="0.000330"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:11.290415" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:11.290225" elapsed="0.000266"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:11.290204" elapsed="0.000320"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:48:11.261541" elapsed="0.029109">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:12.293783" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:12.292756" elapsed="0.001107"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:12.305210" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:12.304849" elapsed="0.000430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:12.305858" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:12.305491" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:48:12.316892" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:12.317112" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:48:12.317362" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:12.309190" elapsed="0.008734">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:12.306035" elapsed="0.012008">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:12.318311" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:12.318094" elapsed="0.000309"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:12.305999" elapsed="0.012437">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:12.319008" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:12.319201" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:12.319144" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:12.319121" elapsed="0.000172"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:12.319494" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:12.319630" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:48:12.298768" elapsed="0.021014">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:12.319878" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:12.294369" elapsed="0.025638">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:12.320314" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:12.320116" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:12.320093" elapsed="0.000332"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:12.320717" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:12.320500" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:12.320478" elapsed="0.000350"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:48:12.291641" elapsed="0.029296">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:13.323485" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:13.322528" elapsed="0.001023"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:13.335596" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:13.335216" elapsed="0.000451"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:13.336227" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:13.335880" 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-08-22T23:48:13.345976" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:13.346117" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:48:13.346279" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:13.339511" elapsed="0.007152">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:13.336387" elapsed="0.010358">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:13.346934" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:13.346779" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:13.336361" elapsed="0.010662">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:13.347441" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:13.347619" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:13.347540" elapsed="0.000141"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:13.347523" elapsed="0.000189"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:13.347911" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:13.348008" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:48:13.329054" elapsed="0.019098">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:13.348248" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:13.324067" elapsed="0.024310">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:13.348704" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:13.348485" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:13.348463" elapsed="0.000354"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:13.349084" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:13.348891" elapsed="0.000268"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:13.348870" elapsed="0.000322"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:48:13.321664" elapsed="0.027636">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:14.351957" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:14.351020" elapsed="0.001003"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:14.363422" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:14.363073" elapsed="0.000415"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:14.364062" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:14.363721" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:48:14.373738" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:14.373868" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:48:14.374010" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:14.367146" elapsed="0.007206">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:14.364220" elapsed="0.010213">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:14.374678" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:14.374466" elapsed="0.000290"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:14.364194" elapsed="0.010587">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:14.375152" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:14.375289" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:14.375250" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:14.375233" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:14.375530" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:14.375654" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:48:14.357041" elapsed="0.018760">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:14.375899" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:14.352504" elapsed="0.023527">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:14.376340" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:14.376140" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:14.376117" elapsed="0.000336"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:14.376740" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:14.376528" elapsed="0.000291"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:14.376506" elapsed="0.000346"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:48:14.350077" elapsed="0.026883">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:15.379948" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:15.378954" elapsed="0.001067"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:15.393154" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:15.392893" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:15.393616" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:15.393354" 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-08-22T23:48:15.401551" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:15.401728" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:48:15.401906" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:15.396015" elapsed="0.006302">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:15.393741" elapsed="0.008659">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:15.402610" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:15.402436" elapsed="0.000242"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:15.393719" elapsed="0.008984">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:15.403081" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:15.403219" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:15.403179" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:15.403161" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:15.403428" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:15.403499" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:48:15.386083" elapsed="0.017537">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:15.403691" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:15.380514" elapsed="0.023271">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:15.404007" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:15.403864" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:15.403847" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:15.404280" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:15.404141" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:15.404126" elapsed="0.000233"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:48:15.377833" elapsed="0.026603">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:16.407400" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:16.406410" elapsed="0.001065"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:16.418862" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:16.418477" elapsed="0.000453"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:16.419487" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:16.419141" 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-08-22T23:48:16.429594" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:16.429776" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:48:16.429956" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:16.422735" elapsed="0.007604">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:16.419677" elapsed="0.010744">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:16.430636" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:16.430455" elapsed="0.000258"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:16.419648" elapsed="0.011090">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:16.431117" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:16.431255" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:16.431215" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:16.431198" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:16.431463" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:16.431539" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:48:16.412441" elapsed="0.019220">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:16.431732" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:16.408002" elapsed="0.023825">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:16.432049" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:16.431906" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:16.431890" elapsed="0.000238"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:16.432321" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:16.432182" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:16.432166" elapsed="0.000233"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:48:16.405296" elapsed="0.027180">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:17.435698" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:17.434659" elapsed="0.001151"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:17.446713" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:17.446425" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:17.447168" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:17.446917" 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-08-22T23:48:17.456742" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:17.456923" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:48:17.457162" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:17.449703" elapsed="0.007870">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:17.447300" elapsed="0.010382">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:17.457899" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:17.457722" elapsed="0.000245"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:17.447272" elapsed="0.010721">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:17.458444" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:17.458616" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:17.458554" elapsed="0.000112"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:17.458535" elapsed="0.000153"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:17.458836" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:17.458909" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:48:17.441977" elapsed="0.017046">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:17.459094" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:17.436351" elapsed="0.022839">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:17.459436" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:17.459270" elapsed="0.000231"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:17.459252" elapsed="0.000275"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:17.459748" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:17.459601" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:17.459567" elapsed="0.000263"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:48:17.433465" elapsed="0.026446">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:18.463051" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:18.461991" elapsed="0.001138"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:18.476208" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:18.475827" elapsed="0.000452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:18.476905" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:18.476503" 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-08-22T23:48:18.487514" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:18.487712" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:48:18.487905" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:18.480505" elapsed="0.007795">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:18.477083" elapsed="0.011307">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:18.488660" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:18.488428" elapsed="0.000302"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:18.477049" elapsed="0.011705">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:18.489176" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:18.489318" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:18.489277" elapsed="0.000100"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:18.489258" elapsed="0.000142"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:18.489567" elapsed="0.000051"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:18.489692" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:48:18.469644" elapsed="0.020207">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:18.489953" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:18.463686" elapsed="0.026407">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:18.490420" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:18.490208" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:18.490184" elapsed="0.000358"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:18.490880" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:18.490671" elapsed="0.000291"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:18.490645" elapsed="0.000352"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:48:18.460873" elapsed="0.030238">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:19.494170" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:19.493152" elapsed="0.001092"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:19.507960" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:19.507574" elapsed="0.000456"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:19.508631" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:19.508281" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:48:19.517444" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:19.517655" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:48:19.517900" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:19.510851" elapsed="0.007560">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:19.508755" elapsed="0.009770">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:19.518813" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:19.518573" elapsed="0.000333"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:19.508732" elapsed="0.010208">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:19.519456" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:19.519674" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:19.519617" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:19.519571" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:19.519964" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:19.520064" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:48:19.498947" elapsed="0.021284">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:19.520329" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:19.494775" elapsed="0.025685">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:19.520790" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:19.520569" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:19.520546" elapsed="0.000355"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:19.521169" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:19.520976" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:19.520954" elapsed="0.000324"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:48:19.492035" elapsed="0.029350">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:20.523958" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:20.522979" elapsed="0.001044"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:20.535908" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:20.535517" elapsed="0.000457"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:20.536522" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:20.536183" 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-08-22T23:48:20.546672" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:20.546799" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:48:20.546943" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:20.539799" elapsed="0.007480">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:20.536701" elapsed="0.010658">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:20.547546" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:20.547393" elapsed="0.000265"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:20.536675" elapsed="0.011008">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:20.548063" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:20.548197" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:20.548160" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:20.548143" 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-08-22T23:48:20.548402" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:20.548473" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:48:20.529485" elapsed="0.019116">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:20.548673" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:20.524497" elapsed="0.024271">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:20.548986" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:20.548846" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:20.548830" elapsed="0.000236"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:20.549255" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:20.549119" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:20.549104" elapsed="0.000228"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:48:20.522088" elapsed="0.027321">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:21.552485" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:21.551413" elapsed="0.001152"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:21.568303" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:21.567872" elapsed="0.000527"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:21.568979" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:21.568626" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:48:21.579954" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:21.580195" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:48:21.580456" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:21.572341" elapsed="0.008673">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:21.569173" elapsed="0.011932">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:21.581335" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:21.581145" elapsed="0.000285"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:21.569130" elapsed="0.012337">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:21.582028" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:21.582213" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:21.582153" elapsed="0.000125"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:21.582128" elapsed="0.000183"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:21.582519" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:21.582646" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:48:21.559110" elapsed="0.023682">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:21.582871" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:21.553137" elapsed="0.029857">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:21.583362" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:21.583110" elapsed="0.000333"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:21.583085" elapsed="0.000385"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:21.583716" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:21.583527" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:21.583512" elapsed="0.000321"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:48:21.550286" elapsed="0.033638">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:22.586967" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:22.585922" elapsed="0.001121"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:22.598740" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:22.598441" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:22.599194" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:22.598945" 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-08-22T23:48:22.608687" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:22.608860" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:48:22.609056" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:22.601627" elapsed="0.007823">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:22.599323" elapsed="0.010214">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:22.609764" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:22.609591" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:22.599297" elapsed="0.010559">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:22.610254" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:22.610394" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:22.610353" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:22.610335" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:22.610648" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:22.610722" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:48:22.593210" elapsed="0.017621">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:22.610901" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:22.587547" elapsed="0.023450">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:22.611220" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:22.611075" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:22.611059" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:22.611492" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:22.611354" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:22.611338" elapsed="0.000232"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:48:22.584824" elapsed="0.026840">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:23.614754" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:23.613717" elapsed="0.001113"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:23.626503" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:23.626241" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:23.626965" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:23.626719" 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-08-22T23:48:23.635958" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:23.636124" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:48:23.636307" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:23.629360" elapsed="0.007367">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:23.627093" elapsed="0.009719">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:23.637005" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:23.636849" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:23.627068" elapsed="0.010029">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:23.637478" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:23.637635" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:23.637592" elapsed="0.000092"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:23.637560" elapsed="0.000146"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:23.637851" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:23.637924" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:48:23.620908" elapsed="0.017123">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:23.638103" elapsed="0.000030"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:23.615325" elapsed="0.022896">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:23.638445" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:23.638301" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:23.638284" elapsed="0.000244"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:23.638744" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:23.638596" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:23.638566" elapsed="0.000258"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:48:23.612614" elapsed="0.026288">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:24.641955" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:24.640871" elapsed="0.001161"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:24.654385" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:24.654119" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:24.654852" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:24.654603" 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-08-22T23:48:24.664475" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:24.664667" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:48:24.664850" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:24.657273" elapsed="0.007964">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:24.654979" elapsed="0.010339">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:24.665509" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:24.665355" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:24.654954" elapsed="0.010696">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:24.666041" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:24.666179" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:24.666139" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:24.666121" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:24.666389" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:24.666459" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:48:24.648367" elapsed="0.018198">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:24.666653" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:24.642535" elapsed="0.024218">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:24.666974" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:24.666831" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:24.666815" elapsed="0.000238"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:24.667245" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:24.667106" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:24.667091" elapsed="0.000232"/>
</if>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Check that the specified session sees the specified data in the test tool device.</doc>
<status status="FAIL" start="2026-08-22T23:48:24.639811" elapsed="0.027589">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<msg time="2026-08-22T23:48:24.667496" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 1 minute 40 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${DEVICE_BOOT_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>node3</arg>
<arg>${empty_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:46:43.660455" elapsed="101.007181">Keyword 'Check_Config_Data' failed after retrying for 1 minute 40 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:24.668914" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:24.668443" elapsed="0.000499"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-08-22T23:48:24.669161" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:24.669017" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:24.668999" elapsed="0.000225"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:48:24.669401" elapsed="0.000268"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:48:24.670556" level="FAIL">'5761' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:48:24.670203" elapsed="0.000429">'5761' does not contain '-'</status>
</kw>
<msg time="2026-08-22T23:48:24.670811" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:48:24.669843" elapsed="0.001003"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:48:24.671540" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=5761</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:48:24.671075" elapsed="0.000543"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:24.672251" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5761</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:24.671846" elapsed="0.000442"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:24.672930" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:24.672499" elapsed="0.000467"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-08-22T23:48:24.673861" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5761

Keyword 'Check_Config_Data' failed after retrying for 1 minute 40 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-08-22T23:48:24.673176" elapsed="0.000754"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:24.674475" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5761</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:24.674142" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-08-22T23:48:24.675460" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=5761'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-08-22T23:48:24.674983" elapsed="0.000542"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:24.674652" elapsed="0.000920"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:24.674627" elapsed="0.001003"/>
</if>
<arg>5761</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:48:24.668085" elapsed="0.007612"/>
</kw>
<doc>Check that the device data removal is propagated to node 3 as well.</doc>
<tag>critical</tag>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=5761</tag>
<status status="FAIL" start="2026-08-22T23:46:42.772895" elapsed="101.902862">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5761

Keyword 'Check_Config_Data' failed after retrying for 1 minute 40 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</test>
<test id="s1-s6-t21" name="Deconfigure_Device_In_Netconf" line="232">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:48:24.680914" elapsed="0.000291"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:48:24.680519" elapsed="0.000764"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:48:24.682714" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:24.682544" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:24.682517" elapsed="0.000265"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:48:24.687780" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:24.687672" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:24.687654" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:48:24.688849" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:48:24.688448" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:48:24.689337" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:48:24.689034" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:48:24.689407" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:48:24.689568" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:48:24.688074" elapsed="0.001541"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:48:24.695075" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:24.694968" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:24.694949" 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-08-22T23:48:24.696308" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:24.696201" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:24.696183" elapsed="0.000226"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:48:24.696891" level="INFO">${karaf_connection_index} = 53</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:48:24.696559" elapsed="0.000360"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:24.697307" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:48:24.697079" elapsed="0.000255"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:48:24.742440" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:48:24.697887" elapsed="0.044724"/>
</kw>
<msg time="2026-08-22T23:48:24.742807" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:48:24.742855" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:24.697492" elapsed="0.045400"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:48:24.778685" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:48:24.743478" elapsed="0.035312"/>
</kw>
<msg time="2026-08-22T23:48:24.778951" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:48:24.778997" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:24.743094" elapsed="0.035941"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:24.779365" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:24.779123" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:24.779099" elapsed="0.000350"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:24.779915" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:24.779614" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:24.780262" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:24.780049" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:24.780031" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:48:24.780377" 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-08-22T23:48:24.783067" elapsed="0.000155"/>
</kw>
<msg time="2026-08-22T23:48:24.783282" 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-08-22T23:48:24.781950" elapsed="0.001463"/>
</kw>
<kw name="Open 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-08-22T23:48:24.783710" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:24.784043" 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-08-22T23:48:24.781254" 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-08-22T23:48:24.780691" 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-08-22T23:48:24.695901" elapsed="0.088489"/>
</kw>
<msg time="2026-08-22T23:48:24.784481" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:24.784526" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:24.695292" elapsed="0.089274"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:48:24.784779" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:48:24.784673" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:24.784654" 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-08-22T23:48:24.785263" 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-08-22T23:48:24.785705" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:48:24.785779" 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-08-22T23:48:24.694627" elapsed="0.091263"/>
</kw>
<msg time="2026-08-22T23:48:24.785986" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:24.786031" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:24.690007" elapsed="0.096064"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:24.786393" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:24.786147" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:24.786129" elapsed="0.000342"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:48:24.689867" elapsed="0.096628"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:48:24.792012" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:24.791905" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:24.791886" 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-08-22T23:48:24.793244" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:24.793136" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:24.793118" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:48:24.793792" level="INFO">${karaf_connection_index} = 67</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:48:24.793453" elapsed="0.000366"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:24.794190" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:48:24.793976" elapsed="0.000240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:48:24.836051" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:48:24.794744" elapsed="0.041409"/>
</kw>
<msg time="2026-08-22T23:48:24.836312" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:48:24.836358" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:24.794373" elapsed="0.042022"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:48:24.858830" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:48:24.836928" elapsed="0.022011"/>
</kw>
<msg time="2026-08-22T23:48:24.859103" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:48:24.859150" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:24.836561" elapsed="0.022627"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:24.859501" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:24.859270" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:24.859249" elapsed="0.000355"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:24.860054" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:24.859750" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:24.860401" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:24.860186" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:24.860168" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:48:24.860512" 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-08-22T23:48:24.863118" elapsed="0.000154"/>
</kw>
<msg time="2026-08-22T23:48:24.863332" 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-08-22T23:48:24.862020" elapsed="0.001486"/>
</kw>
<kw name="Open 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-08-22T23:48:24.863820" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:24.864153" 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-08-22T23:48:24.861334" elapsed="0.003004"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:48:24.860801" elapsed="0.003601"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:48:24.792832" elapsed="0.071668"/>
</kw>
<msg time="2026-08-22T23:48:24.864619" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:24.864665" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:24.792225" elapsed="0.072478"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:48:24.864885" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:48:24.864779" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:24.864760" 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-08-22T23:48:24.865361" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:24.865733" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:48:24.865807" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:48:24.791510" elapsed="0.074404"/>
</kw>
<msg time="2026-08-22T23:48:24.866007" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:24.866050" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:24.786884" elapsed="0.079202"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:24.866408" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:24.866161" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:24.866144" elapsed="0.000340"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:48:24.786744" elapsed="0.079764"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:48:24.872015" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:24.871907" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:24.871888" 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-08-22T23:48:24.873215" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:24.873108" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:24.873090" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:48:24.873755" level="INFO">${karaf_connection_index} = 81</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:48:24.873421" elapsed="0.000361"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:24.874150" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:48:24.873936" elapsed="0.000240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:48:24.936054" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:48:24.874676" elapsed="0.061480"/>
</kw>
<msg time="2026-08-22T23:48:24.936315" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:48:24.936381" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:24.874330" elapsed="0.062088"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:48:24.978261" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:48:24.936943" elapsed="0.041779"/>
</kw>
<msg time="2026-08-22T23:48:24.978886" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:48:24.978933" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:24.936603" elapsed="0.042368"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:24.979297" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:24.979060" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:24.979034" elapsed="0.000345"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:24.979847" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:24.979520" 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-08-22T23:48:24.980194" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:24.979980" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:24.979962" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:48:24.980306" 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-08-22T23:48:24.982922" elapsed="0.000154"/>
</kw>
<msg time="2026-08-22T23:48:24.983137" 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-08-22T23:48:24.981836" 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-08-22T23:48:24.983545" elapsed="0.000101"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:24.983902" 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-08-22T23:48:24.981165" elapsed="0.002924"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:48:24.980618" 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="PASS" start="2026-08-22T23:48:24.872806" elapsed="0.111445"/>
</kw>
<msg time="2026-08-22T23:48:24.984343" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:24.984386" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:24.872232" elapsed="0.112191"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:48:24.984628" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:48:24.984498" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:24.984480" 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-08-22T23:48:24.985110" 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-08-22T23:48:24.985444" elapsed="0.000041"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:48:24.985532" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:48:24.871555" elapsed="0.114160"/>
</kw>
<msg time="2026-08-22T23:48:24.985811" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:24.985856" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:24.866877" elapsed="0.119016"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:24.986217" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:24.985969" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:24.985951" elapsed="0.000344"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:48:24.866737" elapsed="0.119582"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:48:24.689674" elapsed="0.296677"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:48:24.687295" elapsed="0.299117"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:48:24.682142" elapsed="0.304377"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:24.681490" elapsed="0.305078"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:48:24.677219" elapsed="0.309472"/>
</kw>
<kw name="Remove_Device_From_Netconf" owner="NetconfKeywords">
<kw name="Pop From Dictionary" owner="Collections">
<msg time="2026-08-22T23:48:24.987608" level="INFO">${device_type} = configure-via-topology</msg>
<var>${device_type}</var>
<arg>${NetconfKeywords__mounted_device_types}</arg>
<arg>${device_name}</arg>
<doc>Pops the given ``key`` from the ``dictionary`` and returns its value.</doc>
<status status="PASS" start="2026-08-22T23:48:24.987328" elapsed="0.000308"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:48:24.988227" level="INFO">${mapping} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping}</var>
<arg>DEVICE_NAME=${device_name}</arg>
<arg>RESTCONF_ROOT=${RESTCONF_ROOT}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:48:24.987798" elapsed="0.000455"/>
</kw>
<kw name="Set_Variable_If_At_Least_Scandium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Set_Variable_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Set Variable If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:48:25.006680" elapsed="0.000431"/>
</kw>
<msg time="2026-08-22T23:48:25.007164" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>BuiltIn.Set_Variable_If</arg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:48:25.006299" elapsed="0.000913"/>
</kw>
<arg>scandium</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Compare ${lower_bound} to titanium and return scandium if titanium is at least ${lower_bound},
return calcium otherwise.</doc>
<status status="PASS" start="2026-08-22T23:48:25.005898" elapsed="0.001390"/>
</kw>
<msg time="2026-08-22T23:48:25.007332" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Set_Variable_If_At_Least</arg>
<arg>scandium</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:48:24.997078" elapsed="0.010297"/>
</kw>
<msg time="2026-08-22T23:48:25.007477" level="INFO">${version} = scandium</msg>
<var>${version}</var>
<arg>scandium</arg>
<arg>calcium</arg>
<doc>Compare scandium to titanium and return ${value_if_true} if titanium is at least scandium, return ${value_if_false} otherwise.</doc>
<status status="PASS" start="2026-08-22T23:48:24.996750" elapsed="0.010751"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.049668" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:25.049246" elapsed="0.000450"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:48:25.050466" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:48:25.050187" elapsed="0.000359">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:48:25.050656" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:48:25.049856" elapsed="0.000825"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.051221" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:48:25.050843" elapsed="0.000405"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:48:25.051542" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:48:25.051725" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:48:25.051406" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.052143" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:25.051902" 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-08-22T23:48:25.053137" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:25.052880" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.053649" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:48:25.053334" elapsed="0.000341"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.054334" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:48:25.054035" elapsed="0.000361"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:48:25.055160" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:48:25.054934" elapsed="0.000252"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:48:25.055236" elapsed="0.000174"/>
</return>
<msg time="2026-08-22T23:48:25.055540" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:48:25.054600" elapsed="0.000965"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:48:25.055735" elapsed="0.000231"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:48:25.053903" elapsed="0.002105"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.056552" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:48:25.056250" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:48:25.057314" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:48:25.057102" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:48:25.057389" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:48:25.057557" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:48:25.056778" elapsed="0.000818"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:48:25.057751" elapsed="0.000223"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:48:25.056121" elapsed="0.001892"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:48:25.053727" elapsed="0.004322"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:48:25.058091" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:48:25.058246" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:48:25.052543" elapsed="0.005729"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:25.052253" elapsed="0.006051"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.058474" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.058328" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.052235" elapsed="0.006314"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.059299" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:25.058706" elapsed="0.000621"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:48:25.059375" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:48:25.048638" elapsed="0.010859"/>
</kw>
<msg time="2026-08-22T23:48:25.059549" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:48:25.036173" elapsed="0.023440"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.071968" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.084243" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.096549" elapsed="0.000038"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.096754" 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-08-22T23:48:25.096927" 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-08-22T23:48:25.097351" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.097208" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:25.097194" 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-08-22T23:48:25.097628" 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-08-22T23:48:25.097794" 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-08-22T23:48:25.097954" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:48:25.097166" elapsed="0.000840"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:48:25.097059" elapsed="0.000973"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.098175" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:25.098250" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:48:25.098368" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:48:25.031916" elapsed="0.066478"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.099483" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:25.099236" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:48:25.119880" level="INFO">DELETE Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:25.119926" level="INFO">DELETE Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:25.120016" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:48:25.101661" elapsed="0.018380"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:25.099609" elapsed="0.020471"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.120259" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.120106" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.099590" elapsed="0.020751"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.130160" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:25.122229" elapsed="0.007976"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:25.121745" elapsed="0.008496"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.121699" elapsed="0.008567"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.132869" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:25.130541" elapsed="0.002375"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:25.130322" elapsed="0.002629"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.130305" elapsed="0.002671"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.133555" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:25.133139" 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-08-22T23:48:25.133957" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.133717" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.134502" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:25.134200" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:25.134040" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.133699" elapsed="0.000903"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.135130" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:25.134762" 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-08-22T23:48:25.135460" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.135228" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.136017" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:25.135721" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:25.135541" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.135210" 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-08-22T23:48:25.136247" elapsed="0.000359"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:48:25.137088" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:25.136790" 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-08-22T23:48:25.137268" elapsed="0.002356"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_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-08-22T23:48:25.120781" elapsed="0.018909"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:48:25.139738" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:48:25.142015" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-08-22T23:48:25.098670" elapsed="0.043372"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:48:25.142096" elapsed="0.000028"/>
</return>
<arg>${DIRECTORY_WITH_DEVICE_TEMPLATES}${/}${version}${/}${device_type}</arg>
<arg>${mapping}</arg>
<arg>session=${session}</arg>
<arg>location=${location}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-08-22T23:48:25.007735" elapsed="0.134484"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=node1</arg>
<doc>Tell Netconf to deconfigure the specified device</doc>
<status status="PASS" start="2026-08-22T23:48:24.986929" elapsed="0.155352"/>
</kw>
<doc>Make request to deconfigure the device on Netconf connector to clean things up and also check that it still works after all the node outages.</doc>
<status status="PASS" start="2026-08-22T23:48:24.676282" elapsed="0.466105"/>
</test>
<test id="s1-s6-t22" name="Check_Device_Deconfigured" line="237">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:48:25.145762" elapsed="0.000221"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:48:25.145464" 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-08-22T23:48:25.147056" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:25.146943" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.146924" 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-08-22T23:48:25.152060" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:25.151952" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.151934" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.153126" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:48:25.152741" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.153663" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:48:25.153310" elapsed="0.000379"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:48:25.153735" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:48:25.153898" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:48:25.152352" elapsed="0.001571"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:48:25.159596" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:25.159472" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.159453" 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-08-22T23:48:25.160848" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:25.160741" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.160723" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:48:25.161354" level="INFO">${karaf_connection_index} = 53</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:48:25.161058" elapsed="0.000339"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:25.161810" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:48:25.161556" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:48:25.197197" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:48:25.162325" elapsed="0.035160"/>
</kw>
<msg time="2026-08-22T23:48:25.197773" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:48:25.197821" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:25.161992" elapsed="0.035867"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:48:25.216590" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:48:25.198382" elapsed="0.018308"/>
</kw>
<msg time="2026-08-22T23:48:25.216849" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:48:25.216896" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "[K"
[?1l...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:25.198032" elapsed="0.018902"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.217235" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.217011" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.216991" elapsed="0.000325"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.217817" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:25.217488" 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-08-22T23:48:25.218163" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.217949" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.217931" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:48:25.218275" 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-08-22T23:48:25.220831" elapsed="0.000148"/>
</kw>
<msg time="2026-08-22T23:48:25.221041" 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-08-22T23:48:25.219719" elapsed="0.001452"/>
</kw>
<kw name="Open 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-08-22T23:48:25.221458" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.221836" 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-08-22T23:48:25.219086" 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-08-22T23:48:25.218541" elapsed="0.003542"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:48:25.160406" elapsed="0.061775"/>
</kw>
<msg time="2026-08-22T23:48:25.222274" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:25.222319" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "[K"
[?1l...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:25.159817" elapsed="0.062575"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:48:25.222605" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-08-22T23:48:25.222471" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.222452" elapsed="0.000239"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.223091" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.223428" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:48:25.223500" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:48:25.159131" elapsed="0.064496"/>
</kw>
<msg time="2026-08-22T23:48:25.223723" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:25.223768" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "[K"
[?1l...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:25.154342" elapsed="0.069464"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.224129" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.223881" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.223864" elapsed="0.000343"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:48:25.154205" elapsed="0.070025"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:48:25.229888" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:25.229780" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.229760" 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-08-22T23:48:25.231118" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:25.231010" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.230991" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:48:25.231646" level="INFO">${karaf_connection_index} = 67</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:48:25.231328" elapsed="0.000345"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:25.232048" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:48:25.231833" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:48:25.278404" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:48:25.232564" elapsed="0.045940"/>
</kw>
<msg time="2026-08-22T23:48:25.278700" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:48:25.278747" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:25.232231" elapsed="0.046553"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:48:25.298643" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:48:25.279287" elapsed="0.019454"/>
</kw>
<msg time="2026-08-22T23:48:25.298897" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:48:25.298943" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "[K"
[?1l...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:25.278952" elapsed="0.020029"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.299274" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.299057" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.299037" elapsed="0.000316"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.299815" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:25.299492" elapsed="0.000421"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.300197" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.299982" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.299963" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:48:25.300309" 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-08-22T23:48:25.302804" elapsed="0.000150"/>
</kw>
<msg time="2026-08-22T23:48:25.303013" 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-08-22T23:48:25.301762" elapsed="0.001379"/>
</kw>
<kw name="Open 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-08-22T23:48:25.303408" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.303756" 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-08-22T23:48:25.301097" elapsed="0.002840"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:48:25.300560" elapsed="0.003441"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:48:25.230709" elapsed="0.073388"/>
</kw>
<msg time="2026-08-22T23:48:25.304188" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:25.304232" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "[K"
[?1l...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:25.230104" elapsed="0.074166"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:48:25.304467" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:48:25.304362" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.304343" 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-08-22T23:48:25.304955" 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-08-22T23:48:25.305283" elapsed="0.000042"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:48:25.305373" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:48:25.229411" elapsed="0.076071"/>
</kw>
<msg time="2026-08-22T23:48:25.305574" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:25.305663" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "[K"
[?1l...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:25.224489" elapsed="0.081213"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.306024" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.305777" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.305759" elapsed="0.000341"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:48:25.224353" elapsed="0.081771"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:48:25.311870" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:25.311762" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.311735" 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-08-22T23:48:25.313082" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:25.312976" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.312958" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:48:25.313635" level="INFO">${karaf_connection_index} = 81</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:48:25.313291" elapsed="0.000371"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:25.314032" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:48:25.313817" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:48:25.377969" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:48:25.314544" elapsed="0.063618"/>
</kw>
<msg time="2026-08-22T23:48:25.378346" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:48:25.378393" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:25.314213" elapsed="0.064217"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:48:25.404063" level="INFO">"t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:48:25.379022" elapsed="0.025140"/>
</kw>
<msg time="2026-08-22T23:48:25.404321" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:48:25.404367" level="INFO">${message_wait} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "[K"
[?1l...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:25.378645" elapsed="0.025759"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.404756" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.404491" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.404468" elapsed="0.000370"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.405321" level="INFO"> "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:25.404977" 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-08-22T23:48:25.405700" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.405464" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.405445" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:48:25.405817" 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-08-22T23:48:25.408387" elapsed="0.000153"/>
</kw>
<msg time="2026-08-22T23:48:25.408623" 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-08-22T23:48:25.407294" elapsed="0.001464"/>
</kw>
<kw name="Open 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-08-22T23:48:25.409031" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.409382" 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-08-22T23:48:25.406666" elapsed="0.002898"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:48:25.406108" 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-08-22T23:48:25.312675" elapsed="0.097072"/>
</kw>
<msg time="2026-08-22T23:48:25.409842" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:25.409887" level="INFO">${message} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "[K"
[?1l...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:25.312089" elapsed="0.097840"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:48:25.410113" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:48:25.410006" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.409988" 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-08-22T23:48:25.410620" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.410978" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:48:25.411051" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:48:25.311396" elapsed="0.099768"/>
</kw>
<msg time="2026-08-22T23:48:25.411262" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:25.411307" level="INFO">${output} =  "t "x "t ". "O "u "t "a "g "e "s ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "[K"
[?1l...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:25.306382" elapsed="0.104965"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.411761" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.411473" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.411455" elapsed="0.000385"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:48:25.306245" elapsed="0.105619"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:48:25.154027" elapsed="0.257869"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:48:25.151572" elapsed="0.260386"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:48:25.146644" elapsed="0.265372"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:25.146187" elapsed="0.265877"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:48:25.143262" elapsed="0.268857"/>
</kw>
<kw name="Wait_Device_Fully_Removed" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Completely_Gone" owner="NetconfKeywords">
<kw name="Check_Device_Has_No_Netconf_Connector" owner="NetconfKeywords">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.425331" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:25.423231" elapsed="0.002127"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.425701" elapsed="0.000023"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-22T23:48:25.425535" elapsed="0.000225"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-22T23:48:25.425414" elapsed="0.000372"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.426089" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.425849" elapsed="0.000299"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.426888" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:25.426402" elapsed="0.000514"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:25.426172" elapsed="0.000780"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.427142" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.426977" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.425833" elapsed="0.001385"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:25.427253" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:48:25.427403" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:48:25.422771" elapsed="0.004659"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:25.427476" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:48:25.427636" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:48:25.422274" elapsed="0.005388"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.434922" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:25.434672" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.435359" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:25.435118" 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-08-22T23:48:25.445661" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:25.445835" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1011'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}} 
 </msg>
<msg time="2026-08-22T23:48:25.445974" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:48:25.437684" elapsed="0.008316"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:25.435468" elapsed="0.010575"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.446226" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.446070" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.435450" elapsed="0.010863"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.450172" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:25.447342" elapsed="0.002908"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:25.447122" elapsed="0.003178"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.447103" elapsed="0.003232"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.454247" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:25.450751" elapsed="0.003563"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:25.450415" elapsed="0.003949"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.450391" elapsed="0.004008"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.455205" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:25.454665" 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-08-22T23:48:25.455706" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.455344" elapsed="0.000445"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.456465" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:25.456045" elapsed="0.000456"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:25.455824" elapsed="0.000729"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.455317" elapsed="0.001291"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.457362" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:25.456837" elapsed="0.000562"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.457857" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.457498" elapsed="0.000439"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.458643" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:25.458192" elapsed="0.000490"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:25.457971" elapsed="0.000762"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.457473" 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-08-22T23:48:25.458969" elapsed="0.000480"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:48:25.460102" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:25.459698" 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-08-22T23:48:25.460350" elapsed="0.002838"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:48:25.446699" elapsed="0.016552"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:25.463426" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:25.463320" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.463302" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:48:25.466654" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:48:25.463652" elapsed="0.003033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:48:25.466772" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:48:25.466935" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:48:25.430316" elapsed="0.036645"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:48:25.467019" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:48:25.467168" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:48:25.427875" elapsed="0.039319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.467622" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:25.467352" elapsed="0.000327"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.468226" level="INFO">${actual_count} = 0</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:25.467832" elapsed="0.000422"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-22T23:48:25.468301" elapsed="0.000038"/>
</return>
<msg time="2026-08-22T23:48:25.468463" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-22T23:48:25.414697" elapsed="0.053791"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.468924" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:48:25.468666" elapsed="0.000314"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="PASS" start="2026-08-22T23:48:25.413914" elapsed="0.055126"/>
</kw>
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.479398" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:25.477338" elapsed="0.002086"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.480099" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:25.479773" elapsed="0.000353"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:48:25.479623" elapsed="0.000539"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.480727" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:25.480391" elapsed="0.000362"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:48:25.480241" elapsed="0.000549"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:48:25.479477" elapsed="0.001342"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.481611" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:25.481117" elapsed="0.000521"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:25.480882" elapsed="0.000793"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.481866" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.481699" elapsed="0.000223"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.482100" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.481945" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.480865" elapsed="0.001309"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:25.482208" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:48:25.482390" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:48:25.476875" elapsed="0.005542"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:25.482464" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:48:25.482624" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>config</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:48:25.476303" elapsed="0.006347"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:48:25.491717" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0e2bdtl3npd2l1xhw8688ntzmm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:25.491832" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:48:25.491926" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:48:25.483414" elapsed="0.008538"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} == 404 or ${resp.status_code} == 409">
<return>
<status status="PASS" start="2026-08-22T23:48:25.499863" elapsed="0.000061"/>
</return>
<status status="PASS" start="2026-08-22T23:48:25.492033" elapsed="0.007962"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.492014" elapsed="0.008034"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.500381" elapsed="0.000049"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The request failed with code ${resp.status_code}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.500782" elapsed="0.000047"/>
</kw>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config in node1 using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="PASS" start="2026-08-22T23:48:25.483012" elapsed="0.017945"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device has no Netconf connectors nor associated data.</doc>
<status status="PASS" start="2026-08-22T23:48:25.413382" elapsed="0.087701"/>
</kw>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Completely_Gone</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:48:25.412791" elapsed="0.088403"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=node1</arg>
<doc>Wait until all netconf connectors for the device with the given name disappear.
Call of Remove_Device_From_Netconf returns before netconf gets
around deleting the device's connector. To ensure the device is
really gone from netconf, use this keyword to make sure all
connectors disappear. If a call to Remove_Device_From_Netconf
is not made before using this keyword, the wait will fail.
Using this keyword is more readable than putting the WUKS below
into a test case.</doc>
<status status="PASS" start="2026-08-22T23:48:25.412331" elapsed="0.089081"/>
</kw>
<kw name="Wait_Device_Fully_Removed" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Completely_Gone" owner="NetconfKeywords">
<kw name="Check_Device_Has_No_Netconf_Connector" owner="NetconfKeywords">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.514465" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:25.512376" elapsed="0.002116"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.514828" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-22T23:48:25.514677" elapsed="0.000209"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-22T23:48:25.514545" elapsed="0.000367"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.515212" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.514976" elapsed="0.000293"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.516060" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:25.515521" elapsed="0.000566"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:25.515293" elapsed="0.000830"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.516308" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.516147" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.514959" elapsed="0.001458"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:25.516456" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:48:25.516623" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:48:25.511925" elapsed="0.004725"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:25.516697" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:48:25.516855" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:48:25.511438" elapsed="0.005442"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.524231" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:25.523981" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.524684" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:25.524426" 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-08-22T23:48:25.537885" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:25.538014" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1011'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}} 
 </msg>
<msg time="2026-08-22T23:48:25.538124" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:48:25.526852" elapsed="0.011299"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:25.524795" elapsed="0.013398"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.538368" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.538218" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.524777" elapsed="0.013676"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.543740" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:25.539802" elapsed="0.004015"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:25.539472" elapsed="0.004395"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.539447" elapsed="0.004455"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.547655" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:25.544289" elapsed="0.003433"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:25.543981" elapsed="0.003790"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.543956" elapsed="0.003856"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.548555" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:25.548035" 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-08-22T23:48:25.549051" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.548724" elapsed="0.000406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.549850" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:25.549448" elapsed="0.000428"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:25.549165" elapsed="0.000779"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.548699" elapsed="0.001270"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.550500" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:25.550130" 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-08-22T23:48:25.550856" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.550621" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.551396" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:25.551097" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:25.550938" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.550601" 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-08-22T23:48:25.551648" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:48:25.552432" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:25.552159" 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-08-22T23:48:25.552625" elapsed="0.002332"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:48:25.538887" elapsed="0.016133"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:25.555196" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:25.555090" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.555071" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:48:25.558326" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:48:25.555403" elapsed="0.002953"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:48:25.558407" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:48:25.558568" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:48:25.519503" elapsed="0.039114"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:48:25.558675" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:48:25.558825" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:48:25.517093" elapsed="0.041758"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.559257" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:25.559008" elapsed="0.000308"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.559872" level="INFO">${actual_count} = 0</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:25.559466" elapsed="0.000432"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-22T23:48:25.559944" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:48:25.560095" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-22T23:48:25.503882" elapsed="0.056238"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.560565" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:48:25.560309" elapsed="0.000333"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="PASS" start="2026-08-22T23:48:25.503421" elapsed="0.057281"/>
</kw>
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.571314" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:25.569078" elapsed="0.002264"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.572031" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:25.571705" elapsed="0.000353"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:48:25.571537" elapsed="0.000558"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.572658" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:25.572323" elapsed="0.000362"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:48:25.572175" elapsed="0.000546"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:48:25.571399" elapsed="0.001351"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.573554" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:25.573058" elapsed="0.000539"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:25.572817" elapsed="0.000818"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.573826" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.573660" elapsed="0.000222"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.574062" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.573906" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.572798" elapsed="0.001340"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:25.574173" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:48:25.574325" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:48:25.568617" elapsed="0.005734"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:25.574397" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:48:25.574539" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>config</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:48:25.568006" elapsed="0.006558"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:48:25.584244" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01mz23t5aq9b6phkefevpaal0j1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:25.584384" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:48:25.584483" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:48:25.575344" elapsed="0.009165"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} == 404 or ${resp.status_code} == 409">
<return>
<status status="PASS" start="2026-08-22T23:48:25.590887" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:48:25.584612" elapsed="0.006358"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.584571" elapsed="0.006433"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.591213" elapsed="0.000031"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The request failed with code ${resp.status_code}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.591443" elapsed="0.000029"/>
</kw>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config in node2 using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="PASS" start="2026-08-22T23:48:25.574940" elapsed="0.016610"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device has no Netconf connectors nor associated data.</doc>
<status status="PASS" start="2026-08-22T23:48:25.502799" elapsed="0.088854"/>
</kw>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Completely_Gone</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:48:25.502232" elapsed="0.089564"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=node2</arg>
<doc>Wait until all netconf connectors for the device with the given name disappear.
Call of Remove_Device_From_Netconf returns before netconf gets
around deleting the device's connector. To ensure the device is
really gone from netconf, use this keyword to make sure all
connectors disappear. If a call to Remove_Device_From_Netconf
is not made before using this keyword, the wait will fail.
Using this keyword is more readable than putting the WUKS below
into a test case.</doc>
<status status="PASS" start="2026-08-22T23:48:25.501801" elapsed="0.090083"/>
</kw>
<kw name="Wait_Device_Fully_Removed" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Completely_Gone" owner="NetconfKeywords">
<kw name="Check_Device_Has_No_Netconf_Connector" owner="NetconfKeywords">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.605248" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:25.603149" elapsed="0.002126"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.605611" elapsed="0.000023"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-22T23:48:25.605445" elapsed="0.000225"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-22T23:48:25.605328" elapsed="0.000368"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.605996" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.605758" elapsed="0.000296"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.606795" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:25.606308" elapsed="0.000515"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:25.606079" elapsed="0.000781"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.607046" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.606885" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.605741" elapsed="0.001383"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:25.607158" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:48:25.607306" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:48:25.602692" elapsed="0.004640"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:25.607379" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:48:25.607520" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:48:25.602198" elapsed="0.005348"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.614848" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:25.614595" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.615284" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:25.615044" 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-08-22T23:48:25.625848" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:25.625975" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1011'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}} 
 </msg>
<msg time="2026-08-22T23:48:25.626085" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:48:25.617459" elapsed="0.008652"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:25.615394" 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-08-22T23:48:25.626365" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.626213" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.615376" elapsed="0.011074"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.634874" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:25.628420" elapsed="0.006577"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:25.627928" elapsed="0.007147"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.627886" elapsed="0.007245"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.639258" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:25.635794" elapsed="0.003510"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:25.635259" elapsed="0.004081"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.635221" elapsed="0.004144"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.639933" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:25.639524" 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-08-22T23:48:25.640265" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.640032" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.640834" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:25.640502" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:25.640347" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.640013" elapsed="0.000905"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.641453" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:25.641074" 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-08-22T23:48:25.641818" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.641551" elapsed="0.000330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.642354" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:25.642061" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:25.641906" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.641532" 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-08-22T23:48:25.642606" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:48:25.643389" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:25.643112" 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-08-22T23:48:25.643564" elapsed="0.002346"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:48:25.626958" elapsed="0.019014"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:25.646146" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:25.646042" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.646024" elapsed="0.000188"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:48:25.649292" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:48:25.646353" elapsed="0.002969"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:48:25.649374" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:48:25.649531" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:48:25.610239" elapsed="0.039373"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:48:25.649674" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:48:25.649825" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:48:25.607780" elapsed="0.042071"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.650258" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:25.650007" elapsed="0.000308"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.650872" level="INFO">${actual_count} = 0</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:25.650465" elapsed="0.000434"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-22T23:48:25.650945" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:48:25.651101" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-22T23:48:25.594687" elapsed="0.056439"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.651531" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:48:25.651277" elapsed="0.000333"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="PASS" start="2026-08-22T23:48:25.594224" elapsed="0.057446"/>
</kw>
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.663112" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:25.659744" elapsed="0.003395"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.663820" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:25.663472" elapsed="0.000374"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:48:25.663321" elapsed="0.000561"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.664428" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:25.664107" elapsed="0.000347"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:48:25.663960" elapsed="0.000529"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:48:25.663192" elapsed="0.001326"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.665313" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:25.664835" elapsed="0.000505"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:25.664597" elapsed="0.000779"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.665571" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.665401" elapsed="0.000241"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.665824" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:25.665666" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.664564" elapsed="0.001336"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:25.665933" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:48:25.666078" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:48:25.659283" elapsed="0.006821"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:25.666149" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:48:25.666324" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>config</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:48:25.658740" elapsed="0.007609"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:48:25.674707" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01ov6h7rlqlqft1hy9dg5oeihb31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:25.674822" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:48:25.674926" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:48:25.667116" elapsed="0.007836"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} == 404 or ${resp.status_code} == 409">
<return>
<status status="PASS" start="2026-08-22T23:48:25.679587" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-08-22T23:48:25.675034" elapsed="0.004614"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:25.675015" elapsed="0.004658"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.679822" elapsed="0.000022"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The request failed with code ${resp.status_code}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:25.679988" elapsed="0.000020"/>
</kw>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config in node3 using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="PASS" start="2026-08-22T23:48:25.666715" elapsed="0.013350"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device has no Netconf connectors nor associated data.</doc>
<status status="PASS" start="2026-08-22T23:48:25.593630" elapsed="0.086492"/>
</kw>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Completely_Gone</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:48:25.592789" elapsed="0.087383"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=node3</arg>
<doc>Wait until all netconf connectors for the device with the given name disappear.
Call of Remove_Device_From_Netconf returns before netconf gets
around deleting the device's connector. To ensure the device is
really gone from netconf, use this keyword to make sure all
connectors disappear. If a call to Remove_Device_From_Netconf
is not made before using this keyword, the wait will fail.
Using this keyword is more readable than putting the WUKS below
into a test case.</doc>
<status status="PASS" start="2026-08-22T23:48:25.592166" elapsed="0.088068"/>
</kw>
<doc>Check that the device deconfiguration is propagated throughout the cluster correctly.</doc>
<status status="PASS" start="2026-08-22T23:48:25.142686" elapsed="0.537667"/>
</test>
<kw name="Teardown_Everything" type="TEARDOWN">
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-08-22T23:48:25.681176" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-08-22T23:48:25.681075" elapsed="0.000840"/>
</kw>
<kw name="Stop_Testtool" owner="NetconfKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:25.683535" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:25.683093" elapsed="0.000509"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-08-22T23:48:25.683818" elapsed="0.000408"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-08-22T23:48:25.682711" elapsed="0.001612"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-08-22T23:48:26.020923" level="INFO">[?2004l^C[?2004h[jenkins@releng-63244-201-1-mininet-ovs-217-0 ~]&gt;</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-08-22T23:48:25.684528" elapsed="0.336500"/>
</kw>
<kw name="Get File" owner="SSHLibrary">
<msg time="2026-08-22T23:48:26.129191" level="INFO">'testtool--netconf-clustering-txt-Outages.1787441809.404.log' -&gt; '/w/workspace/netconf-csit-3node-clustering-only-titanium/testtool--netconf-clustering-txt-Outages.1787441809.404.log'</msg>
<arg>${testtool_log}</arg>
<doc>Downloads file(s) from the remote machine to the local machine.</doc>
<status status="PASS" start="2026-08-22T23:48:26.021216" elapsed="0.108205"/>
</kw>
<doc>Stop testtool and download its log.</doc>
<status status="PASS" start="2026-08-22T23:48:25.682262" elapsed="0.447400"/>
</kw>
<doc>Teardown the test infrastructure, perform cleanup and release all resources.</doc>
<status status="PASS" start="2026-08-22T23:48:25.680860" elapsed="0.448928"/>
</kw>
<doc>netconf cluster node outage test suite (CRUD operations).

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

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


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

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

Currently each of the 3 operations is done once. "Create" is done while
node 1 is down, "Update" while node 2 is down and "Delete" while node 3
is down.</doc>
<status status="FAIL" start="2026-08-22T23:36:42.943090" elapsed="703.186773"/>
</suite>
<suite id="s1-s7" name="Entity" source="/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/entity.robot">
<kw name="Setup_Everything" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:26.236329" 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-08-22T23:48:26.232167" elapsed="0.004217"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-08-22T23:48:26.231927" elapsed="0.004529"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-08-22T23:48:26.241245" 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-08-22T23:48:26.237588" elapsed="0.003685"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-08-22T23:48:26.241508" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:26.241370" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:26.241339" elapsed="0.000263"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:26.242116" 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-08-22T23:48:26.241760" elapsed="0.000399"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-08-22T23:48:26.242649" 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-08-22T23:48:26.242320" elapsed="0.000356"/>
</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-08-22T23:48:26.243190" elapsed="0.000285"/>
</kw>
<msg time="2026-08-22T23:48:26.243592" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:26.243641" 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-08-22T23:48:26.242842" elapsed="0.000822"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:48:26.244205" 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-08-22T23:48:26.243833" elapsed="0.000398"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:48:26.245250" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:48:26.244984" elapsed="0.000293"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:48:26.245698" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:48:26.245424" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:48:26.246181" 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-08-22T23:48:26.245887" elapsed="0.000320"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-08-22T23:48:26.249405" elapsed="0.000241"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:26.250134" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:48:26.249806" elapsed="0.000355"/>
</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-08-22T23:48:26.250312" elapsed="0.000234"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:26.251340" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:26.251045" elapsed="0.000321"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:48:26.251412" elapsed="0.000041"/>
</return>
<msg time="2026-08-22T23:48:26.251591" 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-08-22T23:48:26.250753" elapsed="0.000865"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:48:26.252219" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.200:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396b88d3a50&gt;, timeout=2, 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-08-22T23:48:26.251774" elapsed="0.000605"/>
</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-08-22T23:48:26.252539" elapsed="0.000207"/>
</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-08-22T23:48:26.248831" elapsed="0.003975"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:48:26.248634" elapsed="0.004244"/>
</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-08-22T23:48:26.253737" elapsed="0.000192"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:26.254453" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:48:26.254127" elapsed="0.000352"/>
</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-08-22T23:48:26.254649" elapsed="0.000272"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:26.255719" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:26.255407" elapsed="0.000339"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:48:26.255791" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:48:26.255944" 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-08-22T23:48:26.255113" elapsed="0.000856"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:48:26.256529" level="INFO">Creating Session using : alias=ClusterManagement__session_2, url=http://10.30.170.12:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396b843acd0&gt;, timeout=2, 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-08-22T23:48:26.256123" elapsed="0.000530"/>
</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-08-22T23:48:26.256814" elapsed="0.000218"/>
</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-08-22T23:48:26.253149" elapsed="0.003942"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:48:26.252970" elapsed="0.004165"/>
</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-08-22T23:48:26.257966" elapsed="0.000190"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:26.258653" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:48:26.258310" elapsed="0.000369"/>
</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-08-22T23:48:26.258827" elapsed="0.000223"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:26.260027" 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-08-22T23:48:26.259529" elapsed="0.000525"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:48:26.260100" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:48:26.260253" 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-08-22T23:48:26.259237" elapsed="0.001041"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:48:26.260871" level="INFO">Creating Session using : alias=ClusterManagement__session_3, url=http://10.30.170.79:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396b8650a50&gt;, timeout=2, 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-08-22T23:48:26.260429" elapsed="0.000559"/>
</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-08-22T23:48:26.261148" 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-08-22T23:48:26.257396" elapsed="0.004001"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:48:26.257218" elapsed="0.004222"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-08-22T23:48:26.246264" elapsed="0.015206"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:26.262049" 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-08-22T23:48:26.261648" elapsed="0.000444"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:26.262669" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.200', 2: '10.30.170.12', 3: '10.30.170.79'}</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-08-22T23:48:26.262252" elapsed="0.000461"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:26.263259" 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-08-22T23:48:26.262872" elapsed="0.000430"/>
</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-08-22T23:48:26.244490" elapsed="0.018869"/>
</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-08-22T23:48:26.237230" elapsed="0.026183"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:48:26.263650" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:26.263518" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:26.263499" elapsed="0.000219"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:48:26.266821" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:48:26.266425" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:48:26.267312" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:48:26.267006" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:48:26.267384" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:48:26.267557" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:48:26.266100" elapsed="0.001499"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:48:26.268599" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:48:26.268317" elapsed="0.000310"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:26.269424" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:48:26.269534" level="INFO">${current_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:48:26.269267" elapsed="0.000295"/>
</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-08-22T23:48:26.272962" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:26.272341" elapsed="0.000708"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:26.272321" elapsed="0.000767"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:26.273558" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:48:26.273821" level="INFO">${current_ssh_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:48:26.273290" elapsed="0.000585"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:26.274819" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.200" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:26.274138" elapsed="0.000789"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:26.276140" 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-08-22T23:48:26.275198" elapsed="0.000994"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:48:26.278141" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:48:26.278320" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:48:26.277782" elapsed="0.000585"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:48:26.278793" elapsed="0.000455"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:48:26.280378" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:48:26.870728" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:48:26 UTC 2026

  System load:  0.3                Processes:             119
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:46:41 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:48:26.280049" elapsed="0.590938"/>
</kw>
<msg time="2026-08-22T23:48:26.871078" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:48:26.279605" elapsed="0.591639"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:48:26.276643" elapsed="0.594760"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:48:26.872341" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-08-22T23:48:26.885436" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-08-22T23:48:26.885711" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:48:26.885933" 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-08-22T23:48:26.871815" elapsed="0.014229"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:48:26.886759" elapsed="0.001163"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:26.890701" 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-08-22T23:48:26.889281" elapsed="0.001661"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:48:26.892025" elapsed="0.000115"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:26.891322" elapsed="0.000990"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:26.891265" elapsed="0.001131"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:48:26.893233" elapsed="0.000136"/>
</return>
<status status="PASS" start="2026-08-22T23:48:26.892718" elapsed="0.000833"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:26.892558" elapsed="0.001145"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:48:26.893839" 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">
<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-08-22T23:48:26.900103" elapsed="0.000157"/>
</kw>
<msg time="2026-08-22T23:48:26.900302" 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-08-22T23:48:26.899391" elapsed="0.001342"/>
</kw>
<kw name="Open 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-08-22T23:48:26.901007" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:26.901294" 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-08-22T23:48:26.894934" elapsed="0.006473"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:48:26.271385" elapsed="0.630219"/>
</kw>
<msg time="2026-08-22T23:48:26.901662" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:48:26.270754" elapsed="0.630961"/>
</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-08-22T23:48:26.270256" elapsed="0.631543"/>
</kw>
<msg time="2026-08-22T23:48:26.901842" 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-08-22T23:48:26.269744" elapsed="0.632144"/>
</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-08-22T23:48:26.905473" elapsed="0.000165"/>
</kw>
<msg time="2026-08-22T23:48:26.905682" 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-08-22T23:48:26.904949" 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-08-22T23:48:26.905897" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:26.906071" 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-08-22T23:48:26.902187" elapsed="0.003967"/>
</kw>
<msg time="2026-08-22T23:48:26.906246" 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-08-22T23:48:26.268865" elapsed="0.637406"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:26.906761" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:26.906487" elapsed="0.000315"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:48:26.906845" 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-08-22T23:48:26.267965" elapsed="0.639004"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:48:26.267789" elapsed="0.639217"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:48:26.907966" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:48:26.907688" elapsed="0.000304"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:26.908789" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:48:26.908892" level="INFO">${current_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:48:26.908657" elapsed="0.000261"/>
</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-08-22T23:48:26.912206" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:26.911652" elapsed="0.000641"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:26.911632" elapsed="0.000700"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:26.912851" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:48:26.913084" level="INFO">${current_ssh_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:48:26.912549" elapsed="0.000593"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:26.914080" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.12" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:26.913401" elapsed="0.000785"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:26.915373" level="INFO">${conn_id} = 83</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:48:26.914453" elapsed="0.000971"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:48:26.917260" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:48:26.917438" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:48:26.916897" elapsed="0.000585"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:48:26.917868" elapsed="0.000457"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:48:26.919749" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:48:27.515303" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:48:27 UTC 2026

  System load:  0.01               Processes:             118
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:46:42 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:48:26.919171" elapsed="0.596316"/>
</kw>
<msg time="2026-08-22T23:48:27.515596" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:48:26.918726" elapsed="0.597045"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:48:26.915985" elapsed="0.599953"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:48:27.516925" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-08-22T23:48:27.529750" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-08-22T23:48:27.530137" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:48:27.530398" 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-08-22T23:48:27.516361" elapsed="0.014313"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:48:27.531507" elapsed="0.001215"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:27.535353" 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-08-22T23:48:27.534062" elapsed="0.001572"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:48:27.536893" elapsed="0.000115"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:27.536174" elapsed="0.001007"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:27.536118" elapsed="0.001149"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:48:27.538136" elapsed="0.000137"/>
</return>
<status status="PASS" start="2026-08-22T23:48:27.537450" elapsed="0.001004"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:27.537410" elapsed="0.001134"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:48:27.538717" 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">
<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-08-22T23:48:27.543938" elapsed="0.000158"/>
</kw>
<msg time="2026-08-22T23:48:27.544140" 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-08-22T23:48:27.543227" 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-08-22T23:48:27.544852" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:27.545139" 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-08-22T23:48:27.539930" elapsed="0.005323"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:48:26.910724" elapsed="0.634704"/>
</kw>
<msg time="2026-08-22T23:48:27.545486" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:48:26.910078" elapsed="0.635459"/>
</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-08-22T23:48:26.909590" elapsed="0.636053"/>
</kw>
<msg time="2026-08-22T23:48:27.545686" 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-08-22T23:48:26.909070" elapsed="0.636663"/>
</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-08-22T23:48:27.548967" elapsed="0.000183"/>
</kw>
<msg time="2026-08-22T23:48:27.549201" 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-08-22T23:48:27.548363" elapsed="0.000909"/>
</kw>
<kw name="Open 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-08-22T23:48:27.549446" elapsed="0.000027"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:27.549632" 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-08-22T23:48:27.546021" elapsed="0.003697"/>
</kw>
<msg time="2026-08-22T23:48:27.549812" 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-08-22T23:48:26.908203" elapsed="0.641633"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:27.550293" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:27.550010" elapsed="0.000326"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:48:27.550380" 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-08-22T23:48:26.907297" elapsed="0.643207"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:48:26.907111" elapsed="0.643431"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:48:27.551480" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:48:27.551211" elapsed="0.000296"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:27.552496" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:48:27.552659" level="INFO">${current_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:48:27.552090" elapsed="0.000598"/>
</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-08-22T23:48:27.555956" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:27.555385" elapsed="0.000656"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:27.555365" elapsed="0.000714"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:27.556564" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:48:27.556821" level="INFO">${current_ssh_connection} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:48:27.556294" elapsed="0.000580"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:27.557811" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.79" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:27.557133" elapsed="0.000783"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:27.559123" level="INFO">${conn_id} = 84</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:48:27.558180" elapsed="0.000995"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:48:27.561042" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:48:27.561219" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:48:27.560647" elapsed="0.000616"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:48:27.561656" elapsed="0.000450"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:48:27.563237" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:48:28.184630" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:48:27 UTC 2026

  System load:  0.16               Processes:             124
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:46:42 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:48:27.562919" elapsed="0.621903"/>
</kw>
<msg time="2026-08-22T23:48:28.185010" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:48:27.562461" elapsed="0.622861"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:48:27.559745" elapsed="0.625978"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:48:28.187640" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-08-22T23:48:28.201014" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-08-22T23:48:28.201495" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:48:28.201829" 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-08-22T23:48:28.186507" elapsed="0.015461"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:48:28.202812" elapsed="0.001284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:28.206876" 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-08-22T23:48:28.205509" elapsed="0.001604"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:48:28.208065" elapsed="0.000076"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:28.207496" elapsed="0.000757"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:28.207433" elapsed="0.000874"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:48:28.208796" elapsed="0.000108"/>
</return>
<status status="PASS" start="2026-08-22T23:48:28.208422" elapsed="0.000597"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:28.208398" elapsed="0.000757"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:48:28.209246" 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-08-22T23:48:28.216281" elapsed="0.000348"/>
</kw>
<msg time="2026-08-22T23:48:28.216722" 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-08-22T23:48:28.214896" elapsed="0.002519"/>
</kw>
<kw name="Open 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-08-22T23:48:28.217795" elapsed="0.000041"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:28.218096" elapsed="0.000037"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:48:28.210073" elapsed="0.008143"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:48:27.554445" elapsed="0.663992"/>
</kw>
<msg time="2026-08-22T23:48:28.218498" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:48:27.553839" elapsed="0.664712"/>
</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-08-22T23:48:27.553345" elapsed="0.665326"/>
</kw>
<msg time="2026-08-22T23:48:28.218724" 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-08-22T23:48:27.552844" elapsed="0.665944"/>
</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-08-22T23:48:28.222884" elapsed="0.000198"/>
</kw>
<msg time="2026-08-22T23:48:28.223141" 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-08-22T23:48:28.222090" elapsed="0.001141"/>
</kw>
<kw name="Open 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-08-22T23:48:28.223402" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:28.223726" elapsed="0.000027"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:48:28.219184" elapsed="0.004637"/>
</kw>
<msg time="2026-08-22T23:48:28.223937" 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-08-22T23:48:27.551736" elapsed="0.672228"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:28.224476" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:28.224167" elapsed="0.000376"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:48:28.224638" elapsed="0.000036"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-08-22T23:48:27.550854" elapsed="0.673932"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:48:27.550668" elapsed="0.674157"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:48:26.267654" elapsed="1.957211"/>
</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-08-22T23:48:26.263937" elapsed="1.960991"/>
</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-08-22T23:48:28.225088" elapsed="0.000222"/>
</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-08-22T23:48:28.240312" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:28.240172" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:28.240146" elapsed="0.000243"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:28.240713" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:48:28.240826" level="INFO">${current_ssh_connection_object} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:48:28.240556" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:28.241314" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:28.241013" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:28.241876" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:28.241618" elapsed="0.000304"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:48:28.242766" 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-08-22T23:48:28.242500" elapsed="0.000388">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-08-22T23:48:28.242999" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:48:28.243045" 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-08-22T23:48:28.242081" elapsed="0.000988"/>
</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-08-22T23:48:28.243394" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:28.243147" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:28.243128" elapsed="0.000371"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:48:28.244307" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:48:28.244037" elapsed="0.000296"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:48:28.244381" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:48:28.244534" level="INFO">${odl_ip} = 10.30.170.200</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:48:28.243744" elapsed="0.000814"/>
</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-08-22T23:48:28.244757" elapsed="0.000507"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:28.245844" level="INFO">index=85
host=10.30.170.200
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-08-22T23:48:28.245954" level="INFO">${karaf_connection_object} = index=85
host=10.30.170.200
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-08-22T23:48:28.245468" elapsed="0.000514"/>
</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-08-22T23:48:28.246133" elapsed="0.002434"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:48:28.249222" level="INFO">Logging into '10.30.170.200:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:48:28.421452" 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-08-22T23:48:28.248765" elapsed="0.172845"/>
</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-08-22T23:48:28.425726" elapsed="0.000257"/>
</kw>
<msg time="2026-08-22T23:48:28.426046" 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-08-22T23:48:28.425024" elapsed="0.001099"/>
</kw>
<kw name="Open 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-08-22T23:48:28.426282" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:28.426445" 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-08-22T23:48:28.422715" elapsed="0.003815"/>
</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-08-22T23:48:28.421998" elapsed="0.004610"/>
</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-08-22T23:48:28.239805" elapsed="0.186865"/>
</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-08-22T23:48:28.226266" elapsed="0.200452"/>
</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-08-22T23:48:28.225812" elapsed="0.201026"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:48:28.225528" elapsed="0.201352"/>
</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-08-22T23:48:28.442135" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:28.442009" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:28.441981" elapsed="0.000232"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:28.442498" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:48:28.442647" level="INFO">${current_ssh_connection_object} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:48:28.442371" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:28.443101" level="INFO">{1: 85}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:28.442830" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:28.443544" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:28.443298" elapsed="0.000306"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:48:28.444388" 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-08-22T23:48:28.444154" elapsed="0.000349">Dictionary does not contain key '2'.</status>
</kw>
<msg time="2026-08-22T23:48:28.444633" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:48:28.444681" 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-08-22T23:48:28.443762" elapsed="0.000943"/>
</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-08-22T23:48:28.445007" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:28.444782" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:28.444763" elapsed="0.000345"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:48:28.445868" level="INFO">${ip_address} = 10.30.170.12</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:48:28.445595" elapsed="0.000300"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:48:28.445943" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:48:28.446094" level="INFO">${odl_ip} = 10.30.170.12</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:48:28.445308" elapsed="0.000811"/>
</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-08-22T23:48:28.446270" elapsed="0.000448"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:28.447002" level="INFO">index=86
host=10.30.170.12
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-08-22T23:48:28.447106" level="INFO">${karaf_connection_object} = index=86
host=10.30.170.12
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:48:28.446889" 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-08-22T23:48:28.447277" elapsed="0.002156"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:48:28.449874" level="INFO">Logging into '10.30.170.12:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:48:28.657547" 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-08-22T23:48:28.449610" elapsed="0.208076"/>
</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-08-22T23:48:28.661969" elapsed="0.000244"/>
</kw>
<msg time="2026-08-22T23:48:28.662273" 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-08-22T23:48:28.661294" elapsed="0.001050"/>
</kw>
<kw name="Open 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-08-22T23:48:28.662503" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:28.662683" 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-08-22T23:48:28.658670" elapsed="0.004098"/>
</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-08-22T23:48:28.658025" elapsed="0.004789"/>
</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-08-22T23:48:28.441694" elapsed="0.221171"/>
</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-08-22T23:48:28.427509" elapsed="0.235404"/>
</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-08-22T23:48:28.427131" elapsed="0.235833"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:48:28.426987" elapsed="0.236017"/>
</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-08-22T23:48:28.676789" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:28.676671" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:28.676643" elapsed="0.000222"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:28.677305" level="INFO">index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:48:28.677415" level="INFO">${current_ssh_connection_object} = index=38
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:48:28.677187" elapsed="0.000254"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:28.677869" level="INFO">{1: 85, 2: 86}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:28.677604" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:28.678311" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:28.678067" elapsed="0.000288"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:48:28.679107" 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-08-22T23:48:28.678887" elapsed="0.000323">Dictionary does not contain key '3'.</status>
</kw>
<msg time="2026-08-22T23:48:28.679318" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:48:28.679364" 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-08-22T23:48:28.678511" elapsed="0.000876"/>
</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-08-22T23:48:28.679714" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:28.679462" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:28.679443" elapsed="0.000370"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:48:28.680545" level="INFO">${ip_address} = 10.30.170.79</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:48:28.680281" elapsed="0.000290"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:48:28.680636" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:48:28.680787" level="INFO">${odl_ip} = 10.30.170.79</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:48:28.680011" elapsed="0.000801"/>
</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-08-22T23:48:28.680962" elapsed="0.000427"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:28.681687" level="INFO">index=87
host=10.30.170.79
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-08-22T23:48:28.681788" level="INFO">${karaf_connection_object} = index=87
host=10.30.170.79
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:48:28.681560" elapsed="0.000289"/>
</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-08-22T23:48:28.681998" elapsed="0.002382"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:48:28.684826" level="INFO">Logging into '10.30.170.79:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:48:28.873802" 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-08-22T23:48:28.684546" elapsed="0.189485"/>
</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-08-22T23:48:28.878716" elapsed="0.000259"/>
</kw>
<msg time="2026-08-22T23:48:28.879042" 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-08-22T23:48:28.877833" 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="NOT RUN" start="2026-08-22T23:48:28.879327" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:28.879489" 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-08-22T23:48:28.875348" elapsed="0.004291"/>
</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-08-22T23:48:28.874515" elapsed="0.005179"/>
</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-08-22T23:48:28.676359" elapsed="0.203394"/>
</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-08-22T23:48:28.663821" elapsed="0.215982"/>
</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-08-22T23:48:28.663247" elapsed="0.216612"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:48:28.663112" elapsed="0.216789"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-08-22T23:48:28.225370" elapsed="0.654577"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-08-22T23:48:26.236778" elapsed="2.643240"/>
</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-08-22T23:48:28.882869" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:28.882741" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:28.882713" elapsed="0.000233"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:48:28.887925" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:28.887816" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:28.887797" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:48:28.889905" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:48:28.888565" elapsed="0.001390"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:48:28.890501" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:48:28.890157" elapsed="0.000370"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:48:28.890574" elapsed="0.000081"/>
</return>
<msg time="2026-08-22T23:48:28.890798" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:48:28.888226" elapsed="0.002601"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:48:28.896088" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:28.895980" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:28.895961" 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-08-22T23:48:28.897481" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:28.897354" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:28.897336" elapsed="0.000213"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:48:28.898062" level="INFO">${karaf_connection_index} = 85</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:48:28.897718" elapsed="0.000371"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:28.898479" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:48:28.898245" elapsed="0.000260"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:48:28.940975" 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 "/ "n "e "t "[78Cc "[A[78Co</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:48:28.899183" elapsed="0.041961"/>
</kw>
<msg time="2026-08-22T23:48:28.941303" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:48:28.941351" 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-08-22T23:48:28.898679" elapsed="0.042710"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:48:28.994093" level="INFO">"n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "e "n "t "[78Ci "[A[78Ct
 "y ". "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-08-22T23:48:28.942170" elapsed="0.052079"/>
</kw>
<msg time="2026-08-22T23:48:28.994378" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:48:28.994424" level="INFO">${message_wait} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:48:28.941614" elapsed="0.052846"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:28.994835" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:28.994551" elapsed="0.000461"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:28.994525" elapsed="0.000518"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:28.995570" level="INFO"> "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "e "n "t "[78Ci "[A[78Ct
 "y ". "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-08-22T23:48:28.995192" 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-08-22T23:48:28.996092" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:28.995853" elapsed="0.000386"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:28.995834" elapsed="0.000445"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:48:28.996318" 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-08-22T23:48:28.998978" elapsed="0.000154"/>
</kw>
<msg time="2026-08-22T23:48:28.999175" 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-08-22T23:48:28.998387" elapsed="0.000921"/>
</kw>
<kw name="Open 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-08-22T23:48:28.999962" elapsed="0.000270"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:29.000567" 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-08-22T23:48:28.997530" 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-08-22T23:48:28.996642" elapsed="0.004254"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:48:28.897061" elapsed="0.103939"/>
</kw>
<msg time="2026-08-22T23:48:29.001095" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:29.001142" level="INFO">${message} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:48:28.896416" elapsed="0.104764"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:48:29.001417" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:48:29.001306" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:29.001286" 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-08-22T23:48:29.002188" 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-08-22T23:48:29.002540" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:48:29.002631" 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-08-22T23:48:28.895680" elapsed="0.107064"/>
</kw>
<msg time="2026-08-22T23:48:29.002839" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:29.002883" level="INFO">${output} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:48:28.891210" elapsed="0.111709"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:29.003245" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:29.002995" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:29.002977" elapsed="0.000348"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:48:28.891069" elapsed="0.112280"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:48:29.008573" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:29.008463" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:29.008445" 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-08-22T23:48:29.009844" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:29.009714" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:29.009696" elapsed="0.000215"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:48:29.010376" level="INFO">${karaf_connection_index} = 86</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:48:29.010052" elapsed="0.000350"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:29.010805" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:48:29.010559" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:48:29.054609" 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 "/ "n "e "t "[78Cc "[A[78Co</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:48:29.011479" elapsed="0.043262"/>
</kw>
<msg time="2026-08-22T23:48:29.054869" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:48:29.054916" 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-08-22T23:48:29.010988" elapsed="0.043964"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:48:29.100720" level="INFO">"n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "e "n "t "[78Ci "[A[78Ct
 "y ". "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-08-22T23:48:29.055695" elapsed="0.045172"/>
</kw>
<msg time="2026-08-22T23:48:29.100993" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:48:29.101038" level="INFO">${message_wait} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:48:29.055118" elapsed="0.045956"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:29.101389" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:29.101150" elapsed="0.000386"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:29.101130" elapsed="0.000433"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:29.102077" level="INFO"> "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "e "n "t "[78Ci "[A[78Ct
 "y ". "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-08-22T23:48:29.101724" 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-08-22T23:48:29.102510" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:29.102273" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:29.102254" elapsed="0.000559"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:48:29.102848" 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-08-22T23:48:29.105439" elapsed="0.000176"/>
</kw>
<msg time="2026-08-22T23:48:29.105658" 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-08-22T23:48:29.104809" elapsed="0.000971"/>
</kw>
<kw name="Open 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-08-22T23:48:29.106116" elapsed="0.000066"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:29.106503" elapsed="0.000151"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:48:29.104007" elapsed="0.002758"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:48:29.103106" elapsed="0.003795"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:48:29.009406" elapsed="0.097596"/>
</kw>
<msg time="2026-08-22T23:48:29.107095" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:29.107139" level="INFO">${message} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:48:29.008805" elapsed="0.098370"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:48:29.107562" elapsed="0.000105"/>
</return>
<status status="PASS" start="2026-08-22T23:48:29.107251" elapsed="0.000453"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:29.107233" elapsed="0.000496"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:29.108236" 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-08-22T23:48:29.108569" elapsed="0.000097"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:48:29.108716" 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-08-22T23:48:29.008169" elapsed="0.100658"/>
</kw>
<msg time="2026-08-22T23:48:29.108920" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:29.108963" level="INFO">${output} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:48:29.003699" elapsed="0.105300"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:29.109320" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:29.109074" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:29.109057" elapsed="0.000340"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:48:29.003480" elapsed="0.105940"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:48:29.114486" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:29.114379" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:29.114361" 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-08-22T23:48:29.115767" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:29.115638" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:29.115619" elapsed="0.000217"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:48:29.116439" level="INFO">${karaf_connection_index} = 87</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:48:29.115978" elapsed="0.000487"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:29.116868" level="INFO">${current_connection_index} = 38</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:48:29.116639" elapsed="0.000255"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:48:29.163843" 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 "/ "n "e "t "[78Cc "[A[78Co</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:48:29.117540" elapsed="0.046582"/>
</kw>
<msg time="2026-08-22T23:48:29.164290" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:48:29.164337" 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-08-22T23:48:29.117051" elapsed="0.047324"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:48:29.216780" level="INFO">"n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "e "n "t "[78Ci "[A[78Ct
 "y ". "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-08-22T23:48:29.165234" elapsed="0.051750"/>
</kw>
<msg time="2026-08-22T23:48:29.217146" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:48:29.217194" level="INFO">${message_wait} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:48:29.164653" elapsed="0.052579"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:29.217755" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:29.217343" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:29.217307" elapsed="0.000633"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:29.218500" level="INFO"> "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "e "n "t "[78Ci "[A[78Ct
 "y ". "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-08-22T23:48:29.218089" 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-08-22T23:48:29.218904" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:29.218671" elapsed="0.000379"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:29.218652" elapsed="0.000425"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:48:29.219117" 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-08-22T23:48:29.222098" elapsed="0.000167"/>
</kw>
<msg time="2026-08-22T23:48:29.222308" 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-08-22T23:48:29.221261" elapsed="0.001207"/>
</kw>
<kw name="Open 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-08-22T23:48:29.223014" elapsed="0.000068"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:29.223420" elapsed="0.000066"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:48:29.220462" 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-08-22T23:48:29.219467" 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-08-22T23:48:29.115315" elapsed="0.108544"/>
</kw>
<msg time="2026-08-22T23:48:29.223955" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:29.224000" level="INFO">${message} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:48:29.114722" elapsed="0.109317"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:48:29.224223" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:48:29.224116" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:29.224097" 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-08-22T23:48:29.225081" 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-08-22T23:48:29.225419" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:48:29.225491" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:48:29.114093" elapsed="0.111523"/>
</kw>
<msg time="2026-08-22T23:48:29.225712" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:29.225757" level="INFO">${output} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:48:29.109706" elapsed="0.116135"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:29.226171" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:29.225920" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:29.225902" elapsed="0.000348"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:48:29.109542" elapsed="0.116732"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:48:28.890885" elapsed="0.335423"/>
</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-08-22T23:48:28.887473" elapsed="0.338900"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-08-22T23:48:28.880836" elapsed="0.345598"/>
</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-08-22T23:48:28.880173" elapsed="0.346304"/>
</kw>
<arg>http_timeout=2</arg>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-08-22T23:48:26.231597" elapsed="2.994934"/>
</kw>
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-08-22T23:48:29.227499" level="INFO">${already_done} = True</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-08-22T23:48:29.227129" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="PASS" start="2026-08-22T23:48:29.227711" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:48:29.227615" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:29.227596" elapsed="0.000196"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:29.227948" elapsed="0.000022"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:29.228121" elapsed="0.000020"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:29.228294" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:29.228472" elapsed="0.000020"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:29.228747" elapsed="0.000025"/>
</kw>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-08-22T23:48:29.226826" elapsed="0.002009"/>
</kw>
<kw name="Setup_NetconfKeywords" owner="NetconfKeywords">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:48:29.229653" level="INFO">${tmp} = {}</msg>
<var>${tmp}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:48:29.229357" elapsed="0.000323"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:29.233532" level="INFO">${NetconfKeywords__mounted_device_types} = {}</msg>
<arg>${NetconfKeywords__mounted_device_types}</arg>
<arg>${tmp}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:48:29.229834" elapsed="0.003757"/>
</kw>
<if>
<branch type="IF" condition="${create_session_for_templated_requests}">
<kw name="Create_Default_Session" owner="TemplatedRequests">
<arg>timeout=2</arg>
<doc>Create "default" session to ${url} with authentication and connection parameters.
This Keyword is in this Resource only so that user do not need to call RequestsLibrary directly.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:29.236945" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:29.233664" elapsed="0.003342"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:29.233645" elapsed="0.003386"/>
</if>
<kw name="Initialize_Artifact_Deployment_And_Usage" owner="NexusKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:29.241994" level="INFO">${odl_connection} = 88</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:48:29.241588" elapsed="0.000432"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:48:29.243686" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:48:29.243765" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:48:29.243367" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:48:29.243943" elapsed="0.000315"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:48:29.245106" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:48:29.573869" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:48:26 UTC 2026

  System load:  0.3                Processes:             119
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:48:26 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:48:29.244790" elapsed="0.329219"/>
</kw>
<msg time="2026-08-22T23:48:29.574071" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:48:29.244422" elapsed="0.329706"/>
</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-08-22T23:48:29.242935" elapsed="0.331279"/>
</kw>
<msg time="2026-08-22T23:48:29.574263" 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-08-22T23:48:29.242526" elapsed="0.331783"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:48:29.242198" elapsed="0.332185"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:48:29.574423" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:48:29.574604" level="INFO">${odl} = 88</msg>
<var>${odl}</var>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:48:29.241283" elapsed="0.333348"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-08-22T23:48:29.583777" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-08-22T23:48:29.591458" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../../tools/deployment/search.sh' -&gt; '/home/jenkins//search.sh'</msg>
<arg>/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../../tools/deployment/search.sh</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-08-22T23:48:29.574791" elapsed="0.016831"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:48:29.591970" elapsed="0.000517"/>
</kw>
<if>
<branch type="IF" condition="not (${tools_system_connect})">
<return>
<status status="NOT RUN" start="2026-08-22T23:48:29.592947" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:29.592674" elapsed="0.000364"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:29.592627" elapsed="0.000460"/>
</if>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:29.600780" level="INFO">${tools_connection} = 89</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-08-22T23:48:29.600228" elapsed="0.000589"/>
</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-08-22T23:48:29.603088" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:48:29.603196" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:48:29.602711" elapsed="0.000535"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:48:29.603461" elapsed="0.000476"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:48:29.605347" level="INFO">Logging into '10.30.171.196:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:48:30.189894" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:48:29 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:36:48 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:48:29.604679" elapsed="0.585393"/>
</kw>
<msg time="2026-08-22T23:48:30.190203" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:48:29.604167" elapsed="0.586154"/>
</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-08-22T23:48:29.602089" elapsed="0.588414"/>
</kw>
<msg time="2026-08-22T23:48:30.190647" 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-08-22T23:48:29.601524" elapsed="0.589227"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-08-22T23:48:29.601065" elapsed="0.589844"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-08-22T23:48:30.191035" elapsed="0.000489"/>
</return>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:48:29.599732" elapsed="0.592060"/>
</kw>
<doc>Places search utility to ODL system, which will be needed for version detection.
By default also initialize a SSH connection to Tools system,
as following Keywords assume a working connection towards target system.</doc>
<status status="PASS" start="2026-08-22T23:48:29.237276" elapsed="0.954573"/>
</kw>
<arg>create_session_for_templated_requests=False</arg>
<doc>Setup the environment for the other keywords of this Resource to work properly.</doc>
<status status="PASS" start="2026-08-22T23:48:29.229072" elapsed="0.962826"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:30.192747" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:30.192404" elapsed="0.000422"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:48:30.192874" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:48:30.193029" level="INFO">${node1_session} = ClusterManagement__session_1</msg>
<var>${node1_session}</var>
<arg>member_index=1</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-08-22T23:48:30.192130" elapsed="0.000924"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:30.193831" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:30.193514" elapsed="0.000343"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:48:30.193902" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:48:30.194051" level="INFO">${node2_session} = ClusterManagement__session_2</msg>
<var>${node2_session}</var>
<arg>member_index=2</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-08-22T23:48:30.193263" elapsed="0.000812"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:30.194842" 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-08-22T23:48:30.194531" elapsed="0.000337"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:48:30.194912" elapsed="0.000039"/>
</return>
<msg time="2026-08-22T23:48:30.195075" level="INFO">${node3_session} = ClusterManagement__session_3</msg>
<var>${node3_session}</var>
<arg>member_index=3</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-08-22T23:48:30.194281" elapsed="0.000818"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:30.195570" level="INFO">${node1_session} = ClusterManagement__session_1</msg>
<arg>${node1_session}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:48:30.195259" elapsed="0.000370"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:30.196083" level="INFO">${node2_session} = ClusterManagement__session_2</msg>
<arg>${node2_session}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:48:30.195785" elapsed="0.000338"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:30.196570" level="INFO">${node3_session} = ClusterManagement__session_3</msg>
<arg>${node3_session}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:48:30.196276" elapsed="0.000355"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:30.200745" level="INFO">${directory_with_template_folders} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD</msg>
<arg>${directory_with_template_folders}</arg>
<arg>/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:48:30.196784" elapsed="0.004007"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:30.205026" level="INFO">${empty_data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${empty_data}</arg>
<arg>&lt;data xmlns="${ODL_NETCONF_NAMESPACE}"&gt;&lt;/data&gt;</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:48:30.200953" elapsed="0.004119"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:30.205552" level="INFO">${cont} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;</msg>
<var>${cont}</var>
<arg>&lt;data xmlns="${ODL_NETCONF_NAMESPACE}"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:30.205228" elapsed="0.000366"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:30.206001" level="INFO">${contend} = &lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<var>${contend}</var>
<arg>&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:30.205749" elapsed="0.000278"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:30.210493" level="INFO">${original_data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${original_data}</arg>
<arg>${cont}Content${contend}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:48:30.206185" elapsed="0.004356"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:30.215075" level="INFO">${modified_data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${modified_data}</arg>
<arg>${cont}Modified Content${contend}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:48:30.210716" elapsed="0.004407"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:30.219669" level="INFO">${modified_data_2} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${modified_data_2}</arg>
<arg>${cont}Another Modified Content${contend}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:48:30.215284" elapsed="0.004433"/>
</kw>
<doc>Setup everything needed for the test cases.</doc>
<status status="PASS" start="2026-08-22T23:48:26.231234" elapsed="3.988544"/>
</kw>
<test id="s1-s7-t1" name="Start_Testtool" line="63">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:48:30.223055" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:48:30.222776" 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-08-22T23:48:30.224500" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:30.224223" elapsed="0.000373"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:30.224202" elapsed="0.000421"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:48:30.229712" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:30.229602" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:30.229570" elapsed="0.000210"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:48:30.230772" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:48:30.230376" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:48:30.231278" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:48:30.230973" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:48:30.231348" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:48:30.231501" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:48:30.230003" elapsed="0.001523"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:48:30.236956" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:30.236850" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:30.236831" 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-08-22T23:48:30.238180" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:30.238072" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:30.238054" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:48:30.238716" level="INFO">${karaf_connection_index} = 85</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:48:30.238391" elapsed="0.000352"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:30.239150" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:48:30.238899" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:48:30.273151" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:48:30.239693" elapsed="0.033565"/>
</kw>
<msg time="2026-08-22T23:48:30.273422" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:48:30.273469" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:30.239332" elapsed="0.034174"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:48:30.287884" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:48:30.274031" elapsed="0.013947"/>
</kw>
<msg time="2026-08-22T23:48:30.288135" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:48:30.288181" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                 ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:30.273692" elapsed="0.014524"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:30.288511" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:30.288293" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:30.288273" elapsed="0.000339"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:30.289059" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:30.288764" elapsed="0.000354"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:30.289394" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:30.289184" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:30.289166" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:48:30.289504" 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-08-22T23:48:30.292117" elapsed="0.000152"/>
</kw>
<msg time="2026-08-22T23:48:30.292375" 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-08-22T23:48:30.290979" elapsed="0.001529"/>
</kw>
<kw name="Open 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-08-22T23:48:30.292808" elapsed="0.000359"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:30.293441" 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-08-22T23:48:30.290312" elapsed="0.003347"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:48:30.289794" elapsed="0.003932"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:48:30.237769" elapsed="0.056056"/>
</kw>
<msg time="2026-08-22T23:48:30.293922" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:30.293965" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                 ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:30.237172" elapsed="0.056830"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:48:30.294184" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:48:30.294078" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:30.294059" 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-08-22T23:48:30.294686" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:30.295043" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:48:30.295115" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:48:30.236502" elapsed="0.058722"/>
</kw>
<msg time="2026-08-22T23:48:30.295317" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:30.295360" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                 ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:30.231923" elapsed="0.063474"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:30.295824" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:30.295471" elapsed="0.000408"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:30.295454" elapsed="0.000448"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:48:30.231782" elapsed="0.064143"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:48:30.301230" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:30.301123" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:30.301104" 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-08-22T23:48:30.302436" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:30.302328" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:30.302310" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:48:30.302981" level="INFO">${karaf_connection_index} = 86</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:48:30.302667" elapsed="0.000341"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:30.303381" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:48:30.303161" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:48:30.348529" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:48:30.303915" elapsed="0.044737"/>
</kw>
<msg time="2026-08-22T23:48:30.348814" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:48:30.348861" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:30.303561" elapsed="0.045336"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:48:30.371560" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:48:30.349397" elapsed="0.022315"/>
</kw>
<msg time="2026-08-22T23:48:30.371882" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:48:30.371930" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                 ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:30.349063" elapsed="0.022903"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:30.372273" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:30.372046" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:30.372026" elapsed="0.000328"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:30.372827" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:30.372494" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:30.373178" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:30.372961" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:30.372942" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:48:30.373290" 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-08-22T23:48:30.375843" elapsed="0.000157"/>
</kw>
<msg time="2026-08-22T23:48:30.376061" 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-08-22T23:48:30.374723" elapsed="0.001468"/>
</kw>
<kw name="Open 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-08-22T23:48:30.376465" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:30.376940" 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-08-22T23:48:30.374090" 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-08-22T23:48:30.373544" elapsed="0.003655"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:48:30.302029" elapsed="0.075268"/>
</kw>
<msg time="2026-08-22T23:48:30.377389" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:30.377433" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                 ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:30.301446" elapsed="0.076022"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:48:30.377844" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-08-22T23:48:30.377544" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:30.377525" elapsed="0.000405"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:30.378321" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:30.378688" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:48:30.378760" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:48:30.300788" elapsed="0.078110"/>
</kw>
<msg time="2026-08-22T23:48:30.378991" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:30.379034" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                 ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:30.296187" elapsed="0.082882"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:30.379411" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:30.379144" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:30.379127" elapsed="0.000365"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:48:30.296051" elapsed="0.083465"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:48:30.384910" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:30.384801" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:30.384783" 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-08-22T23:48:30.386170" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:30.386062" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:30.386044" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:48:30.386694" level="INFO">${karaf_connection_index} = 87</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:48:30.386379" elapsed="0.000342"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:30.387112" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:48:30.386890" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:48:30.438195" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:48:30.387647" elapsed="0.050840"/>
</kw>
<msg time="2026-08-22T23:48:30.438843" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:48:30.438920" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:30.387294" elapsed="0.051683"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:48:30.459176" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:48:30.439967" elapsed="0.019386"/>
</kw>
<msg time="2026-08-22T23:48:30.459571" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:48:30.459649" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                 ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:30.439326" elapsed="0.020362"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:30.460137" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:30.459810" elapsed="0.000389"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:30.459772" elapsed="0.000455"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:30.460780" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:30.460376" 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-08-22T23:48:30.461130" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:30.460912" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:30.460894" elapsed="0.000316"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:48:30.461250" 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-08-22T23:48:30.464202" elapsed="0.000166"/>
</kw>
<msg time="2026-08-22T23:48:30.464431" 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-08-22T23:48:30.462915" elapsed="0.001679"/>
</kw>
<kw name="Open 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-08-22T23:48:30.464878" elapsed="0.000082"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:30.465450" 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-08-22T23:48:30.462196" elapsed="0.003472"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:48:30.461605" elapsed="0.004131"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:48:30.385755" elapsed="0.080085"/>
</kw>
<msg time="2026-08-22T23:48:30.465940" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:30.465987" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                 ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:30.385166" elapsed="0.080859"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:48:30.466215" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:48:30.466105" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:30.466085" 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-08-22T23:48:30.469026" 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-08-22T23:48:30.469406" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:48:30.469482" 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-08-22T23:48:30.384449" elapsed="0.085170"/>
</kw>
<msg time="2026-08-22T23:48:30.469718" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:30.469763" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                 ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:30.379802" elapsed="0.089998"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:30.470136" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:30.469881" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:30.469861" elapsed="0.000357"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:48:30.379664" elapsed="0.090587"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:48:30.231600" elapsed="0.238686"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:48:30.229226" elapsed="0.241122"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:48:30.223911" elapsed="0.246494"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:30.223465" elapsed="0.246987"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:48:30.220530" elapsed="0.249974"/>
</kw>
<kw name="Install_And_Start_Testtool" owner="NetconfKeywords">
<kw name="Deploy_Test_Tool" owner="NexusKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:30.491433" level="INFO">${name_prefix} = netconf-testtool-</msg>
<var>${name_prefix}</var>
<arg>${artifact}-</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:30.491118" elapsed="0.000342"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:48:30.491977" level="INFO">${extension} = jar</msg>
<var>${extension}</var>
<arg>'${component}'=='odl-micro'</arg>
<arg>tar</arg>
<arg>jar</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:48:30.491638" elapsed="0.000365"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:48:30.492560" level="INFO">${name_suffix} = -executable.jar</msg>
<var>${name_suffix}</var>
<arg>"${suffix}" != ""</arg>
<arg>-${suffix}.${extension}</arg>
<arg>.${extension}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:48:30.492170" elapsed="0.000432"/>
</kw>
<kw name="Deploy_Artifact" owner="NexusKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_url}""" != ""</arg>
<arg>Deploy_From_Url</arg>
<arg>${explicit_url}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:48:30.493951" elapsed="0.000320"/>
</kw>
<kw name="Fetch From Left" owner="String">
<msg time="2026-08-22T23:48:30.494687" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot</msg>
<var>${urlbase}</var>
<arg>${BUNDLE_URL}</arg>
<arg>/org/opendaylight</arg>
<doc>Returns contents of the ``string`` before the first occurrence of ``marker``.</doc>
<status status="PASS" start="2026-08-22T23:48:30.494442" elapsed="0.000272"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:48:30.495286" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot</msg>
<var>${urlbase}</var>
<arg>'${urlbase}' != '${BUNDLE_URL}'</arg>
<arg>${urlbase}</arg>
<arg>${fallback_url}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:48:30.494892" elapsed="0.000422"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Magnesium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_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-08-22T23:48:30.518794" elapsed="0.000615"/>
</kw>
<arg>magnesium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to titanium and in case titanium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'carpeople'] {} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:48:30.518028" elapsed="0.001485"/>
</kw>
<msg time="2026-08-22T23:48:30.519602" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>magnesium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:48:30.506461" elapsed="0.013226"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>carpeople</arg>
<doc>Compare magnesium to titanium and in case titanium is at most magnesium,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:48:30.505863" elapsed="0.013923"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Aluminium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_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-08-22T23:48:30.540970" elapsed="0.000498"/>
</kw>
<arg>aluminium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to titanium and in case titanium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'netconf'] {} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:48:30.540374" elapsed="0.001300"/>
</kw>
<msg time="2026-08-22T23:48:30.541732" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>aluminium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:48:30.531237" elapsed="0.010561"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>netconf</arg>
<doc>Compare aluminium to titanium and in case titanium is at most aluminium,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:48:30.530590" elapsed="0.011289"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Silicon" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_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-08-22T23:48:30.560962" elapsed="0.000483"/>
</kw>
<arg>silicon</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to titanium and in case titanium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'bgpcep'] {} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:48:30.560386" elapsed="0.001145"/>
</kw>
<msg time="2026-08-22T23:48:30.561604" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>silicon</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:48:30.551589" elapsed="0.010081"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>bgpcep</arg>
<doc>Compare silicon to titanium and in case titanium is at most silicon,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:48:30.551058" elapsed="0.010693"/>
</kw>
<if>
<branch type="IF" condition="'${build_version}'=='${EMPTY}'">
<kw name="NexusKeywords__Detect_Version_To_Pull" owner="NexusKeywords">
<kw name="NexusKeywords__Get_Items_To_Look_At" owner="NexusKeywords">
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<arg>Component not supported by NexusKeywords version detection: ${component}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:48:30.565218" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:48:30.566046" elapsed="0.000183"/>
</kw>
<msg time="2026-08-22T23:48:30.566280" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Collections.Get_From_Dictionary</arg>
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:48:30.565675" elapsed="0.000663"/>
</kw>
<msg time="2026-08-22T23:48:30.566445" level="INFO">${itemlist} = netconf-api</msg>
<var>${itemlist}</var>
<arg>${component}</arg>
<doc>Get a list of items that might contain the version number that we are looking for.</doc>
<status status="PASS" start="2026-08-22T23:48:30.564885" elapsed="0.001585"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:30.566813" level="INFO">index=89
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:48:30.566917" level="INFO">${current_ssh_connection} = index=89
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:48:30.566652" elapsed="0.000293"/>
</kw>
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:30.571851" level="INFO">${odl_connection} = 90</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:48:30.571423" elapsed="0.000455"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:48:30.573611" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:48:30.573692" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:48:30.573316" 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-08-22T23:48:30.573871" elapsed="0.000386"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:48:30.575790" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:48:30.900316" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:48:26 UTC 2026

  System load:  0.3                Processes:             119
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:48:29 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:48:30.574836" elapsed="0.325658"/>
</kw>
<msg time="2026-08-22T23:48:30.900660" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:48:30.574424" elapsed="0.326315"/>
</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-08-22T23:48:30.572834" elapsed="0.328009"/>
</kw>
<msg time="2026-08-22T23:48:30.900895" 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-08-22T23:48:30.572434" elapsed="0.328509"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:48:30.572058" elapsed="0.328961"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:48:30.901072" elapsed="0.000042"/>
</return>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:48:30.571080" elapsed="0.330158"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:48:30.901739" level="INFO">Executing command 'sh search.sh /tmp/netconf-karaf-9.0.4-SNAPSHOT/system netconf-api'.</msg>
<msg time="2026-08-22T23:48:30.934103" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:48:30.934349" level="INFO">${version} = 9.0.4-SNAPSHOT
org/opendaylight/netconf</msg>
<msg time="2026-08-22T23:48:30.934452" level="INFO">${result} = 0</msg>
<var>${version}</var>
<var>${result}</var>
<arg>sh search.sh ${WORKSPACE}/${BUNDLEFOLDER}/system ${itemlist}</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:48:30.901440" elapsed="0.033065"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:48:30.934926" elapsed="0.000454"/>
</kw>
<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-08-22T23:48:30.942766" elapsed="0.000291"/>
</kw>
<msg time="2026-08-22T23:48:30.943099" 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-08-22T23:48:30.941307" elapsed="0.001843"/>
</kw>
<kw name="Open 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-08-22T23:48:30.943311" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:30.943472" 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-08-22T23:48:30.935960" elapsed="0.007594"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:30.944169" level="INFO">9.0.4-SNAPSHOT
org/opendaylight/netconf</msg>
<arg>${version}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:30.943901" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${result}!=0">
<kw name="Fail" owner="BuiltIn">
<arg>Component "${component}": searching for "${itemlist}" found no version, cannot locate test tool.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:30.944525" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:30.944299" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:30.944274" elapsed="0.000349"/>
</if>
<kw name="Split String" owner="String">
<msg time="2026-08-22T23:48:30.945012" level="INFO">${version} = 9.0.4-SNAPSHOT</msg>
<msg time="2026-08-22T23:48:30.945056" level="INFO">${location} = org/opendaylight/netconf</msg>
<var>${version}</var>
<var>${location}</var>
<arg>${version}</arg>
<arg>max_split=1</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-08-22T23:48:30.944772" elapsed="0.000307"/>
</kw>
<return>
<value>${version}</value>
<value>${location}</value>
<status status="PASS" start="2026-08-22T23:48:30.945129" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:48:30.945323" level="INFO">${version} = 9.0.4-SNAPSHOT</msg>
<msg time="2026-08-22T23:48:30.945368" level="INFO">${location} = org/opendaylight/netconf</msg>
<var>${version}</var>
<var>${location}</var>
<arg>${component}</arg>
<doc>Determine the exact Nexus directory to be used as a source for a particular test tool
Figure out what version of the tool needs to be pulled out of the
Nexus by looking at the version directory of the subsystem from
which the tool is being pulled. This code is REALLY UGLY but there
is no way around it until the bug
https://bugs.opendaylight.org/show_bug.cgi?id=5206 gets fixed.
I also don't want to depend on maven-metadata-local.xml and other
bits and pieces of ODL distribution which are not required for ODL
to function properly.</doc>
<status status="PASS" start="2026-08-22T23:48:30.564384" elapsed="0.381007"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:30.561844" elapsed="0.383588"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${version}</var>
<var>${location}</var>
<arg>${build_version}</arg>
<arg>${build_location}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:30.945625" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:30.945459" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:30.561819" elapsed="0.383891"/>
</if>
<if>
<branch type="IF" condition="'SNAPSHOT' in '${version}'">
<kw name="Remove Values From List" owner="Collections">
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>netconf</arg>
<arg>bgpcep</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:48:30.945989" elapsed="0.000202"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:30.945768" elapsed="0.000464"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:30.945752" elapsed="0.000505"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:48:30.946818" level="INFO">${is_staged} = "FALSE"</msg>
<var>${is_staged}</var>
<arg>"opendaylight.release" not in '${urlbase}' and "opendaylight.snapshot" not in '${urlbase}'</arg>
<arg>"TRUE"</arg>
<arg>"FALSE"</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:48:30.946410" elapsed="0.000435"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:48:30.947398" level="INFO">${is_mri_component} = "FALSE"</msg>
<var>${is_mri_component}</var>
<arg>'${component}' in ${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>"TRUE"</arg>
<arg>"FALSE"</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:48:30.947012" elapsed="0.000412"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:48:30.948049" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot</msg>
<var>${urlbase}</var>
<arg>${is_mri_component} == "TRUE" and ${is_staged} == "FALSE"</arg>
<arg>${NEXUS_RELEASE_BASE_URL}</arg>
<arg>${urlbase}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:48:30.947645" elapsed="0.000431"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:30.948619" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.4-SNAPSHOT</msg>
<var>${url}</var>
<arg>${urlbase}/${location}/${artifact}/${version}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:30.948235" elapsed="0.000411"/>
</kw>
<kw name="Execute_Command_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:48:30.950681" level="INFO">Executing command 'curl -L https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.4-SNAPSHOT/maven-metadata.xml'.</msg>
<msg time="2026-08-22T23:48:31.024388" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:48:31.024689" level="INFO">${stdout} = &lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;metadata modelVersion="1.1.0"&gt;
  &lt;groupId&gt;org.opendaylight.netconf&lt;/groupId&gt;
  &lt;artifactId&gt;netconf-testtool&lt;/artifactId&gt;
  &lt;versioning&gt;
    &lt;lastUpdated&gt;2026082...</msg>
<msg time="2026-08-22T23:48:31.024810" level="INFO">${stderr} =   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0   ...</msg>
<msg time="2026-08-22T23:48:31.024907" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:48:30.950466" elapsed="0.074491"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:48:31.027485" level="INFO">Length is 316.</msg>
<msg time="2026-08-22T23:48:31.027707" level="FAIL">'  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  2763  100  2763    0     0  47924      0 --:--:-- --:--:-- --:--:-- 48473' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-08-22T23:48:31.026813" elapsed="0.001053">'  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  2763  100  2763    0     0  47924      0 --:--:-- --:--:-- --:--:-- 48473' should be empty.</status>
</kw>
<msg time="2026-08-22T23:48:31.028129" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-08-22T23:48:31.028229" level="INFO">${result} = '  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0  ...</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:31.025351" elapsed="0.002932"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:48:31.029696" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:48:31.028717" elapsed="0.001038"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:31.032307" level="INFO">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;metadata modelVersion="1.1.0"&gt;
  &lt;groupId&gt;org.opendaylight.netconf&lt;/groupId&gt;
  &lt;artifactId&gt;netconf-testtool&lt;/artifactId&gt;
  &lt;versioning&gt;
    &lt;lastUpdated&gt;20260822052751&lt;/lastUpdated&gt;
    &lt;snapshot&gt;
      &lt;timestamp&gt;20260822.052751&lt;/timestamp&gt;
      &lt;buildNumber&gt;14&lt;/buildNumber&gt;
    &lt;/snapshot&gt;
    &lt;snapshotVersions&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;pom&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;javadoc&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;executable&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;stress-client&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;rest-perf-client&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;scale-util&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;stress-client&lt;/classifier&gt;
        &lt;extension&gt;tar.gz&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;cyclonedx&lt;/classifier&gt;
        &lt;extension&gt;xml&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;cyclonedx&lt;/classifier&gt;
        &lt;extension&gt;json&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;sources&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
    &lt;/snapshotVersions&gt;
  &lt;/versioning&gt;
  &lt;version&gt;9.0.4-SNAPSHOT&lt;/version&gt;
&lt;/metadata&gt;</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:31.031738" elapsed="0.000827"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:31.033516" level="INFO">  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  2763  100  2763    0     0  47924      0 --:--:-- --:--:-- --:--:-- 48473</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:31.032948" elapsed="0.000709"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:31.034696" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:31.034041" elapsed="0.000762"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:48:31.030753" elapsed="0.004194"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:31.029925" elapsed="0.005068"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:31.029883" elapsed="0.005142"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:48:31.035194" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:31.035090" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:31.035072" elapsed="0.000188"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:48:31.035400" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:48:31.035312" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:31.035297" elapsed="0.000186"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:31.035655" elapsed="0.000023"/>
</kw>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:48:30.949851" elapsed="0.085928"/>
</kw>
<msg time="2026-08-22T23:48:31.035848" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:48:30.949246" elapsed="0.086651"/>
</kw>
<msg time="2026-08-22T23:48:31.036053" level="INFO">${metadata} = &lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;metadata modelVersion="1.1.0"&gt;
  &lt;groupId&gt;org.opendaylight.netconf&lt;/groupId&gt;
  &lt;artifactId&gt;netconf-testtool&lt;/artifactId&gt;
  &lt;versioning&gt;
    &lt;lastUpdated&gt;2026082...</msg>
<var>${metadata}</var>
<arg>curl -L ${url}/maven-metadata.xml</arg>
<doc>A wrapper for Execute_Command_Passes with return_success_only=False
Also, log_on_success defaults to True (but is customizable, unlike return_success_only)..</doc>
<status status="PASS" start="2026-08-22T23:48:30.948850" elapsed="0.087233"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:48:31.038652" level="INFO">Executing command 'echo "&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;metadata modelVersion="1.1.0"&gt;
  &lt;groupId&gt;org.opendaylight.netconf&lt;/groupId&gt;
  &lt;artifactId&gt;netconf-testtool&lt;/artifactId&gt;
  &lt;versioning&gt;
    &lt;lastUpdated&gt;20260822052751&lt;/lastUpdated&gt;
    &lt;snapshot&gt;
      &lt;timestamp&gt;20260822.052751&lt;/timestamp&gt;
      &lt;buildNumber&gt;14&lt;/buildNumber&gt;
    &lt;/snapshot&gt;
    &lt;snapshotVersions&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;pom&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;javadoc&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;executable&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;stress-client&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;rest-perf-client&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;scale-util&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;stress-client&lt;/classifier&gt;
        &lt;extension&gt;tar.gz&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;cyclonedx&lt;/classifier&gt;
        &lt;extension&gt;xml&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;cyclonedx&lt;/classifier&gt;
        &lt;extension&gt;json&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;sources&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
    &lt;/snapshotVersions&gt;
  &lt;/versioning&gt;
  &lt;version&gt;9.0.4-SNAPSHOT&lt;/version&gt;
&lt;/metadata&gt;" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1'.</msg>
<msg time="2026-08-22T23:48:31.079066" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:48:31.079322" level="INFO">${stdout} = 9.0.4-20260822.052751-14</msg>
<msg time="2026-08-22T23:48:31.079493" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:48:31.079631" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:48:31.038427" elapsed="0.041262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:48:31.081466" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:48:31.080880" elapsed="0.000689"/>
</kw>
<msg time="2026-08-22T23:48:31.081817" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:48:31.081918" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:31.080084" elapsed="0.001884"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:48:31.083364" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:48:31.082364" elapsed="0.001059"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:31.085908" level="INFO">9.0.4-20260822.052751-14</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:31.085323" elapsed="0.000685"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:31.086941" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:31.086339" elapsed="0.000694"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:31.087937" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:31.087363" elapsed="0.000671"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:48:31.084376" elapsed="0.003778"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:31.083628" elapsed="0.004603"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:31.083551" elapsed="0.004736"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:48:31.088670" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:31.088414" elapsed="0.000385"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:31.088375" elapsed="0.000480"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:48:31.089189" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-08-22T23:48:31.088978" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:31.088941" elapsed="0.000430"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:31.089727" elapsed="0.000052"/>
</kw>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:48:31.037640" elapsed="0.052361"/>
</kw>
<msg time="2026-08-22T23:48:31.090119" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:48:31.037104" elapsed="0.053124"/>
</kw>
<arg>echo "${metadata}" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1</arg>
<arg>stderr_must_be_empty=${True}</arg>
<doc>A wrapper for Execute_Command_Passes with return_success_only=False
Also, log_on_success defaults to True (but is customizable, unlike return_success_only)..</doc>
<status status="PASS" start="2026-08-22T23:48:31.036647" elapsed="0.053788"/>
</kw>
<msg time="2026-08-22T23:48:31.090750" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:31.090851" level="INFO">${namepart} = 9.0.4-20260822.052751-14</msg>
<var>${status}</var>
<var>${namepart}</var>
<arg>SSHKeywords.Execute_Command_Should_Pass</arg>
<arg>echo "${metadata}" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1</arg>
<arg>stderr_must_be_empty=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:31.036240" elapsed="0.054653"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:48:31.091326" level="INFO">Length is 24.</msg>
<msg time="2026-08-22T23:48:31.091401" level="INFO">${length} = 24</msg>
<var>${length}</var>
<arg>${namepart}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:48:31.091058" elapsed="0.000366"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:48:31.091994" level="INFO">${namepart} = 9.0.4-20260822.052751-14</msg>
<var>${namepart}</var>
<arg>"${status}" != "PASS" or ${length} == 0</arg>
<arg>${version}</arg>
<arg>${namepart}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:48:31.091597" elapsed="0.000423"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:31.092517" level="INFO">${filename} = netconf-testtool-9.0.4-20260822.052751-14-executable.jar</msg>
<var>${filename}</var>
<arg>${name_prefix}${namepart}${name_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:31.092176" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:31.092964" level="INFO">netconf-testtool-9.0.4-20260822.052751-14-executable.jar</msg>
<arg>${filename}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:31.092715" elapsed="0.000293"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:31.093713" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.4-SNAPSHOT/netconf-testtool-9.0.4-20260822.052751-14-executable.jar</msg>
<var>${url}</var>
<arg>${url}/${filename}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:31.093156" elapsed="0.000585"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:48:31.094072" level="INFO">Executing command 'wget -q -N 'https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.4-SNAPSHOT/netconf-testtool-9.0.4-20260822.052751-14-executable.jar' 2&gt;&amp;1'.</msg>
<msg time="2026-08-22T23:48:31.151075" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:48:31.151320" level="INFO">${response} = </msg>
<msg time="2026-08-22T23:48:31.151420" level="INFO">${result} = 0</msg>
<var>${response}</var>
<var>${result}</var>
<arg>wget -q -N '${url}' 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:48:31.093903" elapsed="0.057568"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:31.152451" level="INFO"/>
<arg>${response}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:31.151887" elapsed="0.000657"/>
</kw>
<if>
<branch type="IF" condition="${result} == 0">
<return>
<value>${filename}</value>
<status status="PASS" start="2026-08-22T23:48:31.152979" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-08-22T23:48:31.152735" elapsed="0.000377"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:31.152691" elapsed="0.000475"/>
</if>
<kw name="Replace String Using Regexp" owner="String">
<var>${release_url}</var>
<arg>${url}</arg>
<arg>autorelease-[0-9]{4}</arg>
<arg>opendaylight.release</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:31.153494" elapsed="0.000050"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${response}</var>
<var>${result}</var>
<arg>wget -q -N '${release_url}' 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:31.153929" elapsed="0.000046"/>
</kw>
<if>
<branch type="IF" condition="${result} != 0">
<kw name="Fail" owner="BuiltIn">
<arg>Artifact "${artifact}" in component "${component}" could not be downloaded from ${release_url} nor ${url}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:31.154443" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:31.154138" elapsed="0.000470"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:31.154099" elapsed="0.000565"/>
</if>
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-08-22T23:48:31.154739" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:48:31.155045" level="INFO">${filename} = netconf-testtool-9.0.4-20260822.052751-14-executable.jar</msg>
<var>${filename}</var>
<arg>${component}</arg>
<arg>${artifact}</arg>
<arg>${name_prefix}</arg>
<arg>${name_suffix}</arg>
<arg>${fallback_url}</arg>
<arg>${explicit_url}</arg>
<arg>${build_version}</arg>
<arg>${build_location}</arg>
<doc>Deploy the specified artifact from Nexus to the cwd of the machine to which the active SSHLibrary connection points.
netconf is a name part of an artifact present in system/ of ODl installation with the same version as netconf-testtool should have.
Must have https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-karaf/9.0.4-SNAPSHOT/netconf-karaf-9.0.4-20260822.052751-14.zip variable set to the URL from which the
tested ODL distribution was downloaded and this place must be
inside a repository created by a standard distribution
construction job. If this is detected to ne be the case, fallback URL is used.
If  is non-empty, Deploy_From_Utrl is called instead.
TODO: Allow deploying to a specific directory, we have SSHKeywords.Execute_Command_At_Cwd_Should_Pass now.</doc>
<status status="PASS" start="2026-08-22T23:48:30.493187" elapsed="0.661914"/>
</kw>
<return>
<value>${filename}</value>
<status status="PASS" start="2026-08-22T23:48:31.155248" elapsed="0.000059"/>
</return>
<msg time="2026-08-22T23:48:31.155604" level="INFO">${filename} = netconf-testtool-9.0.4-20260822.052751-14-executable.jar</msg>
<var>${filename}</var>
<arg>netconf</arg>
<arg>netconf-testtool</arg>
<doc>Deploy a test tool.
The test tools have naming convention of the form
"&lt;repository_url&gt;/some/dir/somewhere/&lt;tool-name&gt;/&lt;tool-name&gt;-&lt;version-tag&gt;-${suffix}.jar"
where "&lt;tool-name&gt;" is the name of the tool and "&lt;version-tag&gt;" is
the version tag that is digged out of the maven metadata. This
keyword calculates ${name_prefix} and ${name_suffix} for
"Deploy_Artifact" and then calls "Deploy_Artifact" to do the real
work of deploying the artifact.</doc>
<status status="PASS" start="2026-08-22T23:48:30.485167" elapsed="0.670497"/>
</kw>
<kw name="Start_Testtool" owner="NetconfKeywords">
<kw name="NetconfKeywords__Deploy_Additional_Schemas" owner="NetconfKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:48:31.159194" level="INFO">Executing command 'rm -rf schemas 2&gt;&amp;1'.</msg>
<msg time="2026-08-22T23:48:31.205024" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:48:31.205171" level="INFO">${response} = </msg>
<var>${response}</var>
<arg>rm -rf schemas 2&gt;&amp;1</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:48:31.158941" elapsed="0.046265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:31.205845" level="INFO"/>
<arg>${response}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:31.205441" elapsed="0.000463"/>
</kw>
<if>
<branch type="IF" condition="'${schemas}' == 'none'">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-08-22T23:48:31.206160" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:31.206001" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:31.205974" elapsed="0.000281"/>
</if>
<kw name="Put Directory" owner="SSHLibrary">
<msg time="2026-08-22T23:48:31.250895" level="INFO">[chan 5] Opened sftp connection (server version 3)</msg>
<msg time="2026-08-22T23:48:31.348099" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/yang-ext@2013-07-09.yang' -&gt; '/home/jenkins/./schemas/yang-ext@2013-07-09.yang'</msg>
<msg time="2026-08-22T23:48:31.348162" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/example-action@2016-07-07.yang' -&gt; '/home/jenkins/./schemas/example-action@2016-07-07.yang'</msg>
<msg time="2026-08-22T23:48:31.348203" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/car@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/car@2014-08-18.yang'</msg>
<msg time="2026-08-22T23:48:31.348238" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/car-purchase@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/car-purchase@2014-08-18.yang'</msg>
<msg time="2026-08-22T23:48:31.348274" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/ncmount-l2fib@2016-03-07.yang' -&gt; '/home/jenkins/./schemas/ncmount-l2fib@2016-03-07.yang'</msg>
<msg time="2026-08-22T23:48:31.348308" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/augment-main-a@2014-01-21.yang' -&gt; '/home/jenkins/./schemas/augment-main-a@2014-01-21.yang'</msg>
<msg time="2026-08-22T23:48:31.348343" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/ietf-netconf-monitoring@2010-10-04.yang' -&gt; '/home/jenkins/./schemas/ietf-netconf-monitoring@2010-10-04.yang'</msg>
<msg time="2026-08-22T23:48:31.348377" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/ietf-netconf-monitoring-extension@2013-12-10.yang' -&gt; '/home/jenkins/./schemas/ietf-netconf-monitoring-extension@2013-12-10.yang'</msg>
<msg time="2026-08-22T23:48:31.348484" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/people@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/people@2014-08-18.yang'</msg>
<msg time="2026-08-22T23:48:31.348523" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/test@2014-10-18.yang' -&gt; '/home/jenkins/./schemas/test@2014-10-18.yang'</msg>
<msg time="2026-08-22T23:48:31.348558" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/car-people@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/car-people@2014-08-18.yang'</msg>
<msg time="2026-08-22T23:48:31.348611" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/ietf-inet-types@2010-09-24.yang' -&gt; '/home/jenkins/./schemas/ietf-inet-types@2010-09-24.yang'</msg>
<msg time="2026-08-22T23:48:31.348647" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/main@2014-01-21.yang' -&gt; '/home/jenkins/./schemas/main@2014-01-21.yang'</msg>
<arg>${schemas}</arg>
<arg>destination=./schemas</arg>
<doc>Uploads a directory, including its content, from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-08-22T23:48:31.206479" elapsed="0.142233"/>
</kw>
<kw name="List Directory" owner="SSHLibrary">
<msg time="2026-08-22T23:48:31.352777" level="INFO">13 items:
augment-main-a@2014-01-21.yang
car-people@2014-08-18.yang
car-purchase@2014-08-18.yang
car@2014-08-18.yang
example-action@2016-07-07.yang
ietf-inet-types@2010-09-24.yang
ietf-netconf-monitoring-extension@2013-12-10.yang
ietf-netconf-monitoring@2010-10-04.yang
main@2014-01-21.yang
ncmount-l2fib@2016-03-07.yang
people@2014-08-18.yang
test@2014-10-18.yang
yang-ext@2013-07-09.yang</msg>
<arg>./schemas</arg>
<doc>Returns and logs items in the remote ``path``, optionally filtered with ``pattern``.</doc>
<status status="PASS" start="2026-08-22T23:48:31.348948" elapsed="0.003910"/>
</kw>
<return>
<value>--schemas-dir ./schemas</value>
<status status="PASS" start="2026-08-22T23:48:31.352924" elapsed="0.000046"/>
</return>
<msg time="2026-08-22T23:48:31.353123" level="INFO">${schemas_option} = --schemas-dir ./schemas</msg>
<var>${schemas_option}</var>
<arg>${schemas}</arg>
<doc>Internal keyword for Install_And_Start_TestTool
This deploys the additional schemas if any and returns a
command line argument to be added to the testtool commandline
to tell it to load them. While this code could be integrated
into its only user, I considered the resulting code to be too
unreadable as the actions are quite different in the two
possibilities (additional schemas present versus no additional
schemas present), therefore a separate keyword is used.</doc>
<status status="PASS" start="2026-08-22T23:48:31.158135" elapsed="0.195024"/>
</kw>
<kw name="NetconfKeywords__Deploy_Custom_RPC" owner="NetconfKeywords">
<if>
<branch type="IF" condition="'${rpc_config}' == 'none'">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-08-22T23:48:31.354049" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:48:31.353892" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:31.353865" elapsed="0.000304"/>
</if>
<kw name="Copy_File_To_Tools_System" owner="SSHKeywords">
<arg>${TOOLS_SYSTEM_1_IP}</arg>
<arg>${rpc_config}</arg>
<arg>/tmp</arg>
<doc>Wrapper keyword to make it easier to copy a file to an Tools specific system</doc>
<status status="NOT RUN" start="2026-08-22T23:48:31.354481" elapsed="0.000036"/>
</kw>
<return>
<value>--rpc-config /tmp/customaction.xml</value>
<status status="NOT RUN" start="2026-08-22T23:48:31.354612" elapsed="0.000023"/>
</return>
<msg time="2026-08-22T23:48:31.357360" level="INFO">${rpc_config_option} = </msg>
<var>${rpc_config_option}</var>
<arg>${rpc_config}</arg>
<doc>Internal keyword for Install_And_Start_TestTool
This deploys the optional custom rpc file.
Drop out of the keyword, returning no command line argument when there
is no rpc file to deploy.</doc>
<status status="PASS" start="2026-08-22T23:48:31.353516" elapsed="0.003881"/>
</kw>
<kw name="Compose_Full_Java_Command" owner="NexusKeywords">
<kw name="Compose_Base_Java_Command" owner="NexusKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${openjdk}""" == "openjdk8"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_8_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_8_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:48:31.359367" elapsed="0.000501"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${openjdk}""" == "openjdk11"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_11_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_11_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:48:31.360143" elapsed="0.000425"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${openjdk}""" == "openjdk17"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_17_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_17_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:48:31.360818" elapsed="0.000423"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Compose_Dilemma_Filepath" owner="NexusKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:48:31.363272" level="INFO">Executing command 'ls -lA /usr/lib/jvm/java-21-openjdk-amd64/bin/java 2&gt;&amp;1'.</msg>
<msg time="2026-08-22T23:48:31.376421" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:48:31.376893" level="INFO">${out} = -rwxr-xr-x 1 root root 14456 Apr 26 09:33 /usr/lib/jvm/java-21-openjdk-amd64/bin/java</msg>
<msg time="2026-08-22T23:48:31.377030" level="INFO">${rc} = 0</msg>
<var>${out}</var>
<var>${rc}</var>
<arg>ls -lA ${specific_path} 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:48:31.362755" elapsed="0.014337"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${specific_path}</value>
<status status="PASS" start="2026-08-22T23:48:31.377731" elapsed="0.000088"/>
</return>
<status status="PASS" start="2026-08-22T23:48:31.377375" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:31.377298" elapsed="0.000667"/>
</if>
<return>
<value>${default_path}</value>
<status status="NOT RUN" start="2026-08-22T23:48:31.378046" elapsed="0.000035"/>
</return>
<arg>${JAVA_21_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_21_HOME_UBUNTU}/bin/java</arg>
<doc>Query active SSH connection, return specific path if it exists else default path.</doc>
<status status="PASS" start="2026-08-22T23:48:31.362168" elapsed="0.016186"/>
</kw>
<msg time="2026-08-22T23:48:31.378553" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>"""${openjdk}""" == "openjdk21"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_21_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_21_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:48:31.361467" elapsed="0.017281"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${out}</var>
<var>${rc}</var>
<arg>java -version 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:31.379145" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>java</value>
<status status="NOT RUN" start="2026-08-22T23:48:31.379357" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:31.379302" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:31.379273" elapsed="0.000291"/>
</if>
<kw name="Execute Command" owner="SSHLibrary">
<var>${java}</var>
<arg>echo $JAVA_HOME/bin/java 2&gt;&amp;1</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:31.379806" elapsed="0.000032"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${out}</var>
<var>${rc}</var>
<arg>${java} -version 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:31.380055" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${java}</value>
<status status="NOT RUN" start="2026-08-22T23:48:31.380240" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:31.380187" elapsed="0.000110"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:31.380162" elapsed="0.000165"/>
</if>
<kw name="Get Environment Variable" owner="OperatingSystem">
<var>${JAVA_HOME}</var>
<arg>JAVA_HOME</arg>
<arg>${EMPTY}</arg>
<doc>Returns the value of an environment variable with the given name.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:31.380529" elapsed="0.000030"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${java}</var>
<arg>"""${JAVA_HOME}"""!=""</arg>
<arg>${JAVA_HOME}/bin/java</arg>
<arg>false</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:31.380814" elapsed="0.000030"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${out}</var>
<var>${rc}</var>
<arg>${java} -version 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:31.381065" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${java}</value>
<status status="NOT RUN" start="2026-08-22T23:48:31.381245" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:31.381194" elapsed="0.000108"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:31.381169" elapsed="0.000163"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unable to find Java; specify \${JDKVERSION}, put it to your PATH or set JAVA_HOME environment variable.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:31.381527" elapsed="0.000030"/>
</kw>
<msg time="2026-08-22T23:48:31.381736" level="INFO">${base_command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java</msg>
<var>${base_command}</var>
<arg>openjdk=${openjdk}</arg>
<doc>Return string suitable for launching Java programs over SSHLibrary, depending on JRE version needed.
This requires that the SSH connection on which the command is going to be used is active as it is needed for querying files.
Commands composed for one SSH connection shall not be reused on other SSH connections as the two connections may have different Java setups.
Not directly related to Nexus, but versioned Java tools may need this.</doc>
<status status="PASS" start="2026-08-22T23:48:31.358844" elapsed="0.022928"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:31.382664" level="INFO">${full_command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.4-20260822.052751-14-executable.jar  --device-count 1 --debug true --schemas-dir ./...</msg>
<var>${full_command}</var>
<arg>${base_command} ${options}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:31.381992" elapsed="0.000712"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:31.383283" level="INFO">/usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.4-20260822.052751-14-executable.jar  --device-count 1 --debug true --schemas-dir ./schemas  --md-sal true</msg>
<arg>${full_command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:31.382926" elapsed="0.000421"/>
</kw>
<return>
<value>${full_command}</value>
<status status="PASS" start="2026-08-22T23:48:31.383407" elapsed="0.000040"/>
</return>
<msg time="2026-08-22T23:48:31.383651" level="INFO">${command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.4-20260822.052751-14-executable.jar  --device-count 1 --debug true --schemas-dir ./...</msg>
<var>${command}</var>
<arg>${java_options} -jar ${filename} ${tool_options} --device-count ${device-count} --debug ${debug} ${schemas_option} ${rpc_config_option} --md-sal ${mdsal}</arg>
<doc>Return full Bash command to run Java with given options.
This requires that the SSH connection on which the command is going to be used is active as it is needed for querying files.
The options may include JVM options, application command line arguments, Bash redirects and other constructs.</doc>
<status status="PASS" start="2026-08-22T23:48:31.357737" elapsed="0.025954"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:31.384273" level="INFO">Running testtool: /usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.4-20260822.052751-14-executable.jar  --device-count 1 --debug true --schemas-dir ./schemas  --md-sal true</msg>
<arg>Running testtool: ${command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:31.383915" elapsed="0.000423"/>
</kw>
<kw name="Get Log File Name" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:31.388773" level="INFO">${name} = netconf-clustering-txt-Entity</msg>
<var>${name}</var>
<arg>"""${SUITE_NAME}""".replace(" ","-").replace("/","-").replace(".","-")</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:31.388159" elapsed="0.000662"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:48:31.391828" level="INFO">${suffix} = </msg>
<var>${suffix}</var>
<arg>'${testcase}' != ''</arg>
<arg>--${testcase}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:48:31.389056" elapsed="0.002800"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-08-22T23:48:31.392210" level="INFO">${date} = 2026-08-22 23:48:31.392</msg>
<var>${date}</var>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-08-22T23:48:31.392025" elapsed="0.000211"/>
</kw>
<kw name="Convert Date" owner="DateTime">
<msg time="2026-08-22T23:48:31.392736" level="INFO">${timestamp} = 1787442511.392</msg>
<var>${timestamp}</var>
<arg>${date}</arg>
<arg>epoch</arg>
<doc>Converts between supported `date formats`.</doc>
<status status="PASS" start="2026-08-22T23:48:31.392386" elapsed="0.000381"/>
</kw>
<return>
<value>${testtool}--${name}${suffix}.${timestamp}.log</value>
<status status="PASS" start="2026-08-22T23:48:31.392833" elapsed="0.000040"/>
</return>
<msg time="2026-08-22T23:48:31.393087" level="INFO">${logfile} = testtool--netconf-clustering-txt-Entity.1787442511.392.log</msg>
<var>${logfile}</var>
<arg>testtool</arg>
<doc>Get the name of the suite sanitized to be usable as a part of filename.
These names are used to constructs names of the log files produced
by the testing tools so two suites using a tool wont overwrite the
log files if they happen to run in one job.</doc>
<status status="PASS" start="2026-08-22T23:48:31.384849" elapsed="0.008264"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:31.397843" level="INFO">${testtool_log} = testtool--netconf-clustering-txt-Entity.1787442511.392.log</msg>
<arg>${testtool_log}</arg>
<arg>${logfile}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:48:31.393279" elapsed="0.004677"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:48:31.418415" level="INFO">/usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.4-20260822.052751-14-executable.jar  --device-count 1 --debug true --schemas-dir ./schemas  --md-sal true &gt;testtool--netconf-clustering-txt-Entity.1787442511.392.log 2&gt;&amp;1</msg>
<arg>${command} &gt;${logfile} 2&gt;&amp;1</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:48:31.398128" elapsed="0.020357"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:31.422612" level="INFO">${NetconfKeywords__testtool_device_count} = 1</msg>
<arg>${NetconfKeywords__testtool_device_count}</arg>
<arg>${device-count}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:48:31.418671" elapsed="0.003991"/>
</kw>
<kw name="Perform_Operation_On_Each_Device" owner="NetconfKeywords">
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-08-22T23:48:31.423524" level="INFO">${current_Date} = 2026-08-22 23:48:31.423</msg>
<var>${current_Date}</var>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-08-22T23:48:31.423367" elapsed="0.000184"/>
</kw>
<kw name="Add Time To Date" owner="DateTime">
<msg time="2026-08-22T23:48:31.424046" level="INFO">${deadline_Date} = 2026-08-23 00:33:31.423</msg>
<var>${deadline_Date}</var>
<arg>${current_Date}</arg>
<arg>${timeout}</arg>
<doc>Adds time to date and returns the resulting date.</doc>
<status status="PASS" start="2026-08-22T23:48:31.423717" elapsed="0.000355"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:31.428726" level="INFO">${current_port} = 17830</msg>
<arg>${current_port}</arg>
<arg>${BASE_NETCONF_DEVICE_PORT}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:48:31.424232" elapsed="0.004543"/>
</kw>
<kw name="Repeat Keyword" owner="BuiltIn">
<msg time="2026-08-22T23:48:31.429276" level="INFO">Repeating keyword, round 1/1.</msg>
<kw name="NetconfKeywords__Perform_Operation_With_Checking_On_Next_Device" owner="NetconfKeywords">
<kw name="NetconfKeywords__Check_Netconf_Test_Timeout_Not_Expired" owner="NetconfKeywords">
<if>
<branch type="IF" condition="not ${ENABLE_NETCONF_TEST_TIMEOUT}">
<return>
<status status="NOT RUN" start="2026-08-22T23:48:31.430518" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:31.430396" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:31.430364" elapsed="0.000237"/>
</if>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-08-22T23:48:31.430918" level="INFO">${current_Date} = 2026-08-22 23:48:31.431</msg>
<var>${current_Date}</var>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-08-22T23:48:31.430761" elapsed="0.000184"/>
</kw>
<kw name="Subtract Date From Date" owner="DateTime">
<msg time="2026-08-22T23:48:31.431433" level="INFO">${ellapsed_seconds} = 2699.992</msg>
<var>${ellapsed_seconds}</var>
<arg>${deadline_Date}</arg>
<arg>${current_Date}</arg>
<doc>Subtracts date from another date and returns time between.</doc>
<status status="PASS" start="2026-08-22T23:48:31.431111" elapsed="0.000349"/>
</kw>
<if>
<branch type="IF" condition="${ellapsed_seconds}&lt;0">
<kw name="Fail" owner="BuiltIn">
<arg>The global time out period expired</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:31.431812" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:31.431542" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:31.431522" elapsed="0.000378"/>
</if>
<arg>${deadline_Date}</arg>
<status status="PASS" start="2026-08-22T23:48:31.430102" elapsed="0.001846"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:31.432514" level="INFO">${number} = 1</msg>
<var>${number}</var>
<arg>${current_port}-${BASE_NETCONF_DEVICE_PORT}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:31.432106" elapsed="0.000434"/>
</kw>
<kw name="Run Keyword" owner="BuiltIn">
<kw name="NetconfKeywords__Wait_Device_Is_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:31.434242" level="INFO">${number} = 1</msg>
<var>${number}</var>
<arg>'${device_name}'.split('-').pop()</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:31.433893" elapsed="0.000376"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:31.435910" level="INFO">${device-port} = 17830</msg>
<var>${device-port}</var>
<arg>${FIRST_TESTTOOL_PORT}+${device-number}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:31.435314" elapsed="0.000623"/>
</kw>
<kw name="NetconfKeywords__Check_Device_Is_Up" owner="NetconfKeywords">
<kw name="Count_Port_Occurences" owner="SSHKeywords">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_And_Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:48:31.439369" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-08-22T23:48:31.451684" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:48:31.451900" level="INFO">${netstat_installed} = net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET...</msg>
<var>${netstat_installed}</var>
<arg>netstat --version</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:48:31.439269" elapsed="0.012692"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<doc>Install netstat if it is not already installed.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:31.452870" elapsed="0.000057"/>
</kw>
<msg time="2026-08-22T23:48:31.453006" level="FAIL">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</msg>
<status status="FAIL" start="2026-08-22T23:48:31.452122" elapsed="0.001072">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</branch>
<status status="FAIL" start="2026-08-22T23:48:31.452077" elapsed="0.001214">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="FAIL" start="2026-08-22T23:48:31.438993" elapsed="0.014640">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</kw>
<arg>Check_And_Install_Netstat</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:31.438379" elapsed="0.015555"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:48:31.457216" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-08-22T23:48:31.519096" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:48:31.519664" level="INFO">${output} = 0</msg>
<var>${output}</var>
<arg>${NETSTAT_COMMAND} 2&gt; /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:48:31.456307" elapsed="0.063467"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:48:31.519952" elapsed="0.000163"/>
</return>
<msg time="2026-08-22T23:48:31.520915" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${last-port}</arg>
<arg>LISTEN</arg>
<arg>java</arg>
<doc>Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.</doc>
<status status="PASS" start="2026-08-22T23:48:31.436796" elapsed="0.084358"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-08-22T23:48:31.524403" level="FAIL">0 != 1</msg>
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-08-22T23:48:31.522405" elapsed="0.002336">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-08-22T23:48:31.436133" elapsed="0.089202">0 != 1</status>
</kw>
<arg>${number}</arg>
<doc>Query netstat on remote machine whether testtool device with the specified number has its port open and fail if not.</doc>
<status status="FAIL" start="2026-08-22T23:48:31.434993" elapsed="0.090570">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:32.528351" level="INFO">${device-port} = 17830</msg>
<var>${device-port}</var>
<arg>${FIRST_TESTTOOL_PORT}+${device-number}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:32.526919" elapsed="0.001505"/>
</kw>
<kw name="NetconfKeywords__Check_Device_Is_Up" owner="NetconfKeywords">
<kw name="Count_Port_Occurences" owner="SSHKeywords">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_And_Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:48:32.535860" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-08-22T23:48:32.548396" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:48:32.548535" level="INFO">${netstat_installed} = net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET...</msg>
<var>${netstat_installed}</var>
<arg>netstat --version</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:48:32.535742" elapsed="0.012830"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<doc>Install netstat if it is not already installed.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:32.549189" elapsed="0.000036"/>
</kw>
<msg time="2026-08-22T23:48:32.549275" level="FAIL">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</msg>
<status status="FAIL" start="2026-08-22T23:48:32.548720" elapsed="0.000693">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</branch>
<status status="FAIL" start="2026-08-22T23:48:32.548685" elapsed="0.000793">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="FAIL" start="2026-08-22T23:48:32.535399" elapsed="0.014288">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</kw>
<arg>Check_And_Install_Netstat</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:32.534393" elapsed="0.015510"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:48:32.551837" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-08-22T23:48:32.599193" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:48:32.599691" level="INFO">${output} = 0</msg>
<var>${output}</var>
<arg>${NETSTAT_COMMAND} 2&gt; /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:48:32.551309" elapsed="0.048502"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:48:32.599991" elapsed="0.000140"/>
</return>
<msg time="2026-08-22T23:48:32.600783" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${last-port}</arg>
<arg>LISTEN</arg>
<arg>java</arg>
<doc>Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.</doc>
<status status="PASS" start="2026-08-22T23:48:32.529967" elapsed="0.071029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-08-22T23:48:32.603445" level="FAIL">0 != 1</msg>
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-08-22T23:48:32.601913" elapsed="0.001856">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-08-22T23:48:32.528882" elapsed="0.075465">0 != 1</status>
</kw>
<arg>${number}</arg>
<doc>Query netstat on remote machine whether testtool device with the specified number has its port open and fail if not.</doc>
<status status="FAIL" start="2026-08-22T23:48:32.526289" elapsed="0.078276">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:33.608039" level="INFO">${device-port} = 17830</msg>
<var>${device-port}</var>
<arg>${FIRST_TESTTOOL_PORT}+${device-number}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:33.606562" elapsed="0.001547"/>
</kw>
<kw name="NetconfKeywords__Check_Device_Is_Up" owner="NetconfKeywords">
<kw name="Count_Port_Occurences" owner="SSHKeywords">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_And_Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:48:33.614627" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-08-22T23:48:33.627247" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:48:33.627516" level="INFO">${netstat_installed} = net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET...</msg>
<var>${netstat_installed}</var>
<arg>netstat --version</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:48:33.614479" elapsed="0.013132"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<doc>Install netstat if it is not already installed.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:33.628575" elapsed="0.000145"/>
</kw>
<msg time="2026-08-22T23:48:33.628803" level="FAIL">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</msg>
<status status="FAIL" start="2026-08-22T23:48:33.627821" elapsed="0.001195">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</branch>
<status status="FAIL" start="2026-08-22T23:48:33.627766" elapsed="0.001354">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="FAIL" start="2026-08-22T23:48:33.614188" elapsed="0.015274">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</kw>
<arg>Check_And_Install_Netstat</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:33.613134" elapsed="0.016676"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:48:33.632894" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-08-22T23:48:33.675137" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:48:33.675726" level="INFO">${output} = 0</msg>
<var>${output}</var>
<arg>${NETSTAT_COMMAND} 2&gt; /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:48:33.632047" elapsed="0.043790"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:48:33.676018" elapsed="0.000156"/>
</return>
<msg time="2026-08-22T23:48:33.676846" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${last-port}</arg>
<arg>LISTEN</arg>
<arg>java</arg>
<doc>Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.</doc>
<status status="PASS" start="2026-08-22T23:48:33.609689" elapsed="0.067336"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-08-22T23:48:33.679724" level="FAIL">0 != 1</msg>
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-08-22T23:48:33.678016" elapsed="0.001987">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-08-22T23:48:33.608515" elapsed="0.072213">0 != 1</status>
</kw>
<arg>${number}</arg>
<doc>Query netstat on remote machine whether testtool device with the specified number has its port open and fail if not.</doc>
<status status="FAIL" start="2026-08-22T23:48:33.605574" elapsed="0.076129">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:34.685128" level="INFO">${device-port} = 17830</msg>
<var>${device-port}</var>
<arg>${FIRST_TESTTOOL_PORT}+${device-number}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:34.683604" elapsed="0.001595"/>
</kw>
<kw name="NetconfKeywords__Check_Device_Is_Up" owner="NetconfKeywords">
<kw name="Count_Port_Occurences" owner="SSHKeywords">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_And_Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:48:34.692874" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-08-22T23:48:34.705211" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:48:34.705446" level="INFO">${netstat_installed} = net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET...</msg>
<var>${netstat_installed}</var>
<arg>netstat --version</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:48:34.692405" elapsed="0.013103"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<doc>Install netstat if it is not already installed.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:34.706479" elapsed="0.000056"/>
</kw>
<msg time="2026-08-22T23:48:34.706644" level="FAIL">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</msg>
<status status="FAIL" start="2026-08-22T23:48:34.705733" elapsed="0.001121">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</branch>
<status status="FAIL" start="2026-08-22T23:48:34.705678" elapsed="0.001275">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="FAIL" start="2026-08-22T23:48:34.691762" elapsed="0.015480">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</kw>
<arg>Check_And_Install_Netstat</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:34.690313" elapsed="0.017211"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:48:34.710616" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-08-22T23:48:34.783206" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:48:34.783701" level="INFO">${output} = 0</msg>
<var>${output}</var>
<arg>${NETSTAT_COMMAND} 2&gt; /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:48:34.709804" elapsed="0.074003"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:48:34.783965" elapsed="0.000137"/>
</return>
<msg time="2026-08-22T23:48:34.784775" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${last-port}</arg>
<arg>LISTEN</arg>
<arg>java</arg>
<doc>Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.</doc>
<status status="PASS" start="2026-08-22T23:48:34.686749" elapsed="0.098208"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-08-22T23:48:34.787323" level="FAIL">0 != 1</msg>
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-08-22T23:48:34.785845" elapsed="0.001762">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-08-22T23:48:34.685667" elapsed="0.102681">0 != 1</status>
</kw>
<arg>${number}</arg>
<doc>Query netstat on remote machine whether testtool device with the specified number has its port open and fail if not.</doc>
<status status="FAIL" start="2026-08-22T23:48:34.682572" elapsed="0.106061">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:35.791914" level="INFO">${device-port} = 17830</msg>
<var>${device-port}</var>
<arg>${FIRST_TESTTOOL_PORT}+${device-number}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:35.790481" elapsed="0.001504"/>
</kw>
<kw name="NetconfKeywords__Check_Device_Is_Up" owner="NetconfKeywords">
<kw name="Count_Port_Occurences" owner="SSHKeywords">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_And_Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:48:35.799895" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-08-22T23:48:35.812640" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:48:35.812742" level="INFO">${netstat_installed} = net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET...</msg>
<var>${netstat_installed}</var>
<arg>netstat --version</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:48:35.799131" elapsed="0.013638"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<doc>Install netstat if it is not already installed.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:35.813185" elapsed="0.000026"/>
</kw>
<msg time="2026-08-22T23:48:35.813245" level="FAIL">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</msg>
<status status="FAIL" start="2026-08-22T23:48:35.812855" elapsed="0.000499">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</branch>
<status status="FAIL" start="2026-08-22T23:48:35.812830" elapsed="0.000572">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="FAIL" start="2026-08-22T23:48:35.798474" elapsed="0.015063">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</kw>
<arg>Check_And_Install_Netstat</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:35.797157" elapsed="0.016521"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:48:35.815000" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-08-22T23:48:35.862833" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:48:35.863254" level="INFO">${output} = 1</msg>
<var>${output}</var>
<arg>${NETSTAT_COMMAND} 2&gt; /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:48:35.814651" elapsed="0.048704"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:48:35.863501" elapsed="0.000179"/>
</return>
<msg time="2026-08-22T23:48:35.864286" level="INFO">${count} = 1</msg>
<var>${count}</var>
<arg>${last-port}</arg>
<arg>LISTEN</arg>
<arg>java</arg>
<doc>Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.</doc>
<status status="PASS" start="2026-08-22T23:48:35.793541" elapsed="0.070923"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-08-22T23:48:35.865353" elapsed="0.001398"/>
</kw>
<arg>${device-port}</arg>
<status status="PASS" start="2026-08-22T23:48:35.792428" elapsed="0.074721"/>
</kw>
<arg>${number}</arg>
<doc>Query netstat on remote machine whether testtool device with the specified number has its port open and fail if not.</doc>
<status status="PASS" start="2026-08-22T23:48:35.789473" elapsed="0.077786"/>
</kw>
<arg>${TESTTOOL_BOOT_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Device_Up_And_Running</arg>
<arg>${number}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:48:31.434459" elapsed="4.432900"/>
</kw>
<arg>${DEVICE_NAME_BASE}-${number}</arg>
<arg>log_response=${log_response}</arg>
<status status="PASS" start="2026-08-22T23:48:31.433422" elapsed="4.434064"/>
</kw>
<arg>${operation}</arg>
<arg>${DEVICE_NAME_BASE}-${number}</arg>
<arg>log_response=${log_response}</arg>
<doc>Executes the given keyword with the given arguments.</doc>
<status status="PASS" start="2026-08-22T23:48:31.432713" elapsed="4.434903"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:35.868809" level="INFO">${next} = 17831</msg>
<var>${next}</var>
<arg>${current_port}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:35.867970" elapsed="0.000899"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:35.870180" level="INFO">${current_port} = 17831</msg>
<arg>${current_port}</arg>
<arg>${next}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:48:35.869231" elapsed="0.001043"/>
</kw>
<arg>${operation}</arg>
<arg>${deadline_Date}</arg>
<arg>log_response=${log_response}</arg>
<status status="PASS" start="2026-08-22T23:48:31.429495" elapsed="4.440910"/>
</kw>
<arg>${count} times</arg>
<arg>NetconfKeywords__Perform_Operation_With_Checking_On_Next_Device</arg>
<arg>${operation}</arg>
<arg>${deadline_Date}</arg>
<arg>log_response=${log_response}</arg>
<doc>Executes the specified keyword multiple times.</doc>
<status status="PASS" start="2026-08-22T23:48:31.428948" elapsed="4.441567"/>
</kw>
<arg>NetconfKeywords__Wait_Device_Is_Up_And_Running</arg>
<arg>log_response=${log_response}</arg>
<status status="PASS" start="2026-08-22T23:48:31.422903" elapsed="4.447785"/>
</kw>
<arg>${filename}</arg>
<arg>${device-count}</arg>
<arg>${debug}</arg>
<arg>${schemas}</arg>
<arg>${rpc_config}</arg>
<arg>${tool_options}</arg>
<arg>${java_options}</arg>
<arg>${mdsal}</arg>
<arg>log_response=${log_response}</arg>
<doc>Arrange to collect tool's output into a log file.
Will use specific /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas unless argument resolves to 'none',
which signifies that there are no additional schemas to be deployed.
If so the directory for the additional schemas is deleted on the
remote machine and the additional schemas argument is left out.</doc>
<status status="PASS" start="2026-08-22T23:48:31.156256" elapsed="4.714546"/>
</kw>
<arg>device-count=1</arg>
<arg>schemas=/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas</arg>
<doc>Install and run testtool.</doc>
<status status="PASS" start="2026-08-22T23:48:30.470745" elapsed="5.400297"/>
</kw>
<doc>Deploy and start test tool, then wait for all its devices to become online.</doc>
<status status="PASS" start="2026-08-22T23:48:30.219845" elapsed="5.651441"/>
</test>
<test id="s1-s7-t2" name="Check_Device_Is_Not_Mounted_At_Beginning" 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-08-22T23:48:35.877647" elapsed="0.000298"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:48:35.877254" elapsed="0.000769"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:48:35.879417" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:35.879259" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:35.879233" elapsed="0.000281"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:48:35.886424" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:35.886274" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:35.886249" elapsed="0.000267"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:48:35.887922" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:48:35.887370" elapsed="0.000590"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:48:35.888662" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:48:35.888210" elapsed="0.000488"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:48:35.888760" elapsed="0.000041"/>
</return>
<msg time="2026-08-22T23:48:35.888976" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:48:35.886848" elapsed="0.002161"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:48:35.894654" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:35.894528" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:35.894509" 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-08-22T23:48:35.895887" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:35.895781" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:35.895762" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:48:35.896418" level="INFO">${karaf_connection_index} = 85</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:48:35.896100" elapsed="0.000344"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:35.896853" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:48:35.896622" elapsed="0.000257"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:48:35.930758" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:48:35.897367" elapsed="0.033488"/>
</kw>
<msg time="2026-08-22T23:48:35.931031" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:48:35.931077" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:35.897035" elapsed="0.034079"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:48:35.963014" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:48:35.931647" elapsed="0.031471"/>
</kw>
<msg time="2026-08-22T23:48:35.963276" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:48:35.963321" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:35.931279" elapsed="0.032079"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:35.963748" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:35.963484" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:35.963463" elapsed="0.000367"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:35.964316" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:35.963973" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:35.964688" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:35.964453" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:35.964435" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:48:35.964802" 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-08-22T23:48:35.967366" elapsed="0.000155"/>
</kw>
<msg time="2026-08-22T23:48:35.967598" 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-08-22T23:48:35.966242" elapsed="0.001492"/>
</kw>
<kw name="Open 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-08-22T23:48:35.968007" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:35.968355" 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-08-22T23:48:35.965629" 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-08-22T23:48:35.965082" elapsed="0.003689"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:48:35.895450" elapsed="0.073425"/>
</kw>
<msg time="2026-08-22T23:48:35.968968" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:35.969013" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:35.894875" elapsed="0.074177"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:48:35.969235" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:48:35.969129" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:35.969110" 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-08-22T23:48:35.969731" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:35.970060" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:48:35.970130" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:48:35.894184" elapsed="0.076056"/>
</kw>
<msg time="2026-08-22T23:48:35.970333" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:35.970378" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:35.889386" elapsed="0.081029"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:35.970758" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:35.970489" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:35.970472" elapsed="0.000364"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:48:35.889245" elapsed="0.081614"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:48:35.976513" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:35.976405" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:35.976386" 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-08-22T23:48:35.977730" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:35.977622" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:35.977603" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:48:35.978275" level="INFO">${karaf_connection_index} = 86</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:48:35.977975" elapsed="0.000327"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:35.978694" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:48:35.978457" elapsed="0.000263"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:48:36.020166" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:48:35.979207" elapsed="0.041104"/>
</kw>
<msg time="2026-08-22T23:48:36.020489" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:48:36.020536" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:35.978876" elapsed="0.041697"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:48:36.045816" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:48:36.021115" elapsed="0.024805"/>
</kw>
<msg time="2026-08-22T23:48:36.046079" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:48:36.046124" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:36.020771" elapsed="0.025391"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.046468" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.046247" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.046219" elapsed="0.000327"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.047005" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:36.046708" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.047351" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.047140" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.047122" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:48:36.047461" 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-08-22T23:48:36.050011" elapsed="0.000150"/>
</kw>
<msg time="2026-08-22T23:48:36.050221" 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-08-22T23:48:36.048978" elapsed="0.001374"/>
</kw>
<kw name="Open 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-08-22T23:48:36.050761" elapsed="0.000090"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.051116" 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-08-22T23:48:36.048312" elapsed="0.002991"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:48:36.047747" elapsed="0.003621"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:48:35.977303" elapsed="0.074163"/>
</kw>
<msg time="2026-08-22T23:48:36.051557" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:36.051622" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:35.976745" elapsed="0.074916"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:48:36.051842" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:48:36.051737" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.051719" 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-08-22T23:48:36.052447" 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-08-22T23:48:36.052810" elapsed="0.000196"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:48:36.053061" 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-08-22T23:48:35.976039" elapsed="0.077135"/>
</kw>
<msg time="2026-08-22T23:48:36.053268" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:36.053312" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:35.971122" elapsed="0.082228"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.053694" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.053426" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.053408" elapsed="0.000364"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:48:35.970984" elapsed="0.082812"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:48:36.061058" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:36.060949" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.060929" 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-08-22T23:48:36.062276" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:36.062168" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.062150" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:48:36.062806" level="INFO">${karaf_connection_index} = 87</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:48:36.062485" elapsed="0.000349"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:36.063210" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:48:36.062991" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:48:36.108971" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:48:36.063742" elapsed="0.045342"/>
</kw>
<msg time="2026-08-22T23:48:36.109283" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:48:36.109331" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:36.063393" elapsed="0.045975"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:48:36.137886" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:48:36.109938" elapsed="0.028052"/>
</kw>
<msg time="2026-08-22T23:48:36.138148" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:48:36.138194" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:36.109553" elapsed="0.028678"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.138550" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.138318" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.138294" elapsed="0.000359"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.139095" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:36.138795" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.139444" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.139232" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.139214" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:48:36.139556" 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-08-22T23:48:36.142247" elapsed="0.000154"/>
</kw>
<msg time="2026-08-22T23:48:36.142462" 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-08-22T23:48:36.141084" 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-08-22T23:48:36.142937" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.143266" 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-08-22T23:48:36.140427" elapsed="0.003023"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:48:36.139867" elapsed="0.003646"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:48:36.061864" elapsed="0.081771"/>
</kw>
<msg time="2026-08-22T23:48:36.143891" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:36.143936" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:36.061278" elapsed="0.082699"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:48:36.144200" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:48:36.144092" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.144038" elapsed="0.000244"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.144704" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.145043" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:48:36.145114" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:48:36.060602" elapsed="0.084619"/>
</kw>
<msg time="2026-08-22T23:48:36.145315" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:36.145358" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:36.054054" elapsed="0.091341"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.145791" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.145470" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.145453" elapsed="0.000415"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:48:36.053919" elapsed="0.091972"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:48:35.889066" elapsed="0.256857"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:48:35.885768" elapsed="0.260217"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:48:35.878850" elapsed="0.267192"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:35.878233" elapsed="0.267856"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:48:35.874037" elapsed="0.272105"/>
</kw>
<kw name="Check_Device_Has_No_Netconf_Connector" owner="NetconfKeywords">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.157647" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:36.155526" elapsed="0.002148"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.158007" elapsed="0.000021"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-22T23:48:36.157850" elapsed="0.000214"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-22T23:48:36.157730" elapsed="0.000359"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.158520" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.158276" elapsed="0.000315"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.159320" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:36.158846" elapsed="0.000501"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:36.158617" elapsed="0.000807"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.159629" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.159450" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.158134" elapsed="0.001573"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:36.159741" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:48:36.159887" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:48:36.155076" elapsed="0.004836"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:36.159958" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:48:36.160113" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:48:36.154597" elapsed="0.005541"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.167480" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:36.167230" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.167936" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:36.167691" 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-08-22T23:48:36.181516" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:36.181804" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Fri, 21-Aug-2026 23:48:36 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1011'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}} 
 </msg>
<msg time="2026-08-22T23:48:36.181976" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:48:36.170132" elapsed="0.011883"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:36.168067" elapsed="0.014007"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.182326" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.182111" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.168026" elapsed="0.014419"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.187617" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:36.183874" elapsed="0.003822"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:36.183547" elapsed="0.004198"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.183521" elapsed="0.004259"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.191449" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:36.188186" elapsed="0.003348"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:36.187857" elapsed="0.003750"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.187833" elapsed="0.003811"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.192465" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:36.191874" 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-08-22T23:48:36.192957" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.192624" elapsed="0.000463"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.193791" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:36.193345" elapsed="0.000484"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:36.193122" elapsed="0.000758"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.192576" elapsed="0.001334"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.194659" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:36.194128" 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-08-22T23:48:36.195122" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.194795" elapsed="0.000406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.195891" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:36.195451" elapsed="0.000477"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:36.195234" elapsed="0.000743"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.194769" elapsed="0.001238"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:48:36.196263" elapsed="0.000528"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:48:36.197318" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:36.197009" 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-08-22T23:48:36.197498" 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-08-22T23:48:36.182960" elapsed="0.016950"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:36.200113" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:36.199983" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.199962" elapsed="0.000220"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:48:36.203273" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:48:36.200327" elapsed="0.002976"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:48:36.203355" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:48:36.203513" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:48:36.162770" elapsed="0.040770"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:48:36.203612" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:48:36.203762" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:48:36.160353" elapsed="0.043434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.204224" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:36.203947" elapsed="0.000334"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.204834" level="INFO">${actual_count} = 0</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:36.204432" elapsed="0.000467"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-22T23:48:36.204947" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:48:36.205101" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-22T23:48:36.146880" elapsed="0.058246"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.205539" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:48:36.205280" elapsed="0.000330"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${node1_session}</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="PASS" start="2026-08-22T23:48:36.146355" elapsed="0.059315"/>
</kw>
<kw name="Check_Device_Has_No_Netconf_Connector" owner="NetconfKeywords">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.223050" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:36.219715" elapsed="0.003376"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.223596" elapsed="0.000034"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-22T23:48:36.223353" elapsed="0.000333"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-22T23:48:36.223178" elapsed="0.000547"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.224216" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.223818" elapsed="0.000487"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.225449" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:36.224738" elapsed="0.000751"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:36.224342" elapsed="0.001202"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.225846" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.225602" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.223793" elapsed="0.002168"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:36.226012" elapsed="0.000040"/>
</return>
<msg time="2026-08-22T23:48:36.226230" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:48:36.219028" elapsed="0.007239"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:36.226335" elapsed="0.000038"/>
</return>
<msg time="2026-08-22T23:48:36.226543" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:48:36.218286" elapsed="0.008312"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.234727" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:36.234445" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.235183" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:36.234930" 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-08-22T23:48:36.248724" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:36.249020" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Fri, 21-Aug-2026 23:48:36 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1011'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}} 
 </msg>
<msg time="2026-08-22T23:48:36.249252" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:48:36.237382" elapsed="0.011929"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:36.235294" elapsed="0.014204"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.249942" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.249560" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.235276" elapsed="0.014892"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.257569" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:36.252547" elapsed="0.005094"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:36.252049" elapsed="0.005628"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.251978" elapsed="0.005724"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.260465" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:36.257983" elapsed="0.002529"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:36.257759" elapsed="0.002789"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.257742" elapsed="0.002831"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.261127" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:36.260750" 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-08-22T23:48:36.261457" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.261224" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.262011" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:36.261711" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:36.261538" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.261206" elapsed="0.000888"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.262625" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:36.262248" 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-08-22T23:48:36.262953" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.262723" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.263632" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:36.263190" elapsed="0.000472"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:36.263034" elapsed="0.000667"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.262705" 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-08-22T23:48:36.263873" elapsed="0.000396"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:48:36.264755" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:36.264433" 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-08-22T23:48:36.264936" elapsed="0.002369"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:48:36.251025" elapsed="0.016345"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:36.267549" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:36.267441" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.267423" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:48:36.271031" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:48:36.267781" elapsed="0.003287"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:48:36.271138" elapsed="0.000038"/>
</return>
<msg time="2026-08-22T23:48:36.271379" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:48:36.230028" elapsed="0.041379"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:48:36.271467" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:48:36.271638" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:48:36.226920" elapsed="0.044745"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.272109" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:36.271825" elapsed="0.000356"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.272781" level="INFO">${actual_count} = 0</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:36.272341" elapsed="0.000469"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-22T23:48:36.272871" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:48:36.273061" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-22T23:48:36.206334" elapsed="0.066759"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.273615" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:48:36.273294" elapsed="0.000377"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${node2_session}</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="PASS" start="2026-08-22T23:48:36.205873" elapsed="0.067859"/>
</kw>
<kw name="Check_Device_Has_No_Netconf_Connector" owner="NetconfKeywords">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.287044" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:36.284774" elapsed="0.002298"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.287398" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-22T23:48:36.287246" elapsed="0.000216"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-22T23:48:36.287127" elapsed="0.000372"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.287829" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.287566" elapsed="0.000323"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.288734" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:36.288192" elapsed="0.000570"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:36.287913" elapsed="0.000887"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.289017" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.288825" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.287548" elapsed="0.001551"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:36.289133" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:48:36.289283" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:48:36.284291" elapsed="0.005019"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:36.289368" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:48:36.289552" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:48:36.283769" elapsed="0.005836"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.297211" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:36.296956" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.297697" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:36.297429" 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-08-22T23:48:36.315169" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:36.315521" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node0179ip0zxsj0s9108c1r30zjro01.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Fri, 21-Aug-2026 23:48:36 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1011'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}} 
 </msg>
<msg time="2026-08-22T23:48:36.315809" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:48:36.299954" elapsed="0.015936"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:36.297812" elapsed="0.018231"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.316642" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.316128" elapsed="0.000677"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.297794" elapsed="0.019060"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.325332" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:36.319727" elapsed="0.005660"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:36.319124" elapsed="0.006300"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.319065" elapsed="0.006385"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.328268" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:36.325751" elapsed="0.002566"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:36.325507" elapsed="0.002847"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.325490" elapsed="0.002890"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.328952" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:36.328547" 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-08-22T23:48:36.329312" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.329053" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.329880" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:36.329556" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:36.329397" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.329034" elapsed="0.000932"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.330548" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:36.330124" 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-08-22T23:48:36.330903" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.330666" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.331519" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:36.331189" elapsed="0.000357"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:36.331022" elapsed="0.000579"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.330648" 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-08-22T23:48:36.331778" elapsed="0.000394"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:48:36.332778" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:36.332385" 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-08-22T23:48:36.333025" elapsed="0.002764"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:48:36.317888" elapsed="0.017973"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:36.336077" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:36.335933" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.335914" elapsed="0.000232"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:48:36.339357" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:48:36.336290" elapsed="0.003097"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:48:36.339440" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:48:36.339622" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:48:36.292367" elapsed="0.047284"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:48:36.339709" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:48:36.339860" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:48:36.289888" elapsed="0.049999"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.340351" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:36.340085" elapsed="0.000324"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.340980" level="INFO">${actual_count} = 0</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:36.340566" elapsed="0.000442"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-22T23:48:36.341059" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:48:36.341241" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-22T23:48:36.275026" elapsed="0.066241"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.341703" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:48:36.341425" elapsed="0.000332"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${node3_session}</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="PASS" start="2026-08-22T23:48:36.273937" elapsed="0.067881"/>
</kw>
<doc>Sanity check making sure our device is not there. Fail if found.</doc>
<status status="PASS" start="2026-08-22T23:48:35.872391" elapsed="0.469548"/>
</test>
<test id="s1-s7-t3" name="Configure_Device_On_Netconf" line="75">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:48:36.346135" elapsed="0.000222"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:48:36.345817" elapsed="0.000617"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:48:36.347784" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:36.347640" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.347611" elapsed="0.000265"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:48:36.353900" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:36.353789" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.353769" elapsed="0.000201"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.355012" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:48:36.354617" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.355512" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:48:36.355205" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:48:36.355602" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:48:36.355764" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:48:36.354205" 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-08-22T23:48:36.361903" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:36.361777" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.361756" 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-08-22T23:48:36.363203" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:36.363094" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.363076" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:48:36.363753" level="INFO">${karaf_connection_index} = 85</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:48:36.363417" elapsed="0.000363"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:36.364631" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:48:36.364027" elapsed="0.000669"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:48:36.402417" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:48:36.365838" elapsed="0.036693"/>
</kw>
<msg time="2026-08-22T23:48:36.402758" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:48:36.402807" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:36.365059" elapsed="0.037785"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:48:36.419419" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:48:36.403388" elapsed="0.016134"/>
</kw>
<msg time="2026-08-22T23:48:36.419704" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:48:36.419750" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:36.403024" elapsed="0.016765"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.420120" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.419870" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.419849" elapsed="0.000352"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.420665" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:36.420345" 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-08-22T23:48:36.421029" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.420814" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.420796" elapsed="0.000364"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:48:36.421196" 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">
<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-08-22T23:48:36.423877" elapsed="0.000189"/>
</kw>
<msg time="2026-08-22T23:48:36.424129" 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-08-22T23:48:36.422712" elapsed="0.001552"/>
</kw>
<kw name="Open 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-08-22T23:48:36.424540" elapsed="0.000100"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.424899" 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-08-22T23:48:36.422050" elapsed="0.003208"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:48:36.421482" elapsed="0.003846"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:48:36.362785" elapsed="0.062643"/>
</kw>
<msg time="2026-08-22T23:48:36.425524" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:36.425569" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:36.362130" elapsed="0.063498"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:48:36.426006" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:48:36.425708" elapsed="0.000360"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.425689" elapsed="0.000404"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.426498" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.426944" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:48:36.427018" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:48:36.361323" elapsed="0.065805"/>
</kw>
<msg time="2026-08-22T23:48:36.427223" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:36.427268" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:36.356208" elapsed="0.071098"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.427671" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.427382" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.427365" elapsed="0.000389"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:48:36.356063" elapsed="0.071716"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:48:36.433225" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:36.433118" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.433099" 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-08-22T23:48:36.434422" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:36.434316" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.434298" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:48:36.434951" level="INFO">${karaf_connection_index} = 86</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:48:36.434651" elapsed="0.000327"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:36.435349" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:48:36.435131" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:48:36.472255" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:48:36.435876" elapsed="0.036497"/>
</kw>
<msg time="2026-08-22T23:48:36.472547" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:48:36.472612" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:36.435528" elapsed="0.037182"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:48:36.488462" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:48:36.473260" elapsed="0.015301"/>
</kw>
<msg time="2026-08-22T23:48:36.488740" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:48:36.488785" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:36.472898" elapsed="0.015926"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.489128" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.488908" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.488882" elapsed="0.000325"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.489659" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:36.489346" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.490004" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.489791" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.489773" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:48:36.490117" 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-08-22T23:48:36.492797" elapsed="0.000154"/>
</kw>
<msg time="2026-08-22T23:48:36.493013" 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-08-22T23:48:36.491575" 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-08-22T23:48:36.493425" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.493789" 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-08-22T23:48:36.490935" 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-08-22T23:48:36.490386" 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-08-22T23:48:36.434016" elapsed="0.060282"/>
</kw>
<msg time="2026-08-22T23:48:36.494390" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:36.494435" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:36.433441" elapsed="0.061033"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:48:36.494679" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:48:36.494550" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.494531" 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-08-22T23:48:36.495346" 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-08-22T23:48:36.495791" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:48:36.495865" elapsed="0.000038"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:48:36.432775" elapsed="0.063226"/>
</kw>
<msg time="2026-08-22T23:48:36.496095" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:36.496139" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:36.428066" elapsed="0.068111"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.496502" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.496252" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.496235" elapsed="0.000399"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:48:36.427924" elapsed="0.068736"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:48:36.502081" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:36.501973" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.501955" 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-08-22T23:48:36.503298" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:36.503189" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.503171" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:48:36.503833" level="INFO">${karaf_connection_index} = 87</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:48:36.503508" elapsed="0.000352"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:36.504279" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:48:36.504053" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:48:36.544083" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:48:36.504822" elapsed="0.039385"/>
</kw>
<msg time="2026-08-22T23:48:36.544402" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:48:36.544451" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:36.504463" elapsed="0.040026"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:48:36.565920" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:48:36.545076" elapsed="0.020961"/>
</kw>
<msg time="2026-08-22T23:48:36.566206" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:48:36.566252" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:36.544706" elapsed="0.021585"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.566673" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.566384" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.566356" elapsed="0.000417"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.567247" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:36.566925" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.567630" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.567385" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.567365" elapsed="0.000348"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:48:36.567750" 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-08-22T23:48:36.570719" elapsed="0.000162"/>
</kw>
<msg time="2026-08-22T23:48:36.570945" 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-08-22T23:48:36.569400" elapsed="0.001688"/>
</kw>
<kw name="Open 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-08-22T23:48:36.571370" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.571743" 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-08-22T23:48:36.568674" elapsed="0.003304"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:48:36.568080" elapsed="0.003965"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:48:36.502888" elapsed="0.069257"/>
</kw>
<msg time="2026-08-22T23:48:36.572240" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:36.572286" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:36.502299" elapsed="0.070083"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:48:36.572666" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-08-22T23:48:36.572464" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.572445" elapsed="0.000331"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.573195" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.573927" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:48:36.574006" elapsed="0.000167"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:48:36.501629" elapsed="0.072657"/>
</kw>
<msg time="2026-08-22T23:48:36.574387" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:36.574433" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:36.496930" elapsed="0.077543"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.574837" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.574553" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.574534" elapsed="0.000384"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:48:36.496788" elapsed="0.078156"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:48:36.355847" elapsed="0.219131"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:48:36.353399" elapsed="0.221642"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:48:36.347246" elapsed="0.227857"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:36.346659" elapsed="0.228495"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:48:36.343053" elapsed="0.232160"/>
</kw>
<kw name="Configure_Device_In_Netconf" owner="NetconfKeywords">
<kw name="Set_Variable_If_At_Least_Scandium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Set_Variable_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Set Variable If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:48:36.596629" elapsed="0.000449"/>
</kw>
<msg time="2026-08-22T23:48:36.597140" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>BuiltIn.Set_Variable_If</arg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:48:36.596239" elapsed="0.000960"/>
</kw>
<arg>scandium</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Compare ${lower_bound} to titanium and return scandium if titanium is at least ${lower_bound},
return calcium otherwise.</doc>
<status status="PASS" start="2026-08-22T23:48:36.595799" elapsed="0.001476"/>
</kw>
<msg time="2026-08-22T23:48:36.597319" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Set_Variable_If_At_Least</arg>
<arg>scandium</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:48:36.587096" elapsed="0.010266"/>
</kw>
<msg time="2026-08-22T23:48:36.597467" level="INFO">${version} = scandium</msg>
<var>${version}</var>
<arg>scandium</arg>
<arg>calcium</arg>
<doc>Compare scandium to titanium and return ${value_if_true} if titanium is at least scandium, return ${value_if_false} otherwise.</doc>
<status status="PASS" start="2026-08-22T23:48:36.586760" elapsed="0.010733"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.598411" level="INFO">${mapping} = {'DEVICE_IP': '10.30.171.196', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/t...</msg>
<var>${mapping}</var>
<arg>DEVICE_IP=${device_address}</arg>
<arg>DEVICE_NAME=${device_name}</arg>
<arg>DEVICE_PORT=${device_port}</arg>
<arg>DEVICE_USER=${device_user}</arg>
<arg>DEVICE_PASSWORD=${device_password}</arg>
<arg>DEVICE_KEY=${device_key}</arg>
<arg>SCHEMA_DIRECTORY=${schema_directory}</arg>
<arg>RESTCONF_ROOT=${RESTCONF_ROOT}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:48:36.597677" elapsed="0.000763"/>
</kw>
<if>
<branch type="IF" condition="'${http_method}'=='post'">
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<arg>folder=${DIRECTORY_WITH_DEVICE_TEMPLATES}${/}${version}${/}${device_type}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.598881" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.598538" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.631004" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:36.630603" elapsed="0.000431"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:48:36.631903" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:48:36.631540" elapsed="0.000450">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:48:36.632106" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:48:36.631199" elapsed="0.000933"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.632740" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:48:36.632297" elapsed="0.000471"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:48:36.633075" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:48:36.633243" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:48:36.632930" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.633706" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:36.633427" 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-08-22T23:48:36.634733" level="INFO">mapping: {'DEVICE_IP': '10.30.171.196', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tmp/schema', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:36.634450" elapsed="0.000330"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.635224" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:48:36.634952" elapsed="0.000298"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.636144" level="INFO">${value} = 10.30.171.196</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:48:36.635657" elapsed="0.000514"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:48:36.637214" level="INFO">${encoded} = 10.30.171.196</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:48:36.636790" elapsed="0.000524"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:48:36.637623" elapsed="0.000039"/>
</return>
<msg time="2026-08-22T23:48:36.637798" level="INFO">${encoded_value} = 10.30.171.196</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:48:36.636362" elapsed="0.001461"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:48:36.637976" elapsed="0.000436"/>
</kw>
<var name="${key}">DEVICE_IP</var>
<var name="${value}">10.30.171.196</var>
<status status="PASS" start="2026-08-22T23:48:36.635498" elapsed="0.002956"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.639161" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:48:36.638737" elapsed="0.000451"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:48:36.640227" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:48:36.639798" elapsed="0.000533"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:48:36.640640" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:48:36.640805" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:48:36.639372" elapsed="0.001459"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:48:36.640980" elapsed="0.000408"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:48:36.638592" elapsed="0.002838"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.642234" level="INFO">${value} = 17830</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:48:36.641800" elapsed="0.000461"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:48:36.645292" level="INFO">${encoded} = 17830</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:48:36.644881" elapsed="0.000515"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:48:36.645770" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:48:36.645937" level="INFO">${encoded_value} = 17830</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:48:36.644449" elapsed="0.001515"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:48:36.646116" elapsed="0.000409"/>
</kw>
<var name="${key}">DEVICE_PORT</var>
<var name="${value}">17830</var>
<status status="PASS" start="2026-08-22T23:48:36.641545" elapsed="0.005023"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.647281" level="INFO">${value} = admin</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:48:36.646851" elapsed="0.000457"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:48:36.648346" level="INFO">${encoded} = admin</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:48:36.647935" elapsed="0.000515"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:48:36.648767" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:48:36.648932" level="INFO">${encoded_value} = admin</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:48:36.647495" elapsed="0.001462"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:48:36.649106" elapsed="0.000412"/>
</kw>
<var name="${key}">DEVICE_USER</var>
<var name="${value}">admin</var>
<status status="PASS" start="2026-08-22T23:48:36.646717" elapsed="0.002843"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.650358" level="INFO">${value} = topsecret</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:48:36.649931" elapsed="0.000454"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:48:36.651390" level="INFO">${encoded} = topsecret</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:48:36.650986" elapsed="0.000506"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:48:36.651833" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:48:36.651997" level="INFO">${encoded_value} = topsecret</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:48:36.650570" elapsed="0.001453"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:48:36.652177" elapsed="0.000420"/>
</kw>
<var name="${key}">DEVICE_PASSWORD</var>
<var name="${value}">topsecret</var>
<status status="PASS" start="2026-08-22T23:48:36.649797" elapsed="0.002850"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.653319" level="INFO">${value} = device-key</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:48:36.652897" elapsed="0.000449"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:48:36.654389" level="INFO">${encoded} = device-key</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:48:36.653988" elapsed="0.000533"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:48:36.654899" elapsed="0.000040"/>
</return>
<msg time="2026-08-22T23:48:36.655102" level="INFO">${encoded_value} = device-key</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:48:36.653531" elapsed="0.001606"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:48:36.655346" elapsed="0.000580"/>
</kw>
<var name="${key}">DEVICE_KEY</var>
<var name="${value}">device-key</var>
<status status="PASS" start="2026-08-22T23:48:36.652764" elapsed="0.003214"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.656827" level="INFO">${value} = /tmp/schema</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:48:36.656282" elapsed="0.000580"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:48:36.657947" level="INFO">${encoded} = /tmp/schema</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:48:36.657519" elapsed="0.000534"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:48:36.658326" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:48:36.658510" level="INFO">${encoded_value} = /tmp/schema</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:48:36.657097" elapsed="0.001447"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:48:36.658837" elapsed="0.000475"/>
</kw>
<var name="${key}">SCHEMA_DIRECTORY</var>
<var name="${value}">/tmp/schema</var>
<status status="PASS" start="2026-08-22T23:48:36.656114" elapsed="0.003252"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.660218" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:48:36.659692" elapsed="0.000560"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:48:36.661553" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:48:36.661035" elapsed="0.000657"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:48:36.662078" elapsed="0.000040"/>
</return>
<msg time="2026-08-22T23:48:36.662281" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:48:36.660491" elapsed="0.001823"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:48:36.662513" elapsed="0.000814"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:48:36.659505" elapsed="0.003879"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:48:36.635308" elapsed="0.028121"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:48:36.663491" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:48:36.663719" level="INFO">${mapping_to_use} = {'DEVICE_IP': '10.30.171.196', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/t...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:48:36.634128" elapsed="0.029626"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:36.633825" elapsed="0.030010"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.664093" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.663876" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.633803" elapsed="0.030412"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.665507" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:36.664430" elapsed="0.001118"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:48:36.665653" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:48:36.629968" elapsed="0.035853"/>
</kw>
<msg time="2026-08-22T23:48:36.665890" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:48:36.617264" elapsed="0.048683"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.679920" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.692510" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.704946" 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-08-22T23:48:36.705146" 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-08-22T23:48:36.705324" 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-08-22T23:48:36.705720" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.705560" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:36.705543" 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-08-22T23:48:36.705985" 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-08-22T23:48:36.706155" 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-08-22T23:48:36.706318" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:48:36.705512" elapsed="0.000858"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:48:36.705406" elapsed="0.000991"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.706544" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:36.706640" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:48:36.706768" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:48:36.612726" elapsed="0.094069"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.733457" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:36.733071" elapsed="0.000416"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:48:36.734256" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology.titanium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:48:36.734005" elapsed="0.000330">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology.titanium/data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:48:36.734429" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:48:36.733665" elapsed="0.000788"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.735018" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:48:36.734630" elapsed="0.000416"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:48:36.735348" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:48:36.735507" level="INFO">${template} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;$DEVICE_NAME&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;$DEVICE_IP&lt;/host&gt;
    &lt;port&gt;$DEVI...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:48:36.735206" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.735984" level="INFO">&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;$DEVICE_NAME&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;$DEVICE_IP&lt;/host&gt;
    &lt;port&gt;$DEVICE_PORT&lt;/port&gt;
    &lt;login-password-unencrypted&gt;
      &lt;username&gt;$DEVICE_USER&lt;/username&gt;
      &lt;password&gt;$DEVICE_PASSWORD&lt;/password&gt;
    &lt;/login-password-unencrypted&gt;
    &lt;tcp-only&gt;false&lt;/tcp-only&gt;
    &lt;keepalive-delay&gt;0&lt;/keepalive-delay&gt;
  &lt;/netconf-node&gt;
&lt;/node&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:36.735712" elapsed="0.000330"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:48:36.736409" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.736113" elapsed="0.000354"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.736963" level="INFO">${mapping_to_use} = {'DEVICE_IP': '10.30.171.196', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/t...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:36.736657" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:36.736494" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.736094" elapsed="0.000957"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.737916" level="INFO">${final_text} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;10.30.171.196&lt;/host&gt;
    &lt;...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:36.737198" elapsed="0.000749"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:48:36.738034" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:48:36.732429" elapsed="0.005736"/>
</kw>
<msg time="2026-08-22T23:48:36.738223" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:48:36.719706" elapsed="0.018566"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.750970" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.763434" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.775880" 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-08-22T23:48:36.776074" 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-08-22T23:48:36.776247" 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-08-22T23:48:36.776627" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.776470" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:36.776455" 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-08-22T23:48:36.776850" 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-08-22T23:48:36.777017" 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-08-22T23:48:36.777179" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:48:36.776427" elapsed="0.000804"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:48:36.776322" elapsed="0.000935"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.777400" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:36.777475" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:48:36.777614" level="INFO">${data} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;10.30.171.196&lt;/host&gt;
    &lt;...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:48:36.716961" elapsed="0.060683"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:48:36.778957" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:48:36.778708" elapsed="0.000315">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:48:36.779116" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:48:36.778349" 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-08-22T23:48:36.779459" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.779211" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.780046" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:36.779750" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:36.779541" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.779193" elapsed="0.000936"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.782756" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:48:36.780280" elapsed="0.002503"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:48:36.782837" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:48:36.783028" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:48:36.778021" elapsed="0.005034"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.784530" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:36.784277" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.784990" level="INFO">&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;10.30.171.196&lt;/host&gt;
    &lt;port&gt;17830&lt;/port&gt;
    &lt;login-password-unencrypted&gt;
      &lt;username&gt;admin&lt;/username&gt;
      &lt;password&gt;topsecret&lt;/password&gt;
    &lt;/login-password-unencrypted&gt;
    &lt;tcp-only&gt;false&lt;/tcp-only&gt;
    &lt;keepalive-delay&gt;0&lt;/keepalive-delay&gt;
  &lt;/netconf-node&gt;
&lt;/node&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:36.784748" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.785478" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:36.785219" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.785959" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:36.785699" elapsed="0.000310"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:48:36.786856" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:48:36.786646" elapsed="0.000237"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:48:36.787280" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:48:36.787059" elapsed="0.000257"/>
</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-08-22T23:48:36.787474" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.788177" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:36.787922" elapsed="0.000301"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:48:36.788267" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:48:36.788424" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:48:36.786212" elapsed="0.002238"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:48:36.828240" level="INFO">PUT Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Content-Length': '452', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;10.30.171.196&lt;/host&gt;
    &lt;port&gt;17830&lt;/port&gt;
    &lt;login-password-unencrypted&gt;
      &lt;username&gt;admin&lt;/username&gt;
      &lt;password&gt;topsecret&lt;/password&gt;
    &lt;/login-password-unencrypted&gt;
    &lt;tcp-only&gt;false&lt;/tcp-only&gt;
    &lt;keepalive-delay&gt;0&lt;/keepalive-delay&gt;
  &lt;/netconf-node&gt;
&lt;/node&gt; 
 </msg>
<msg time="2026-08-22T23:48:36.828323" level="INFO">PUT Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:36.828555" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:48:36.790813" elapsed="0.037831"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:36.788520" elapsed="0.040201"/>
</branch>
<branch type="ELSE">
<kw name="PUT 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 PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.828985" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.828760" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.788503" elapsed="0.040626"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.834043" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:36.830494" elapsed="0.003678"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:36.830187" elapsed="0.004052"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.830161" elapsed="0.004119"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.837534" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:36.834735" elapsed="0.002862"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:36.834368" elapsed="0.003268"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.834342" elapsed="0.003319"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.838223" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:36.837831" 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-08-22T23:48:36.838558" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.838322" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.839124" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:36.838822" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:36.838660" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.838304" elapsed="0.000904"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.839773" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:36.839366" 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-08-22T23:48:36.840108" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.839874" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.840662" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:36.840347" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:36.840190" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.839855" 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-08-22T23:48:36.840895" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:48:36.841722" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:36.841415" 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-08-22T23:48:36.841905" elapsed="0.002358"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:48:36.829682" elapsed="0.014646"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:48:36.844506" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:48:36.844397" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.844378" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.844761" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:36.844831" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:48:36.847103" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT 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-08-22T23:48:36.783393" elapsed="0.063737"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:48:36.847197" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:48:36.847353" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-08-22T23:48:36.601884" elapsed="0.245533"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.847813" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.847523" elapsed="0.000362"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.847505" elapsed="0.000405"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:48:36.847945" elapsed="0.000026"/>
</return>
<arg>folder=${DIRECTORY_WITH_DEVICE_TEMPLATES}${/}${version}${/}${device_type}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-08-22T23:48:36.599211" elapsed="0.248861"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:36.598977" elapsed="0.249138"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.598514" elapsed="0.249625"/>
</if>
<kw name="Set To Dictionary" owner="Collections">
<arg>${NetconfKeywords__mounted_device_types}</arg>
<arg>${device_name}</arg>
<arg>${device_type}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:48:36.848284" elapsed="0.000240"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>device_type=configure-via-topology</arg>
<arg>session=${node1_session}</arg>
<doc>Tell Netconf about the specified device so it can add it into its configuration.</doc>
<status status="PASS" start="2026-08-22T23:48:36.575502" elapsed="0.273105"/>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.849802" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:36.849372" elapsed="0.000458"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-08-22T23:48:36.850049" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:48:36.849905" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.849887" elapsed="0.000243"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.850295" elapsed="0.000022"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.850471" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.850670" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.850847" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.851015" elapsed="0.000021"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.851181" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.851344" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.851605" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.851427" elapsed="0.000233"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:36.851411" elapsed="0.000273"/>
</if>
<arg>5089</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:48:36.849019" elapsed="0.002734"/>
</kw>
<doc>Use node 1 to configure a testtool device on Netconf connector.</doc>
<status status="PASS" start="2026-08-22T23:48:36.342422" elapsed="0.509381"/>
</test>
<test id="s1-s7-t4" name="Wait_For_Device_To_Become_Visible_For_All_Nodes" line="83">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:48:36.855955" elapsed="0.000225"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:48:36.855666" elapsed="0.000573"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:48:36.857256" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:36.857141" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.857121" 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-08-22T23:48:36.862341" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:36.862232" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.862213" elapsed="0.000199"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.863419" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:48:36.863035" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.864004" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:48:36.863666" elapsed="0.000365"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:48:36.864077" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:48:36.864233" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:48:36.862655" elapsed="0.001603"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:48:36.869715" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:36.869603" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.869569" 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-08-22T23:48:36.871002" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:36.870893" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.870873" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:48:36.871520" level="INFO">${karaf_connection_index} = 85</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:48:36.871217" elapsed="0.000329"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:36.872009" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:48:36.871767" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:48:36.909728" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:48:36.872529" elapsed="0.037302"/>
</kw>
<msg time="2026-08-22T23:48:36.910006" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:48:36.910062" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:36.872194" elapsed="0.037906"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:48:36.937997" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "A "l "l "_ "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-08-22T23:48:36.910644" elapsed="0.027467"/>
</kw>
<msg time="2026-08-22T23:48:36.938272" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:48:36.938319" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:36.910270" elapsed="0.028087"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.938679" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.938435" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.938415" elapsed="0.000345"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:36.939203" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "A "l "l "_ "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-08-22T23:48:36.938904" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.939558" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.939342" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.939324" elapsed="0.000363"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:48:36.939727" 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">
<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-08-22T23:48:36.942305" elapsed="0.000160"/>
</kw>
<msg time="2026-08-22T23:48:36.942538" 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-08-22T23:48:36.941178" elapsed="0.001516"/>
</kw>
<kw name="Open 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-08-22T23:48:36.942973" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.943309" elapsed="0.000112"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:48:36.940544" elapsed="0.003159"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:48:36.940013" 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-08-22T23:48:36.870535" elapsed="0.073351"/>
</kw>
<msg time="2026-08-22T23:48:36.943977" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:36.944021" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:36.869934" elapsed="0.074124"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:48:36.944242" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:48:36.944135" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.944116" 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-08-22T23:48:36.944747" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.945082" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:48:36.945154" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:48:36.869247" elapsed="0.076016"/>
</kw>
<msg time="2026-08-22T23:48:36.945356" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:36.945399" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:36.864641" elapsed="0.080801"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:36.945844" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:36.945518" elapsed="0.000379"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.945501" elapsed="0.000420"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:48:36.864487" elapsed="0.081458"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:48:36.951387" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:36.951279" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.951260" 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-08-22T23:48:36.952658" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:36.952528" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:36.952510" elapsed="0.000216"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:48:36.953166" level="INFO">${karaf_connection_index} = 86</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:48:36.952868" elapsed="0.000324"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:36.953564" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:48:36.953345" elapsed="0.000261"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:48:36.989468" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:48:36.954096" elapsed="0.035471"/>
</kw>
<msg time="2026-08-22T23:48:36.989754" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:48:36.989800" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:36.953764" elapsed="0.036073"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:48:37.016976" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "A "l "l "_ "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-08-22T23:48:36.990354" elapsed="0.026896"/>
</kw>
<msg time="2026-08-22T23:48:37.017409" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:48:37.017465" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:36.990003" elapsed="0.027503"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:37.017863" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:37.017643" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:37.017622" elapsed="0.000320"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:37.018376" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "A "l "l "_ "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-08-22T23:48:37.018081" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:37.018745" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:37.018514" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:37.018496" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:48:37.018857" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<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-08-22T23:48:37.021447" elapsed="0.000172"/>
</kw>
<msg time="2026-08-22T23:48:37.021683" 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-08-22T23:48:37.020323" elapsed="0.001495"/>
</kw>
<kw name="Open 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-08-22T23:48:37.022096" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:37.022440" 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-08-22T23:48:37.019681" 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-08-22T23:48:37.019109" elapsed="0.003741"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:48:36.952212" elapsed="0.070738"/>
</kw>
<msg time="2026-08-22T23:48:37.023041" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:37.023084" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:36.951620" elapsed="0.071502"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:48:37.023307" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:48:37.023199" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:37.023180" 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-08-22T23:48:37.023832" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:37.024163" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:48:37.024234" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:48:36.950939" elapsed="0.073402"/>
</kw>
<msg time="2026-08-22T23:48:37.024432" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:37.024475" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:36.946206" elapsed="0.078305"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:37.024941" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:37.024690" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:37.024569" elapsed="0.000451"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:48:36.946068" elapsed="0.078976"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:48:37.030422" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:37.030300" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:37.030281" 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-08-22T23:48:37.031689" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:37.031522" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:37.031503" elapsed="0.000294"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:48:37.032248" level="INFO">${karaf_connection_index} = 87</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:48:37.031944" elapsed="0.000331"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:48:37.032685" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:48:37.032434" elapsed="0.000278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:48:37.070617" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:48:37.033208" elapsed="0.037524"/>
</kw>
<msg time="2026-08-22T23:48:37.070898" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:48:37.070944" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:37.032874" elapsed="0.038107"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:48:37.098887" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "A "l "l "_ "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-08-22T23:48:37.071492" elapsed="0.027501"/>
</kw>
<msg time="2026-08-22T23:48:37.099156" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:48:37.099202" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:37.071153" elapsed="0.028086"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:37.099534" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:37.099316" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:37.099296" elapsed="0.000379"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:37.100305" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "A "l "l "_ "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-08-22T23:48:37.099823" elapsed="0.000554"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:37.100678" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:37.100446" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:37.100428" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:48:37.100791" 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-08-22T23:48:37.103364" elapsed="0.000152"/>
</kw>
<msg time="2026-08-22T23:48:37.103627" 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-08-22T23:48:37.102231" elapsed="0.001544"/>
</kw>
<kw name="Open 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-08-22T23:48:37.104052" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:37.104495" 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-08-22T23:48:37.101610" elapsed="0.003106"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:48:37.101060" 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-08-22T23:48:37.031219" elapsed="0.073662"/>
</kw>
<msg time="2026-08-22T23:48:37.104972" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:37.105015" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:37.030657" elapsed="0.074396"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:48:37.105233" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:48:37.105128" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:37.105110" elapsed="0.000204"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:37.105721" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:37.106094" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:48:37.106165" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:48:37.029954" elapsed="0.076320"/>
</kw>
<msg time="2026-08-22T23:48:37.106366" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:48:37.106410" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:37.025304" elapsed="0.081143"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:37.106874" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:37.106522" elapsed="0.000406"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:37.106505" elapsed="0.000447"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:48:37.025165" elapsed="0.081811"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:48:36.864312" elapsed="0.242694"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:48:36.861862" elapsed="0.245203"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:48:36.856842" elapsed="0.250279"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:48:36.856391" elapsed="0.250775"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:48:36.852874" elapsed="0.254348"/>
</kw>
<kw name="Wait_Device_Connected" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:37.119421" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:37.117157" elapsed="0.002292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:37.120200" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:37.119830" elapsed="0.000397"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:48:37.119676" elapsed="0.000588"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:37.120831" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:37.120492" elapsed="0.000366"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:48:37.120343" elapsed="0.000551"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:48:37.119504" elapsed="0.001420"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:37.121333" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:37.120990" elapsed="0.000409"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:37.122159" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:37.121685" elapsed="0.000502"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:37.121424" elapsed="0.000800"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:37.122415" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:37.122249" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:37.120970" elapsed="0.001533"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:37.122538" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:48:37.122703" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:48:37.116702" elapsed="0.006027"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:37.122774" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:48:37.122913" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:48:37.116110" elapsed="0.006829"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:37.130260" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:37.130010" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:37.130718" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:37.130458" 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-08-22T23:48:37.140457" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:37.140636" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"connection-status":"connecting","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196"}}]} 
 </msg>
<msg time="2026-08-22T23:48:37.140737" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:48:37.132951" elapsed="0.007813"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:37.130829" elapsed="0.009979"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:37.140989" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:37.140835" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:37.130811" elapsed="0.010266"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:37.145035" level="INFO">{"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"connection-status":"connecting","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196"}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:37.142130" elapsed="0.002974"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:37.141904" elapsed="0.003249"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:37.141885" elapsed="0.003304"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:37.148856" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:37.145596" elapsed="0.003324"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:37.145268" elapsed="0.003701"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:37.145244" elapsed="0.003760"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:37.149779" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:37.149227" 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-08-22T23:48:37.150243" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:37.149916" elapsed="0.000406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:37.151016" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:37.150595" elapsed="0.000458"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:37.150356" elapsed="0.000747"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:37.149891" elapsed="0.001241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:37.151930" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:37.151349" 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-08-22T23:48:37.152393" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:37.152067" elapsed="0.000419"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:37.153182" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:37.152766" elapsed="0.000452"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:37.152522" elapsed="0.000746"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:37.152042" 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-08-22T23:48:37.153498" elapsed="0.000505"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:48:37.154648" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:37.154228" 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-08-22T23:48:37.154896" elapsed="0.002646"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:48:37.141459" elapsed="0.016164"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:37.157840" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:37.157730" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:37.157711" elapsed="0.000197"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:48:37.160776" level="INFO">${text_normalized} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:48:37.158050" elapsed="0.002756"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:48:37.160858" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:48:37.161015" level="INFO">${response_text} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:48:37.125637" elapsed="0.035405"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:48:37.161099" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:48:37.161248" level="INFO">${device_status} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:48:37.123157" elapsed="0.038117"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:48:37.161800" level="FAIL">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</msg>
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:48:37.161430" elapsed="0.000446">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</status>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:48:37.108524" elapsed="0.053478">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:38.180376" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:38.177162" elapsed="0.003246"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:38.181126" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:38.180792" elapsed="0.000362"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:48:38.180638" elapsed="0.000553"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:38.181767" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:38.181422" elapsed="0.000372"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:48:38.181273" elapsed="0.000557"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:48:38.180477" elapsed="0.001383"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:38.182194" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:38.181932" elapsed="0.000321"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:38.182999" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:38.182508" elapsed="0.000519"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:38.182278" elapsed="0.000800"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:38.183268" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:38.183105" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:38.181912" elapsed="0.001434"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:38.183384" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:48:38.183544" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:48:38.176489" elapsed="0.007162"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:38.183702" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:48:38.183871" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:48:38.175708" elapsed="0.008190"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:38.191430" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:38.191169" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:38.191888" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:38.191644" 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-08-22T23:48:38.201227" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:38.201383" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"connection-status":"connecting","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196"}}]} 
 </msg>
<msg time="2026-08-22T23:48:38.201481" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:48:38.194035" elapsed="0.007472"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:38.191997" elapsed="0.009554"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:38.201753" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:38.201596" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:38.191980" elapsed="0.009860"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:38.206836" level="INFO">{"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"connection-status":"connecting","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196"}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:38.203225" elapsed="0.003681"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:38.202901" elapsed="0.004055"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:38.202875" elapsed="0.004116"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:38.210704" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:38.207404" elapsed="0.003367"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:38.207086" elapsed="0.003736"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:38.207061" elapsed="0.003796"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:38.211700" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:38.211122" elapsed="0.000617"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:38.212143" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:38.211840" elapsed="0.000362"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:38.212705" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:38.212386" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:38.212226" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:38.211815" elapsed="0.000977"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:38.213313" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:38.212949" 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-08-22T23:48:38.213654" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:38.213410" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:38.214190" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:38.213893" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:38.213737" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:38.213392" 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-08-22T23:48:38.214423" elapsed="0.000408"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:48:38.215307" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:38.214993" 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-08-22T23:48:38.215486" elapsed="0.002371"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:48:38.202286" elapsed="0.015635"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:38.218096" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:38.217990" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:38.217972" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:48:38.221048" level="INFO">${text_normalized} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:48:38.218304" elapsed="0.002774"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:48:38.221130" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:48:38.221287" level="INFO">${response_text} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:48:38.186620" elapsed="0.034694"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:48:38.221373" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:48:38.221521" level="INFO">${device_status} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:48:38.184126" elapsed="0.037423"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:48:38.222076" level="FAIL">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</msg>
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:48:38.221722" elapsed="0.000429">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</status>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:48:38.162851" elapsed="0.059422">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:39.242072" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:39.237055" elapsed="0.005061"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:39.243153" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:39.242684" elapsed="0.000507"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:48:39.242407" elapsed="0.000837"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:39.244043" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:39.243571" elapsed="0.000509"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:48:39.243363" elapsed="0.000768"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:48:39.242208" elapsed="0.001962"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:39.244648" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:39.244269" elapsed="0.000461"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:39.245820" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:39.245087" elapsed="0.000845"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:39.244767" elapsed="0.001219"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:39.246251" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:39.246021" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:39.244242" elapsed="0.002126"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:39.246419" elapsed="0.000045"/>
</return>
<msg time="2026-08-22T23:48:39.246705" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:48:39.236373" elapsed="0.010370"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:39.246811" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:48:39.247015" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:48:39.235551" elapsed="0.011508"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:39.254444" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:39.254184" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:39.254961" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:39.254710" 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-08-22T23:48:39.265462" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:39.265693" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '3689'} 
 body={"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"unavailable-capabilities":{"unavailable-capability":[{"failure-reason":"missing-source","capability":"(urn:ietf:params:xml:ns:netconf:notification:1.0?revision=2008-07-14)notifications"}]},"clustered-connection-status":{"netconf-master-node":"pekko://opendaylight-cluster-data@127.0.0.1:2550"},"negotiated-ssh-transport-parameters":{"encryption-alg":"chacha20-poly1305","host-key-alg":"rsa-sha2-512","mac-alg":"none","key-exchange-alg":"sntrup761x25519-sha512"},"session-id":1,"connection-status":"connected","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196","available-capabilities":{"available-capability":[{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:notification:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:exi:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:candidate:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.1"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.0"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people?revision=2014-08-18)people"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)ietf-yang-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?revision=2010-10-04)ietf-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car?revision=2014-08-18)car"},{"capability-origin":"device-advertised","capability":"(ns:main?revision=2014-01-21)main"},{"capability-origin":"device-advertised","capability":"(ns:augment:main:a?revision=2014-01-21)augment-main-a"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:netconf:monitoring?revision=2022-07-18)odl-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:netconf:base:1.0?revision=2011-06-01)ietf-netconf"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring-extension?revision=2013-12-10)ietf-netconf-monitoring-extension"},{"capability-origin":"device-advertised","capability":"(org:opendaylight:coretutorials:ncmount:example:l2fib?revision=2016-03-07)ncmount-l2fib"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people?revision=2014-08-18)car-people"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-purchase?revision=2014-08-18)car-purchase"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:test:netconf:crud?revision=2014-10-18)test"},{"capability-origin":"device-advertised","capability":"(https://example.com/ns/example-action?revision=2016-07-07)example-action"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2013-07-15)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2010-09-24)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:yang:extension:yang-ext?revision=2013-07-09)yang-ext"}]}}}]} 
 </msg>
<msg time="2026-08-22T23:48:39.265830" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:48:39.257141" elapsed="0.008716"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:39.255073" elapsed="0.010828"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:39.266096" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:39.265927" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:39.255055" elapsed="0.011237"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:39.271239" level="INFO">{"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"unavailable-capabilities":{"unavailable-capability":[{"failure-reason":"missing-source","capability":"(urn:ietf:params:xml:ns:netconf:notification:1.0?revision=2008-07-14)notifications"}]},"clustered-connection-status":{"netconf-master-node":"pekko://opendaylight-cluster-data@127.0.0.1:2550"},"negotiated-ssh-transport-parameters":{"encryption-alg":"chacha20-poly1305","host-key-alg":"rsa-sha2-512","mac-alg":"none","key-exchange-alg":"sntrup761x25519-sha512"},"session-id":1,"connection-status":"connected","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196","available-capabilities":{"available-capability":[{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:notification:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:exi:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:candidate:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.1"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.0"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people?revision=2014-08-18)people"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)ietf-yang-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?revision=2010-10-04)ietf-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car?revision=2014-08-18)car"},{"capability-origin":"device-advertised","capability":"(ns:main?revision=2014-01-21)main"},{"capability-origin":"device-advertised","capability":"(ns:augment:main:a?revision=2014-01-21)augment-main-a"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:netconf:monitoring?revision=2022-07-18)odl-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:netconf:base:1.0?revision=2011-06-01)ietf-netconf"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring-extension?revision=2013-12-10)ietf-netconf-monitoring-extension"},{"capability-origin":"device-advertised","capability":"(org:opendaylight:coretutorials:ncmount:example:l2fib?revision=2016-03-07)ncmount-l2fib"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people?revision=2014-08-18)car-people"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-purchase?revision=2014-08-18)car-purchase"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:test:netconf:crud?revision=2014-10-18)test"},{"capability-origin":"device-advertised","capability":"(https://example.com/ns/example-action?revision=2016-07-07)example-action"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2013-07-15)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2010-09-24)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:yang:extension:yang-ext?revision=2013-07-09)yang-ext"}]}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:39.267760" elapsed="0.003581"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:39.267431" elapsed="0.003960"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:39.267405" elapsed="0.004022"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:39.275354" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:39.271836" elapsed="0.003566"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:39.271506" elapsed="0.003932"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:39.271483" elapsed="0.003981"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:39.276043" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:39.275643" 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-08-22T23:48:39.276379" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:39.276143" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:39.276940" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:39.276636" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:39.276462" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:39.276125" elapsed="0.000904"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:48:39.277546" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:39.277185" 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-08-22T23:48:39.277891" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:39.277660" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:39.278424" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:39.278128" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:39.277972" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:39.277641" elapsed="0.000867"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:48:39.278690" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:48:39.279537" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:48:39.279238" 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-08-22T23:48:39.279732" elapsed="0.002362"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:48:39.266833" elapsed="0.015325"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:39.282336" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:39.282229" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:39.282210" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:48:39.285988" level="INFO">${text_normalized} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "available-capabilities": {
     "available-capability": [
      {
       "capability": "(https://example.com/ns/exampl...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:48:39.282561" elapsed="0.003457"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:48:39.286071" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:48:39.286231" level="INFO">${response_text} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "available-capabilities": {
     "available-capability": [
      {
       "capability": "(https://example.com/ns/exampl...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:48:39.249831" elapsed="0.036427"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:48:39.286317" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:48:39.286466" level="INFO">${device_status} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "available-capabilities": {
     "available-capability": [
      {
       "capability": "(https://example.com/ns/exampl...</msg>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:48:39.247350" elapsed="0.039142"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-08-22T23:48:39.286703" elapsed="0.000307"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="PASS" start="2026-08-22T23:48:39.223240" elapsed="0.063833"/>
</kw>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Connected</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:48:37.107952" elapsed="2.179174"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${node1_session}</arg>
<doc>Wait for the device to become connected.
It is more readable to use this keyword in a test case than to put the whole WUKS below into it.</doc>
<status status="PASS" start="2026-08-22T23:48:37.107429" elapsed="2.179761"/>
</kw>
<kw name="Wait_Device_Connected" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:39.299626" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:39.297325" elapsed="0.002330"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:39.300327" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:39.300001" elapsed="0.000353"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:48:39.299849" elapsed="0.000543"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:39.300961" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:39.300637" elapsed="0.000351"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:48:39.300471" elapsed="0.000678"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:48:39.299713" elapsed="0.001468"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:39.301490" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:39.301249" elapsed="0.000300"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:39.302299" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:39.301830" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:39.301573" elapsed="0.000792"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:39.302588" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:39.302390" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:39.301231" elapsed="0.001476"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:39.302743" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:48:39.302894" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:48:39.296874" elapsed="0.006046"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:39.302966" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:48:39.303109" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:48:39.296295" elapsed="0.006840"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:39.310944" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:39.310683" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:39.311400" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:39.311155" 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-08-22T23:48:39.320996" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:39.321127" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:48:39.321245" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:39.313641" elapsed="0.008062">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:39.311512" elapsed="0.010278">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:39.321977" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:39.321824" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:39.311494" elapsed="0.010577">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:39.322437" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:39.322616" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:39.322560" elapsed="0.000099"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:39.322540" elapsed="0.000140"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:39.322821" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:39.322891" 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-08-22T23:48:39.305875" elapsed="0.017121">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:39.323064" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:39.303355" elapsed="0.019803">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:39.323321" elapsed="0.000021"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:48:39.288434" elapsed="0.035058">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:40.342118" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:40.339876" elapsed="0.002286"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:40.342915" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:40.342558" elapsed="0.000385"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:48:40.342401" elapsed="0.000580"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:40.343556" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:40.343219" elapsed="0.000381"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:48:40.343067" elapsed="0.000572"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:48:40.342240" elapsed="0.001429"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:40.344018" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:40.343748" elapsed="0.000331"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:40.344847" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:40.344342" elapsed="0.000535"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:40.344105" elapsed="0.000812"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:40.345113" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:40.344942" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:40.343726" elapsed="0.001466"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:40.345232" elapsed="0.000048"/>
</return>
<msg time="2026-08-22T23:48:40.345422" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:48:40.339353" elapsed="0.006098"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:40.345501" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:48:40.345666" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:48:40.338664" elapsed="0.007029"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:40.353269" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:40.353003" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:40.353755" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:40.353474" 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-08-22T23:48:40.365711" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:40.365935" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:48:40.366124" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:40.356002" elapsed="0.010713">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:40.353871" elapsed="0.012968">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:40.367109" elapsed="0.000108"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:40.366889" elapsed="0.000393"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:40.353853" elapsed="0.013463">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:40.367883" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:40.368079" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:40.368024" elapsed="0.000114"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:40.367999" elapsed="0.000169"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:40.368367" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:40.368467" 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-08-22T23:48:40.348500" elapsed="0.020140">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:40.368745" elapsed="0.000027"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:40.345926" elapsed="0.022964">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:40.369125" elapsed="0.000030"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:48:40.324562" elapsed="0.044718">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:41.386179" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:41.383914" elapsed="0.002299"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:41.386933" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:41.386602" elapsed="0.000358"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:48:41.386434" elapsed="0.000564"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:41.387549" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:41.387228" elapsed="0.000361"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:48:41.387080" elapsed="0.000547"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:48:41.386285" elapsed="0.001371"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:41.387998" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:41.387732" elapsed="0.000324"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:41.388792" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:41.388313" elapsed="0.000507"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:41.388082" elapsed="0.000774"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:41.389042" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:41.388881" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:41.387711" elapsed="0.001409"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:41.389159" elapsed="0.000052"/>
</return>
<msg time="2026-08-22T23:48:41.389349" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:48:41.383404" elapsed="0.005972"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:41.389422" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:48:41.389609" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:48:41.382805" elapsed="0.006832"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:41.397204" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:41.396939" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:41.397697" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:41.397407" 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-08-22T23:48:41.407402" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:41.407569" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:48:41.407716" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:41.399926" elapsed="0.008196">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:41.397811" elapsed="0.010396">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:41.408399" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:41.408241" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:41.397792" elapsed="0.010722">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:41.408917" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:41.409054" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:41.409016" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:41.408999" 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-08-22T23:48:41.409264" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:41.409354" 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-08-22T23:48:41.392421" elapsed="0.017054">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:41.409601" elapsed="0.000018"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:41.389935" elapsed="0.019769">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:41.409877" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:48:41.370177" elapsed="0.039812">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:42.428495" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:42.425501" elapsed="0.003040"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:42.429552" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:42.429102" elapsed="0.000584"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:48:42.428858" elapsed="0.000883"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:42.430500" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:42.430063" elapsed="0.000474"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:48:42.429855" elapsed="0.000750"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:48:42.428657" elapsed="0.001992"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:42.431106" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:42.430751" elapsed="0.000434"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:42.432182" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:42.431537" elapsed="0.000683"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:42.431221" elapsed="0.001049"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:42.432529" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:42.432305" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:42.430722" elapsed="0.001938"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:42.432713" elapsed="0.000051"/>
</return>
<msg time="2026-08-22T23:48:42.432934" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:48:42.424832" elapsed="0.008138"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:42.433052" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:48:42.433249" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:48:42.424013" elapsed="0.009271"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:42.443312" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:42.442964" elapsed="0.000415"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:42.443940" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:42.443609" 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-08-22T23:48:42.461304" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:42.461542" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:48:42.461764" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:42.448648" elapsed="0.013674">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:42.444093" elapsed="0.018392">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:42.462817" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:42.462543" elapsed="0.000373"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:42.444067" elapsed="0.018887">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:42.463565" elapsed="0.000062"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:42.463883" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:42.463822" elapsed="0.000128"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:42.463794" elapsed="0.000189"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:42.464195" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:42.464301" 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-08-22T23:48:42.437001" elapsed="0.027473">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:42.464606" elapsed="0.000025"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:42.433606" elapsed="0.031149">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:42.465039" elapsed="0.000035"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:48:42.411098" elapsed="0.054113">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:43.485306" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:43.482058" elapsed="0.003299"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:43.486368" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:43.485902" elapsed="0.000504"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:48:43.485683" elapsed="0.000774"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:43.487250" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:43.486801" elapsed="0.000486"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:48:43.486571" elapsed="0.000766"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:48:43.485457" elapsed="0.001920"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:43.487868" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:43.487481" elapsed="0.000468"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:43.489024" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:43.488310" elapsed="0.000754"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:43.487986" elapsed="0.001135"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:43.489391" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:43.489164" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:43.487452" elapsed="0.002018"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:43.489512" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:48:43.489693" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:48:43.481333" elapsed="0.008387"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:43.489768" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:48:43.489912" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:48:43.480390" elapsed="0.009547"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:43.497247" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:43.496991" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:43.497703" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:43.497444" 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-08-22T23:48:43.507091" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:43.507265" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:48:43.507383" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:43.500026" elapsed="0.007789">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:43.497903" elapsed="0.009998">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:43.508094" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:43.507937" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:43.497882" elapsed="0.010304">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:43.508652" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:43.508792" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:43.508753" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:43.508735" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:43.508999" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:43.509068" 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-08-22T23:48:43.492674" elapsed="0.016510">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:43.509293" elapsed="0.000025"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:43.490169" elapsed="0.019257">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:43.509678" elapsed="0.000031"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:48:43.466137" elapsed="0.043695">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:44.528769" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:44.525905" elapsed="0.002898"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:44.529503" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:44.529173" elapsed="0.000357"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:48:44.529020" elapsed="0.000547"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:44.530142" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:44.529815" elapsed="0.000356"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:48:44.529667" elapsed="0.000543"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:48:44.528874" elapsed="0.001365"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:44.530598" elapsed="0.000088"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:44.530314" elapsed="0.000412"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:44.531464" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:44.530990" elapsed="0.000503"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:44.530753" elapsed="0.000776"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:44.531735" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:44.531555" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:44.530293" elapsed="0.001521"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:44.531853" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:48:44.532037" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:48:44.525224" elapsed="0.006842"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:44.532115" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:48:44.532265" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:48:44.524402" elapsed="0.007889"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:44.539637" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:44.539366" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:44.540118" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:44.539835" 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-08-22T23:48:44.552400" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:44.552559" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:48:44.552691" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:44.542275" elapsed="0.010800">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:44.540230" elapsed="0.012927">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:44.553349" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:44.553190" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:44.540212" elapsed="0.013227">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:44.553839" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:44.553975" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:44.553937" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:44.553920" 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-08-22T23:48:44.554180" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:44.554250" 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-08-22T23:48:44.535046" elapsed="0.019308">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:44.554461" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:44.532514" elapsed="0.022044">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:44.554742" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:48:44.510734" elapsed="0.044116">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:45.572877" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:45.570020" elapsed="0.002891"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:45.573628" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:45.573284" elapsed="0.000372"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:48:45.573126" elapsed="0.000568"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:45.574244" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:45.573923" elapsed="0.000347"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:48:45.573776" elapsed="0.000534"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:48:45.572981" elapsed="0.001358"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:45.574692" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:45.574414" elapsed="0.000337"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:45.575490" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:45.575009" elapsed="0.000509"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:45.574776" elapsed="0.000779"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:45.575761" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:45.575595" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:45.574393" elapsed="0.001446"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:45.575878" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:48:45.576038" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:48:45.569345" elapsed="0.006719"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:45.576111" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:48:45.576254" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:48:45.568539" elapsed="0.007741"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:45.583603" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:45.583307" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:45.584047" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:45.583804" 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-08-22T23:48:45.594100" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:45.594257" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:48:45.594495" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:45.586198" elapsed="0.008845">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:45.584158" elapsed="0.011001">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:45.595420" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:45.595205" elapsed="0.000331"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:45.584140" elapsed="0.011430">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:45.596109" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:45.596295" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:45.596244" elapsed="0.000109"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:45.596220" elapsed="0.000163"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:45.596598" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:45.596700" 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-08-22T23:48:45.579003" elapsed="0.017844">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:45.596945" elapsed="0.000021"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:45.576502" elapsed="0.020575">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:45.597306" elapsed="0.000031"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:48:45.555704" elapsed="0.041755">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:46.617030" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:46.614710" elapsed="0.002353"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:46.617809" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:46.617443" elapsed="0.000394"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:48:46.617288" elapsed="0.000589"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:46.618452" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:46.618116" elapsed="0.000363"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:48:46.617961" elapsed="0.000557"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:48:46.617136" elapsed="0.001412"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:46.618915" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:46.618646" elapsed="0.000346"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:46.619775" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:46.619270" elapsed="0.000534"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:46.619028" elapsed="0.000814"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:46.620034" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:46.619869" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:46.618624" elapsed="0.001565"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:46.620233" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:48:46.620398" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:48:46.614218" elapsed="0.006207"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:46.620475" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:48:46.620641" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:48:46.613640" elapsed="0.007029"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:46.628268" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:46.627997" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:46.628755" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:46.628476" 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-08-22T23:48:46.640694" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:46.640847" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:48:46.640951" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:46.630921" elapsed="0.010432">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:46.628868" elapsed="0.012578">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:46.641650" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:46.641480" elapsed="0.000238"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:46.628850" elapsed="0.012893">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:46.642118" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:46.642252" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:46.642214" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:46.642197" 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-08-22T23:48:46.642454" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:46.642524" 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-08-22T23:48:46.623439" elapsed="0.019204">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:46.642715" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:46.620896" elapsed="0.021914">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:46.643009" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:48:46.598278" elapsed="0.044841">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:47.663804" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:47.661525" elapsed="0.002312"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:47.664538" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:47.664208" elapsed="0.000357"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:48:47.664054" elapsed="0.000565"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:47.665174" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:47.664851" elapsed="0.000350"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:48:47.664701" elapsed="0.000537"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:48:47.663907" elapsed="0.001360"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:47.665613" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:47.665338" elapsed="0.000334"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:47.666394" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:47.665925" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:47.665696" elapsed="0.000775"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:47.666680" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:47.666497" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:47.665319" elapsed="0.001440"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:47.666795" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:48:47.666952" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:48:47.661040" elapsed="0.005938"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:47.667024" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:48:47.667167" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:48:47.660436" elapsed="0.006757"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:47.674531" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:47.674256" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:47.674989" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:47.674746" 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-08-22T23:48:47.686146" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:47.686307" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:48:47.686420" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:47.677342" elapsed="0.009517">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:47.675099" elapsed="0.011844">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:47.687134" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:47.686978" elapsed="0.000314"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:47.675081" elapsed="0.012238">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:47.687716" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:47.687856" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:47.687816" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:47.687798" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:47.688065" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:47.688137" 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-08-22T23:48:47.669882" elapsed="0.018363">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:47.688317" elapsed="0.000017"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:47.667413" elapsed="0.021006">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:47.688607" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:48:47.644077" elapsed="0.044650">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:48.707765" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:48.705598" elapsed="0.002200"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:48.708511" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:48.708175" elapsed="0.000364"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:48:48.708018" elapsed="0.000574"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:48.709157" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:48.708829" elapsed="0.000355"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:48:48.708677" elapsed="0.000545"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:48:48.707871" elapsed="0.001390"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:48.709626" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:48.709343" elapsed="0.000344"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:48.710449" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:48.709966" elapsed="0.000514"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:48.709712" elapsed="0.000806"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:48.710726" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:48.710542" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:48.709323" elapsed="0.001484"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:48.710847" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:48:48.711013" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:48:48.705065" elapsed="0.005975"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:48.711086" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:48:48.711229" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:48:48.704459" elapsed="0.006796"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:48.720777" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:48.720434" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:48.721232" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:48.720982" 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-08-22T23:48:48.730708" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:48.730863" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:48:48.730981" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:48.723413" elapsed="0.008010">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:48.721345" elapsed="0.010165">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:48.731729" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:48.731546" elapsed="0.000253"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:48.721327" elapsed="0.010497">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:48.732210" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:48.732374" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:48.732325" elapsed="0.000104"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:48.732303" 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-08-22T23:48:48.732620" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:48.732696" 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-08-22T23:48:48.716033" elapsed="0.016772">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:48.732877" elapsed="0.000017"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:48.711549" elapsed="0.021427">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:48.733144" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:48:48.689542" elapsed="0.043713">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:49.797520" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:49.747544" elapsed="0.050021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:49.798440" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:49.798057" elapsed="0.000410"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:48:49.797845" elapsed="0.000660"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:49.799161" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:49.798830" elapsed="0.000358"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:48:49.798675" elapsed="0.000549"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:48:49.797665" elapsed="0.001589"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:49.799611" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:49.799329" elapsed="0.000342"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:49.800405" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:49.799931" elapsed="0.000503"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:49.799696" elapsed="0.000775"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:49.800675" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:49.800496" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:49.799309" elapsed="0.001445"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:49.800792" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:48:49.800958" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:48:49.747055" elapsed="0.053930"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:49.801033" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:48:49.801179" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:48:49.746452" elapsed="0.054753"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:49.808604" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:49.808332" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:49.809048" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:49.808804" 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-08-22T23:48:49.818322" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:49.818524" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:48:49.818722" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:49.811245" elapsed="0.008000">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:49.809159" elapsed="0.010200">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:49.819649" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:49.819408" elapsed="0.000349"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:49.809141" elapsed="0.010661">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:49.820330" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:49.820524" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:49.820469" elapsed="0.000143"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:49.820444" 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-08-22T23:48:49.820905" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:49.821007" 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-08-22T23:48:49.804003" elapsed="0.017156">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:49.821258" elapsed="0.000022"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:49.801459" elapsed="0.019936">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:49.821682" elapsed="0.000032"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:48:49.734173" elapsed="0.087667">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:50.846833" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:50.843512" elapsed="0.003356"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:50.847593" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:50.847246" elapsed="0.000375"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:48:50.847092" elapsed="0.000567"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:50.848334" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:50.848010" elapsed="0.000350"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:48:50.847854" elapsed="0.000544"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:48:50.846942" elapsed="0.001489"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:50.848793" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:50.848507" elapsed="0.000344"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:50.849650" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:50.849140" elapsed="0.000543"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:50.848877" elapsed="0.000843"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:50.849912" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:50.849747" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:50.848485" elapsed="0.001505"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:50.850029" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:48:50.850195" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:48:50.842446" elapsed="0.007776"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:50.850269" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:48:50.850413" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:48:50.841152" elapsed="0.009292"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:50.857883" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:50.857625" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:50.858325" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:50.858082" 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-08-22T23:48:50.866945" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:50.867167" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:48:50.867277" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:50.860536" elapsed="0.007309">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:50.858437" elapsed="0.009527">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:50.868242" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:50.868013" elapsed="0.000326"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:50.858419" elapsed="0.009956">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:50.868999" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:50.869211" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:50.869153" elapsed="0.000127"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:50.869126" elapsed="0.000188"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:50.869531" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:50.869664" 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-08-22T23:48:50.853291" elapsed="0.016551">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:50.869956" elapsed="0.000025"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:50.850691" elapsed="0.019415">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:50.870359" elapsed="0.000034"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:48:50.822700" elapsed="0.047841">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:51.889282" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:51.886284" elapsed="0.003041"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:51.890046" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:51.889712" elapsed="0.000362"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:48:51.889544" elapsed="0.000568"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:51.890697" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:51.890343" elapsed="0.000381"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:48:51.890193" elapsed="0.000568"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:48:51.889402" elapsed="0.001389"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:51.891129" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:51.890863" elapsed="0.000325"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:51.891930" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:51.891443" elapsed="0.000516"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:51.891213" elapsed="0.000846"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:51.892249" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:51.892086" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:51.890844" elapsed="0.001483"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:51.892364" elapsed="0.000045"/>
</return>
<msg time="2026-08-22T23:48:51.892535" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:48:51.885627" elapsed="0.006934"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:51.892626" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:48:51.892770" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:48:51.884821" elapsed="0.007975"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:51.900178" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:51.899922" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:51.900677" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:51.900378" 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-08-22T23:48:51.909710" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:51.909859" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:48:51.909963" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:51.902839" elapsed="0.007507">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:51.900791" elapsed="0.009666">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:51.910742" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:51.910505" elapsed="0.000332"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:51.900774" elapsed="0.010097">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:51.911385" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:51.911592" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:51.911522" elapsed="0.000133"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:51.911497" elapsed="0.000189"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:51.911885" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:51.911985" elapsed="0.000020"/>
</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-08-22T23:48:51.895466" elapsed="0.016663">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:51.912227" elapsed="0.000021"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:51.893016" elapsed="0.019341">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:51.912695" elapsed="0.000032"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:48:51.871417" elapsed="0.041438">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:52.932804" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:52.930673" elapsed="0.002161"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:52.933518" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:52.933193" elapsed="0.000352"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:48:52.933040" elapsed="0.000557"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:52.934145" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:52.933829" elapsed="0.000343"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:48:52.933680" elapsed="0.000528"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:48:52.932897" elapsed="0.001339"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:52.934557" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:52.934306" elapsed="0.000325"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:52.935352" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:52.934888" elapsed="0.000492"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:52.934657" elapsed="0.000759"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:52.935616" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:52.935440" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:52.934287" elapsed="0.001407"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:52.935730" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:48:52.935886" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:48:52.930189" elapsed="0.005735"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:52.935970" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:48:52.936111" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:48:52.929626" elapsed="0.006511"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:52.943419" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:52.943163" elapsed="0.000451"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:52.944028" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:52.943769" 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-08-22T23:48:52.953212" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:52.953360" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:48:52.953474" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:52.946312" elapsed="0.007573">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:52.944138" elapsed="0.009891">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:52.954221" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:52.954066" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:52.944120" elapsed="0.010193">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:52.954698" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:52.954833" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:52.954795" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:52.954778" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:52.955038" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:52.955111" elapsed="0.000014"/>
</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-08-22T23:48:52.938818" elapsed="0.016396">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:52.955285" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:52.936358" elapsed="0.019022">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:52.955550" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:48:52.913557" elapsed="0.042119">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:53.972528" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:53.970393" elapsed="0.002166"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:53.973258" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:53.972934" elapsed="0.000351"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:48:53.972781" elapsed="0.000540"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:53.973884" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:53.973549" elapsed="0.000362"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:48:53.973401" elapsed="0.000545"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:48:53.972637" elapsed="0.001338"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:53.974298" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:53.974047" elapsed="0.000309"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:53.975092" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:53.974627" elapsed="0.000493"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:53.974381" elapsed="0.000774"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:53.975343" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:53.975182" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:53.974027" elapsed="0.001406"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:53.975472" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:48:53.975644" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:48:53.969922" elapsed="0.005749"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:53.975717" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:48:53.975928" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:48:53.969343" elapsed="0.006611"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:53.983418" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:53.983152" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:53.983875" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:53.983630" 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-08-22T23:48:53.993449" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:53.993624" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:48:53.993732" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:53.986024" elapsed="0.008092">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:53.983984" elapsed="0.010213">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:53.994384" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:53.994230" elapsed="0.000219"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:53.983966" elapsed="0.010507">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:53.994853" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:53.994985" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:53.994949" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:53.994932" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:53.995188" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:53.995257" elapsed="0.000014"/>
</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-08-22T23:48:53.978817" elapsed="0.016543">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:53.995456" elapsed="0.000019"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:53.976173" elapsed="0.019383">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:53.995738" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:48:53.956496" elapsed="0.039348">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:55.020542" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:55.016546" elapsed="0.004045"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:55.021369" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:55.021042" elapsed="0.000354"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:48:55.020887" elapsed="0.000551"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:55.022039" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:55.021720" elapsed="0.000346"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:48:55.021538" elapsed="0.000564"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:48:55.020740" elapsed="0.001391"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:55.022468" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:55.022204" elapsed="0.000322"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:55.023282" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:55.022798" elapsed="0.000512"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:55.022551" elapsed="0.000796"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:55.023535" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:55.023372" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:55.022184" elapsed="0.001445"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:55.023666" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:48:55.023825" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:48:55.015489" elapsed="0.008362"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:55.023898" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:48:55.024041" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:48:55.014157" elapsed="0.009910"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:55.031422" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:55.031166" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:55.031888" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:55.031642" 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-08-22T23:48:55.040873" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:55.041028" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:48:55.041133" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:55.034054" elapsed="0.007501">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:55.032000" elapsed="0.009698">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:55.041978" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:55.041748" elapsed="0.000327"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:55.031981" elapsed="0.010129">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:55.042675" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:55.042945" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:55.042886" elapsed="0.000122"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:55.042840" elapsed="0.000200"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:55.043250" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:55.043355" 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-08-22T23:48:55.026799" elapsed="0.016711">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:55.043635" elapsed="0.000023"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:55.024289" elapsed="0.019489">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:55.044023" elapsed="0.000031"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:48:54.996761" elapsed="0.047423">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:56.062125" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:56.059969" elapsed="0.002188"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:56.063106" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:56.062544" elapsed="0.000589"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:48:56.062389" elapsed="0.000781"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:56.063740" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:56.063401" elapsed="0.000366"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:48:56.063252" elapsed="0.000550"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:48:56.062226" elapsed="0.001605"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:56.064168" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:56.063907" elapsed="0.000319"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:56.064966" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:56.064480" elapsed="0.000514"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:56.064251" elapsed="0.000779"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:56.065217" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:56.065055" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:56.063885" elapsed="0.001409"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:56.065332" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:48:56.065494" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:48:56.059469" elapsed="0.006052"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:56.065568" elapsed="0.000042"/>
</return>
<msg time="2026-08-22T23:48:56.065728" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:48:56.058900" elapsed="0.006854"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:56.073048" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:56.072792" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:56.073591" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:56.073332" 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-08-22T23:48:56.082840" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:56.083001" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:48:56.083109" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:56.075780" elapsed="0.007721">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:56.073705" elapsed="0.009896">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:56.083793" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:56.083637" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:56.073687" elapsed="0.010196">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:56.084256" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:56.084390" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:56.084352" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:56.084335" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:56.084614" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:56.084685" 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-08-22T23:48:56.068475" elapsed="0.016324">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:56.084868" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:56.065973" elapsed="0.018991">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:56.085129" elapsed="0.000021"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:48:56.045113" elapsed="0.040124">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:57.103240" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:57.100360" elapsed="0.002915"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:57.103990" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:57.103664" elapsed="0.000353"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:48:57.103496" elapsed="0.000558"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:57.104622" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:57.104284" elapsed="0.000365"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:48:57.104136" elapsed="0.000549"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:48:57.103348" elapsed="0.001435"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:57.105127" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:57.104861" elapsed="0.000325"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:57.105945" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:57.105445" elapsed="0.000528"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:57.105212" elapsed="0.000799"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:57.106202" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:57.106036" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:57.104839" elapsed="0.001442"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:57.106319" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:48:57.106482" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:48:57.099700" elapsed="0.006808"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:57.106555" elapsed="0.000041"/>
</return>
<msg time="2026-08-22T23:48:57.106716" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:48:57.098881" elapsed="0.007860"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:57.114029" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:57.113747" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:57.114469" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:57.114228" 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-08-22T23:48:57.123658" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:57.123821" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:48:57.123930" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:57.116775" elapsed="0.007556">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:57.114606" elapsed="0.009809">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:57.124621" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:57.124448" elapsed="0.000239"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:57.114567" elapsed="0.010144">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:57.125084" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:57.125219" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:57.125182" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:57.125165" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:57.125423" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:57.125492" 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-08-22T23:48:57.109413" elapsed="0.016238">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:57.125723" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:57.106962" elapsed="0.018857">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:57.126005" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:48:57.086114" elapsed="0.040002">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:58.141284" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:58.139126" elapsed="0.002192"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:58.142049" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:58.141721" elapsed="0.000355"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:48:58.141553" elapsed="0.000560"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:58.142677" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:58.142343" elapsed="0.000360"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:48:58.142196" elapsed="0.000543"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:48:58.141401" elapsed="0.001367"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:58.143104" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:58.142841" elapsed="0.000320"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:58.143897" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:58.143414" elapsed="0.000511"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:58.143187" elapsed="0.000774"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:58.144145" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:58.143985" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:58.142821" elapsed="0.001401"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:58.144260" elapsed="0.000038"/>
</return>
<msg time="2026-08-22T23:48:58.144426" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:48:58.138537" elapsed="0.005914"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:58.144497" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:48:58.144660" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:48:58.137730" elapsed="0.006956"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:58.152266" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:58.152009" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:58.152725" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:58.152466" 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-08-22T23:48:58.162728" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:58.162933" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:48:58.163153" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:58.154901" elapsed="0.008816">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:58.152836" elapsed="0.010999">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:58.164099" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:58.163883" elapsed="0.000309"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:58.152817" elapsed="0.011410">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:58.164779" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:58.164970" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:58.164917" elapsed="0.000113"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:58.164892" elapsed="0.000169"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:58.165258" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:58.165393" elapsed="0.000024"/>
</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-08-22T23:48:58.147666" elapsed="0.017879">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:58.165666" elapsed="0.000022"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:58.144906" elapsed="0.020896">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:58.166032" elapsed="0.000031"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:48:58.126801" elapsed="0.039383">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:59.184330" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:59.181945" elapsed="0.002426"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:59.185294" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:59.184933" elapsed="0.000395"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:48:59.184757" elapsed="0.000609"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:59.185967" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:59.185632" elapsed="0.000362"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:48:59.185458" elapsed="0.000572"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:48:59.184556" elapsed="0.001504"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:59.186409" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:59.186137" elapsed="0.000330"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:48:59.187252" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:48:59.186748" elapsed="0.000534"/>
</kw>
<status status="PASS" start="2026-08-22T23:48:59.186495" elapsed="0.000894"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:59.187597" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:59.187416" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-08-22T23:48:59.186115" elapsed="0.001564"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:59.187719" elapsed="0.000041"/>
</return>
<msg time="2026-08-22T23:48:59.187891" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:48:59.181446" elapsed="0.006471"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:48:59.187963" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:48:59.188111" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:48:59.180847" elapsed="0.007290"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:59.195610" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:59.195313" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:48:59.196070" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:48:59.195819" 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-08-22T23:48:59.204953" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:48:59.205113" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:48:59.205225" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:48:59.198249" elapsed="0.007400">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:48:59.196186" elapsed="0.009555">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:59.205935" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:48:59.205777" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-08-22T23:48:59.196167" elapsed="0.009860">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:59.206428" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:59.206568" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:48:59.206529" elapsed="0.000105"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:48:59.206511" elapsed="0.000145"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:59.206800" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:48:59.206873" 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-08-22T23:48:59.190897" elapsed="0.016084">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:48:59.207053" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:48:59.188366" elapsed="0.018784">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:48:59.207370" elapsed="0.000025"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:48:59.167057" elapsed="0.040432">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:00.226727" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:00.224297" elapsed="0.002463"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:00.227459" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:00.227131" elapsed="0.000355"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:49:00.226977" elapsed="0.000546"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:00.228092" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:00.227770" elapsed="0.000348"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:49:00.227619" elapsed="0.000536"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:49:00.226830" elapsed="0.001354"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:00.228548" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:00.228258" elapsed="0.000368"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:00.229402" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:00.228906" elapsed="0.000524"/>
</kw>
<status status="PASS" start="2026-08-22T23:49:00.228657" elapsed="0.000810"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:00.229679" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:00.229494" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-08-22T23:49:00.228237" elapsed="0.001523"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:49:00.229801" elapsed="0.000046"/>
</return>
<msg time="2026-08-22T23:49:00.229980" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:49:00.223642" elapsed="0.006365"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:49:00.230054" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:49:00.230313" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:49:00.222826" elapsed="0.007515"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:00.237737" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:00.237440" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:00.238196" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:00.237945" 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-08-22T23:49:00.247926" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:00.248087" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:49:00.248207" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:00.240420" elapsed="0.008230">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:00.238316" elapsed="0.010419">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:00.248986" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:00.248828" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:00.238296" elapsed="0.010780">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:00.249449" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:00.249602" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:00.249548" elapsed="0.000102"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:00.249531" elapsed="0.000142"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:00.249815" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:00.249886" 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-08-22T23:49:00.233102" elapsed="0.016891">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:00.250064" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:00.230571" elapsed="0.019588">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:00.250326" elapsed="0.000021"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:49:00.208248" elapsed="0.042187">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<msg time="2026-08-22T23:49:00.250543" level="FAIL">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Connected</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:48:39.287873" elapsed="20.962786">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${node2_session}</arg>
<doc>Wait for the device to become connected.
It is more readable to use this keyword in a test case than to put the whole WUKS below into it.</doc>
<status status="FAIL" start="2026-08-22T23:48:39.287390" elapsed="20.963384">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Wait_Device_Connected" owner="NetconfKeywords">
<arg>${DEVICE_NAME}</arg>
<arg>session=${node3_session}</arg>
<doc>Wait for the device to become connected.
It is more readable to use this keyword in a test case than to put the whole WUKS below into it.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:00.250991" elapsed="0.000025"/>
</kw>
<doc>Wait for the whole cluster to see the device.</doc>
<status status="FAIL" start="2026-08-22T23:48:36.852250" elapsed="23.398933">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</test>
<test id="s1-s7-t5" name="Check_Config_Data_Before_Data_Creation" 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-08-22T23:49:00.256220" elapsed="0.000395"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:49:00.255837" elapsed="0.000863"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:49:00.258157" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:00.257991" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-08-22T23:49:00.257963" elapsed="0.000289"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:49:00.265259" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:00.265151" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:49:00.265133" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:49:00.266334" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:49:00.265949" elapsed="0.000455"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:49:00.266901" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:49:00.266567" elapsed="0.000360"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:49:00.266971" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:49:00.267127" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:49:00.265554" elapsed="0.001597"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:49:00.272832" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:00.272721" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:49:00.272701" 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-08-22T23:49:00.274087" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:00.273981" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:49:00.273962" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:49:00.274626" level="INFO">${karaf_connection_index} = 85</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:49:00.274300" elapsed="0.000353"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:49:00.275050" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:49:00.274818" elapsed="0.000258"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:49:00.312466" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:49:00.275565" elapsed="0.037006"/>
</kw>
<msg time="2026-08-22T23:49:00.312768" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:49:00.312814" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:49:00.275234" elapsed="0.037617"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:49:00.335148" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "D "a "t "a "_ "C "r "e "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-08-22T23:49:00.313364" elapsed="0.021889"/>
</kw>
<msg time="2026-08-22T23:49:00.335415" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:49:00.335462" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "D "a "t "a ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:49:00.313022" elapsed="0.022477"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:00.335837" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:00.335602" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-08-22T23:49:00.335560" elapsed="0.000358"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:00.336388" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "D "a "t "a "_ "C "r "e "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-08-22T23:49:00.336061" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:00.336756" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:00.336524" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-08-22T23:49:00.336506" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:49:00.336868" 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-08-22T23:49:00.339527" elapsed="0.000178"/>
</kw>
<msg time="2026-08-22T23:49:00.339770" 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-08-22T23:49:00.338322" 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-08-22T23:49:00.340187" elapsed="0.000081"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:00.340566" elapsed="0.000277"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:49:00.337698" elapsed="0.003267"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:49:00.337140" elapsed="0.003893"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:49:00.273676" elapsed="0.067457"/>
</kw>
<msg time="2026-08-22T23:49:00.341228" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:49:00.341273" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "D "a "t "a ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:49:00.273051" elapsed="0.068264"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:49:00.341505" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:49:00.341395" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-08-22T23:49:00.341375" 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-08-22T23:49:00.342023" 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-08-22T23:49:00.342364" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:49:00.342439" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:49:00.272314" elapsed="0.070235"/>
</kw>
<msg time="2026-08-22T23:49:00.342728" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:49:00.342774" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "D "a "t "a ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:49:00.267510" elapsed="0.075301"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:00.343142" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:00.342889" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-08-22T23:49:00.342871" elapsed="0.000350"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:49:00.267371" elapsed="0.075874"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:49:00.348740" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:00.348627" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-08-22T23:49:00.348607" 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-08-22T23:49:00.350005" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:00.349893" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-08-22T23:49:00.349874" elapsed="0.000202"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:49:00.350531" level="INFO">${karaf_connection_index} = 86</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:49:00.350223" elapsed="0.000335"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:49:00.350960" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:49:00.350733" elapsed="0.000254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:49:00.386066" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:49:00.351484" elapsed="0.034680"/>
</kw>
<msg time="2026-08-22T23:49:00.386323" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:49:00.386369" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:49:00.351145" elapsed="0.035260"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:49:00.408743" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "D "a "t "a "_ "C "r "e "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-08-22T23:49:00.386970" elapsed="0.021875"/>
</kw>
<msg time="2026-08-22T23:49:00.409002" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:49:00.409047" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "D "a "t "a ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:49:00.386628" elapsed="0.022455"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:00.409436" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:00.409210" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-08-22T23:49:00.409188" elapsed="0.000328"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:00.410190" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "D "a "t "a "_ "C "r "e "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-08-22T23:49:00.409679" elapsed="0.000580"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:00.410542" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:00.410327" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-08-22T23:49:00.410309" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:49:00.410672" 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">
<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-08-22T23:49:00.413277" elapsed="0.000153"/>
</kw>
<msg time="2026-08-22T23:49:00.413491" 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-08-22T23:49:00.412115" elapsed="0.001529"/>
</kw>
<kw name="Open 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-08-22T23:49:00.413918" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:00.414252" 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-08-22T23:49:00.411477" elapsed="0.002962"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:49:00.410945" elapsed="0.003560"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:49:00.349559" elapsed="0.065066"/>
</kw>
<msg time="2026-08-22T23:49:00.414719" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:49:00.414763" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "D "a "t "a ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:49:00.348976" elapsed="0.065823"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:49:00.414981" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:49:00.414876" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-08-22T23:49:00.414857" 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-08-22T23:49:00.415455" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:00.415806" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:49:00.415878" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:49:00.348239" elapsed="0.067747"/>
</kw>
<msg time="2026-08-22T23:49:00.416079" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:49:00.416122" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "D "a "t "a ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:49:00.343512" elapsed="0.072646"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:00.416505" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:00.416233" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-08-22T23:49:00.416216" elapsed="0.000468"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:49:00.343372" elapsed="0.073339"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:49:00.422049" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:00.421943" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:49:00.421924" 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-08-22T23:49:00.423387" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:00.423279" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:49:00.423261" elapsed="0.000230"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:49:00.423958" level="INFO">${karaf_connection_index} = 87</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:49:00.423656" elapsed="0.000328"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:49:00.424370" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:49:00.424139" elapsed="0.000257"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:49:00.466526" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:49:00.424901" elapsed="0.041809"/>
</kw>
<msg time="2026-08-22T23:49:00.466914" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:49:00.466963" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:49:00.424552" elapsed="0.042448"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:49:00.495539" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "D "a "t "a "_ "C "r "e "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-08-22T23:49:00.467677" elapsed="0.028056"/>
</kw>
<msg time="2026-08-22T23:49:00.495938" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:49:00.495986" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "D "a "t "a ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:49:00.467238" elapsed="0.028788"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:00.496523" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:00.496136" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-08-22T23:49:00.496105" elapsed="0.000572"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:00.497207" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "D "a "t "a "_ "C "r "e "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-08-22T23:49:00.496827" 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-08-22T23:49:00.497567" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:00.497348" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-08-22T23:49:00.497329" elapsed="0.000336"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:49:00.497703" 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-08-22T23:49:00.500757" elapsed="0.000162"/>
</kw>
<msg time="2026-08-22T23:49:00.500981" 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-08-22T23:49:00.499570" elapsed="0.001548"/>
</kw>
<kw name="Open 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-08-22T23:49:00.501397" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:00.501752" 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-08-22T23:49:00.498907" elapsed="0.003040"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:49:00.498016" elapsed="0.003998"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:49:00.422975" elapsed="0.079138"/>
</kw>
<msg time="2026-08-22T23:49:00.502208" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:49:00.502253" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "D "a "t "a ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:49:00.422266" elapsed="0.080024"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:49:00.502475" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:49:00.502368" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:49:00.502349" 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-08-22T23:49:00.502990" 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-08-22T23:49:00.503412" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:49:00.503487" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:49:00.421605" elapsed="0.082015"/>
</kw>
<msg time="2026-08-22T23:49:00.503717" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:49:00.503762" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "D "a "t "a ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:49:00.416973" elapsed="0.086826"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:00.504127" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:00.503874" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-08-22T23:49:00.503857" elapsed="0.000349"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:49:00.416835" elapsed="0.087429"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:49:00.267202" elapsed="0.237096"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:49:00.264668" elapsed="0.239692"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:49:00.257546" elapsed="0.246874"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:49:00.256921" elapsed="0.247546"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:49:00.252158" elapsed="0.252366"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:00.506151" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:00.505754" elapsed="0.000425"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:00.513707" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:00.513439" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:00.514145" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:00.513903" 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-08-22T23:49:00.541268" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:00.541609" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:49:00.541848" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:49:00.516519" elapsed="0.025390"/>
</kw>
<status status="PASS" start="2026-08-22T23:49:00.514253" elapsed="0.027755"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:00.542425" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:00.542070" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-08-22T23:49:00.514235" elapsed="0.028425"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:00.549482" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:00.545009" elapsed="0.004522"/>
</kw>
<status status="PASS" start="2026-08-22T23:49:00.544481" elapsed="0.005086"/>
</branch>
<status status="PASS" start="2026-08-22T23:49:00.544439" elapsed="0.005168"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:00.552237" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:00.549888" elapsed="0.002395"/>
</kw>
<status status="PASS" start="2026-08-22T23:49:00.549665" elapsed="0.002653"/>
</branch>
<status status="PASS" start="2026-08-22T23:49:00.549648" elapsed="0.002694"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:49:00.552922" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:49:00.552512" 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-08-22T23:49:00.553303" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:00.553066" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:00.553863" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:00.553545" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-22T23:49:00.553386" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:49:00.553047" elapsed="0.000900"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:49:00.554463" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:49:00.554103" 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-08-22T23:49:00.554806" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:00.554559" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:00.555342" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:00.555046" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:49:00.554889" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-08-22T23:49:00.554542" 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-08-22T23:49:00.555572" elapsed="0.000363"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:49:00.556426" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:49:00.556099" 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-08-22T23:49:00.556629" elapsed="0.002311"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:49:00.543458" elapsed="0.015546"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:49:00.559181" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-08-22T23:49:00.559074" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-22T23:49:00.559055" 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-08-22T23:49:00.559416" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:00.559488" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:49:00.561844" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:49:00.509024" elapsed="0.052850"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:49:00.561935" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:49:00.562088" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:49:00.506392" elapsed="0.055723"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:49:00.562395" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-08-22T23:49:00.562185" elapsed="0.000595"/>
</branch>
<status status="PASS" start="2026-08-22T23:49:00.562169" elapsed="0.000637"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:00.563066" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:00.562863" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-08-22T23:49:00.562846" elapsed="0.000302"/>
</if>
<arg>${node1_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="PASS" start="2026-08-22T23:49:00.505331" elapsed="0.057864"/>
</kw>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${node1_session}</arg>
<arg>${empty_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:49:00.504728" elapsed="0.058518"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:00.564919" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:00.564401" elapsed="0.000546"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:00.572494" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:00.572170" elapsed="0.000374"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:00.572968" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:00.572716" 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-08-22T23:49:00.582621" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:00.582792" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:00.582940" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:00.575301" elapsed="0.008159">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:00.573080" elapsed="0.010523">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:00.583869" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:00.583653" elapsed="0.000307"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:00.573062" elapsed="0.010931">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:00.584523" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:00.584732" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:00.584680" elapsed="0.000111"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:00.584656" elapsed="0.000164"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:00.585015" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:00.585111" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:00.567795" elapsed="0.017461">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:00.585351" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:00.565200" elapsed="0.020279">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:00.585806" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:00.585606" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:00.585563" elapsed="0.000353"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:00.586181" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:00.585990" elapsed="0.000265"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:00.585969" elapsed="0.000317"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:00.563994" elapsed="0.022398">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:01.589683" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:01.588572" elapsed="0.001190"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:01.603615" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:01.603210" elapsed="0.000580"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:01.604374" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:01.604020" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:49:01.613931" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:01.614098" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:01.614220" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:01.606756" elapsed="0.007928">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:01.604541" elapsed="0.010288">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:01.615126" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:01.614882" elapsed="0.000341"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:01.604511" elapsed="0.010745">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:01.615867" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:01.616063" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:01.616007" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:01.615983" elapsed="0.000172"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:01.616355" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:01.616452" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:01.596906" elapsed="0.019713">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:01.616719" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:01.590340" elapsed="0.026508">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:01.617156" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:01.616957" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:01.616935" elapsed="0.000330"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:01.617848" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:01.617630" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:01.617572" elapsed="0.000395"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:01.587346" elapsed="0.030734">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:02.621129" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:02.620135" elapsed="0.001066"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:02.632477" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:02.632217" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:02.632943" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:02.632694" 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-08-22T23:49:02.642422" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:02.642596" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:02.642722" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:02.635153" elapsed="0.007953">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:02.633066" elapsed="0.010142">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:02.643404" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:02.643244" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:02.633042" elapsed="0.010453">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:02.643881" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:02.644018" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:02.643978" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:02.643960" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:02.644226" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:02.644297" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:02.627878" elapsed="0.016522">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:02.644471" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:02.621734" elapsed="0.022831">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:02.644864" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:02.644718" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:02.644700" elapsed="0.000244"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:02.645141" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:02.644999" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:02.644984" elapsed="0.000236"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:02.618991" elapsed="0.026308">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:03.648637" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:03.647480" elapsed="0.001235"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:03.660353" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:03.660089" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:03.660874" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:03.660557" 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-08-22T23:49:03.669947" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:03.670118" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:03.670239" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:03.663128" elapsed="0.007538">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:03.661003" elapsed="0.009784">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:03.670991" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:03.670830" elapsed="0.000231"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:03.660978" elapsed="0.010108">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:03.671475" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:03.671634" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:03.671574" elapsed="0.000107"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:03.671556" elapsed="0.000147"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:03.671864" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:03.671937" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:03.655450" elapsed="0.016596">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:03.672180" elapsed="0.000018"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:03.649235" elapsed="0.023047">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:03.672527" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:03.672373" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:03.672355" elapsed="0.000272"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:03.672844" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:03.672686" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:03.672669" elapsed="0.000259"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:03.646231" elapsed="0.026779">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:04.676322" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:04.675232" elapsed="0.001169"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:04.688072" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:04.687713" elapsed="0.000411"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:04.688541" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:04.688287" 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-08-22T23:49:04.697934" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:04.698107" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:04.698356" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:04.690816" elapsed="0.007972">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:04.688689" elapsed="0.010189">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:04.699074" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:04.698916" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:04.688663" elapsed="0.010502">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:04.699546" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:04.699704" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:04.699661" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:04.699644" elapsed="0.000129"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:04.699917" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:04.700054" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:04.683124" elapsed="0.017043">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:04.700239" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:04.676976" elapsed="0.023360">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:04.700562" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:04.700417" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:04.700400" elapsed="0.000259"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:04.700860" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:04.700715" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:04.700699" elapsed="0.000241"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:04.673971" elapsed="0.027050">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:05.704799" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:05.703757" elapsed="0.001124"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:05.721848" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:05.721384" elapsed="0.000540"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:05.722516" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:05.722157" elapsed="0.000444"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:49:05.732691" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:05.732927" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:05.733095" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:05.725643" elapsed="0.008080">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:05.722708" elapsed="0.011144">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:05.734131" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:05.733903" elapsed="0.000326"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:05.722678" elapsed="0.011587">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:05.734835" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:05.735174" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:05.735099" elapsed="0.000177"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:05.735071" 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-08-22T23:49:05.735558" elapsed="0.000062"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:05.735698" elapsed="0.000025"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:05.712434" elapsed="0.023427">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:05.735965" elapsed="0.000024"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:05.705380" elapsed="0.030728">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:05.736436" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:05.736225" elapsed="0.000293"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:05.736201" elapsed="0.000352"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:05.736861" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:05.736655" elapsed="0.000287"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:05.736631" elapsed="0.000346"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:05.702449" elapsed="0.034641">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:06.740160" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:06.739178" elapsed="0.001054"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:06.755296" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:06.754688" elapsed="0.000722"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:06.756331" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:06.755781" 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-08-22T23:49:06.770533" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:06.770713" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:06.770846" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:06.761368" elapsed="0.009890">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:06.756619" elapsed="0.014723">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:06.771546" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:06.771385" elapsed="0.000246"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:06.756545" elapsed="0.015188">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:06.772147" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:06.772292" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:06.772248" elapsed="0.000094"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:06.772230" elapsed="0.000134"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:06.772510" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:06.772605" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:06.747012" elapsed="0.025703">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:06.772797" elapsed="0.000018"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:06.740757" elapsed="0.032140">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:06.773129" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:06.772983" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:06.772963" elapsed="0.000278"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:06.773443" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:06.773300" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:06.773283" elapsed="0.000249"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:06.738082" elapsed="0.035548">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:07.776815" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:07.775715" elapsed="0.001175"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:07.789768" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:07.789474" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:07.790223" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:07.789975" 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-08-22T23:49:07.800417" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:07.800651" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:07.800831" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:07.792444" elapsed="0.008923">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:07.790346" elapsed="0.011134">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:07.801868" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:07.801643" elapsed="0.000320"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:07.790322" elapsed="0.011676">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:07.802524" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:07.802739" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:07.802683" elapsed="0.000123"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:07.802658" elapsed="0.000178"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:07.803036" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:07.803136" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:07.783028" elapsed="0.020255">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:07.803382" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:07.777389" elapsed="0.026130">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:07.803855" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:07.803655" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:07.803631" elapsed="0.000335"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:07.804236" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:07.804042" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:07.804020" elapsed="0.000325"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:07.774504" elapsed="0.029949">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:08.807525" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:08.806528" elapsed="0.001100"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:08.820558" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:08.820098" elapsed="0.000552"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:08.821179" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:08.820898" 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-08-22T23:49:08.832678" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:08.832854" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:08.833035" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:08.823407" elapsed="0.010243">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:08.821302" elapsed="0.012463">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:08.834031" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:08.833814" elapsed="0.000310"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:08.821278" elapsed="0.012879">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:08.834701" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:08.834896" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:08.834841" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:08.834816" elapsed="0.000172"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:08.835189" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:08.835289" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:08.813516" elapsed="0.021918">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:08.835532" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:08.808158" elapsed="0.027525">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:08.835997" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:08.835796" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:08.835773" elapsed="0.000337"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:08.836403" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:08.836205" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:08.836163" elapsed="0.000351"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:08.805360" elapsed="0.031280">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:09.839383" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:09.838412" elapsed="0.001042"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:09.854541" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:09.854282" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:09.855015" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:09.854761" 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-08-22T23:49:09.864385" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:09.864543" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:09.864750" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:09.857251" elapsed="0.007881">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:09.855136" elapsed="0.010079">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:09.865422" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:09.865262" elapsed="0.000228"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:09.855113" elapsed="0.010402">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:09.865924" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:09.866063" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:09.866023" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:09.866006" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:09.866272" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:09.866345" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:09.845905" elapsed="0.020546">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:09.866523" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:09.840051" elapsed="0.026585">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:09.866863" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:09.866717" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:09.866700" elapsed="0.000248"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:09.867140" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:09.867001" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:09.866986" elapsed="0.000236"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:09.837378" elapsed="0.029921">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:10.870135" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:10.869159" elapsed="0.001048"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:10.882530" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:10.881952" elapsed="0.000717"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:10.883616" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:10.883012" elapsed="0.000709"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:49:10.895135" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:10.895338" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:10.895519" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:10.888218" elapsed="0.007718">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:10.883881" elapsed="0.012170">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:10.896312" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:10.896099" elapsed="0.000305"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:10.883835" elapsed="0.012602">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:10.896978" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:10.897171" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:10.897115" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:10.897091" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:10.897463" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:10.897563" elapsed="0.000040"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:10.874754" elapsed="0.022976">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:10.897827" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:10.870726" elapsed="0.027236">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:10.898275" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:10.898072" elapsed="0.000283"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:10.898050" elapsed="0.000338"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:10.898680" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:10.898463" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:10.898441" elapsed="0.000353"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:10.868095" elapsed="0.030806">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:11.901815" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:11.900821" elapsed="0.001066"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:11.913618" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:11.913236" elapsed="0.000453"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:11.914250" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:11.913903" 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-08-22T23:49:11.924688" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:11.924890" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:11.925117" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:11.916984" elapsed="0.008730">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:11.914417" elapsed="0.011412">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:11.926094" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:11.925879" elapsed="0.000309"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:11.914387" elapsed="0.011834">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:11.926789" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:11.926982" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:11.926927" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:11.926903" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:11.927273" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:11.927373" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:11.906563" elapsed="0.020955">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:11.927639" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:11.902420" elapsed="0.025354">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:11.928087" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:11.927887" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:11.927863" elapsed="0.000337"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:11.928468" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:11.928274" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:11.928253" elapsed="0.000343"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:11.899755" elapsed="0.028952">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:12.931967" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:12.930908" elapsed="0.001137"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:12.944120" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:12.943748" elapsed="0.000441"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:12.944779" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:12.944405" elapsed="0.000438"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:49:12.954896" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:12.955153" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:12.955421" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:12.947699" elapsed="0.008302">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:12.944955" elapsed="0.011168">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:12.956394" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:12.956175" elapsed="0.000315"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:12.944920" elapsed="0.011605">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:12.957083" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:12.957281" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:12.957223" elapsed="0.000122"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:12.957198" elapsed="0.000178"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:12.957595" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:12.957698" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:12.937172" elapsed="0.020677">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:12.957949" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:12.932556" elapsed="0.025525">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:12.958425" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:12.958221" elapsed="0.000284"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:12.958197" elapsed="0.000342"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:12.958831" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:12.958635" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:12.958612" elapsed="0.000331"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:12.929656" elapsed="0.029395">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:13.961124" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:13.960476" elapsed="0.000697"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:13.972072" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:13.971658" elapsed="0.000520"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:13.972917" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:13.972395" elapsed="0.000605"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:49:13.981343" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:13.981528" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:13.981786" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:13.975497" elapsed="0.006833">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:13.973126" elapsed="0.009324">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:13.982743" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:13.982500" elapsed="0.000336"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:13.973094" elapsed="0.009775">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:13.983401" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:13.983614" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:13.983538" elapsed="0.000142"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:13.983514" 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-08-22T23:49:13.983906" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:13.984013" elapsed="0.000028"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:13.965113" elapsed="0.019059">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:13.984269" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:13.961492" elapsed="0.022907">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:13.984726" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:13.984507" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:13.984484" elapsed="0.000354"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:13.985103" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:13.984911" elapsed="0.000268"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:13.984890" elapsed="0.000321"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:13.959748" elapsed="0.025570">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:14.989256" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:14.988140" elapsed="0.001219"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:15.000349" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:14.999972" elapsed="0.000448"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:15.001010" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:15.000656" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:49:15.011037" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:15.011453" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:15.011997" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:15.003590" elapsed="0.009548">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:15.001210" elapsed="0.012235">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:15.014134" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:15.013562" elapsed="0.000678"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:15.001149" elapsed="0.013127">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:15.014890" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:15.015134" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:15.015065" elapsed="0.000141"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:15.015032" 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-08-22T23:49:15.015439" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:15.015537" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:14.993507" elapsed="0.022233">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:15.015841" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:14.989910" elapsed="0.026062">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:15.016284" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:15.016080" elapsed="0.000282"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:15.016057" elapsed="0.000337"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:15.016681" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:15.016467" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:15.016446" elapsed="0.000347"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:14.986832" elapsed="0.030069">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:16.019988" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:16.018962" elapsed="0.001103"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:16.032815" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:16.032518" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:16.033267" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:16.033018" 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-08-22T23:49:16.042219" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:16.042397" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:16.042612" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:16.035486" elapsed="0.007575">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:16.033391" elapsed="0.009758">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:16.043358" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:16.043186" elapsed="0.000239"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:16.033367" elapsed="0.010083">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:16.043868" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:16.044008" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:16.043968" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:16.043950" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:16.044217" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:16.044294" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:16.026353" elapsed="0.018066">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:16.044489" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:16.020557" elapsed="0.024043">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:16.044864" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:16.044699" elapsed="0.000237"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:16.044664" elapsed="0.000297"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:16.045157" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:16.045015" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:16.045000" elapsed="0.000236"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:16.017832" elapsed="0.027481">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:17.048467" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:17.047394" elapsed="0.001147"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:17.060939" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:17.060675" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:17.061385" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:17.061140" 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-08-22T23:49:17.070112" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:17.070270" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:17.070472" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:17.063650" elapsed="0.007232">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:17.061505" elapsed="0.009461">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:17.071159" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:17.071003" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:17.061482" elapsed="0.009769">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:17.071649" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:17.071789" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:17.071748" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:17.071731" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:17.072001" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:17.072074" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:17.054745" elapsed="0.017458">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:17.072276" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:17.049075" elapsed="0.023301">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:17.072614" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:17.072455" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:17.072439" elapsed="0.000257"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:17.072891" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:17.072751" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:17.072735" elapsed="0.000237"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:17.046272" elapsed="0.026778">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:18.076071" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:18.075015" elapsed="0.001129"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:18.089142" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:18.088881" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:18.089602" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:18.089342" 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-08-22T23:49:18.098867" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:18.099027" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:18.099384" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:18.091846" elapsed="0.007955">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:18.089727" elapsed="0.010157">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:18.100075" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:18.099920" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:18.089704" elapsed="0.010462">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:18.100547" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:18.100702" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:18.100662" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:18.100644" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:18.100911" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:18.100983" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:18.082179" elapsed="0.018910">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:18.101160" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:18.076673" elapsed="0.024582">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:18.101477" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:18.101333" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:18.101317" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:18.101767" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:18.101627" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:18.101611" elapsed="0.000236"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:18.073922" elapsed="0.028003">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:19.105020" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:19.104035" elapsed="0.001058"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:19.120201" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:19.119934" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:19.120670" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:19.120405" 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-08-22T23:49:19.129483" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:19.129660" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:19.129847" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:19.122879" elapsed="0.007355">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:19.120790" elapsed="0.009525">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:19.130522" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:19.130349" elapsed="0.000277"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:19.120768" elapsed="0.009883">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:19.131027" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:19.131168" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:19.131129" elapsed="0.000100"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:19.131111" elapsed="0.000139"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:19.131393" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:19.131463" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:19.111110" elapsed="0.020456">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:19.131651" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:19.105613" elapsed="0.026131">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:19.131960" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:19.131820" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:19.131804" elapsed="0.000235"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:19.132226" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:19.132090" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:19.132075" elapsed="0.000229"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:19.102837" elapsed="0.029542">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:20.135257" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:20.134202" elapsed="0.001126"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:20.147262" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:20.146993" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:20.147764" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:20.147496" 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-08-22T23:49:20.157090" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:20.157248" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:20.157415" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:20.150284" elapsed="0.007534">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:20.147884" elapsed="0.010016">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:20.158092" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:20.157935" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:20.147863" elapsed="0.010319">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:20.158554" elapsed="0.000060"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:20.158747" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:20.158707" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:20.158671" elapsed="0.000143"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:20.158966" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:20.159038" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:20.141641" elapsed="0.017501">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:20.159213" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:20.135852" elapsed="0.023454">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:20.159528" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:20.159384" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:20.159367" elapsed="0.000270"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:20.159833" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:20.159692" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:20.159676" elapsed="0.000236"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:20.133164" elapsed="0.026825">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:21.163869" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:21.162771" elapsed="0.001179"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:21.175159" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:21.174887" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:21.175632" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:21.175362" 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-08-22T23:49:21.185082" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:21.185260" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:21.185484" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:21.178193" elapsed="0.007733">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:21.175762" elapsed="0.010252">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:21.186277" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:21.186052" elapsed="0.000329"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:21.175737" elapsed="0.010678">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:21.186963" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:21.187157" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:21.187102" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:21.187077" 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-08-22T23:49:21.187452" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:21.187552" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:21.170334" elapsed="0.017390">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:21.187823" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:21.164488" elapsed="0.023466">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:21.188265" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:21.188065" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:21.188042" elapsed="0.000338"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:21.188673" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:21.188455" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:21.188433" elapsed="0.000354"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:21.161217" elapsed="0.027678">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:22.191914" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:22.190921" elapsed="0.001071"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:22.202992" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:22.202733" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:22.203458" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:22.203193" 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-08-22T23:49:22.212325" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:22.212478" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:22.212679" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:22.206001" elapsed="0.007063">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:22.203598" elapsed="0.009584">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:22.213374" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:22.213218" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:22.203560" elapsed="0.009904">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:22.213854" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:22.213990" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:22.213950" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:22.213934" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:22.214274" elapsed="0.000037"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:22.214386" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:22.198236" elapsed="0.016295">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:22.214652" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:22.192488" elapsed="0.022296">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:22.215092" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:22.214893" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:22.214870" elapsed="0.000333"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:22.215469" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:22.215276" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:22.215255" elapsed="0.000329"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:22.189813" elapsed="0.025898">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:23.218783" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:23.217804" elapsed="0.001052"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:23.231434" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:23.231040" elapsed="0.000465"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:23.232094" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:23.231742" 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-08-22T23:49:23.241045" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:23.241227" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:23.241454" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:23.234544" elapsed="0.007455">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:23.232261" elapsed="0.009854">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:23.242430" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:23.242174" elapsed="0.000350"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:23.232238" elapsed="0.010320">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:23.243104" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:23.243296" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:23.243241" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:23.243217" elapsed="0.000199"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:23.243642" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:23.243745" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:23.224802" elapsed="0.019089">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:23.243991" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:23.219383" elapsed="0.024753">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:23.244484" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:23.244272" elapsed="0.000292"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:23.244244" elapsed="0.000377"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:23.244894" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:23.244699" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:23.244677" elapsed="0.000329"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:23.216662" elapsed="0.028451">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:24.248057" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:24.247062" elapsed="0.001092"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:24.260756" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:24.260348" elapsed="0.000477"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:24.261388" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:24.261037" 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-08-22T23:49:24.270921" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:24.271085" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:24.271307" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:24.263796" elapsed="0.008048">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:24.261512" elapsed="0.010448">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:24.272250" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:24.272010" elapsed="0.000385"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:24.261489" elapsed="0.010944">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:24.272976" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:24.273169" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:24.273114" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:24.273090" elapsed="0.000172"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:24.273461" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:24.273561" elapsed="0.000044"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:24.254066" elapsed="0.019666">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:24.273832" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:24.248741" elapsed="0.025222">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:24.274273" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:24.274073" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:24.274050" elapsed="0.000336"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:24.274681" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:24.274461" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:24.274439" elapsed="0.000356"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:24.245957" elapsed="0.028945">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:25.277871" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:25.276838" elapsed="0.001106"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:25.289067" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:25.288807" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:25.289515" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:25.289269" 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-08-22T23:49:25.298998" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:25.299157" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:25.299388" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:25.291971" elapsed="0.007949">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:25.289656" elapsed="0.010401">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:25.300326" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:25.300106" elapsed="0.000312"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:25.289634" elapsed="0.010817">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:25.300991" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:25.301180" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:25.301128" elapsed="0.000114"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:25.301103" elapsed="0.000169"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:25.301471" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:25.301570" elapsed="0.000043"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:25.282737" elapsed="0.019002">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:25.301837" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:25.278433" elapsed="0.023534">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:25.302277" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:25.302077" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:25.302054" elapsed="0.000334"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:25.302679" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:25.302462" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:25.302441" elapsed="0.000350"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:25.275759" elapsed="0.027138">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:26.305087" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:26.304415" elapsed="0.000722"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:26.315637" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:26.315351" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:26.316086" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:26.315840" 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-08-22T23:49:26.325369" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:26.325612" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:26.325852" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:26.318495" elapsed="0.007880">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:26.316212" elapsed="0.010279">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:26.326808" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:26.326541" elapsed="0.000361"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:26.316188" elapsed="0.010748">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:26.327459" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:26.327677" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:26.327618" elapsed="0.000122"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:26.327572" elapsed="0.000198"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:26.327971" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:26.328069" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:26.309061" elapsed="0.019153">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:26.328310" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:26.305456" elapsed="0.022983">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:26.328768" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:26.328547" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:26.328525" elapsed="0.000354"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:26.329147" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:26.328955" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:26.328933" elapsed="0.000328"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:26.303655" elapsed="0.025714">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:27.332194" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:27.331222" elapsed="0.001087"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:27.344829" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:27.344555" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:27.345276" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:27.345030" 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-08-22T23:49:27.353875" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:27.354027" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:27.354197" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:27.347655" elapsed="0.006918">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:27.345398" elapsed="0.009277">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:27.354867" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:27.354712" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:27.345376" elapsed="0.009584">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:27.355339" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:27.355480" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:27.355440" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:27.355422" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:27.355708" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:27.355781" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:27.338765" elapsed="0.017123">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:27.355961" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:27.332835" elapsed="0.023222">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:27.356282" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:27.356137" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:27.356121" elapsed="0.000530"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:27.356922" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:27.356740" elapsed="0.000241"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:27.356719" elapsed="0.000285"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:27.330176" elapsed="0.026923">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:28.360139" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:28.359127" elapsed="0.001085"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:28.371554" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:28.371285" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:28.372020" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:28.371773" 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-08-22T23:49:28.380893" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:28.381064" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:28.381255" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:28.374475" elapsed="0.007221">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:28.372147" elapsed="0.009634">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:28.381975" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:28.381817" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:28.372122" elapsed="0.009946">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:28.382453" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:28.382612" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:28.382552" elapsed="0.000107"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:28.382535" elapsed="0.000146"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:28.382824" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:28.382896" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:28.365055" elapsed="0.017948">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:28.383073" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:28.360732" elapsed="0.022435">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:28.383388" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:28.383246" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:28.383229" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:28.383678" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:28.383522" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:28.383507" elapsed="0.000252"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:28.358021" elapsed="0.025816">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:29.386856" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:29.385853" elapsed="0.001078"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:29.398408" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:29.398095" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:29.398870" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:29.398623" 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-08-22T23:49:29.407971" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:29.408228" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:29.408503" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:29.401358" elapsed="0.007684">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:29.399064" elapsed="0.010093">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:29.409426" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:29.409207" elapsed="0.000312"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:29.399040" elapsed="0.010558">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:29.410131" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:29.410326" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:29.410267" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:29.410241" elapsed="0.000175"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:29.410639" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:29.410740" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:29.392012" elapsed="0.018876">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:29.410986" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:29.387422" elapsed="0.023698">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:29.411434" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:29.411231" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:29.411208" elapsed="0.000338"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:29.411844" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:29.411645" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:29.411622" elapsed="0.000333"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:29.384721" elapsed="0.027343">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:30.414687" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:30.413767" elapsed="0.000986"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:30.426429" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:30.426041" elapsed="0.000455"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:30.426917" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:30.426671" 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-08-22T23:49:30.435239" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:30.435391" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:30.435630" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:30.429101" elapsed="0.007003">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:30.427038" elapsed="0.009177">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:30.436483" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:30.436262" elapsed="0.000314"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:30.427012" elapsed="0.009622">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:30.437146" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:30.437351" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:30.437299" elapsed="0.000109"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:30.437274" elapsed="0.000164"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:30.437654" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:30.437754" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:30.419782" elapsed="0.018116">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:30.437994" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:30.415225" elapsed="0.022899">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:30.438434" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:30.438233" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:30.438210" elapsed="0.000334"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:30.438834" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:30.438641" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:30.438618" elapsed="0.000325"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:30.412792" elapsed="0.026258">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:31.441958" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:31.440955" elapsed="0.001073"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:31.455267" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:31.455006" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:31.455743" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:31.455476" 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-08-22T23:49:31.464854" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:31.465011" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:31.465182" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:31.457978" elapsed="0.007577">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:31.455863" elapsed="0.009792">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:31.465848" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:31.465692" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:31.455841" elapsed="0.010099">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:31.466312" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:31.466451" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:31.466411" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:31.466394" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:31.466674" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:31.466747" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:31.447057" elapsed="0.019796">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:31.466924" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:31.442520" elapsed="0.024499">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:31.467242" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:31.467098" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:31.467081" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:31.467514" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:31.467376" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:31.467360" elapsed="0.000252"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:31.439857" elapsed="0.027833">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:32.470686" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:32.469694" elapsed="0.001069"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:32.483332" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:32.483068" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:32.483820" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:32.483534" 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-08-22T23:49:32.493005" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:32.493178" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:32.493372" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:32.486269" elapsed="0.007523">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:32.483948" elapsed="0.009926">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:32.494075" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:32.493910" elapsed="0.000233"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:32.483924" elapsed="0.010244">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:32.494547" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:32.494702" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:32.494662" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:32.494644" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:32.494910" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:32.495012" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:32.477165" elapsed="0.017954">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:32.495188" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:32.471289" elapsed="0.023992">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:32.495600" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:32.495381" elapsed="0.000307"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:32.495354" elapsed="0.000367"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:32.495988" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:32.495795" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:32.495774" elapsed="0.000322"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:32.468553" elapsed="0.027649">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:33.499264" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:33.498281" elapsed="0.001055"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:33.510315" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:33.510050" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:33.510825" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:33.510555" 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-08-22T23:49:33.519826" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:33.519993" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:33.520173" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:33.513275" elapsed="0.007295">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:33.510953" elapsed="0.009720">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:33.520869" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:33.520709" elapsed="0.000228"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:33.510930" elapsed="0.010032">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:33.521418" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:33.521558" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:33.521517" elapsed="0.000104"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:33.521500" elapsed="0.000142"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:33.521787" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:33.521859" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:33.505480" elapsed="0.016484">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:33.522034" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:33.499860" elapsed="0.022277">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:33.522380" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:33.522231" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:33.522210" elapsed="0.000277"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:33.522781" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:33.522563" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:33.522541" elapsed="0.000350"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:33.497114" elapsed="0.025886">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:34.526152" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:34.525094" elapsed="0.001134"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:34.537032" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:34.536755" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:34.537499" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:34.537238" 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-08-22T23:49:34.546436" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:34.546690" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:34.546930" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:34.540003" elapsed="0.007506">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:34.537652" elapsed="0.010001">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:34.547929" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:34.547705" elapsed="0.000320"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:34.537627" elapsed="0.010433">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:34.548643" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:34.548847" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:34.548788" elapsed="0.000121"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:34.548763" elapsed="0.000178"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:34.549147" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:34.549252" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:34.530841" elapsed="0.018564">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:34.549518" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:34.526801" elapsed="0.022878">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:34.550000" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:34.549796" elapsed="0.000286"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:34.549772" elapsed="0.000344"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:34.550391" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:34.550193" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:34.550171" elapsed="0.000366"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:34.523937" elapsed="0.026736">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:35.554395" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:35.553206" elapsed="0.001277"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:35.565870" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:35.565605" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:35.566324" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:35.566074" 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-08-22T23:49:35.575147" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:35.575306" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:35.575487" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:35.568801" elapsed="0.007111">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:35.566453" elapsed="0.009544">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:35.576191" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:35.576034" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:35.566428" elapsed="0.009857">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:35.576714" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:35.576861" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:35.576820" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:35.576801" elapsed="0.000128"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:35.577076" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:35.577149" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:35.560850" elapsed="0.016404">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:35.577326" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:35.555052" elapsed="0.022377">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:35.577792" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:35.577545" elapsed="0.000328"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:35.577516" elapsed="0.000392"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:35.578182" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:35.577986" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:35.577964" elapsed="0.000332"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:35.551551" elapsed="0.026854">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:36.581363" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:36.580383" elapsed="0.001053"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:36.594056" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:36.593777" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:36.594511" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:36.594262" 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-08-22T23:49:36.604020" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:36.604177" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:36.604357" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:36.597042" elapsed="0.007732">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:36.594655" elapsed="0.010203">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:36.605048" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:36.604893" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:36.594632" elapsed="0.010507">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:36.605518" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:36.605672" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:36.605632" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:36.605614" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:36.605881" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:36.605951" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:36.587555" elapsed="0.018534">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:36.606162" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:36.581962" elapsed="0.024294">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:36.606481" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:36.606335" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:36.606319" elapsed="0.000293"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:36.606890" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:36.606696" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:36.606674" elapsed="0.000326"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:36.579277" elapsed="0.027830">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:37.609379" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:37.608713" elapsed="0.000719"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:37.617332" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:37.617065" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:37.617805" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:37.617536" 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-08-22T23:49:37.626537" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:37.626723" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:37.626916" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:37.620275" elapsed="0.007064">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:37.617937" elapsed="0.009487">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:37.627689" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:37.627462" elapsed="0.000327"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:37.617910" elapsed="0.009915">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:37.628377" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:37.628598" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:37.628522" elapsed="0.000144"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:37.628496" elapsed="0.000202"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:37.628909" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:37.629013" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:37.612685" elapsed="0.016482">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:37.629271" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:37.609779" elapsed="0.019630">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:37.629757" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:37.629524" elapsed="0.000317"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:37.629500" elapsed="0.000377"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:37.630165" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:37.629958" elapsed="0.000289"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:37.629934" elapsed="0.000347"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:37.607905" elapsed="0.022492">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:38.633413" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:38.632431" elapsed="0.001055"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:38.645891" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:38.645632" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:38.646334" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:38.646090" 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-08-22T23:49:38.655447" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:38.655687" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:38.655929" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:38.648766" elapsed="0.007702">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:38.646456" elapsed="0.010150">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:38.656876" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:38.656657" elapsed="0.000313"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:38.646433" elapsed="0.010570">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:38.657526" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:38.657741" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:38.657685" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:38.657661" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:38.658033" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:38.658132" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:38.639527" elapsed="0.018749">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:38.658374" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:38.634010" elapsed="0.024495">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:38.658838" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:38.658636" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:38.658612" elapsed="0.000337"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:38.659219" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:38.659024" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:38.659003" elapsed="0.000327"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:38.631297" elapsed="0.028139">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:39.662740" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:39.661611" elapsed="0.001205"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:39.674378" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:39.674112" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:39.674910" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:39.674642" 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-08-22T23:49:39.684284" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:39.684493" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:39.684791" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:39.677462" elapsed="0.007933">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:39.675040" elapsed="0.010473">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:39.685811" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:39.685562" elapsed="0.000344"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:39.675016" elapsed="0.010923">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:39.686503" elapsed="0.000055"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:39.686764" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:39.686706" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:39.686678" elapsed="0.000178"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:39.687061" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:39.687161" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:39.667920" elapsed="0.019390">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:39.687409" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:39.663332" elapsed="0.024212">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:39.687902" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:39.687681" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:39.687656" elapsed="0.000362"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:39.688290" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:39.688094" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:39.688072" elapsed="0.000328"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:39.660334" elapsed="0.028174">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:40.691535" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:40.690545" elapsed="0.001094"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:40.702762" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:40.702376" elapsed="0.000454"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:40.703410" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:40.703041" elapsed="0.000437"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:49:40.713410" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:40.713572" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:40.713782" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:40.706692" elapsed="0.007607">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:40.703600" elapsed="0.010813">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:40.714702" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:40.714462" elapsed="0.000333"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:40.703552" elapsed="0.011278">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:40.715359" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:40.715548" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:40.715495" elapsed="0.000135"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:40.715471" elapsed="0.000190"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:40.715861" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:40.715960" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:40.696294" elapsed="0.019809">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:40.716200" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:40.692136" elapsed="0.024196">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:40.716660" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:40.716442" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:40.716419" elapsed="0.000354"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:40.717041" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:40.716848" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:40.716826" elapsed="0.000325"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:40.689417" elapsed="0.027856">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:41.720524" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:41.719473" elapsed="0.001158"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:41.731860" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:41.731472" elapsed="0.000455"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:41.732478" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:41.732138" 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-08-22T23:49:41.742492" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:41.742751" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:41.743057" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:41.735591" elapsed="0.008034">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:41.732681" elapsed="0.011066">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:41.744017" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:41.743798" elapsed="0.000310"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:41.732644" elapsed="0.011499">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:41.744694" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:41.744888" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:41.744831" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:41.744807" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:41.745178" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:41.745276" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:41.725382" elapsed="0.020042">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:41.745519" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:41.721180" elapsed="0.024513">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:41.746002" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:41.745805" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:41.745782" elapsed="0.000329"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:41.746378" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:41.746186" elapsed="0.000268"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:41.746164" elapsed="0.000321"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:41.718276" elapsed="0.028335">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:42.749750" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:42.748742" elapsed="0.001084"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:42.762679" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:42.762396" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:42.763127" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:42.762880" 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-08-22T23:49:42.772656" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:42.772821" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:42.773014" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:42.765335" elapsed="0.008072">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:42.763251" elapsed="0.010239">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:42.773700" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:42.773527" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:42.763225" elapsed="0.010568">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:42.774228" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:42.774372" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:42.774330" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:42.774312" elapsed="0.000130"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:42.774607" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:42.774710" elapsed="0.000027"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:42.756017" elapsed="0.018866">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:42.774983" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:42.750382" elapsed="0.024734">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:42.775426" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:42.775226" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:42.775203" elapsed="0.000335"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:42.775831" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:42.775634" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:42.775611" elapsed="0.000331"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:42.747517" elapsed="0.028534">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:43.779663" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:43.778501" elapsed="0.001246"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:43.795641" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:43.795243" elapsed="0.000468"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:43.796283" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:43.795934" 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-08-22T23:49:43.805827" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:43.806002" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:43.806235" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:43.799216" elapsed="0.007455">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:43.796457" elapsed="0.010303">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:43.806957" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:43.806799" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:43.796420" elapsed="0.010626">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:43.807552" elapsed="0.000057"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:43.807771" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:43.807714" elapsed="0.000122"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:43.807689" elapsed="0.000176"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:43.808064" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:43.808160" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:43.786064" elapsed="0.022244">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:43.808402" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:43.780271" elapsed="0.028260">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:43.808872" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:43.808665" elapsed="0.000284"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:43.808640" elapsed="0.000342"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:43.809245" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:43.809054" elapsed="0.000267"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:43.809033" elapsed="0.000320"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:43.777021" elapsed="0.032445">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:44.812218" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:44.811252" elapsed="0.001034"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:44.823464" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:44.823207" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:44.823925" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:44.823679" 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-08-22T23:49:44.833029" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:44.833180" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:44.833338" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:44.826306" elapsed="0.007474">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:44.824045" elapsed="0.009849">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:44.834158" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:44.833943" elapsed="0.000305"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:44.824022" elapsed="0.010281">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:44.834848" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:44.835037" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:44.834984" elapsed="0.000113"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:44.834960" elapsed="0.000166"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:44.835322" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:44.835417" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:44.817012" elapsed="0.018548">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:44.835683" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:44.812800" elapsed="0.023014">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:44.836120" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:44.835921" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:44.835899" elapsed="0.000330"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:44.836498" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:44.836303" elapsed="0.000290"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:44.836282" elapsed="0.000345"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:44.810201" elapsed="0.026540">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:45.839748" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:45.838764" elapsed="0.001060"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:45.851452" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:45.851157" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:45.851974" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:45.851690" 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-08-22T23:49:45.861416" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:45.861627" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:45.861872" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:45.854469" elapsed="0.007986">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:45.852119" elapsed="0.010489">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:45.862920" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:45.862675" elapsed="0.000343"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:45.852089" elapsed="0.010964">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:45.863665" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:45.863872" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:45.863814" elapsed="0.000124"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:45.863788" elapsed="0.000181"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:45.864181" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:45.864285" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:45.844760" elapsed="0.019683">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:45.864552" elapsed="0.000051"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:45.840313" elapsed="0.024441">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:45.865074" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:45.864870" elapsed="0.000283"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:45.864847" elapsed="0.000338"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:45.865456" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:45.865260" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:45.865239" elapsed="0.000326"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:45.837633" elapsed="0.028063">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:46.868794" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:46.867740" elapsed="0.001130"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:46.879786" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:46.879497" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:46.880240" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:46.879992" 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-08-22T23:49:46.889080" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:46.889242" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:46.889424" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:46.882680" elapsed="0.007202">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:46.880367" elapsed="0.009632">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:46.890286" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:46.890047" elapsed="0.000335"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:46.880344" elapsed="0.010072">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:46.890966" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:46.891171" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:46.891115" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:46.891091" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:46.891466" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:46.891567" elapsed="0.000041"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:46.873493" elapsed="0.018242">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:46.891836" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:46.869401" elapsed="0.022568">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:46.892279" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:46.892079" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:46.892057" elapsed="0.000336"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:46.892686" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:46.892469" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:46.892447" elapsed="0.000359"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:46.866630" elapsed="0.026284">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:47.896096" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:47.895062" elapsed="0.001113"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:47.909643" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:47.909367" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:47.910097" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:47.909846" 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-08-22T23:49:47.919512" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:47.919901" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:47.920278" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:47.912508" elapsed="0.008591">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:47.910236" elapsed="0.011044">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:47.921733" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:47.921357" elapsed="0.000525"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:47.910212" elapsed="0.011722">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:47.922880" elapsed="0.000065"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:47.923210" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:47.923124" elapsed="0.000183"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:47.923085" 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-08-22T23:49:47.923704" elapsed="0.000042"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:47.923820" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:47.902488" elapsed="0.021487">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:47.924077" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:47.896706" elapsed="0.027508">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:47.924537" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:47.924328" elapsed="0.000312"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:47.924304" elapsed="0.000372"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:47.924957" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:47.924754" elapsed="0.000283"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:47.924732" elapsed="0.000339"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:47.893854" elapsed="0.031330">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:48.928249" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:48.927236" elapsed="0.001086"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:48.939525" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:48.939263" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:48.939992" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:48.939743" 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-08-22T23:49:48.948611" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:48.948782" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:48.948964" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:48.942421" elapsed="0.006933">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:48.940118" elapsed="0.009319">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:48.949643" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:48.949472" elapsed="0.000239"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:48.940095" elapsed="0.009641">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:48.950129" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:48.950268" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:48.950229" elapsed="0.000091"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:48.950211" elapsed="0.000130"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:48.950485" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:48.950556" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:48.934560" elapsed="0.016116">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:48.950747" elapsed="0.000018"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:48.928848" elapsed="0.021996">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:48.951067" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:48.950923" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:48.950906" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:48.951345" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:48.951200" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:48.951184" elapsed="0.000239"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:48.926130" elapsed="0.025369">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:49.954608" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:49.953534" elapsed="0.001151"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:49.971547" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:49.970963" elapsed="0.000723"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:49.972610" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:49.972030" elapsed="0.000688"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:49:49.982960" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:49.983172" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:49.983417" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:49.976307" elapsed="0.007670">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:49.972878" elapsed="0.011220">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:49.984432" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:49.984151" elapsed="0.000383"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:49.972832" elapsed="0.011738">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:49.985143" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:49.985344" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:49.985286" elapsed="0.000122"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:49.985260" elapsed="0.000181"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:49.985671" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:49.985776" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:49.960804" elapsed="0.025146">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:49.986052" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:49.955179" elapsed="0.031010">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:49.986513" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:49.986303" elapsed="0.000320"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:49.986280" elapsed="0.000380"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:49.986946" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:49.986740" elapsed="0.000288"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:49.986717" elapsed="0.000345"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:49.952406" elapsed="0.034769">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:50.990097" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:50.989086" elapsed="0.001082"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:51.002235" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:51.001879" elapsed="0.000422"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:51.002876" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:51.002509" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:49:51.012126" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:51.012286" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:51.012465" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:51.006121" elapsed="0.006750">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:51.003046" elapsed="0.009909">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:51.013147" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:51.012991" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:51.003015" elapsed="0.010225">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:51.013669" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:51.013811" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:51.013770" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:51.013752" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:51.014021" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:51.014092" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:50.995800" elapsed="0.018395">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:51.014263" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:50.990691" elapsed="0.023664">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:51.014601" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:51.014433" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:51.014416" elapsed="0.000267"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:51.014915" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:51.014736" elapsed="0.000256"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:51.014721" elapsed="0.000303"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:50.988000" elapsed="0.027130">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:52.018285" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:52.017193" elapsed="0.001165"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:52.032184" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:52.031922" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:52.032648" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:52.032384" 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-08-22T23:49:52.041561" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:52.041806" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:52.042050" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:52.035106" elapsed="0.007508">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:52.032776" elapsed="0.009960">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:52.043007" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:52.042786" elapsed="0.000315"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:52.032752" elapsed="0.010383">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:52.043675" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:52.043869" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:52.043813" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:52.043788" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:52.044159" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:52.044258" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:52.024446" elapsed="0.019958">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:52.044500" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:52.018887" elapsed="0.025768">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:52.044969" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:52.044769" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:52.044745" elapsed="0.000338"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:52.045368" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:52.045159" elapsed="0.000289"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:52.045138" elapsed="0.000343"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:52.016056" elapsed="0.029554">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:53.048537" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:53.047552" elapsed="0.001088"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:53.062980" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:53.062718" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:53.063427" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:53.063181" 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-08-22T23:49:53.071933" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:53.072096" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:53.072278" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:53.065840" elapsed="0.006863">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:53.063548" elapsed="0.009245">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:53.072984" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:53.072828" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:53.063527" elapsed="0.009549">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:53.073458" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:53.073613" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:53.073557" elapsed="0.000102"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:53.073539" elapsed="0.000143"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:53.073826" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:53.073898" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:53.055057" elapsed="0.018947">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:53.074075" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:53.049178" elapsed="0.024993">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:53.074395" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:53.074251" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:53.074235" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:53.074684" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:53.074529" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:53.074513" elapsed="0.000252"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:53.046404" elapsed="0.028438">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:54.077655" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:54.076675" elapsed="0.001053"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:54.088390" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:54.088033" elapsed="0.000426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:54.089042" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:54.088692" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:49:54.098025" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:54.098192" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:54.098363" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:54.092029" elapsed="0.006738">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:54.089209" elapsed="0.009640">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:54.099040" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:54.098884" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:54.089180" elapsed="0.009951">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:54.099505" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:54.099659" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:54.099619" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:54.099601" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:54.099868" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:54.099939" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:54.081957" elapsed="0.018085">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:54.100111" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:54.078215" elapsed="0.021990">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:54.100426" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:54.100284" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:54.100267" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:54.100721" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:54.100561" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:54.100546" elapsed="0.000255"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:54.075631" elapsed="0.025249">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:55.102824" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:55.102343" elapsed="0.000517"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:55.110510" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:55.110250" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:55.110981" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:55.110729" 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-08-22T23:49:55.119087" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:55.119238" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:55.119414" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:55.113179" elapsed="0.006633">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:55.111100" elapsed="0.008795">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:55.120087" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:55.119932" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:55.111078" elapsed="0.009101">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:55.120557" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:55.120714" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:55.120673" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:55.120656" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:55.120924" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:55.120995" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:55.105600" elapsed="0.015499">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:55.121168" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:55.103088" elapsed="0.018174">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:55.121481" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:55.121339" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:55.121323" elapsed="0.000238"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:55.121781" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:55.121642" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:55.121625" elapsed="0.000235"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:55.101570" elapsed="0.020368">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:56.124925" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:56.123946" elapsed="0.001052"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:56.140981" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:56.140570" elapsed="0.000478"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:56.141629" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:56.141263" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:49:56.152078" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:56.152240" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:56.152429" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:56.144740" elapsed="0.008100">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:56.141798" elapsed="0.011130">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:56.153119" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:56.152963" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:56.141768" elapsed="0.011442">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:56.153602" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:56.153740" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:56.153701" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:56.153684" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:56.153954" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:56.154024" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:56.131300" elapsed="0.022828">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:56.154196" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:56.125487" elapsed="0.028802">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:56.154508" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:56.154367" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:56.154350" elapsed="0.000264"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:56.154812" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:56.154669" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:56.154654" elapsed="0.000236"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:56.122813" elapsed="0.032153">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:57.157745" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:57.156723" elapsed="0.001093"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:57.171991" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:57.171729" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:57.172438" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:57.172193" 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-08-22T23:49:57.181255" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:57.181452" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:57.181699" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:57.174820" elapsed="0.007384">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:57.172558" elapsed="0.009760">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:57.182604" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:57.182367" elapsed="0.000333"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:57.172537" elapsed="0.010197">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:57.183268" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:57.183460" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:57.183405" elapsed="0.000115"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:57.183381" elapsed="0.000170"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:57.183773" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:57.183874" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:57.163924" elapsed="0.020095">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:57.184119" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:57.158299" elapsed="0.025953">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:57.184563" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:57.184363" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:57.184340" elapsed="0.000358"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:57.184987" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:57.184775" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:57.184753" elapsed="0.000350"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:57.155707" elapsed="0.029505">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:58.188111" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:58.187129" elapsed="0.001056"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:58.199170" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:58.198795" elapsed="0.000445"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:58.199880" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:58.199488" 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-08-22T23:49:58.209440" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:58.209617" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:58.209795" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:58.202641" elapsed="0.007541">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:58.200057" elapsed="0.010209">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:58.210456" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:58.210302" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:58.200027" elapsed="0.010521">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:58.210943" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:58.211083" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:58.211042" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:58.211025" elapsed="0.000130"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:58.211298" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:58.211370" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:58.192603" elapsed="0.018872">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:58.211546" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:58.188758" elapsed="0.022900">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:58.211882" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:58.211739" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:58.211722" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:58.212156" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:58.212017" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:58.212001" elapsed="0.000235"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:58.186049" elapsed="0.026264">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:49:59.215272" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:49:59.214292" elapsed="0.001053"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:59.226854" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:59.226469" elapsed="0.000453"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:49:59.227483" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:49:59.227136" 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-08-22T23:49:59.238373" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:49:59.238759" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:49:59.239139" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:49:59.230643" elapsed="0.009366">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:49:59.227676" elapsed="0.012529">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:59.240690" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:59.240286" elapsed="0.000567"/>
</branch>
<status status="FAIL" start="2026-08-22T23:49:59.227646" elapsed="0.013265">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:59.241855" elapsed="0.000062"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:59.242182" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:49:59.242088" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:59.242048" 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-08-22T23:49:59.242710" elapsed="0.000052"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:49:59.242884" elapsed="0.000037"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:49:59.220227" elapsed="0.022908">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:49:59.243305" elapsed="0.000037"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:49:59.215873" elapsed="0.027661">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:59.244104" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:59.243759" elapsed="0.000482"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:59.243719" elapsed="0.000580"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:49:59.244798" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:49:59.244428" elapsed="0.000508"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:49:59.244391" elapsed="0.000603"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:49:59.213192" elapsed="0.032029">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:00.248362" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:00.247309" elapsed="0.001130"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:00.259981" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:00.259616" elapsed="0.000433"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:00.260622" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:00.260260" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:50:00.270463" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:00.270652" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:50:00.270844" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:50:00.263310" elapsed="0.007978">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:00.260862" elapsed="0.010542">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:00.271729" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:00.271456" elapsed="0.000373"/>
</branch>
<status status="FAIL" start="2026-08-22T23:50:00.260765" elapsed="0.011099">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:00.272416" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:50:00.272632" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:50:00.272556" elapsed="0.000141"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:00.272531" elapsed="0.000197"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:00.272928" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:00.273028" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:50:00.253453" elapsed="0.019720">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:50:00.273271" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:50:00.249005" elapsed="0.024397">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:00.273748" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:00.273511" elapsed="0.000318"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:00.273488" elapsed="0.000376"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:00.274135" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:00.273940" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:00.273918" elapsed="0.000330"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:00.246173" elapsed="0.028185">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.277697" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:01.276660" elapsed="0.001108"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.290298" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:01.290033" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.290761" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:01.290497" 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-08-22T23:50:01.300826" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:01.301080" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:50:01.301308" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:50:01.293193" elapsed="0.008666">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:01.290885" elapsed="0.011095">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.302264" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:01.302032" elapsed="0.000331"/>
</branch>
<status status="FAIL" start="2026-08-22T23:50:01.290861" elapsed="0.011539">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.302989" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:50:01.303198" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:50:01.303139" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:01.303108" elapsed="0.000181"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.303487" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:01.303605" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:50:01.283407" elapsed="0.020347">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:50:01.303852" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:50:01.278262" elapsed="0.025723">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.304300" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:01.304100" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:01.304077" elapsed="0.000335"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.304704" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:01.304487" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:01.304465" elapsed="0.000366"/>
</if>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:01.275199" elapsed="0.029755">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<msg time="2026-08-22T23:50:01.305091" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${node2_session}</arg>
<arg>${empty_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:49:00.563414" elapsed="60.741810">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${node3_session}</arg>
<arg>${empty_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.305484" elapsed="0.000033"/>
</kw>
<doc>Check if there really is no data present on none of the nodes</doc>
<status status="FAIL" start="2026-08-22T23:49:00.251634" elapsed="61.054107">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</test>
<test id="s1-s7-t6" name="Create_Device_Data" 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-08-22T23:50:01.310077" elapsed="0.000214"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:50:01.309809" 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-08-22T23:50:01.311408" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:50:01.311294" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.311275" 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-08-22T23:50:01.316615" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:50:01.316489" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.316471" elapsed="0.000213"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.317704" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:50:01.317302" elapsed="0.000429"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.318196" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:50:01.317892" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:50:01.318268" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:50:01.318429" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:50:01.316923" elapsed="0.001531"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:50:01.323963" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:50:01.323854" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.323835" 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-08-22T23:50:01.325233" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:50:01.325126" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.325108" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:50:01.325775" level="INFO">${karaf_connection_index} = 85</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:50:01.325444" elapsed="0.000358"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:50:01.326190" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:50:01.325960" elapsed="0.000256"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:50:01.365088" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:50:01.326726" elapsed="0.038463"/>
</kw>
<msg time="2026-08-22T23:50:01.365372" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:50:01.365420" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:50:01.326373" elapsed="0.039084"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:50:01.387508" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:50:01.365990" elapsed="0.021638"/>
</kw>
<msg time="2026-08-22T23:50:01.387794" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:50:01.387840" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m             ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:50:01.365647" elapsed="0.022230"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.388174" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:01.387953" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.387934" elapsed="0.000320"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.388749" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:01.388422" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.389091" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:01.388878" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.388860" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:50:01.389202" 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-08-22T23:50:01.391835" elapsed="0.000282"/>
</kw>
<msg time="2026-08-22T23:50:01.392180" 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-08-22T23:50:01.390711" elapsed="0.001598"/>
</kw>
<kw name="Open 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-08-22T23:50:01.392643" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.392982" 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-08-22T23:50:01.390022" elapsed="0.003148"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:50:01.389469" elapsed="0.003768"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:50:01.324821" elapsed="0.068516"/>
</kw>
<msg time="2026-08-22T23:50:01.393431" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:50:01.393479" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m             ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:50:01.324180" elapsed="0.069345"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:50:01.393775" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-08-22T23:50:01.393647" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.393623" 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-08-22T23:50:01.394366" 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-08-22T23:50:01.394922" elapsed="0.000032"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:50:01.395014" 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-08-22T23:50:01.323491" elapsed="0.071661"/>
</kw>
<msg time="2026-08-22T23:50:01.395268" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:50:01.395322" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m             ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:50:01.318849" elapsed="0.076520"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.395796" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:01.395464" elapsed="0.000399"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.395442" elapsed="0.000451"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:50:01.318708" elapsed="0.077214"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:50:01.403363" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:50:01.403250" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.403230" 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-08-22T23:50:01.404640" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:50:01.404506" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.404488" elapsed="0.000221"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:50:01.405165" level="INFO">${karaf_connection_index} = 86</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:50:01.404852" elapsed="0.000341"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:50:01.405572" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:50:01.405349" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:50:01.456061" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:50:01.406107" elapsed="0.050061"/>
</kw>
<msg time="2026-08-22T23:50:01.456331" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:50:01.456378" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:50:01.405774" elapsed="0.050641"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:50:01.479631" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:50:01.457009" elapsed="0.022723"/>
</kw>
<msg time="2026-08-22T23:50:01.479912" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:50:01.479960" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m             ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:50:01.456604" elapsed="0.023398"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.480315" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:01.480088" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.480068" elapsed="0.000327"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.480863" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:01.480534" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.481203" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:01.480992" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.480973" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:50:01.481315" 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-08-22T23:50:01.484143" elapsed="0.000152"/>
</kw>
<msg time="2026-08-22T23:50:01.484357" 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-08-22T23:50:01.482828" elapsed="0.001665"/>
</kw>
<kw name="Open 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-08-22T23:50:01.485005" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.485351" 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-08-22T23:50:01.482169" elapsed="0.003369"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:50:01.481617" elapsed="0.004016"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:50:01.404186" elapsed="0.081546"/>
</kw>
<msg time="2026-08-22T23:50:01.485824" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:50:01.485869" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m             ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:50:01.403604" elapsed="0.082303"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:50:01.486091" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:50:01.485984" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.485965" 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-08-22T23:50:01.486562" elapsed="0.000045"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.486915" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:50:01.486986" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:50:01.402818" elapsed="0.084276"/>
</kw>
<msg time="2026-08-22T23:50:01.487188" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:50:01.487231" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m             ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:50:01.396253" elapsed="0.091015"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.487689" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:01.487344" elapsed="0.000402"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.487326" elapsed="0.000444"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:50:01.396075" elapsed="0.091719"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:50:01.493425" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:50:01.493317" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.493297" 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-08-22T23:50:01.494667" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:50:01.494535" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.494516" elapsed="0.000220"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:50:01.495182" level="INFO">${karaf_connection_index} = 87</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:50:01.494879" elapsed="0.000330"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:50:01.495600" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:50:01.495363" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:50:01.541141" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:50:01.496150" elapsed="0.045094"/>
</kw>
<msg time="2026-08-22T23:50:01.541415" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:50:01.541461" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:50:01.495785" elapsed="0.045713"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:50:01.559955" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:50:01.542034" elapsed="0.018019"/>
</kw>
<msg time="2026-08-22T23:50:01.560212" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:50:01.560258" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m             ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:50:01.541691" elapsed="0.018604"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.560620" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:01.560372" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.560353" elapsed="0.000348"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.561145" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:01.560843" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.561487" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:01.561273" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.561255" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:50:01.561620" 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-08-22T23:50:01.564211" elapsed="0.000150"/>
</kw>
<msg time="2026-08-22T23:50:01.564420" 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-08-22T23:50:01.563078" elapsed="0.001477"/>
</kw>
<kw name="Open 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-08-22T23:50:01.564848" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.565179" 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-08-22T23:50:01.562416" 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-08-22T23:50:01.561882" elapsed="0.003547"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:50:01.494231" elapsed="0.071304"/>
</kw>
<msg time="2026-08-22T23:50:01.565657" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:50:01.565704" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m             ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:50:01.493660" elapsed="0.072082"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:50:01.565964" elapsed="0.000199"/>
</return>
<status status="PASS" start="2026-08-22T23:50:01.565855" elapsed="0.000344"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.565835" elapsed="0.000388"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.566645" 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-08-22T23:50:01.566988" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:50:01.567061" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:50:01.492969" elapsed="0.074202"/>
</kw>
<msg time="2026-08-22T23:50:01.567265" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:50:01.567309" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m             ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:50:01.488139" elapsed="0.079208"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.567793" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:01.567422" elapsed="0.000427"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.567404" elapsed="0.000469"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:50:01.487950" elapsed="0.079948"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:50:01.318511" elapsed="0.249417"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:50:01.316124" elapsed="0.251866"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:50:01.310999" elapsed="0.257052"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:50:01.310497" elapsed="0.257603"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:50:01.307040" elapsed="0.261116"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.568793" level="INFO">${template_as_string} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${template_as_string}</var>
<arg>DEVICE_NAME=${device_name}</arg>
<arg>RESTCONF_ROOT=${RESTCONF_ROOT}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:50:01.568334" elapsed="0.000486"/>
</kw>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.602825" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:01.602429" elapsed="0.000425"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:50:01.603669" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:50:01.603380" elapsed="0.000370">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:50:01.603845" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:50:01.603016" elapsed="0.000853"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.604416" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:50:01.604032" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:50:01.604756" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:50:01.604921" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:50:01.604618" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.605343" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:01.605100" 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-08-22T23:50:01.606541" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:01.606283" elapsed="0.000318"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.607020" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:50:01.606759" elapsed="0.000286"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.608644" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:50:01.608131" elapsed="0.000540"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:50:01.609417" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:50:01.609192" elapsed="0.000251"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:50:01.609494" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:50:01.609666" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:50:01.608868" elapsed="0.000824"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:50:01.609841" elapsed="0.000244"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:50:01.607982" elapsed="0.002144"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.610693" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:50:01.610369" elapsed="0.000350"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:50:01.611452" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:50:01.611233" elapsed="0.000244"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:50:01.611527" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:01.611698" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:50:01.610901" elapsed="0.000822"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:50:01.611869" elapsed="0.000227"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:50:01.610240" elapsed="0.001896"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:50:01.607095" elapsed="0.005077"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:50:01.612216" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:50:01.612373" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:50:01.605923" elapsed="0.006476"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:01.605629" elapsed="0.006801"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.612616" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:01.612455" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.605608" elapsed="0.007086"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.613607" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:01.612835" elapsed="0.000802"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:50:01.613685" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:50:01.601711" elapsed="0.012098"/>
</kw>
<msg time="2026-08-22T23:50:01.613863" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:50:01.588974" elapsed="0.024935"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.626333" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.638706" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.651192" 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-08-22T23:50:01.651394" 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-08-22T23:50:01.651571" 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-08-22T23:50:01.651982" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:01.651835" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:01.651818" 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-08-22T23:50:01.652207" 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-08-22T23:50:01.652371" 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-08-22T23:50:01.652534" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:50:01.651786" elapsed="0.000817"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:50:01.651675" 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-08-22T23:50:01.652781" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:50:01.652863" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:50:01.652991" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:50:01.584738" elapsed="0.068280"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.678315" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:01.677848" elapsed="0.000497"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:50:01.679163" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:50:01.678861" elapsed="0.000381">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:50:01.679336" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:50:01.678505" elapsed="0.000856"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.679925" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:50:01.679522" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:50:01.680252" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:50:01.680410" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:50:01.680113" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.680902" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:01.680649" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:50:01.681318" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:01.681019" elapsed="0.000357"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.681859" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:01.681547" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:01.681403" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.680999" elapsed="0.000944"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.682541" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:01.682089" elapsed="0.000481"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:50:01.682637" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:50:01.677218" elapsed="0.005548"/>
</kw>
<msg time="2026-08-22T23:50:01.682819" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:50:01.664516" elapsed="0.018376"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.695386" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.708044" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.722713" 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-08-22T23:50:01.722936" 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-08-22T23:50:01.723114" 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-08-22T23:50:01.723521" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:01.723375" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:01.723357" 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-08-22T23:50:01.723762" 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-08-22T23:50:01.723928" 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-08-22T23:50:01.724089" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:50:01.723322" elapsed="0.000819"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:50:01.723198" elapsed="0.001039"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.724390" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:50:01.724469" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:50:01.724630" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:50:01.663471" elapsed="0.061190"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:50:01.726034" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:50:01.725752" elapsed="0.000361">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:50:01.726206" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:50:01.725346" elapsed="0.000885"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.726559" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:01.726302" elapsed="0.000359"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.727164" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:01.726864" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:01.726686" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.726284" elapsed="0.000964"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.729604" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:50:01.727397" elapsed="0.002235"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:50:01.729686" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:50:01.729843" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:50:01.725000" elapsed="0.004869"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.731441" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:01.731183" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.731900" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:01.731657" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.732342" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:01.732096" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.732792" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:01.732534" elapsed="0.000303"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:50:01.733665" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:50:01.733447" elapsed="0.000245"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:50:01.734017" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:50:01.733839" 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-08-22T23:50:01.734191" elapsed="0.000210"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.734846" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:01.734555" elapsed="0.000336"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:50:01.734934" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:01.735090" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:50:01.733039" 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-08-22T23:50:01.756639" level="INFO">POST Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Content-Length': '72', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:50:01.756974" level="INFO">POST Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:50:01.757221" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:50:01.737649" elapsed="0.020440">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:01.735187" elapsed="0.023100">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.758796" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:01.758367" elapsed="0.000596"/>
</branch>
<status status="FAIL" start="2026-08-22T23:50:01.735169" elapsed="0.023853">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.759955" elapsed="0.000062"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:50:01.760284" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:50:01.760193" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:01.760152" elapsed="0.000286"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.760812" elapsed="0.000054"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:01.760977" elapsed="0.000036"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:50:01.730199" elapsed="0.031025">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:50:01.761415" elapsed="0.000038"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:50:01.573632" elapsed="0.188043">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.762381" elapsed="0.000107"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:01.761949" elapsed="0.000681"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:01.761908" elapsed="0.000785"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:50:01.762778" elapsed="0.000037"/>
</return>
<arg>${directory_with_template_folders}${/}dataorig</arg>
<arg>${template_as_string}</arg>
<arg>session=${node2_session}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:50:01.569074" elapsed="0.193938">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<doc>Create some data on the device and propagate it throughout the cluster.</doc>
<status status="FAIL" start="2026-08-22T23:50:01.306251" elapsed="0.457030">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</test>
<test id="s1-s7-t7" name="Check_Config_Data_After_Data_Creation" 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-08-22T23:50:01.767999" elapsed="0.000304"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:50:01.767626" 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-08-22T23:50:01.769811" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:50:01.769653" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.769626" elapsed="0.000280"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:50:01.776434" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:50:01.776326" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.776308" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.777518" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:50:01.777130" elapsed="0.000416"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.778032" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:50:01.777724" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:50:01.778104" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:01.778261" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:50:01.776746" 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-08-22T23:50:01.784063" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:50:01.783954" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.783934" 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-08-22T23:50:01.785305" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:50:01.785199" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.785181" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:50:01.785839" level="INFO">${karaf_connection_index} = 85</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:50:01.785512" elapsed="0.000354"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:50:01.786250" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:50:01.786023" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:50:01.819330" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:50:01.786806" elapsed="0.032763"/>
</kw>
<msg time="2026-08-22T23:50:01.819981" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:50:01.820084" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:50:01.786449" elapsed="0.033718"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:50:01.841262" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "D "a "t "a "_ "C "r "e "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-08-22T23:50:01.821354" elapsed="0.020029"/>
</kw>
<msg time="2026-08-22T23:50:01.841553" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:50:01.841620" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "D "a "t "a "_ ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:50:01.820548" elapsed="0.021113"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.842002" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:01.841753" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.841724" elapsed="0.000371"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.842552" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "D "a "t "a "_ "C "r "e "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-08-22T23:50:01.842241" 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-08-22T23:50:01.842992" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:01.842778" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.842759" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:50:01.843106" 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-08-22T23:50:01.845792" elapsed="0.000155"/>
</kw>
<msg time="2026-08-22T23:50:01.846029" 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-08-22T23:50:01.844653" 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-08-22T23:50:01.846464" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.846819" 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-08-22T23:50:01.843984" elapsed="0.003023"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:50:01.843404" elapsed="0.003673"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:50:01.784899" elapsed="0.062277"/>
</kw>
<msg time="2026-08-22T23:50:01.847271" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:50:01.847315" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "D "a "t "a "_ ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:50:01.784281" elapsed="0.063072"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:50:01.847536" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:50:01.847429" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.847411" elapsed="0.000234"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.848050" 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-08-22T23:50:01.848385" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:50:01.848456" 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-08-22T23:50:01.783610" elapsed="0.064958"/>
</kw>
<msg time="2026-08-22T23:50:01.848746" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:50:01.848791" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "D "a "t "a "_ ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:50:01.778706" elapsed="0.070124"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.849160" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:01.848907" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.848890" elapsed="0.000348"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:50:01.778544" elapsed="0.070717"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:50:01.854977" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:50:01.854868" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.854849" 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-08-22T23:50:01.856170" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:50:01.856064" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.856046" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:50:01.856700" level="INFO">${karaf_connection_index} = 86</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:50:01.856379" elapsed="0.000348"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:50:01.857099" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:50:01.856881" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:50:01.893812" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:50:01.857628" elapsed="0.036375"/>
</kw>
<msg time="2026-08-22T23:50:01.894223" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:50:01.894292" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:50:01.857281" elapsed="0.037068"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:50:01.918475" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "D "a "t "a "_ "C "r "e "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-08-22T23:50:01.895160" elapsed="0.023443"/>
</kw>
<msg time="2026-08-22T23:50:01.918768" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:50:01.918814" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "D "a "t "a "_ ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:50:01.894641" elapsed="0.024211"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.919167" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:01.918936" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.918913" elapsed="0.000334"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.919708" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "D "a "t "a "_ "C "r "e "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-08-22T23:50:01.919388" 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-08-22T23:50:01.920055" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:01.919843" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.919825" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:50:01.920168" 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-08-22T23:50:01.922762" elapsed="0.000154"/>
</kw>
<msg time="2026-08-22T23:50:01.922977" 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-08-22T23:50:01.921657" elapsed="0.001454"/>
</kw>
<kw name="Open 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-08-22T23:50:01.923387" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.923745" 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-08-22T23:50:01.921001" elapsed="0.002930"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:50:01.920443" elapsed="0.003552"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:50:01.855766" elapsed="0.068328"/>
</kw>
<msg time="2026-08-22T23:50:01.924189" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:50:01.924234" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "D "a "t "a "_ ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:50:01.855194" elapsed="0.069079"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:50:01.924458" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:50:01.924350" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.924332" 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-08-22T23:50:01.924963" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.925300" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:50:01.925373" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:50:01.854503" elapsed="0.070980"/>
</kw>
<msg time="2026-08-22T23:50:01.925663" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:50:01.925714" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "D "a "t "a "_ ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:50:01.849530" elapsed="0.076223"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.926123" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:01.925873" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.925855" elapsed="0.000345"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:50:01.849393" elapsed="0.076832"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:50:01.931952" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:50:01.931842" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.931822" 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-08-22T23:50:01.933198" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:50:01.933090" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.933072" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:50:01.933754" level="INFO">${karaf_connection_index} = 87</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:50:01.933406" elapsed="0.000377"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:50:01.934161" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:50:01.933939" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:50:01.971831" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:50:01.934705" elapsed="0.037231"/>
</kw>
<msg time="2026-08-22T23:50:01.972111" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:50:01.972158" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:50:01.934345" elapsed="0.037851"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:50:01.995117" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "D "a "t "a "_ "C "r "e "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-08-22T23:50:01.972726" elapsed="0.022499"/>
</kw>
<msg time="2026-08-22T23:50:01.995388" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:50:01.995434" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "D "a "t "a "_ ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:50:01.972363" elapsed="0.023109"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.995797" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:01.995550" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.995529" elapsed="0.000349"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:01.996316" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "D "a "t "a "_ "C "r "e "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-08-22T23:50:01.996019" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:01.996681" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:01.996451" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:01.996433" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:50:01.996795" 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-08-22T23:50:01.999388" elapsed="0.000152"/>
</kw>
<msg time="2026-08-22T23:50:01.999623" 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-08-22T23:50:01.998278" elapsed="0.001478"/>
</kw>
<kw name="Open 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-08-22T23:50:02.000029" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:02.000539" 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-08-22T23:50:01.997654" elapsed="0.003095"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:50:01.997066" elapsed="0.003749"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:50:01.932786" elapsed="0.068175"/>
</kw>
<msg time="2026-08-22T23:50:02.001055" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:50:02.001099" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "D "a "t "a "_ ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:50:01.932175" elapsed="0.068962"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:50:02.001349" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:50:02.001214" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:02.001196" 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 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:02.001856" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:02.002191" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:50:02.002262" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:50:01.931468" elapsed="0.070901"/>
</kw>
<msg time="2026-08-22T23:50:02.002465" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:50:02.002510" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "D "a "t "a "_ ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:50:01.926490" elapsed="0.076058"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:02.002955" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:02.002705" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:02.002686" elapsed="0.000347"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:50:01.926353" elapsed="0.076704"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:50:01.778340" elapsed="0.224749"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:50:01.775963" elapsed="0.227186"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:50:01.769222" elapsed="0.233987"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:50:01.768618" elapsed="0.234638"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:50:01.764547" elapsed="0.238767"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:02.004933" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:02.004519" elapsed="0.000441"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:02.012614" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:02.012346" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:02.013112" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:02.012813" 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-08-22T23:50:02.038471" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:02.038647" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:02.038753" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:02.015331" elapsed="0.023448"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:02.013250" elapsed="0.025571"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:02.039040" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:02.038882" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:02.013230" elapsed="0.025898"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:02.042633" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:02.040162" elapsed="0.002521"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:02.039930" elapsed="0.002788"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:02.039912" elapsed="0.002831"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:02.045358" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:02.043020" elapsed="0.002385"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:02.042800" elapsed="0.002640"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:02.042782" elapsed="0.002683"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:02.046097" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:02.045705" 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-08-22T23:50:02.046432" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:02.046196" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:02.046998" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:02.046692" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:02.046514" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:02.046178" elapsed="0.000907"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:02.047623" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:02.047242" 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-08-22T23:50:02.047954" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:02.047722" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:02.048495" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:02.048195" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:02.048036" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:02.047704" 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-08-22T23:50:02.048744" elapsed="0.000380"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:02.049600" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:02.049287" 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-08-22T23:50:02.049781" 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-08-22T23:50:02.039490" elapsed="0.012820"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:02.052486" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-08-22T23:50:02.052380" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:02.052361" 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-08-22T23:50:02.052736" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:02.052840" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:50:02.055205" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:02.007952" elapsed="0.047281"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:02.055294" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:50:02.055446" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:02.005169" elapsed="0.050304"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:02.056134" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:02.055770" elapsed="0.000499">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:02.055543" elapsed="0.000801">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:02.055526" elapsed="0.000853">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:02.056614" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:02.056450" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:02.056434" elapsed="0.000263"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:02.004128" elapsed="0.052653">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:03.060100" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:03.059003" elapsed="0.001177"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:03.071026" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:03.070660" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:03.071701" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:03.071307" elapsed="0.000461"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:50:03.096292" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:03.096475" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:03.096598" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:03.074384" elapsed="0.022242"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:03.071885" elapsed="0.024784"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:03.096854" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:03.096700" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:03.071848" elapsed="0.025091"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:03.100701" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:03.097991" elapsed="0.002761"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:03.097769" elapsed="0.003018"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:03.097750" elapsed="0.003063"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:03.103560" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:03.101220" elapsed="0.002401"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:03.100871" elapsed="0.002785"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:03.100854" elapsed="0.002827"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:03.104318" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:03.103869" 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-08-22T23:50:03.104683" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:03.104420" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:03.105227" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:03.104926" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:03.104766" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:03.104402" elapsed="0.000982"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:03.105932" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:03.105545" 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-08-22T23:50:03.106262" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:03.106029" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:03.106818" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:03.106502" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:03.106344" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:03.106011" 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-08-22T23:50:03.107058" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:03.107909" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:03.107593" 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-08-22T23:50:03.108089" elapsed="0.002341"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:50:03.097312" elapsed="0.013184"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:03.110697" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-08-22T23:50:03.110567" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:03.110548" 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-08-22T23:50:03.110946" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:03.111017" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:03.113413" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:03.064534" elapsed="0.048909"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:03.113503" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:03.113674" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:03.060803" elapsed="0.052898"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:03.114353" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:03.113982" elapsed="0.000453">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:03.113771" elapsed="0.000737">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:03.113754" elapsed="0.000788">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:03.114777" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:03.114630" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:03.114612" elapsed="0.000244"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:03.057774" elapsed="0.057164">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:04.117675" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:04.116841" elapsed="0.000896"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:04.129494" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:04.129202" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:04.129986" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:04.129725" 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-08-22T23:50:04.156261" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:04.156656" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:04.156963" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:04.132349" elapsed="0.024676"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:04.130116" elapsed="0.027032"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:04.157739" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:04.157228" elapsed="0.000671"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:04.130088" elapsed="0.027863"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:04.165773" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:04.160626" elapsed="0.005198"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:04.160041" elapsed="0.005819"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:04.159992" elapsed="0.005893"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:04.168539" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:04.166164" elapsed="0.002437"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:04.165942" elapsed="0.002696"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:04.165925" elapsed="0.002738"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:04.169280" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:04.168852" 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-08-22T23:50:04.169631" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:04.169378" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:04.170181" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:04.169878" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:04.169715" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:04.169360" elapsed="0.000906"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:04.170799" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:04.170421" 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-08-22T23:50:04.171123" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:04.170895" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:04.171682" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:04.171365" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:04.171210" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:04.170877" 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-08-22T23:50:04.171918" elapsed="0.000368"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:04.172774" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:04.172447" 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-08-22T23:50:04.172953" elapsed="0.002343"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:50:04.158913" elapsed="0.016450"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:04.175646" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:50:04.175513" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:04.175493" elapsed="0.000254"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:04.175896" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:04.175970" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:04.178337" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:04.122617" elapsed="0.055751"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:04.178431" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:04.178606" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:04.118149" elapsed="0.060487"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:04.179294" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:04.178921" elapsed="0.000459">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:04.178709" elapsed="0.000748">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:04.178692" elapsed="0.000799">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:04.179729" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:04.179562" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:04.179544" elapsed="0.000266"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:04.115777" elapsed="0.064121">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:05.182887" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:05.181907" elapsed="0.001053"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:05.198234" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:05.197954" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:05.198712" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:05.198442" 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-08-22T23:50:05.222630" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:05.222837" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:05.222996" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:05.200950" elapsed="0.022085"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:05.198836" elapsed="0.024266"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:05.223507" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:05.223146" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:05.198813" elapsed="0.024934"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:05.231989" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:05.226299" elapsed="0.005802"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:05.225790" elapsed="0.006390"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:05.225747" elapsed="0.006492"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:05.235478" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:05.232948" elapsed="0.002577"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:05.232416" elapsed="0.003146"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:05.232330" elapsed="0.003271"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:05.236180" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:05.235781" 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-08-22T23:50:05.236538" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:05.236282" elapsed="0.000332"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:05.237106" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:05.236802" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:05.236639" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:05.236263" elapsed="0.000929"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:05.237729" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:05.237350" 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-08-22T23:50:05.238056" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:05.237827" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:05.238662" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:05.238344" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:05.238138" elapsed="0.000586"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:05.237809" 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-08-22T23:50:05.238898" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:05.239727" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:05.239413" 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-08-22T23:50:05.239904" 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-08-22T23:50:05.224768" elapsed="0.017709"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:05.242676" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:50:05.242548" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:05.242530" 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-08-22T23:50:05.242921" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:05.242993" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:05.245409" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:05.188877" elapsed="0.056561"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:05.245500" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:05.245670" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:05.183448" elapsed="0.062249"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:05.246346" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:05.245977" elapsed="0.000446">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:05.245768" elapsed="0.000764">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:05.245751" elapsed="0.000819">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:05.246807" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:05.246660" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:05.246642" elapsed="0.000247"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:05.180833" elapsed="0.066139">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:06.249954" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:06.248909" elapsed="0.001116"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:06.262594" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:06.262314" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:06.263054" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:06.262803" 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-08-22T23:50:06.287335" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:06.287670" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:06.287894" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:06.265278" elapsed="0.022674"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:06.263178" elapsed="0.024872"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:06.288451" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:06.288110" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:06.263155" elapsed="0.025525"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:06.298422" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:06.291048" elapsed="0.007429"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:06.290520" elapsed="0.007998"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:06.290480" elapsed="0.008066"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:06.301789" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:06.298926" elapsed="0.002915"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:06.298651" elapsed="0.003231"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:06.298621" elapsed="0.003290"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:06.302589" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:06.302093" elapsed="0.000526"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:06.302928" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:06.302691" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:06.303477" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:06.303172" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:06.303011" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:06.302672" elapsed="0.000891"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:06.304104" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:06.303739" 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-08-22T23:50:06.304517" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:06.304280" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:06.305097" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:06.304776" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:06.304616" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:06.304260" 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-08-22T23:50:06.305336" elapsed="0.000371"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:06.306175" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:06.305871" 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-08-22T23:50:06.306354" 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-08-22T23:50:06.289517" elapsed="0.019239"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:06.308936" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:50:06.308826" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:06.308807" 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-08-22T23:50:06.309204" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:06.309275" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:06.311630" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:06.256282" elapsed="0.055377"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:06.311719" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:06.311872" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:06.250522" elapsed="0.061376"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:06.312622" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:06.312239" elapsed="0.000468">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:06.311969" elapsed="0.000812">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:06.311952" elapsed="0.000864">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:06.313043" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:06.312885" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:06.312868" elapsed="0.000256"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:06.247818" elapsed="0.065388">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:07.316297" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:07.315286" elapsed="0.001083"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:07.330058" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:07.329600" elapsed="0.000530"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:07.330702" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:07.330325" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:50:07.358070" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:07.358240" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:07.358351" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:07.332930" elapsed="0.025448"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:07.330825" elapsed="0.027596"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:07.358625" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:07.358448" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:07.330803" elapsed="0.027911"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:07.362177" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:07.359742" elapsed="0.002485"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:07.359504" elapsed="0.002758"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:07.359486" elapsed="0.002802"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:07.364951" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:07.362563" elapsed="0.002435"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:07.362344" elapsed="0.002690"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:07.362327" elapsed="0.002733"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:07.365723" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:07.365233" 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-08-22T23:50:07.366062" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:07.365825" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:07.366662" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:07.366336" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:07.366175" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:07.365806" elapsed="0.000943"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:07.367280" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:07.366906" 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-08-22T23:50:07.367625" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:07.367377" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:07.368160" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:07.367865" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:07.367708" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:07.367359" elapsed="0.000886"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:50:07.368394" elapsed="0.000369"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:07.369222" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:07.368924" 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-08-22T23:50:07.369400" 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-08-22T23:50:07.359071" elapsed="0.012791"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:07.372043" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:50:07.371933" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:07.371915" 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-08-22T23:50:07.372324" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:07.372398" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:50:07.374817" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:07.321312" elapsed="0.053534"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:07.374908" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:50:07.375057" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:07.316896" elapsed="0.058188"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:07.375739" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:07.375361" elapsed="0.000457">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:07.375154" elapsed="0.000737">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:07.375138" elapsed="0.000788">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:07.376142" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:07.375996" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:07.375980" elapsed="0.000243"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:07.314129" elapsed="0.062176">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:08.379215" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:08.378243" elapsed="0.001043"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:08.390483" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:08.390080" elapsed="0.000476"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:08.391192" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:08.390806" elapsed="0.000454"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:50:08.412260" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:08.412626" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:08.412861" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:08.393771" elapsed="0.019150"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:08.391367" elapsed="0.021666"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:08.413482" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:08.413120" elapsed="0.000590"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:08.391337" elapsed="0.022425"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:08.421225" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:08.416175" elapsed="0.005123"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:08.415662" elapsed="0.005767"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:08.415616" elapsed="0.005853"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:08.425264" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:08.421905" elapsed="0.003426"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:08.421552" elapsed="0.003830"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:08.421527" elapsed="0.003890"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:08.426239" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:08.425679" 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-08-22T23:50:08.426821" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:08.426377" elapsed="0.000531"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:08.427637" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:08.427164" elapsed="0.000512"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:08.426941" elapsed="0.000787"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:08.426352" elapsed="0.001406"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:08.428538" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:08.427977" 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-08-22T23:50:08.429019" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:08.428697" elapsed="0.000401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:08.429785" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:08.429352" elapsed="0.000469"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:08.429131" elapsed="0.000740"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:08.428672" elapsed="0.001228"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:50:08.430109" elapsed="0.000514"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:08.431254" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:08.430848" 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-08-22T23:50:08.431530" elapsed="0.003609"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:50:08.414631" elapsed="0.020597"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:08.435476" elapsed="0.000070"/>
</return>
<status status="PASS" start="2026-08-22T23:50:08.435326" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:08.435301" 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-08-22T23:50:08.435857" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:08.435956" elapsed="0.000020"/>
</return>
<msg time="2026-08-22T23:50:08.439338" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:08.383930" elapsed="0.055449"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:08.439462" elapsed="0.000061"/>
</return>
<msg time="2026-08-22T23:50:08.439734" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:08.379891" elapsed="0.059882"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:08.440684" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:08.440162" elapsed="0.000629">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:08.439872" elapsed="0.001017">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:08.439848" elapsed="0.001147">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:08.441311" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:08.441109" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:08.441085" elapsed="0.000339"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:08.377161" elapsed="0.064377">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:09.444802" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:09.443779" elapsed="0.001097"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:09.458946" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:09.458559" elapsed="0.000457"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:09.459596" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:09.459230" elapsed="0.000433"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:50:09.483863" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:09.484183" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:09.484423" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:09.462689" elapsed="0.021796"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:09.459772" elapsed="0.024853"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:09.485070" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:09.484696" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:09.459741" elapsed="0.025573"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:09.494117" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:09.487912" elapsed="0.006319"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:09.487319" elapsed="0.006970"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:09.487266" elapsed="0.007049"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:09.496978" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:09.494613" elapsed="0.002413"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:09.494373" elapsed="0.002688"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:09.494356" elapsed="0.002731"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:09.497764" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:09.497319" 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-08-22T23:50:09.498104" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:09.497865" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:09.498673" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:09.498354" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:09.498188" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:09.497847" elapsed="0.000915"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:09.499287" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:09.498919" 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-08-22T23:50:09.499633" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:09.499386" elapsed="0.000374"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:09.500250" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:09.499949" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:09.499788" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:09.499367" 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-08-22T23:50:09.500492" elapsed="0.000376"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:09.501357" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:09.501033" 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-08-22T23:50:09.501539" 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-08-22T23:50:09.486222" elapsed="0.017829"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:09.504260" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-08-22T23:50:09.504140" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:09.504115" 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-08-22T23:50:09.504537" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:09.504630" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:09.507287" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:09.451382" elapsed="0.055935"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:09.507379" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:09.507534" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:09.445422" elapsed="0.062140"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:09.508270" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:09.507864" elapsed="0.000493">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:09.507652" elapsed="0.000781">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:09.507634" elapsed="0.000834">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:09.508706" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:09.508540" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:09.508523" elapsed="0.000268"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:09.442481" elapsed="0.066396">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:10.512170" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:10.510944" elapsed="0.001301"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:10.526617" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:10.526339" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:10.527069" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:10.526821" 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-08-22T23:50:10.550382" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:10.550785" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:10.551018" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:10.529401" elapsed="0.021716"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:10.527207" elapsed="0.024027"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:10.551700" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:10.551298" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:10.527184" elapsed="0.024722"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:10.558228" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:10.554218" elapsed="0.004079"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:10.553725" elapsed="0.004622"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:10.553683" elapsed="0.004699"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:10.562115" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:10.558791" elapsed="0.003389"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:10.558461" elapsed="0.003769"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:10.558438" elapsed="0.003828"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:10.563088" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:10.562503" 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-08-22T23:50:10.563558" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:10.563229" elapsed="0.000434"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:10.564348" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:10.563921" elapsed="0.000467"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:10.563698" elapsed="0.000741"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:10.563203" elapsed="0.001267"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:10.565223" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:10.564712" 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-08-22T23:50:10.565707" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:10.565361" elapsed="0.000429"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:10.566459" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:10.566044" elapsed="0.000451"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:10.565824" elapsed="0.000722"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:10.565336" 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-08-22T23:50:10.566819" elapsed="0.000521"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:10.567882" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:10.567566" 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-08-22T23:50:10.568061" 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-08-22T23:50:10.552745" elapsed="0.017774"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:10.570715" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:50:10.570604" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:10.570570" 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-08-22T23:50:10.570968" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:10.571088" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:50:10.573497" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:10.518516" elapsed="0.055010"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:10.573603" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:50:10.573758" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:10.512795" elapsed="0.060990"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:10.574427" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:10.574067" elapsed="0.000437">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:10.573858" elapsed="0.000732">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:10.573841" elapsed="0.000787">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:10.574848" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:10.574700" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:10.574683" elapsed="0.000247"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:10.509813" elapsed="0.065200">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:11.578067" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:11.577028" elapsed="0.001112"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:11.592770" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:11.592327" elapsed="0.000493"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:11.593224" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:11.592975" 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-08-22T23:50:11.619103" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:11.619258" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:11.619358" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:11.595471" elapsed="0.023913"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:11.593376" elapsed="0.026053"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:11.619633" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:11.619457" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:11.593353" elapsed="0.026371"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:11.623236" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:11.620753" elapsed="0.002533"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:11.620511" elapsed="0.002810"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:11.620492" elapsed="0.002855"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:11.626095" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:11.623714" elapsed="0.002429"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:11.623409" elapsed="0.002769"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:11.623393" elapsed="0.002811"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:11.626797" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:11.626386" 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-08-22T23:50:11.627134" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:11.626897" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:11.627701" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:11.627380" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:11.627218" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:11.626879" elapsed="0.000910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:11.628317" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:11.627949" 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-08-22T23:50:11.628664" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:11.628415" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:11.629236" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:11.628908" elapsed="0.000356"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:11.628748" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:11.628398" 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-08-22T23:50:11.629475" elapsed="0.000375"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:11.630313" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:11.630014" 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-08-22T23:50:11.630496" 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-08-22T23:50:11.620081" elapsed="0.012970"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:11.633244" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:50:11.633122" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:11.633104" 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-08-22T23:50:11.633487" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:11.633561" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:50:11.635959" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:11.584866" elapsed="0.051122"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:11.636050" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:50:11.636202" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:11.578668" elapsed="0.057562"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:11.636894" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:11.636515" elapsed="0.000455">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:11.636302" elapsed="0.000739">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:11.636285" elapsed="0.000792">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:11.637357" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:11.637207" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:11.637188" elapsed="0.000254"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:11.575925" elapsed="0.061600">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:12.640642" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:12.639526" elapsed="0.001191"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:12.652471" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:12.652208" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:12.652936" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:12.652688" 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-08-22T23:50:12.674526" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:12.674865" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:12.675087" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:12.655144" elapsed="0.020001"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:12.653060" elapsed="0.022180"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:12.675700" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:12.675302" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:12.653036" elapsed="0.022859"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:12.684103" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:12.678195" elapsed="0.006020"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:12.677697" elapsed="0.006599"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:12.677653" elapsed="0.006708"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:12.687066" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:12.684751" elapsed="0.002363"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:12.684504" elapsed="0.002647"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:12.684464" elapsed="0.002712"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:12.687818" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:12.687355" 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-08-22T23:50:12.688166" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:12.687927" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:12.688730" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:12.688409" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:12.688249" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:12.687901" elapsed="0.000915"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:12.689336" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:12.688973" 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-08-22T23:50:12.689679" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:12.689433" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:12.690311" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:12.690011" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:12.689760" elapsed="0.000707"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:12.689415" 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-08-22T23:50:12.690661" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:12.691500" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:12.691179" 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-08-22T23:50:12.691701" elapsed="0.002325"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:50:12.676715" elapsed="0.017377"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:12.694275" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:50:12.694162" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:12.694143" 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-08-22T23:50:12.694519" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:12.694605" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:50:12.697013" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:12.646969" elapsed="0.050073"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:12.697102" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:12.697255" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:12.641222" elapsed="0.056060"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:12.697942" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:12.697559" elapsed="0.000466">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:12.697352" elapsed="0.000746">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:12.697335" elapsed="0.000798">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:12.698350" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:12.698203" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:12.698186" elapsed="0.000244"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:12.638385" elapsed="0.060130">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:13.701564" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:13.700529" elapsed="0.001137"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:13.714039" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:13.713656" elapsed="0.000460"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:13.714698" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:13.714329" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:50:13.736512" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:13.736981" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:13.737217" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:13.717776" elapsed="0.019501"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:13.714867" elapsed="0.022512"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:13.737839" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:13.737444" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:13.714835" elapsed="0.023243"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:13.746142" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:13.740469" elapsed="0.005783"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:13.739971" elapsed="0.006359"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:13.739929" elapsed="0.006443"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:13.749021" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:13.746671" elapsed="0.002396"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:13.746434" elapsed="0.002674"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:13.746417" elapsed="0.002716"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:13.749774" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:13.749321" 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-08-22T23:50:13.750446" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:13.749875" elapsed="0.000637"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:13.751057" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:13.750727" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:13.750537" elapsed="0.000585"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:13.749856" elapsed="0.001288"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:13.751689" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:13.751300" 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-08-22T23:50:13.752177" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:13.751787" elapsed="0.000450"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:13.752739" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:13.752421" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:13.752262" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:13.751769" 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-08-22T23:50:13.752978" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:13.753825" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:13.753494" 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-08-22T23:50:13.754032" 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-08-22T23:50:13.738959" elapsed="0.017538"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:13.756701" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-08-22T23:50:13.756570" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:13.756551" 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-08-22T23:50:13.756959" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:13.757031" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:13.759735" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:13.707303" elapsed="0.052463"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:13.759895" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:50:13.760054" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:13.702188" elapsed="0.057893"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:13.760755" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:13.760365" elapsed="0.000476">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:13.760154" elapsed="0.000762">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:13.760137" elapsed="0.000814">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:13.761170" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:13.761022" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:13.761005" elapsed="0.000245"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:13.699382" elapsed="0.061954">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:14.764531" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:14.763457" elapsed="0.001231"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:14.775712" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:14.775328" elapsed="0.000459"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:14.776378" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:14.776018" elapsed="0.000425"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:50:14.797941" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:14.798095" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:14.798196" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:14.778911" elapsed="0.019311"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:14.776550" elapsed="0.021716"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:14.798449" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:14.798295" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:14.776518" elapsed="0.022019"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:14.802025" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:14.799592" elapsed="0.002484"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:14.799350" elapsed="0.002761"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:14.799332" elapsed="0.002804"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:14.804739" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:14.802412" elapsed="0.002373"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:14.802193" elapsed="0.002627"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:14.802177" elapsed="0.002668"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:14.805414" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:14.805019" 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-08-22T23:50:14.805837" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:14.805595" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:14.806381" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:14.806079" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:14.805919" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:14.805561" elapsed="0.000906"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:14.807005" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:14.806640" 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-08-22T23:50:14.807330" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:14.807101" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:14.807877" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:14.807566" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:14.807411" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:14.807083" 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-08-22T23:50:14.808110" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:14.808960" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:14.808662" 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-08-22T23:50:14.809138" 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-08-22T23:50:14.798921" elapsed="0.012720"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:14.811822" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:50:14.811711" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:14.811693" 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-08-22T23:50:14.812062" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:14.812134" elapsed="0.000014"/>
</return>
<msg time="2026-08-22T23:50:14.814468" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:14.769133" elapsed="0.045364"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:14.814557" elapsed="0.000042"/>
</return>
<msg time="2026-08-22T23:50:14.814725" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:14.765221" elapsed="0.049531"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:14.815395" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:14.815031" elapsed="0.000447">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:14.814823" elapsed="0.000727">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:14.814806" elapsed="0.000794">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:14.815821" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:14.815674" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:14.815657" elapsed="0.000243"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:14.762271" elapsed="0.053711">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:15.819084" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:15.818093" elapsed="0.001064"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:15.833097" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:15.832837" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:15.833545" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:15.833300" 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-08-22T23:50:15.851169" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:15.851339" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:15.851487" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:15.835774" elapsed="0.015773"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:15.833687" elapsed="0.018006"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:15.852101" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:15.851756" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:15.833663" elapsed="0.018633"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:15.860562" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:15.854622" elapsed="0.006006"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:15.854100" elapsed="0.006565"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:15.854059" elapsed="0.006632"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:15.863503" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:15.860972" elapsed="0.002577"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:15.860749" elapsed="0.002857"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:15.860732" elapsed="0.002900"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:15.864214" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:15.863811" 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-08-22T23:50:15.864549" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:15.864312" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:15.865146" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:15.864829" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:15.864652" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:15.864294" elapsed="0.000938"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:15.865835" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:15.865399" 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-08-22T23:50:15.866173" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:15.865935" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:15.866738" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:15.866416" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:15.866256" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:15.865917" 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-08-22T23:50:15.866978" elapsed="0.000372"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:15.867909" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:15.867602" 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-08-22T23:50:15.868088" elapsed="0.002307"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:50:15.853117" elapsed="0.017343"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:15.870657" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:50:15.870530" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:15.870512" 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-08-22T23:50:15.870897" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:15.870969" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:15.873356" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:15.825289" elapsed="0.048096"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:15.873445" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:50:15.873613" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:15.819730" elapsed="0.053911"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:15.874280" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:15.873918" elapsed="0.000439">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:15.873712" elapsed="0.000718">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:15.873695" elapsed="0.000769">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:15.874694" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:15.874532" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:15.874516" elapsed="0.000259"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:15.816951" elapsed="0.057907">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:16.877786" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:16.876813" elapsed="0.001044"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:16.891988" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:16.891723" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:16.892439" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:16.892191" 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-08-22T23:50:16.914534" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:16.914709" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:16.914880" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:16.894668" elapsed="0.020239"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:16.892558" elapsed="0.022393"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:16.915132" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:16.914979" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:16.892537" elapsed="0.022684"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:16.918766" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:16.916257" elapsed="0.002559"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:16.916035" elapsed="0.002817"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:16.916016" elapsed="0.002862"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:16.921501" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:16.919156" elapsed="0.002392"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:16.918935" elapsed="0.002663"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:16.918918" elapsed="0.002707"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:16.922203" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:16.921798" 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-08-22T23:50:16.922553" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:16.922303" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:16.923117" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:16.922815" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:16.922653" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:16.922285" elapsed="0.000918"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:16.923742" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:16.923360" 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-08-22T23:50:16.924072" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:16.923840" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:16.924627" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:16.924312" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:16.924154" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:16.923822" 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-08-22T23:50:16.924864" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:16.925686" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:16.925375" 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-08-22T23:50:16.925869" 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-08-22T23:50:16.915605" elapsed="0.012717"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:16.928501" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:50:16.928393" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:16.928374" 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-08-22T23:50:16.928762" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:16.928835" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:16.931227" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:16.884001" elapsed="0.047255"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:16.931318" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:16.931502" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:16.878383" elapsed="0.053146"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:16.932232" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:16.931870" elapsed="0.000438">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:16.931659" elapsed="0.000720">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:16.931640" elapsed="0.000774">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:16.932652" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:16.932485" elapsed="0.000235"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:16.932468" elapsed="0.000276"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:16.875750" elapsed="0.057076">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:17.935414" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:17.934498" elapsed="0.000983"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:17.946834" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:17.946457" elapsed="0.000443"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:17.947455" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:17.947112" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:50:17.968457" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:17.968654" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:17.968786" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:17.950288" elapsed="0.018525"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:17.947634" elapsed="0.021235"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:17.969133" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:17.968912" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:17.947606" elapsed="0.021618"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:17.973084" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:17.970512" elapsed="0.002622"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:17.970274" elapsed="0.002896"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:17.970255" elapsed="0.002941"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:17.975883" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:17.973474" elapsed="0.002457"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:17.973253" elapsed="0.002714"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:17.973235" elapsed="0.002757"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:17.976622" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:17.976172" 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-08-22T23:50:17.976962" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:17.976725" elapsed="0.000379"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:17.977623" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:17.977297" elapsed="0.000356"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:17.977131" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:17.976706" elapsed="0.001005"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:17.978236" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:17.977870" 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-08-22T23:50:17.978570" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:17.978333" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:17.979136" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:17.978837" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:17.978677" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:17.978315" 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-08-22T23:50:17.979377" elapsed="0.000393"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:17.980227" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:17.979931" 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-08-22T23:50:17.980405" 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-08-22T23:50:17.969795" elapsed="0.013172"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:17.983148" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:50:17.983037" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:17.983019" 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-08-22T23:50:17.983389" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:17.983461" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:17.985864" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:17.940265" elapsed="0.045629"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:17.985955" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:50:17.986108" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:17.935999" elapsed="0.050136"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:17.986974" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:17.986418" elapsed="0.000634">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:17.986206" elapsed="0.000917">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:17.986189" elapsed="0.000969">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:17.987377" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:17.987228" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:17.987212" elapsed="0.000246"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:17.933531" elapsed="0.054008">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:18.990858" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:18.989706" elapsed="0.001226"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:19.002045" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:19.001678" elapsed="0.000436"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:19.002702" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:19.002332" elapsed="0.000433"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:50:19.025160" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:19.025454" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:19.025708" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:19.005448" elapsed="0.020322"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:19.002873" elapsed="0.022993"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:19.026273" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:19.025927" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:19.002842" 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-08-22T23:50:19.034757" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:19.028854" elapsed="0.006016"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:19.028327" elapsed="0.006625"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:19.028285" elapsed="0.006726"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:19.040735" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:19.035675" elapsed="0.005107"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:19.035140" elapsed="0.005678"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:19.035102" elapsed="0.005741"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:19.041414" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:19.041018" 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-08-22T23:50:19.041769" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:19.041514" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:19.042318" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:19.042015" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:19.041853" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:19.041495" elapsed="0.000910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:19.042944" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:19.042563" 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-08-22T23:50:19.043272" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:19.043042" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:19.043831" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:19.043512" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:19.043354" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:19.043024" 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-08-22T23:50:19.044082" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:19.044913" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:19.044614" 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-08-22T23:50:19.045141" elapsed="0.002329"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:50:19.027295" elapsed="0.020245"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:19.047738" elapsed="0.000148"/>
</return>
<status status="PASS" start="2026-08-22T23:50:19.047625" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:19.047606" elapsed="0.000362"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:19.048119" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:19.048193" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:50:19.050538" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:18.995409" elapsed="0.055158"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:19.050641" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:19.050794" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:18.991430" elapsed="0.059391"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:19.051458" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:19.051100" elapsed="0.000435">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:19.050890" elapsed="0.000731">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:19.050873" elapsed="0.000785">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:19.051873" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:19.051728" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:19.051711" elapsed="0.000265"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:18.988495" elapsed="0.063565">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:20.055298" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:20.054213" elapsed="0.001162"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:20.067699" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:20.067412" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:20.068183" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:20.067905" 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-08-22T23:50:20.090492" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:20.090863" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:20.091114" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:20.070717" elapsed="0.020458"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:20.068324" elapsed="0.023073"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:20.091858" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:20.091471" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:20.068293" elapsed="0.023764"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:20.099096" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:20.094386" elapsed="0.004779"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:20.093892" elapsed="0.005323"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:20.093850" elapsed="0.005400"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:20.102895" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:20.099662" elapsed="0.003297"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:20.099330" elapsed="0.003711"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:20.099306" elapsed="0.003772"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:20.103941" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:20.103332" 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-08-22T23:50:20.104408" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:20.104078" elapsed="0.000411"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:20.105239" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:20.104813" elapsed="0.000464"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:20.104522" elapsed="0.000807"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:20.104053" elapsed="0.001306"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:20.106110" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:20.105576" 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-08-22T23:50:20.106569" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:20.106246" elapsed="0.000427"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:20.107378" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:20.106928" elapsed="0.000486"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:20.106707" elapsed="0.000758"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:20.106221" elapsed="0.001274"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:50:20.107677" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:20.108518" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:20.108196" 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-08-22T23:50:20.108715" elapsed="0.002374"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:50:20.092907" elapsed="0.018250"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:20.111344" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-08-22T23:50:20.111229" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:20.111211" 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-08-22T23:50:20.111612" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:20.111686" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:50:20.114031" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:20.061678" elapsed="0.052382"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:20.114154" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:50:20.114311" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:20.055919" elapsed="0.058419"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:20.115028" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:20.114632" elapsed="0.000532">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:20.114407" elapsed="0.000836">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:20.114390" elapsed="0.000888">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:20.115498" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:20.115349" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:20.115333" elapsed="0.000266"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:20.053002" elapsed="0.062686">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:21.119008" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:21.117885" elapsed="0.001200"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:21.131264" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:21.130996" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:21.131757" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:21.131469" elapsed="0.000334"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:50:21.152851" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:21.153035" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:21.153141" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:21.134037" elapsed="0.019131"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:21.131890" elapsed="0.021325"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:21.153407" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:21.153248" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:21.131861" elapsed="0.021636"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:21.157158" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:21.154640" elapsed="0.002568"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:21.154385" elapsed="0.002859"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:21.154366" elapsed="0.002904"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:21.159994" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:21.157546" elapsed="0.002502"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:21.157325" elapsed="0.002760"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:21.157309" elapsed="0.002801"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:21.160790" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:21.160310" 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-08-22T23:50:21.161142" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:21.160893" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:21.161719" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:21.161387" elapsed="0.000360"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:21.161226" elapsed="0.000627"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:21.160874" elapsed="0.001002"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:21.162452" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:21.162037" 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-08-22T23:50:21.162828" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:21.162552" elapsed="0.000335"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:21.163371" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:21.163071" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:21.162912" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:21.162534" 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-08-22T23:50:21.163634" elapsed="0.000361"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:21.164479" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:21.164161" 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-08-22T23:50:21.164685" 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-08-22T23:50:21.153920" elapsed="0.013327"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:21.167436" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-08-22T23:50:21.167320" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:21.167301" 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-08-22T23:50:21.167711" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:21.167794" elapsed="0.000018"/>
</return>
<msg time="2026-08-22T23:50:21.170430" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:21.126057" elapsed="0.044410"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:21.170532" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:50:21.170731" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:21.119656" elapsed="0.051104"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:21.171460" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:21.171069" elapsed="0.000480">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:21.170833" elapsed="0.000822">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:21.170816" elapsed="0.000879">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:21.171923" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:21.171766" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:21.171749" elapsed="0.000257"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:21.116635" elapsed="0.055458">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:22.175384" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:22.174345" elapsed="0.001113"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:22.186805" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:22.186523" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:22.187258" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:22.187008" 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-08-22T23:50:22.206798" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:22.206958" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:22.207059" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:22.189503" elapsed="0.017582"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:22.187386" elapsed="0.019744"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:22.207314" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:22.207160" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:22.187359" elapsed="0.020044"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:22.212923" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:22.208449" elapsed="0.004585"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:22.208228" elapsed="0.004888"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:22.208210" elapsed="0.004963"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:22.222529" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:22.213994" elapsed="0.008599"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:22.213361" elapsed="0.009273"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:22.213261" elapsed="0.009398"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:22.223359" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:22.222840" 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-08-22T23:50:22.223723" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:22.223460" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:22.224272" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:22.223969" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:22.223808" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:22.223441" elapsed="0.000918"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:22.224900" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:22.224516" 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-08-22T23:50:22.225227" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:22.224997" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:22.225812" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:22.225487" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:22.225323" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:22.224979" 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-08-22T23:50:22.226052" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:22.226891" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:22.226566" 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-08-22T23:50:22.227070" elapsed="0.002380"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:50:22.207799" elapsed="0.021716"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:22.229776" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:50:22.229656" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:22.229636" 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-08-22T23:50:22.230020" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:22.230091" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:22.232420" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:22.182020" elapsed="0.050429"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:22.232509" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:22.232676" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:22.176187" elapsed="0.056516"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:22.233424" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:22.232982" elapsed="0.000532">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:22.232773" elapsed="0.000835">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:22.232756" elapsed="0.000899">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:22.233876" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:22.233727" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:22.233710" elapsed="0.000245"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:22.173032" elapsed="0.061008">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:23.237147" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:23.236104" elapsed="0.001115"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:23.251857" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:23.251593" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:23.252310" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:23.252061" 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-08-22T23:50:23.271456" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:23.271822" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:23.272070" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:23.254590" elapsed="0.017543"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:23.252437" elapsed="0.019802"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:23.272743" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:23.272308" elapsed="0.000710"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:23.252411" elapsed="0.020664"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:23.281679" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:23.275626" elapsed="0.006104"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:23.275062" elapsed="0.006704"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:23.275017" elapsed="0.006774"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:23.284436" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:23.282070" elapsed="0.002425"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:23.281847" elapsed="0.002684"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:23.281830" elapsed="0.002726"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:23.285198" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:23.284779" 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-08-22T23:50:23.285552" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:23.285298" elapsed="0.000333"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:23.286120" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:23.285818" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:23.285656" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:23.285279" elapsed="0.000926"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:23.286750" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:23.286361" 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-08-22T23:50:23.287078" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:23.286848" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:23.287628" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:23.287317" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:23.287160" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:23.286830" 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-08-22T23:50:23.287863" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:23.288711" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:23.288374" 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-08-22T23:50:23.289702" elapsed="0.002468"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:50:23.273989" elapsed="0.018259"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:23.292442" elapsed="0.000079"/>
</return>
<status status="PASS" start="2026-08-22T23:50:23.292327" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:23.292306" 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-08-22T23:50:23.292763" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:23.292835" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:23.295306" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:23.243387" elapsed="0.051948"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:23.295396" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:50:23.295547" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:23.237771" elapsed="0.057818"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:23.296252" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:23.295873" elapsed="0.000463">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:23.295664" elapsed="0.000884">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:23.295647" elapsed="0.000966">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:23.296842" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:23.296691" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:23.296673" elapsed="0.000250"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:23.234937" elapsed="0.062071">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:24.300149" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:24.299067" elapsed="0.001157"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:24.312711" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:24.312426" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:24.313163" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:24.312917" 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-08-22T23:50:24.332741" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:24.333075" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:24.333316" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:24.315372" elapsed="0.018007"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:24.313288" elapsed="0.020196"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:24.333962" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:24.333553" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:24.313263" elapsed="0.020911"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:24.342853" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:24.336824" elapsed="0.006149"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:24.336252" elapsed="0.006806"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:24.336202" elapsed="0.006916"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:24.346771" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:24.343883" elapsed="0.002936"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:24.343251" elapsed="0.003605"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:24.343212" elapsed="0.003668"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:24.347502" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:24.347065" elapsed="0.000467"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:24.347919" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:24.347622" elapsed="0.000360"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:24.348484" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:24.348171" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:24.348007" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:24.347602" elapsed="0.001066"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:24.349204" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:24.348832" 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-08-22T23:50:24.349535" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:24.349302" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:24.350180" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:24.349835" elapsed="0.000374"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:24.349634" elapsed="0.000617"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:24.349284" 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-08-22T23:50:24.350460" elapsed="0.000404"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:24.351336" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:24.351030" 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-08-22T23:50:24.351531" 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-08-22T23:50:24.335071" elapsed="0.019051"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:24.354306" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:50:24.354194" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:24.354176" 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-08-22T23:50:24.354554" elapsed="0.000037"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:24.354644" elapsed="0.000018"/>
</return>
<msg time="2026-08-22T23:50:24.357083" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:24.306942" elapsed="0.050170"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:24.357173" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:24.357328" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:24.300756" elapsed="0.056599"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:24.358030" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:24.357654" elapsed="0.000458">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:24.357426" elapsed="0.000760">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:24.357409" elapsed="0.000811">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:24.358439" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:24.358290" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:24.358272" elapsed="0.000247"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:24.297891" elapsed="0.060735">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:25.361759" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:25.360771" elapsed="0.001063"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:25.373228" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:25.372930" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:25.373719" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:25.373448" 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-08-22T23:50:25.394834" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:25.395182" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:25.395417" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:25.375976" elapsed="0.019500"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:25.373842" elapsed="0.021770"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:25.396042" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:25.395681" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:25.373818" elapsed="0.022419"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:25.404419" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:25.398865" elapsed="0.005609"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:25.398252" elapsed="0.006260"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:25.398200" elapsed="0.006342"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:25.407213" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:25.404858" elapsed="0.002407"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:25.404624" elapsed="0.002677"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:25.404602" elapsed="0.002725"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:25.407956" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:25.407511" 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-08-22T23:50:25.408298" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:25.408057" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:25.409007" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:25.408548" elapsed="0.000487"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:25.408383" elapsed="0.000689"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:25.408038" elapsed="0.001056"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:25.409790" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:25.409252" 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-08-22T23:50:25.410219" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:25.409918" elapsed="0.000386"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:25.410840" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:25.410508" elapsed="0.000369"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:25.410341" elapsed="0.000590"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:25.409888" elapsed="0.001068"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:50:25.411172" elapsed="0.000440"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:25.412174" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:25.411814" 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-08-22T23:50:25.412390" elapsed="0.002872"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:50:25.397109" elapsed="0.018231"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:25.415839" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-08-22T23:50:25.415691" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:25.415654" 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-08-22T23:50:25.416126" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:25.416207" elapsed="0.000019"/>
</return>
<msg time="2026-08-22T23:50:25.418708" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:25.368049" elapsed="0.050689"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:25.418800" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:50:25.418958" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:25.362325" elapsed="0.056660"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:25.419734" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:25.419318" elapsed="0.000512">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:25.419057" elapsed="0.000850">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:25.419040" elapsed="0.000901">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:25.420165" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:25.420014" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:25.419996" elapsed="0.000252"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:25.359535" elapsed="0.060799">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:26.423346" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:26.422336" elapsed="0.001082"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:26.435881" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:26.435570" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:26.436427" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:26.436096" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:50:26.457090" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:26.457383" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:26.457665" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:26.438701" elapsed="0.019026"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:26.436559" elapsed="0.021264"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:26.458228" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:26.457885" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:26.436535" elapsed="0.021887"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:26.465371" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:26.460921" elapsed="0.004520"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:26.460394" elapsed="0.005098"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:26.460353" elapsed="0.005175"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:26.469302" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:26.465939" elapsed="0.003429"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:26.465628" elapsed="0.003790"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:26.465603" elapsed="0.003850"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:26.470259" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:26.469712" 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-08-22T23:50:26.470761" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:26.470397" elapsed="0.000448"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:26.471528" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:26.471109" elapsed="0.000456"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:26.470879" elapsed="0.000759"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:26.470372" elapsed="0.001298"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:26.472398" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:26.471895" 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-08-22T23:50:26.472876" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:26.472532" elapsed="0.000423"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:26.473725" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:26.473226" elapsed="0.000537"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:26.472989" elapsed="0.000828"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:26.472508" elapsed="0.001339"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:50:26.474054" elapsed="0.000485"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:26.475229" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:26.474824" 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-08-22T23:50:26.475477" 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-08-22T23:50:26.459414" elapsed="0.018636"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:26.478231" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:50:26.478121" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:26.478102" 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-08-22T23:50:26.478471" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:26.478542" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:26.480985" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:26.429093" elapsed="0.051922"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:26.481076" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:26.481227" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:26.423948" elapsed="0.057305"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:26.481907" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:26.481529" elapsed="0.000456">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:26.481323" elapsed="0.000775">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:26.481306" elapsed="0.000830">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:26.482354" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:26.482207" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:26.482189" elapsed="0.000246"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:26.421247" elapsed="0.061269">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:27.485526" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:27.484534" elapsed="0.001095"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:27.498300" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:27.497917" elapsed="0.000452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:27.498978" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:27.498626" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:50:27.521710" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:27.522015" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:27.522297" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:27.502050" elapsed="0.020309"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:27.499148" elapsed="0.023310"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:27.522912" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:27.522523" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:27.499116" elapsed="0.023993"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:27.531184" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:27.525526" elapsed="0.005708"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:27.525020" elapsed="0.006250"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:27.524976" elapsed="0.006319"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:27.533898" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:27.531575" elapsed="0.002370"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:27.531351" elapsed="0.002628"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:27.531335" elapsed="0.002669"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:27.534639" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:27.534206" 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-08-22T23:50:27.534979" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:27.534739" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:27.535527" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:27.535225" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:27.535062" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:27.534720" elapsed="0.000976"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:27.536232" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:27.535863" 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-08-22T23:50:27.536679" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:27.536424" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:27.537224" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:27.536925" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:27.536767" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:27.536404" 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-08-22T23:50:27.537459" elapsed="0.000368"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:27.538334" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:27.537991" 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-08-22T23:50:27.538517" elapsed="0.002452"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:50:27.523949" elapsed="0.017085"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:27.541216" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:50:27.541104" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:27.541085" 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-08-22T23:50:27.541458" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:27.541530" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:27.543916" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:27.491720" elapsed="0.052309"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:27.544097" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:27.544250" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:27.486156" elapsed="0.058121"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:27.544943" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:27.544555" elapsed="0.000467">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:27.544347" elapsed="0.000748">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:27.544330" elapsed="0.000799">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:27.545345" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:27.545199" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:27.545182" elapsed="0.000243"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:27.483390" elapsed="0.062117">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:28.548529" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:28.547545" elapsed="0.001084"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:28.559927" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:28.559544" elapsed="0.000453"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:28.560704" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:28.560210" 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-08-22T23:50:28.580385" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:28.580718" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:28.580939" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:28.563522" elapsed="0.017474"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:28.560876" elapsed="0.020219"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:28.581501" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:28.581155" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:28.560846" elapsed="0.020909"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:28.589372" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:28.584061" elapsed="0.005361"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:28.583534" elapsed="0.005924"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:28.583494" elapsed="0.005990"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:28.592148" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:28.589789" elapsed="0.002406"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:28.589540" elapsed="0.002691"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:28.589523" elapsed="0.002733"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:28.592850" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:28.592433" 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-08-22T23:50:28.593184" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:28.592948" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:28.593760" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:28.593424" elapsed="0.000364"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:28.593265" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:28.592930" elapsed="0.000916"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:28.594364" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:28.594001" 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-08-22T23:50:28.594706" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:28.594461" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:28.595238" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:28.594944" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:28.594788" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:28.594443" 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-08-22T23:50:28.595473" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:28.596299" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:28.596002" 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-08-22T23:50:28.596479" 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-08-22T23:50:28.582555" elapsed="0.016427"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:28.599163" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:50:28.599053" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:28.599034" 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-08-22T23:50:28.599450" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:28.599523" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:28.601888" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:28.553358" elapsed="0.048559"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:28.601977" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:50:28.602146" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:28.549125" elapsed="0.053056"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:28.602902" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:28.602504" elapsed="0.000484">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:28.602273" elapsed="0.000797">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:28.602250" elapsed="0.000856">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:28.603322" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:28.603176" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:28.603159" elapsed="0.000243"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:28.546385" elapsed="0.057098">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:29.606622" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:29.605544" elapsed="0.001173"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:29.620026" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:29.619632" elapsed="0.000463"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:29.620680" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:29.620312" 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-08-22T23:50:29.640475" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:29.640659" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:29.640771" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:29.623333" elapsed="0.017491"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:29.620870" elapsed="0.020068"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:29.641423" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:29.641008" elapsed="0.000601"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:29.620837" elapsed="0.020825"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:29.649741" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:29.644031" elapsed="0.005839"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:29.643499" elapsed="0.006492"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:29.643458" elapsed="0.006564"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:29.652673" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:29.650311" elapsed="0.002410"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:29.650084" elapsed="0.002673"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:29.650067" elapsed="0.002715"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:29.653423" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:29.652963" 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-08-22T23:50:29.653785" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:29.653525" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:29.654336" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:29.654029" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:29.653868" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:29.653506" elapsed="0.000928"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:29.654985" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:29.654609" 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-08-22T23:50:29.655315" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:29.655084" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:29.655868" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:29.655554" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:29.655396" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:29.655066" 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-08-22T23:50:29.656106" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:29.656958" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:29.656650" 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-08-22T23:50:29.657162" 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-08-22T23:50:29.642509" elapsed="0.017133"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:29.659840" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:50:29.659713" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:29.659695" 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-08-22T23:50:29.660096" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:29.660167" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:29.662543" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:29.613030" elapsed="0.049543"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:29.662649" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:50:29.662804" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:29.607242" elapsed="0.055590"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:29.663496" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:29.663127" elapsed="0.000463">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:29.662902" elapsed="0.000765">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:29.662885" elapsed="0.000863">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:29.663978" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:29.663827" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:29.663809" elapsed="0.000250"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:29.604339" elapsed="0.059816">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:30.667395" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:30.666222" elapsed="0.001244"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:30.679048" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:30.678678" elapsed="0.000438"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:30.679705" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:30.679331" elapsed="0.000438"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:50:30.701317" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:30.701650" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:30.701874" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:30.682333" elapsed="0.019601"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:30.679878" elapsed="0.022155"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:30.702443" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:30.702096" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:30.679848" elapsed="0.022830"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:30.708621" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:30.705029" elapsed="0.003665"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:30.704458" elapsed="0.004287"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:30.704416" elapsed="0.004365"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:30.712535" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:30.709177" elapsed="0.003456"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:30.708868" elapsed="0.003820"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:30.708837" elapsed="0.003887"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:30.713506" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:30.712962" 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-08-22T23:50:30.713996" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:30.713666" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:30.714784" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:30.714333" elapsed="0.000489"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:30.714112" elapsed="0.000762"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:30.713641" elapsed="0.001263"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:30.715653" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:30.715122" 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-08-22T23:50:30.716114" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:30.715791" elapsed="0.000471"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:30.717025" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:30.716529" elapsed="0.000522"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:30.716303" elapsed="0.000785"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:30.715766" elapsed="0.001344"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:50:30.717264" elapsed="0.000368"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:30.718097" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:30.717797" 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-08-22T23:50:30.718276" 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-08-22T23:50:30.703472" elapsed="0.017480"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:30.721133" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:50:30.721023" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:30.721004" 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-08-22T23:50:30.721372" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:30.721444" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:50:30.723845" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:30.672559" elapsed="0.051315"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:30.723934" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:30.724087" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:30.667993" elapsed="0.056121"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:30.724966" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:30.724390" elapsed="0.000653">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:30.724184" elapsed="0.000933">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:30.724167" elapsed="0.000986">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:30.725369" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:30.725223" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:30.725206" elapsed="0.000245"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:30.665092" elapsed="0.060441">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:31.728605" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:31.727609" elapsed="0.001073"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:31.740701" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:31.740314" elapsed="0.000455"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:31.741179" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:31.740931" 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-08-22T23:50:31.766711" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:31.766999" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:31.767220" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:31.743571" elapsed="0.023710"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:31.741302" elapsed="0.026079"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:31.767821" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:31.767444" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:31.741280" elapsed="0.026749"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:31.776409" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:31.770449" elapsed="0.006072"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:31.769952" elapsed="0.006681"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:31.769909" elapsed="0.006785"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:31.781672" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:31.777318" elapsed="0.004402"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:31.776822" elapsed="0.004934"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:31.776785" elapsed="0.004996"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:31.782352" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:31.781957" 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-08-22T23:50:31.782704" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:31.782452" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:31.783253" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:31.782953" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:31.782788" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:31.782434" elapsed="0.000906"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:31.783880" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:31.783499" 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-08-22T23:50:31.784237" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:31.783979" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:31.784793" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:31.784477" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:31.784320" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:31.783961" 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-08-22T23:50:31.785029" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:31.785853" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:31.785539" 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-08-22T23:50:31.786033" 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-08-22T23:50:31.768960" elapsed="0.019513"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:31.788668" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:50:31.788542" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:31.788524" 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-08-22T23:50:31.788914" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:31.789065" elapsed="0.000018"/>
</return>
<msg time="2026-08-22T23:50:31.791395" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:31.734109" elapsed="0.057316"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:31.791485" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:31.791653" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:31.729181" elapsed="0.062499"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:31.793621" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:31.792687" elapsed="0.001107">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:31.791751" elapsed="0.002223">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:31.791734" elapsed="0.002320">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:31.794534" elapsed="0.000075"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:31.794211" elapsed="0.000481"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:31.794173" elapsed="0.000572"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:31.726434" elapsed="0.068494">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:32.798323" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:32.797305" elapsed="0.001091"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:32.809728" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:32.809343" elapsed="0.000454"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:32.810354" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:32.810011" 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-08-22T23:50:32.835171" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:32.835468" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:32.835783" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:32.813094" elapsed="0.022750"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:32.810521" elapsed="0.025423"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:32.836356" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:32.836007" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:32.810490" elapsed="0.026064"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:32.844233" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:32.838989" elapsed="0.005294"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:32.838454" elapsed="0.005864"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:32.838411" elapsed="0.006028"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:32.847199" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:32.844874" elapsed="0.002371"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:32.844507" elapsed="0.002773"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:32.844489" elapsed="0.002816"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:32.847954" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:32.847481" 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-08-22T23:50:32.848291" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:32.848054" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:32.848856" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:32.848534" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:32.848373" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:32.848036" elapsed="0.000905"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:32.849459" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:32.849096" 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-08-22T23:50:32.849802" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:32.849556" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:32.850404" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:32.850107" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:32.849946" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:32.849538" 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-08-22T23:50:32.850654" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:32.851457" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:32.851163" 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-08-22T23:50:32.851664" elapsed="0.002324"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:50:32.837380" elapsed="0.016671"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:32.854232" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:50:32.854123" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:32.854104" 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-08-22T23:50:32.854473" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:32.854546" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:32.856914" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:32.802910" elapsed="0.054033"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:32.857004" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:50:32.857157" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:32.798924" elapsed="0.058260"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:32.857906" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:32.857480" elapsed="0.000507">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:32.857256" elapsed="0.000807">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:32.857239" elapsed="0.000859">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:32.858394" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:32.858242" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:32.858223" elapsed="0.000253"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:32.796174" elapsed="0.062388">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:33.861623" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:33.860643" elapsed="0.001055"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:33.873554" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:33.872727" elapsed="0.000994"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:33.874781" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:33.874093" elapsed="0.000794"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:50:33.903619" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:33.903928" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:33.904166" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:33.879833" elapsed="0.024394"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:33.875095" elapsed="0.029237"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:33.904807" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:33.904397" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:33.875007" elapsed="0.030003"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:33.911221" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:33.907606" elapsed="0.003684"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:33.906972" elapsed="0.004368"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:33.906928" elapsed="0.004448"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:33.915048" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:33.911787" elapsed="0.003327"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:33.911455" elapsed="0.003708"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:33.911432" elapsed="0.003765"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:33.916011" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:33.915438" 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-08-22T23:50:33.916477" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:33.916149" elapsed="0.000409"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:33.917272" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:33.916848" elapsed="0.000462"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:33.916615" elapsed="0.000745"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:33.916124" elapsed="0.001266"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:33.918143" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:33.917629" 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-08-22T23:50:33.918621" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:33.918280" elapsed="0.000421"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:33.919407" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:33.918955" elapsed="0.000489"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:33.918735" elapsed="0.000875"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:33.918255" elapsed="0.001389"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:50:33.919857" elapsed="0.000359"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:33.920694" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:33.920376" 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-08-22T23:50:33.920873" 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-08-22T23:50:33.905869" elapsed="0.017552"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:33.923617" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:50:33.923490" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:33.923472" 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-08-22T23:50:33.923861" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:33.923939" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:33.926293" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:33.866645" elapsed="0.059676"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:33.926382" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:33.926536" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:33.862193" elapsed="0.064370"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:33.927257" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:33.926864" elapsed="0.000495">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:33.926656" elapsed="0.000783">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:33.926639" elapsed="0.000839">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:33.927747" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:33.927549" elapsed="0.000255"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:33.927532" elapsed="0.000295"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:33.859467" elapsed="0.068444">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:34.929907" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:34.929411" elapsed="0.000534"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:34.937406" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:34.937146" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:34.937873" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:34.937623" 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-08-22T23:50:34.961772" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:34.962047" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:34.962148" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:34.940113" elapsed="0.022062"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:34.937998" elapsed="0.024221"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:34.962401" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:34.962248" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:34.937973" elapsed="0.024531"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:34.966194" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:34.963537" elapsed="0.002708"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:34.963314" elapsed="0.002968"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:34.963296" elapsed="0.003012"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:34.968989" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:34.966628" elapsed="0.002409"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:34.966365" elapsed="0.002708"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:34.966348" elapsed="0.002751"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:34.969690" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:34.969277" 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-08-22T23:50:34.970025" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:34.969789" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:34.970613" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:34.970267" elapsed="0.000376"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:34.970107" elapsed="0.000573"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:34.969771" elapsed="0.000931"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:34.971227" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:34.970861" 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-08-22T23:50:34.971555" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:34.971324" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:34.972109" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:34.971814" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:34.971655" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:34.971307" elapsed="0.000886"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:50:34.972346" elapsed="0.000363"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:34.973168" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:34.972873" 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-08-22T23:50:34.973348" 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-08-22T23:50:34.962885" elapsed="0.012923"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:34.975989" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:50:34.975879" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:34.975860" 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-08-22T23:50:34.976232" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:34.976304" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:34.978713" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:34.932704" elapsed="0.046039"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:34.978847" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:50:34.979002" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:34.930176" elapsed="0.048854"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:34.979686" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:34.979309" elapsed="0.000456">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:34.979101" elapsed="0.000736">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:34.979083" elapsed="0.000789">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:34.980094" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:34.979947" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:34.979931" elapsed="0.000245"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:34.928716" elapsed="0.051542">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:35.983279" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:35.982286" elapsed="0.001064"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:35.997548" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:35.997147" elapsed="0.000496"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:35.998246" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:35.997862" elapsed="0.000447"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:50:36.020617" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:36.020920" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:36.021165" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:36.000647" elapsed="0.020578"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:35.998413" elapsed="0.022911"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:36.021760" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:36.021383" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:35.998382" elapsed="0.023578"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:36.030187" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:36.024297" elapsed="0.006008"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:36.023807" elapsed="0.006584"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:36.023765" elapsed="0.006686"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:36.034409" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:36.031057" elapsed="0.003416"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:36.030620" elapsed="0.003906"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:36.030547" elapsed="0.004013"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:36.035386" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:36.034821" 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-08-22T23:50:36.035986" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:36.035651" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:36.036772" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:36.036327" elapsed="0.000484"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:36.036101" elapsed="0.000762"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:36.035625" elapsed="0.001269"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:36.037648" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:36.037116" 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-08-22T23:50:36.038149" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:36.037787" elapsed="0.000445"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:36.038928" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:36.038489" elapsed="0.000476"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:36.038267" elapsed="0.000750"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:36.037762" elapsed="0.001285"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:50:36.039255" elapsed="0.000511"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:36.040399" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:36.039992" 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-08-22T23:50:36.040669" elapsed="0.003299"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:50:36.022814" elapsed="0.021221"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:36.044216" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:50:36.044105" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:36.044087" 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-08-22T23:50:36.044459" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:36.044532" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:36.046959" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:35.988556" elapsed="0.058433"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:36.047050" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:36.047201" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:35.983875" elapsed="0.063353"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:36.047891" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:36.047508" elapsed="0.000464">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:36.047299" elapsed="0.000746">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:36.047282" elapsed="0.000797">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:36.048296" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:36.048149" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:36.048132" elapsed="0.000243"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:35.981147" elapsed="0.067309">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:37.051670" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:37.050659" elapsed="0.001086"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:37.113905" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:37.113548" elapsed="0.000424"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:37.114402" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:37.114146" 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-08-22T23:50:37.137825" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:37.137995" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:37.138137" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:37.116666" elapsed="0.021499"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:37.114529" elapsed="0.023688"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:37.138432" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:37.138250" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:37.114503" elapsed="0.024022"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:37.142230" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:37.139653" elapsed="0.002628"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:37.139400" elapsed="0.002919"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:37.139380" elapsed="0.002965"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:37.145029" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:37.142664" elapsed="0.002415"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:37.142410" elapsed="0.002708"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:37.142388" elapsed="0.002759"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:37.145791" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:37.145330" 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-08-22T23:50:37.146127" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:37.145892" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:37.146699" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:37.146374" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:37.146210" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:37.145873" elapsed="0.000912"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:37.147309" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:37.146942" 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-08-22T23:50:37.147655" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:37.147408" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:37.148196" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:37.147895" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:37.147738" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:37.147390" 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-08-22T23:50:37.148432" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:37.149398" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:37.149094" 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-08-22T23:50:37.149623" 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-08-22T23:50:37.138940" elapsed="0.013267"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:37.152392" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:50:37.152278" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:37.152259" 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-08-22T23:50:37.152655" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:37.152729" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:50:37.155222" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:37.108914" elapsed="0.046340"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:37.155320" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:50:37.155490" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:37.052249" elapsed="0.103271"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:37.156210" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:37.155834" elapsed="0.000461">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:37.155615" elapsed="0.000756">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:37.155595" elapsed="0.000810">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:37.156649" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:37.156478" elapsed="0.000236"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:37.156461" elapsed="0.000278"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:37.049394" elapsed="0.107439">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:38.159836" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:38.158853" elapsed="0.001055"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:38.170737" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:38.170454" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:38.171191" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:38.170942" 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-08-22T23:50:38.190009" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:38.190320" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:38.190708" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:38.173443" elapsed="0.017333"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:38.171316" 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-08-22T23:50:38.191323" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:38.190951" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:38.171293" elapsed="0.020246"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:38.197798" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:38.194117" elapsed="0.003754"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:38.193699" elapsed="0.004224"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:38.193647" elapsed="0.004314"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:38.201719" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:38.198357" elapsed="0.003429"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:38.198041" elapsed="0.003795"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:38.198018" elapsed="0.003854"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:38.202683" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:38.202110" 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-08-22T23:50:38.203163" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:38.202824" elapsed="0.000422"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:38.203957" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:38.203508" elapsed="0.000488"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:38.203281" elapsed="0.000768"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:38.202798" elapsed="0.001282"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:38.204836" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:38.204301" 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-08-22T23:50:38.205336" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:38.205009" elapsed="0.000409"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:38.206100" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:38.205707" elapsed="0.000420"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:38.205452" elapsed="0.000712"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:38.204983" 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-08-22T23:50:38.206337" elapsed="0.000372"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:38.207171" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:38.206874" 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-08-22T23:50:38.207349" 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-08-22T23:50:38.192440" elapsed="0.017549"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:38.210171" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:50:38.210060" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:38.210041" 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-08-22T23:50:38.210414" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:38.210486" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:50:38.212890" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:38.166021" elapsed="0.046910"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:38.212993" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:50:38.213152" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:38.160402" elapsed="0.052777"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:38.213897" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:38.213512" elapsed="0.000464">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:38.213299" elapsed="0.000750">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:38.213280" elapsed="0.000804">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:38.214302" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:38.214155" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:38.214139" elapsed="0.000246"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:38.157723" elapsed="0.056745">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:39.217480" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:39.216496" elapsed="0.001056"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:39.229487" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:39.229223" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:39.229962" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:39.229711" 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-08-22T23:50:39.249283" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:39.249436" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:39.249534" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:39.232192" elapsed="0.017368"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:39.230083" elapsed="0.019542"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:39.249810" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:39.249654" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:39.230061" elapsed="0.019836"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:39.253803" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:39.250926" elapsed="0.002987"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:39.250703" elapsed="0.003294"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:39.250684" elapsed="0.003370"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:39.260097" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:39.254701" elapsed="0.005562"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:39.254177" elapsed="0.006170"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:39.254140" elapsed="0.006311"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:39.261386" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:39.260858" 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-08-22T23:50:39.261737" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:39.261485" elapsed="0.000372"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:39.262361" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:39.262054" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:39.261886" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:39.261467" elapsed="0.000982"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:39.262996" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:39.262623" 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-08-22T23:50:39.263329" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:39.263096" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:39.263887" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:39.263570" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:39.263412" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:39.263077" 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-08-22T23:50:39.264122" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:39.264964" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:39.264668" 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-08-22T23:50:39.265142" elapsed="0.002320"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:50:39.250260" elapsed="0.017265"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:39.267723" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:50:39.267611" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:39.267591" 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-08-22T23:50:39.267964" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:39.268035" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:39.270393" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:39.223860" elapsed="0.046562"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:39.270484" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:50:39.270651" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:39.218083" elapsed="0.052595"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:39.271316" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:39.270957" elapsed="0.000438">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:39.270749" elapsed="0.000720">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:39.270732" elapsed="0.000771">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:39.271737" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:39.271573" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:39.271557" elapsed="0.000263"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:39.215334" elapsed="0.056568">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:40.275031" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:40.273899" elapsed="0.001206"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:40.288359" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:40.288092" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:40.288828" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:40.288564" 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-08-22T23:50:40.307088" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:40.307409" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:40.307699" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:40.291052" elapsed="0.016715"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:40.288952" elapsed="0.018923"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:40.308362" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:40.307978" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:40.288927" elapsed="0.019644"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:40.317153" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:40.311122" elapsed="0.006082"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:40.310558" elapsed="0.006682"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:40.310513" elapsed="0.006754"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:40.320045" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:40.317547" elapsed="0.002545"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:40.317324" elapsed="0.002805"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:40.317308" elapsed="0.002846"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:40.320772" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:40.320338" 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-08-22T23:50:40.321111" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:40.320871" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:40.321676" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:40.321356" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:40.321194" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:40.320852" elapsed="0.000911"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:40.322301" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:40.321920" 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-08-22T23:50:40.322650" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:40.322399" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:40.323187" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:40.322890" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:40.322733" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:40.322381" 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-08-22T23:50:40.323423" elapsed="0.000399"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:40.324309" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:40.324002" 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-08-22T23:50:40.324716" 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-08-22T23:50:40.309485" elapsed="0.017798"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:40.327465" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:50:40.327354" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:40.327336" 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-08-22T23:50:40.327729" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:40.327802" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:40.330216" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:40.281712" elapsed="0.048533"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:40.330308" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:40.330463" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:40.275639" elapsed="0.054852"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:40.331155" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:40.330790" elapsed="0.000446">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:40.330562" elapsed="0.000747">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:40.330545" elapsed="0.000799">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:40.331562" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:40.331415" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:40.331398" elapsed="0.000265"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:40.272774" elapsed="0.058972">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:41.334766" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:41.333780" elapsed="0.001056"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:41.347408" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:41.347134" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:41.347877" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:41.347628" 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-08-22T23:50:41.366905" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:41.367207" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:41.367469" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:41.350087" elapsed="0.017444"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:41.347999" elapsed="0.019772"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:41.368185" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:41.367838" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:41.347977" elapsed="0.020405"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:41.374989" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:41.370721" elapsed="0.004340"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:41.370193" elapsed="0.004919"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:41.370152" elapsed="0.004998"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:41.378905" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:41.375560" elapsed="0.003412"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:41.375232" elapsed="0.003791"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:41.375208" elapsed="0.003851"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:41.379892" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:41.379299" 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-08-22T23:50:41.380369" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:41.380034" elapsed="0.000420"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:41.381167" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:41.380740" elapsed="0.000467"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:41.380490" elapsed="0.000770"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:41.380008" elapsed="0.001284"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:41.382056" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:41.381515" 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-08-22T23:50:41.382522" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:41.382196" elapsed="0.000431"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:41.383309" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:41.382888" elapsed="0.000458"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:41.382663" elapsed="0.000769"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:41.382170" elapsed="0.001294"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:50:41.383697" elapsed="0.000531"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:41.384707" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:41.384398" 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-08-22T23:50:41.384888" elapsed="0.002379"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:50:41.369203" elapsed="0.018129"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:41.387529" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:50:41.387418" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:41.387399" 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-08-22T23:50:41.387790" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:41.387863" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:41.390255" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:41.341043" elapsed="0.049241"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:41.390345" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:50:41.390497" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:41.335337" elapsed="0.055187"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:41.391188" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:41.390820" elapsed="0.000491">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:41.390610" elapsed="0.000787">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:41.390592" elapsed="0.000842">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:41.391672" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:41.391507" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:41.391490" elapsed="0.000267"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:41.332660" elapsed="0.059181">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:42.394814" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:42.393836" elapsed="0.001093"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:42.409720" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:42.409440" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:42.410168" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:42.409922" 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-08-22T23:50:42.428706" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:42.428900" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:42.429038" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:42.412393" elapsed="0.016704"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:42.410291" elapsed="0.018904"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:42.429626" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:42.429255" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:42.410266" elapsed="0.019568"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:42.437873" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:42.432260" elapsed="0.005723"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:42.431767" elapsed="0.006294"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:42.431725" elapsed="0.006392"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:42.441870" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:42.438765" elapsed="0.003152"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:42.438242" elapsed="0.003710"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:42.438204" elapsed="0.003772"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:42.442555" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:42.442157" 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-08-22T23:50:42.442931" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:42.442670" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:42.443471" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:42.443171" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:42.443014" elapsed="0.000679"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:42.442651" elapsed="0.001076"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:42.444289" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:42.443911" 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-08-22T23:50:42.444653" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:42.444398" elapsed="0.000330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:42.445213" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:42.444912" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:42.444753" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:42.444379" 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-08-22T23:50:42.445447" elapsed="0.000371"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:42.446277" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:42.445980" 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-08-22T23:50:42.446454" elapsed="0.002346"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:50:42.430740" elapsed="0.018124"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:42.449044" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:50:42.448935" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:42.448917" 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-08-22T23:50:42.449286" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:42.449358" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:42.451706" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:42.401001" elapsed="0.050734"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:42.451796" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:42.451950" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:42.395429" elapsed="0.056547"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:42.452633" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:42.452256" elapsed="0.000457">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:42.452048" elapsed="0.000738">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:42.452031" elapsed="0.000790">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:42.453065" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:42.452895" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:42.452874" elapsed="0.000274"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:42.392746" elapsed="0.060486">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:43.456442" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:43.455418" elapsed="0.001098"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:43.468360" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:43.467993" elapsed="0.000436"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:43.469011" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:43.468664" 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-08-22T23:50:43.492012" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:43.492351" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:43.492644" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:43.471929" elapsed="0.020781"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:43.469182" elapsed="0.023642"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:43.493301" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:43.492896" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:43.469149" elapsed="0.024361"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:43.501701" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:43.496099" elapsed="0.005718"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:43.495558" elapsed="0.006341"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:43.495515" elapsed="0.006440"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:43.505334" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:43.502650" elapsed="0.002731"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:43.502082" elapsed="0.003335"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:43.502045" elapsed="0.003396"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:43.506067" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:43.505642" 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-08-22T23:50:43.506435" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:43.506171" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:43.507002" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:43.506698" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:43.506520" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:43.506153" elapsed="0.000935"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:43.507623" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:43.507244" 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-08-22T23:50:43.507952" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:43.507721" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:43.508490" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:43.508194" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:43.508036" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:43.507704" elapsed="0.000870"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:50:43.508745" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:43.509569" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:43.509260" 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-08-22T23:50:43.509768" 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-08-22T23:50:43.494471" elapsed="0.017879"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:43.512622" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-08-22T23:50:43.512491" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:43.512472" 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-08-22T23:50:43.512871" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:43.512944" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:43.515367" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:43.461833" elapsed="0.053565"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:43.515460" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:43.515630" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:43.457198" elapsed="0.058461"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:43.516314" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:43.515942" elapsed="0.000453">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:43.515732" elapsed="0.000738">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:43.515715" elapsed="0.000790">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:43.516738" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:43.516590" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:43.516558" elapsed="0.000261"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:43.454179" elapsed="0.062723">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:44.519978" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:44.518995" elapsed="0.001055"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:44.530846" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:44.530568" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:44.531305" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:44.531049" 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-08-22T23:50:44.551844" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:44.552150" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:44.552373" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:44.533678" elapsed="0.018753"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:44.531431" elapsed="0.021095"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:44.552965" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:44.552618" elapsed="0.000612"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:44.531407" elapsed="0.021873"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:44.561719" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:44.555825" elapsed="0.006055"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:44.555293" elapsed="0.006682"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:44.555250" elapsed="0.006782"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:44.564863" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:44.562493" elapsed="0.002417"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:44.562161" elapsed="0.002785"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:44.562124" elapsed="0.002847"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:44.565600" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:44.565159" 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-08-22T23:50:44.565978" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:44.565701" elapsed="0.000342"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:44.566534" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:44.566231" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:44.566068" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:44.565683" elapsed="0.000967"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:44.567183" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:44.566817" 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-08-22T23:50:44.567511" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:44.567280" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:44.568069" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:44.567773" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:44.567611" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:44.567262" 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-08-22T23:50:44.568305" elapsed="0.000365"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:44.569140" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:44.568831" 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-08-22T23:50:44.569320" elapsed="0.002382"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:50:44.554264" elapsed="0.017509"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:44.571957" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:50:44.571845" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:44.571826" 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-08-22T23:50:44.572209" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:44.572280" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:44.574825" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:44.526246" elapsed="0.048609"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:44.574919" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:44.575073" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:44.520539" elapsed="0.054560"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:44.575797" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:44.575383" elapsed="0.000501">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:44.575170" elapsed="0.000927">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:44.575153" elapsed="0.000980">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:44.576352" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:44.576204" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:44.576186" elapsed="0.000245"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:44.517837" elapsed="0.058677">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:45.579507" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:45.578471" elapsed="0.001132"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:45.592051" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:45.591685" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:45.592704" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:45.592334" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:50:45.614185" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:45.614492" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:45.614758" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:45.595452" elapsed="0.019366"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:45.592872" elapsed="0.022048"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:45.615332" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:45.614984" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:45.592840" elapsed="0.022688"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:45.623303" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:45.618056" elapsed="0.005317"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:45.617490" elapsed="0.005933"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:45.617446" elapsed="0.006012"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:45.627213" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:45.623875" elapsed="0.003404"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:45.623535" elapsed="0.003795"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:45.623512" elapsed="0.003853"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:45.628196" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:45.627629" 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-08-22T23:50:45.628715" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:45.628332" elapsed="0.000471"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:45.629522" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:45.629063" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:45.628837" elapsed="0.000796"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:45.628308" elapsed="0.001428"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:45.630471" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:45.629960" 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-08-22T23:50:45.630952" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:45.630628" elapsed="0.000404"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:45.631715" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:45.631282" elapsed="0.000469"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:45.631066" elapsed="0.000736"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:45.630602" 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-08-22T23:50:45.632044" elapsed="0.000487"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:45.633192" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:45.632779" 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-08-22T23:50:45.633473" 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-08-22T23:50:45.616400" elapsed="0.019667"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:45.636247" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:50:45.636137" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:45.636119" 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-08-22T23:50:45.636490" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:45.636561" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:50:45.638929" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:45.585343" elapsed="0.053616"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:45.639020" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:45.639173" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:45.580101" elapsed="0.059099"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:45.639862" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:45.639478" elapsed="0.000464">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:45.639270" elapsed="0.000744">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:45.639254" elapsed="0.000794">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:45.640267" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:45.640119" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:45.640102" elapsed="0.000246"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:45.577313" elapsed="0.063118">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:46.643521" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:46.642486" elapsed="0.001142"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:46.656475" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:46.656178" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:46.657000" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:46.656710" 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-08-22T23:50:46.672939" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:46.673221" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:46.673484" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:46.659225" elapsed="0.014317"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:46.657126" elapsed="0.016555"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:46.674119" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:46.673747" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:46.657102" elapsed="0.017213"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:46.681904" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:46.676721" elapsed="0.005237"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:46.676181" elapsed="0.005816"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:46.676137" elapsed="0.005886"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:46.684702" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:46.682311" elapsed="0.002438"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:46.682080" elapsed="0.002705"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:46.682064" elapsed="0.002761"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:46.685426" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:46.685017" 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-08-22T23:50:46.685786" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:46.685524" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:46.686330" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:46.686029" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:46.685868" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:46.685506" elapsed="0.000909"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:46.686952" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:46.686570" 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-08-22T23:50:46.687275" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:46.687047" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:46.687828" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:46.687512" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:46.687356" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:46.687030" 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-08-22T23:50:46.688061" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:46.688938" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:46.688571" 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-08-22T23:50:46.689118" 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-08-22T23:50:46.675172" elapsed="0.016488"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:46.691927" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:50:46.691811" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:46.691791" 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-08-22T23:50:46.692172" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:46.692243" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:46.694794" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:46.651443" elapsed="0.043380"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:46.694883" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:46.695036" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:46.644120" elapsed="0.050942"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:46.695735" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:46.695347" elapsed="0.000471">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:46.695132" elapsed="0.000761">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:46.695116" elapsed="0.000811">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:46.696144" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:46.695998" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:46.695981" elapsed="0.000242"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:46.641355" elapsed="0.054953">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:47.699350" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:47.698363" elapsed="0.001060"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:47.714637" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:47.714357" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:47.715093" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:47.714841" 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-08-22T23:50:47.748254" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:47.748644" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:47.748875" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:47.717341" elapsed="0.031592"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:47.715220" elapsed="0.033813"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:47.749470" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:47.749096" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:47.715196" elapsed="0.034507"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:47.757671" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:47.752176" elapsed="0.005545"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:47.751674" elapsed="0.006083"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:47.751632" elapsed="0.006151"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:47.760434" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:47.758062" elapsed="0.002419"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:47.757840" elapsed="0.002677"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:47.757823" elapsed="0.002719"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:47.761155" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:47.760738" 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-08-22T23:50:47.761492" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:47.761255" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:47.762057" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:47.761754" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:47.761575" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:47.761236" elapsed="0.000909"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:47.762832" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:47.762301" 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-08-22T23:50:47.763166" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:47.762932" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:47.763721" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:47.763405" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:47.763248" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:47.762914" 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-08-22T23:50:47.763960" elapsed="0.000384"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:47.764837" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:47.764509" 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-08-22T23:50:47.765017" 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-08-22T23:50:47.750687" elapsed="0.016787"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:47.767674" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:50:47.767545" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:47.767527" 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-08-22T23:50:47.767922" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:47.767993" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:47.770401" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:47.705817" elapsed="0.064615"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:47.770494" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:47.770662" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:47.700010" elapsed="0.070680"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:47.771338" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:47.770971" elapsed="0.000450">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:47.770761" elapsed="0.000781">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:47.770744" elapsed="0.000849">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:47.771816" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:47.771668" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:47.771650" elapsed="0.000247"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:47.697233" elapsed="0.074749">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:48.775176" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:48.774120" elapsed="0.001131"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:48.788013" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:48.787724" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:48.788467" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:48.788218" 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-08-22T23:50:48.818629" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:48.818936" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:48.819166" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:48.790710" elapsed="0.028515"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:48.788611" elapsed="0.030715"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:48.819808" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:48.819389" elapsed="0.000575"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:48.788568" elapsed="0.031445"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:48.828046" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:48.822343" elapsed="0.005821"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:48.821843" elapsed="0.006403"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:48.821802" elapsed="0.006503"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:48.831028" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:48.828717" elapsed="0.002358"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:48.828449" elapsed="0.002661"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:48.828408" elapsed="0.002727"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:48.831738" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:48.831311" 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-08-22T23:50:48.832115" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:48.831876" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:48.832678" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:48.832357" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:48.832198" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:48.831857" elapsed="0.000907"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:48.833309" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:48.832921" 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-08-22T23:50:48.833730" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:48.833477" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:48.834274" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:48.833975" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:48.833813" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:48.833458" 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-08-22T23:50:48.834510" elapsed="0.000391"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:48.835373" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:48.835068" 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-08-22T23:50:48.835587" elapsed="0.002352"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:50:48.820855" elapsed="0.017152"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:48.838190" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:50:48.838078" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:48.838059" 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-08-22T23:50:48.838437" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:48.838508" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:48.840934" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:48.781541" elapsed="0.059423"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:48.841027" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:48.841179" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:48.775821" elapsed="0.065385"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:48.841876" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:48.841487" elapsed="0.000474">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:48.841277" elapsed="0.000758">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:48.841260" elapsed="0.000810">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:48.842289" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:48.842141" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:48.842124" elapsed="0.000244"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:48.772896" elapsed="0.069582">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:49.845563" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:49.844561" elapsed="0.001104"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:49.859396" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:49.858977" elapsed="0.000492"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:49.860158" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:49.859711" 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-08-22T23:50:49.878529" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:49.878885" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:49.879117" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:49.862428" elapsed="0.016749"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:49.860320" elapsed="0.019095"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:49.879915" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:49.879487" elapsed="0.000583"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:49.860295" elapsed="0.019824"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:49.888320" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:49.882451" elapsed="0.005920"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:49.881949" elapsed="0.006459"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:49.881906" elapsed="0.006529"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:49.891114" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:49.888734" elapsed="0.002428"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:49.888492" elapsed="0.002707"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:49.888475" elapsed="0.002750"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:49.891866" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:49.891426" 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-08-22T23:50:49.892206" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:49.891967" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:49.892774" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:49.892451" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:49.892289" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:49.891948" elapsed="0.000913"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:49.893393" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:49.893018" 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-08-22T23:50:49.893739" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:49.893490" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:49.894272" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:49.893976" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:49.893821" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:49.893471" 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-08-22T23:50:49.894509" elapsed="0.000368"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:49.895397" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:49.895041" 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-08-22T23:50:49.895601" 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-08-22T23:50:49.880949" elapsed="0.017188"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:49.898338" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:50:49.898219" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:49.898200" 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-08-22T23:50:49.898722" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:49.898799" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:50:49.901169" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:49.852537" elapsed="0.048662"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:49.901261" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:49.901415" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:49.846164" elapsed="0.055279"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:49.902118" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:49.901745" elapsed="0.000456">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:49.901516" elapsed="0.000760">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:49.901498" elapsed="0.000813">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:49.902530" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:49.902381" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:49.902364" elapsed="0.000262"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:49.843401" elapsed="0.059310">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:50.905783" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:50.904783" elapsed="0.001073"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:50.916734" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:50.916441" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:50.917190" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:50.916940" 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-08-22T23:50:50.936955" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:50.937248" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:50.937466" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:50.919437" elapsed="0.018091"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:50.917320" elapsed="0.020340"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:50.938071" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:50.937724" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:50.917294" elapsed="0.020970"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:50.946513" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:50.940648" elapsed="0.006013"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:50.940124" elapsed="0.006781"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:50.940083" elapsed="0.006886"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:50.949780" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:50.947441" elapsed="0.002386"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:50.947104" elapsed="0.002759"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:50.947065" elapsed="0.002823"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:50.950469" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:50.950067" 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-08-22T23:50:50.950837" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:50.950569" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:50.951390" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:50.951088" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:50.950922" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:50.950550" elapsed="0.000927"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:50.952023" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:50.951648" 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-08-22T23:50:50.952363" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:50.952124" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:50.952924" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:50.952624" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:50.952445" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:50.952106" 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-08-22T23:50:50.953169" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:50.954003" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:50.953707" 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-08-22T23:50:50.954182" 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-08-22T23:50:50.939109" elapsed="0.017502"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:50.956792" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:50:50.956681" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:50.956664" 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-08-22T23:50:50.957032" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:50.957104" elapsed="0.000014"/>
</return>
<msg time="2026-08-22T23:50:50.959478" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:50.910242" elapsed="0.049266"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:50.959567" elapsed="0.000047"/>
</return>
<msg time="2026-08-22T23:50:50.959740" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:50.906354" elapsed="0.053413"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:50.960415" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:50.960047" elapsed="0.000447">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:50.959838" elapsed="0.000728">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:50.959821" elapsed="0.000853">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:50.960906" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:50.960752" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:50.960734" elapsed="0.000254"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:50.903641" elapsed="0.057435">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:51.964090" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:51.963124" elapsed="0.001037"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:51.976203" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:51.975938" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:51.976672" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:51.976406" 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-08-22T23:50:51.995147" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:51.995344" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:51.995615" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:51.978926" elapsed="0.016755"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:51.976799" elapsed="0.018984"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:51.996197" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:51.995846" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:51.976775" elapsed="0.019622"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:52.004375" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:51.998785" elapsed="0.005702"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:51.998252" elapsed="0.006315"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:51.998185" elapsed="0.006483"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:52.008906" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:52.005292" elapsed="0.003661"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:52.004797" elapsed="0.004192"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:52.004760" elapsed="0.004254"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:52.009612" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:52.009191" 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-08-22T23:50:52.009954" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:52.009714" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:52.010524" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:52.010200" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:52.010038" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:52.009696" elapsed="0.000931"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:52.011151" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:52.010785" 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-08-22T23:50:52.011487" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:52.011249" elapsed="0.000378"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:52.012122" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:52.011821" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:52.011656" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:52.011232" 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-08-22T23:50:52.012362" elapsed="0.000370"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:52.013198" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:52.012896" 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-08-22T23:50:52.013378" 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-08-22T23:50:51.997242" elapsed="0.018592"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:52.016016" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:50:52.015905" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:52.015887" 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-08-22T23:50:52.016262" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:52.016335" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:50:52.018745" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:51.969408" elapsed="0.049367"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:52.018838" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:50:52.018991" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:51.964687" elapsed="0.054330"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:52.019681" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:52.019299" elapsed="0.000461">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:52.019088" elapsed="0.000747">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:52.019071" elapsed="0.000799">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:52.020089" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:52.019941" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:52.019925" elapsed="0.000245"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:51.961998" elapsed="0.058257">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:53.023339" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:53.022336" elapsed="0.001077"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:53.034918" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:53.034653" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:53.035372" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:53.035120" 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-08-22T23:50:53.053983" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:53.054138" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:53.054240" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:53.037675" elapsed="0.016592"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:53.035495" elapsed="0.018823"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:53.054773" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:53.054382" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:53.035473" elapsed="0.019504"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:53.062562" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:53.057264" elapsed="0.005364"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:53.056774" elapsed="0.005890"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:53.056732" elapsed="0.005958"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:53.065291" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:53.062967" elapsed="0.002371"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:53.062748" elapsed="0.002626"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:53.062730" elapsed="0.002669"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:53.065993" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:53.065570" 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-08-22T23:50:53.066325" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:53.066091" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:53.066885" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:53.066566" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:53.066408" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:53.066073" elapsed="0.000898"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:53.067492" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:53.067126" 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-08-22T23:50:53.067838" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:53.067606" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:53.068374" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:53.068078" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:53.067921" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:53.067573" 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-08-22T23:50:53.068622" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:53.069422" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:53.069133" 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-08-22T23:50:53.069614" 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-08-22T23:50:53.055803" elapsed="0.016320"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:53.072301" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-08-22T23:50:53.072193" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:53.072175" 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-08-22T23:50:53.072540" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:53.072669" elapsed="0.000018"/>
</return>
<msg time="2026-08-22T23:50:53.075039" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:53.030246" elapsed="0.044822"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:53.075128" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:53.075280" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:53.023942" elapsed="0.051365"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:53.075975" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:53.075601" elapsed="0.000450">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:53.075378" elapsed="0.000757">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:53.075361" elapsed="0.000810">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:53.076388" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:53.076243" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:53.076225" elapsed="0.000244"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:53.021157" elapsed="0.055392">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:54.079676" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:54.078666" elapsed="0.001082"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:54.091280" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:54.090888" elapsed="0.000467"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:54.091933" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:54.091567" 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-08-22T23:50:54.115021" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:54.115212" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:54.115360" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:54.094942" elapsed="0.020480"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:54.092099" elapsed="0.023422"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:54.115960" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:54.115616" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:54.092069" elapsed="0.024088"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:54.124428" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:54.118481" elapsed="0.006060"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:54.117981" elapsed="0.006673"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:54.117941" elapsed="0.006774"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:54.128371" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:54.125526" elapsed="0.002892"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:54.124842" elapsed="0.003612"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:54.124805" elapsed="0.003674"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:54.129070" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:54.128673" 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-08-22T23:50:54.129429" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:54.129169" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:54.129992" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:54.129688" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:54.129511" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:54.129151" elapsed="0.000926"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:54.130615" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:54.130235" 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-08-22T23:50:54.130946" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:54.130714" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:54.131482" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:54.131186" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:54.131029" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:54.130696" elapsed="0.000871"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:50:54.131733" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:54.132541" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:54.132244" 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-08-22T23:50:54.132738" elapsed="0.002418"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:50:54.116973" elapsed="0.018249"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:54.135403" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:50:54.135293" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:54.135274" 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-08-22T23:50:54.135661" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:54.135736" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:54.138094" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:54.084802" elapsed="0.053321"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:54.138183" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:54.138334" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:54.080239" elapsed="0.058122"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:54.139016" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:54.138655" elapsed="0.000437">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:54.138432" elapsed="0.000731">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:54.138415" elapsed="0.000783">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:54.139451" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:54.139304" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:54.139286" elapsed="0.000245"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:54.077482" elapsed="0.062147">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:55.141302" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:55.140864" elapsed="0.000473"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:55.148860" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:55.148550" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:55.149308" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:55.149061" 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-08-22T23:50:55.171566" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:55.171730" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:55.171832" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:55.151505" elapsed="0.020353"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:55.149427" elapsed="0.022475"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:55.172084" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:55.171931" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:55.149405" elapsed="0.022767"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:55.175648" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:55.173220" elapsed="0.002478"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:55.172998" elapsed="0.002735"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:55.172980" elapsed="0.002779"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:55.178407" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:55.176036" elapsed="0.002418"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:55.175815" elapsed="0.002675"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:55.175799" elapsed="0.002716"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:55.179095" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:55.178701" 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-08-22T23:50:55.179436" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:55.179194" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:55.180004" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:55.179698" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:55.179521" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:55.179176" elapsed="0.000915"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:55.180628" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:55.180248" 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-08-22T23:50:55.180975" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:55.180741" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:55.181515" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:55.181216" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:55.181058" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:55.180723" 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-08-22T23:50:55.181831" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:55.182657" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:55.182346" 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-08-22T23:50:55.182837" elapsed="0.002390"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:50:55.172529" elapsed="0.012763"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:55.185471" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-08-22T23:50:55.185363" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:55.185345" 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-08-22T23:50:55.185730" elapsed="0.000036"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:55.185819" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:55.188327" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:55.144069" elapsed="0.044288"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:55.188418" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:55.188570" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:55.141560" elapsed="0.047053"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:55.189264" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:55.188907" elapsed="0.000433">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:55.188698" elapsed="0.000713">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:55.188680" elapsed="0.000766">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:55.189676" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:55.189515" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:55.189498" elapsed="0.000259"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:55.140282" elapsed="0.049557">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:56.193092" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:56.192075" elapsed="0.001092"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:56.207349" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:56.206981" elapsed="0.000437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:56.208052" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:56.207695" 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-08-22T23:50:56.226705" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:56.227102" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:56.227346" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:56.210436" elapsed="0.016969"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:56.208247" elapsed="0.019253"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:56.227934" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:56.227558" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:56.208218" elapsed="0.019908"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:56.235928" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:56.230427" elapsed="0.005609"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:56.229940" elapsed="0.006175"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:56.229899" elapsed="0.006314"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:56.239029" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:56.236658" elapsed="0.002417"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:56.236345" elapsed="0.002767"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:56.236308" elapsed="0.002828"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:56.239714" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:56.239301" 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-08-22T23:50:56.240045" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:56.239813" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:56.240620" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:56.240298" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:56.240127" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:56.239795" elapsed="0.000911"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:56.241222" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:56.240861" 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-08-22T23:50:56.241549" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:56.241318" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:56.242103" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:56.241808" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:56.241648" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:56.241301" 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-08-22T23:50:56.242334" elapsed="0.000363"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:56.243152" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:56.242859" 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-08-22T23:50:56.243330" 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-08-22T23:50:56.228965" elapsed="0.016880"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:56.246027" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-08-22T23:50:56.245914" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:56.245896" 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-08-22T23:50:56.246268" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:56.246339" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:56.248843" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:56.200573" elapsed="0.048300"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:56.248970" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:50:56.249125" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:56.193721" elapsed="0.055432"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:56.249809" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:56.249437" elapsed="0.000444">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:56.249223" elapsed="0.000728">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:56.249207" elapsed="0.000779">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:56.250199" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:56.250055" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:56.250039" elapsed="0.000240"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:56.191026" elapsed="0.059334">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:57.253499" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:57.252502" elapsed="0.001070"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:57.265010" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:57.264738" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:57.265479" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:57.265226" 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-08-22T23:50:57.284753" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:57.285057" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:57.285319" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:57.267812" elapsed="0.017571"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:57.265623" elapsed="0.019857"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:57.285947" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:57.285552" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:57.265597" elapsed="0.020552"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:57.293800" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:57.288532" elapsed="0.005339"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:57.287990" elapsed="0.005933"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:57.287948" elapsed="0.006010"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:57.297723" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:57.294360" elapsed="0.003430"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:57.294046" elapsed="0.003795"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:57.294015" elapsed="0.003861"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:57.298695" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:57.298119" 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-08-22T23:50:57.299283" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:57.298944" elapsed="0.000433"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:57.300232" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:57.299753" elapsed="0.000521"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:57.299414" elapsed="0.000922"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:57.298917" elapsed="0.001451"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:57.301220" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:57.300667" 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-08-22T23:50:57.301733" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:57.301363" elapsed="0.000462"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:57.302561" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:57.302123" elapsed="0.000502"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:57.301868" elapsed="0.000820"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:57.301337" 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-08-22T23:50:57.302945" elapsed="0.000515"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:57.304202" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:57.303771" 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-08-22T23:50:57.304450" elapsed="0.002369"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:50:57.286973" elapsed="0.019913"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:57.307071" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:50:57.306957" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:57.306938" 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-08-22T23:50:57.307314" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:57.307387" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:50:57.310062" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:57.260100" elapsed="0.049993"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:57.310155" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:50:57.310309" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:57.254109" elapsed="0.056226"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:57.311011" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:57.310641" elapsed="0.000452">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:57.310406" elapsed="0.000761">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:57.310390" elapsed="0.000811">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:57.311421" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:57.311273" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:57.311256" elapsed="0.000245"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:57.251258" elapsed="0.060342">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:58.314647" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:58.313598" elapsed="0.001126"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:58.327227" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:58.326950" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:58.327698" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:58.327431" 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-08-22T23:50:58.347116" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:58.347400" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:58.347660" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:58.330168" elapsed="0.017554"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:58.327821" elapsed="0.020001"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:58.348281" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:58.347883" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:58.327798" elapsed="0.020689"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:58.356544" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:58.350882" elapsed="0.005814"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:58.350347" elapsed="0.006433"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:58.350306" elapsed="0.006531"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:58.359921" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:58.357469" elapsed="0.002499"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:58.356965" elapsed="0.003039"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:58.356927" elapsed="0.003101"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:58.360632" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:58.360200" 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-08-22T23:50:58.360972" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:58.360734" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:58.361544" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:58.361215" elapsed="0.000367"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:58.361054" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:58.360716" elapsed="0.000947"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:58.362186" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:58.361821" 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-08-22T23:50:58.362536" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:58.362284" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:58.363115" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:58.362819" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:58.362659" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:58.362266" 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-08-22T23:50:58.363349" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:58.364269" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:58.363974" 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-08-22T23:50:58.364454" 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-08-22T23:50:58.349325" elapsed="0.017585"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:58.367091" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:50:58.366981" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:58.366962" 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-08-22T23:50:58.367350" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:58.367424" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:58.369880" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:58.320885" elapsed="0.049025"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:58.369973" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:58.370126" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:58.315219" elapsed="0.054934"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:58.370823" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:58.370436" elapsed="0.000462">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:58.370225" elapsed="0.000744">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:58.370207" elapsed="0.000797">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:58.371222" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:58.371075" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:58.371058" elapsed="0.000245"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:58.312495" elapsed="0.058889">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:59.374748" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:59.373684" elapsed="0.001141"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:59.386300" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:59.386033" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:59.386781" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:59.386506" 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-08-22T23:50:59.405938" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:50:59.406161" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:50:59.406396" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:50:59.389107" elapsed="0.017327"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:59.386911" elapsed="0.019587"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:59.406784" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:59.406540" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:59.386883" elapsed="0.020029"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:59.411956" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:59.408360" elapsed="0.003665"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:59.408047" elapsed="0.004030"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:59.408020" elapsed="0.004093"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:50:59.415930" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:50:59.412503" elapsed="0.003492"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:59.412193" elapsed="0.003852"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:59.412170" elapsed="0.003910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:59.416935" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:59.416327" 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-08-22T23:50:59.417406" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:59.417074" elapsed="0.000414"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:59.418285" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:59.417855" elapsed="0.000468"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:59.417521" elapsed="0.000855"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:59.417048" elapsed="0.001357"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:50:59.418991" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:59.418596" 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-08-22T23:50:59.419321" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:59.419089" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:50:59.419879" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:50:59.419559" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-08-22T23:50:59.419402" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:59.419071" 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-08-22T23:50:59.420118" elapsed="0.000370"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:50:59.421059" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:50:59.420741" 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-08-22T23:50:59.421239" elapsed="0.002569"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:50:59.407425" elapsed="0.016457"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:50:59.424068" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-08-22T23:50:59.423954" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-08-22T23:50:59.423935" 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-08-22T23:50:59.424317" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:50:59.424388" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:50:59.426848" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:50:59.379996" elapsed="0.046881"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:50:59.426939" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:50:59.427091" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:50:59.375340" elapsed="0.051777"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:50:59.427854" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:50:59.427456" elapsed="0.000483">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:50:59.427243" elapsed="0.000772">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:50:59.427224" elapsed="0.000825">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:50:59.428266" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:50:59.428119" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:50:59.428103" elapsed="0.000243"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:50:59.372437" elapsed="0.055992">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:51:00.431537" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:51:00.430507" elapsed="0.001134"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:00.442074" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:51:00.441810" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:00.442525" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:51:00.442274" 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-08-22T23:51:00.461176" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:51:00.461501" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:51:00.461764" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:51:00.444828" elapsed="0.016996"/>
</kw>
<status status="PASS" start="2026-08-22T23:51:00.442689" elapsed="0.019234"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:00.462331" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:51:00.461987" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:00.442662" elapsed="0.019865"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:00.468896" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:51:00.464888" elapsed="0.004078"/>
</kw>
<status status="PASS" start="2026-08-22T23:51:00.464354" elapsed="0.004666"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:00.464313" elapsed="0.004743"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:00.472870" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:51:00.469488" elapsed="0.003447"/>
</kw>
<status status="PASS" start="2026-08-22T23:51:00.469137" elapsed="0.003849"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:00.469113" elapsed="0.003910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:51:00.473904" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:51:00.473267" 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-08-22T23:51:00.474379" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:51:00.474046" elapsed="0.000507"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:51:00.475102" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:51:00.474794" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-08-22T23:51:00.474592" elapsed="0.000577"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:00.474020" elapsed="0.001171"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:51:00.475740" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:51:00.475350" 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-08-22T23:51:00.476072" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:51:00.475840" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:51:00.476629" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:51:00.476313" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-22T23:51:00.476156" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:00.475822" 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-08-22T23:51:00.476871" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:51:00.477735" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:51:00.477389" 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-08-22T23:51:00.477914" elapsed="0.002382"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:51:00.463366" elapsed="0.016996"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:51:00.480549" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-08-22T23:51:00.480434" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:00.480416" 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-08-22T23:51:00.480812" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:51:00.480886" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:51:00.483381" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:51:00.435893" elapsed="0.047517"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:51:00.483472" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:51:00.483642" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:51:00.432202" elapsed="0.051468"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:51:00.484312" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:51:00.483949" elapsed="0.000445">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:51:00.483741" elapsed="0.000727">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:51:00.483724" elapsed="0.000778">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:00.484737" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:51:00.484572" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:51:00.484555" elapsed="0.000266"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:51:00.429373" elapsed="0.055530">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:51:01.488184" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:51:01.487015" elapsed="0.001242"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:01.500589" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:51:01.500230" elapsed="0.000425"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:01.501062" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:51:01.500812" 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-08-22T23:51:01.520135" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:51:01.520330" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:51:01.520491" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:51:01.503290" elapsed="0.017249"/>
</kw>
<status status="PASS" start="2026-08-22T23:51:01.501183" elapsed="0.019501"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:01.521095" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:51:01.520747" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:01.501161" elapsed="0.020134"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:01.529269" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:51:01.523646" elapsed="0.005734"/>
</kw>
<status status="PASS" start="2026-08-22T23:51:01.523114" elapsed="0.006348"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:01.523072" elapsed="0.006448"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:01.532139" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:51:01.529842" elapsed="0.002343"/>
</kw>
<status status="PASS" start="2026-08-22T23:51:01.529601" elapsed="0.002620"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:01.529579" elapsed="0.002667"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:51:01.532860" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:51:01.532417" 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-08-22T23:51:01.533200" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:51:01.532965" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:51:01.533758" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:51:01.533440" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-08-22T23:51:01.533282" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:01.532946" elapsed="0.000897"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:51:01.534359" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:51:01.534000" 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-08-22T23:51:01.534706" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:51:01.534455" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:51:01.535239" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:51:01.534943" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:51:01.534787" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:01.534437" 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-08-22T23:51:01.535470" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:51:01.536289" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:51:01.535994" 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-08-22T23:51:01.536507" elapsed="0.002339"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:51:01.522129" elapsed="0.016781"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:51:01.539089" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:51:01.538979" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:01.538961" 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-08-22T23:51:01.539330" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:51:01.539402" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:51:01.541817" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:51:01.493775" elapsed="0.048071"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:51:01.541906" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:51:01.542057" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:51:01.488797" elapsed="0.053286"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:51:01.542738" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:51:01.542359" elapsed="0.000462">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:51:01.542153" elapsed="0.000741">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:51:01.542136" elapsed="0.000793">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:01.543144" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:51:01.542999" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:51:01.542982" elapsed="0.000241"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:51:01.485882" elapsed="0.057425">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:51:02.546548" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:51:02.545515" elapsed="0.001144"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:02.559495" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:51:02.559228" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:02.559966" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:51:02.559717" 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-08-22T23:51:02.580107" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:51:02.580266" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:51:02.580368" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:51:02.562167" elapsed="0.018227"/>
</kw>
<status status="PASS" start="2026-08-22T23:51:02.560089" elapsed="0.020409"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.580710" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:51:02.580530" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:02.560066" elapsed="0.020734"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:02.588417" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:51:02.582861" elapsed="0.005672"/>
</kw>
<status status="PASS" start="2026-08-22T23:51:02.582302" elapsed="0.006357"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:02.582260" elapsed="0.006432"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:02.591273" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:51:02.588983" elapsed="0.002337"/>
</kw>
<status status="PASS" start="2026-08-22T23:51:02.588763" elapsed="0.002592"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:02.588744" elapsed="0.002635"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:51:02.591969" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:51:02.591554" 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-08-22T23:51:02.592319" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:51:02.592085" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:51:02.592876" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:51:02.592558" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-08-22T23:51:02.592401" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:02.592066" elapsed="0.000895"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:51:02.593475" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:51:02.593117" 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-08-22T23:51:02.593824" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:51:02.593572" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:51:02.594353" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:51:02.594061" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-08-22T23:51:02.593906" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:02.593554" 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-08-22T23:51:02.594588" elapsed="0.000361"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:51:02.595400" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:51:02.595107" 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-08-22T23:51:02.595581" elapsed="0.002504"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:51:02.581300" elapsed="0.016850"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:51:02.598328" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:51:02.598221" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:02.598203" 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-08-22T23:51:02.598567" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:51:02.598658" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:51:02.600991" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:51:02.553546" elapsed="0.047474"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:51:02.601079" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:51:02.601231" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:51:02.547269" elapsed="0.053988"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:51:02.601909" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:51:02.601532" elapsed="0.000545">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:51:02.601327" elapsed="0.000824">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:51:02.601310" elapsed="0.000876">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.602410" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:51:02.602259" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:51:02.602241" elapsed="0.000252"/>
</if>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:51:02.544357" elapsed="0.058223">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<msg time="2026-08-22T23:51:02.602695" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${node1_session}</arg>
<arg>${original_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:50:02.003487" elapsed="60.599309">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${node2_session}</arg>
<arg>${original_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.602985" elapsed="0.000022"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${node3_session}</arg>
<arg>${original_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.603166" elapsed="0.000021"/>
</kw>
<doc>Check if the data we just added into the cluster is really there</doc>
<status status="FAIL" start="2026-08-22T23:50:01.763777" elapsed="60.839559">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</test>
<test id="s1-s7-t8" name="Find_And_Shutdown_Device_Entity_Owner" 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-08-22T23:51:02.606884" elapsed="0.000231"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:51:02.606620" elapsed="0.000552"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:51:02.608186" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:51:02.608067" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:02.608048" 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-08-22T23:51:02.613270" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:51:02.613163" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:02.613145" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:51:02.614344" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:51:02.613958" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:51:02.614856" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:51:02.614529" elapsed="0.000353"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:51:02.614928" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:51:02.615083" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:51:02.613561" elapsed="0.001547"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:51:02.620810" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:51:02.620664" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:02.620645" 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-08-22T23:51:02.622098" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:51:02.621991" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:02.621972" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:51:02.622631" level="INFO">${karaf_connection_index} = 85</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:51:02.622309" elapsed="0.000350"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:51:02.623050" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:51:02.622821" elapsed="0.000255"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:51:02.661967" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:51:02.623562" elapsed="0.038505"/>
</kw>
<msg time="2026-08-22T23:51:02.662230" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:51:02.662277" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:51:02.623232" elapsed="0.039080"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:51:02.686981" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "F "i "n "d "_ "A "n "d "_ "S "h "u "t "d "o "w "n "_ "D "e "v "i "c "e "_ "E "n "t "i "t "y "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:51:02.662842" elapsed="0.024238"/>
</kw>
<msg time="2026-08-22T23:51:02.687235" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:51:02.687281" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "F "i "n "d "_ "A "n "d "_ "S "h "u "t "d "o "w "n "_ "D "e "v "i "c "e "_ "E "n "t "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:51:02.662479" elapsed="0.024837"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.687635" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:51:02.687393" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:02.687373" elapsed="0.000343"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:02.688157" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "F "i "n "d "_ "A "n "d "_ "S "h "u "t "d "o "w "n "_ "D "e "v "i "c "e "_ "E "n "t "i "t "y "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:51:02.687858" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.688503" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:51:02.688290" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:02.688272" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:51:02.688639" 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-08-22T23:51:02.691166" elapsed="0.000150"/>
</kw>
<msg time="2026-08-22T23:51:02.691380" 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-08-22T23:51:02.690074" 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-08-22T23:51:02.691810" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.692142" 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-08-22T23:51:02.689437" elapsed="0.002889"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:51:02.688913" elapsed="0.003477"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:51:02.621688" elapsed="0.070802"/>
</kw>
<msg time="2026-08-22T23:51:02.692588" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:51:02.692657" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "F "i "n "d "_ "A "n "d "_ "S "h "u "t "d "o "w "n "_ "D "e "v "i "c "e "_ "E "n "t "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:51:02.621028" elapsed="0.071667"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:51:02.692879" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:51:02.692772" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:02.692754" 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-08-22T23:51:02.693359" 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-08-22T23:51:02.693752" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:51:02.693825" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:51:02.620309" elapsed="0.073624"/>
</kw>
<msg time="2026-08-22T23:51:02.694029" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:51:02.694073" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "F "i "n "d "_ "A "n "d "_ "S "h "u "t "d "o "w "n "_ "D "e "v "i "c "e "_ "E "n "t "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:51:02.615487" elapsed="0.078622"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.694481" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:51:02.694185" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:02.694168" elapsed="0.000393"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:51:02.615347" elapsed="0.079238"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:51:02.700270" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:51:02.700161" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:02.700141" 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-08-22T23:51:02.701472" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:51:02.701364" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:02.701347" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:51:02.702000" level="INFO">${karaf_connection_index} = 86</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:51:02.701705" elapsed="0.000322"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:51:02.702400" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:51:02.702182" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:51:02.739616" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:51:02.702957" elapsed="0.036767"/>
</kw>
<msg time="2026-08-22T23:51:02.739888" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:51:02.739934" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:51:02.702624" elapsed="0.037344"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:51:02.758789" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "F "i "n "d "_ "A "n "d "_ "S "h "u "t "d "o "w "n "_ "D "e "v "i "c "e "_ "E "n "t "i "t "y "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:51:02.740477" elapsed="0.018412"/>
</kw>
<msg time="2026-08-22T23:51:02.759046" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:51:02.759091" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "F "i "n "d "_ "A "n "d "_ "S "h "u "t "d "o "w "n "_ "D "e "v "i "c "e "_ "E "n "t "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:51:02.740137" elapsed="0.018990"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.759429" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:51:02.759203" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:02.759183" elapsed="0.000327"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:02.760021" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "F "i "n "d "_ "A "n "d "_ "S "h "u "t "d "o "w "n "_ "D "e "v "i "c "e "_ "E "n "t "i "t "y "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:51:02.759673" elapsed="0.000414"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.760368" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:51:02.760154" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:02.760136" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:51:02.760480" 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-08-22T23:51:02.763140" elapsed="0.000151"/>
</kw>
<msg time="2026-08-22T23:51:02.763351" 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-08-22T23:51:02.762059" elapsed="0.001423"/>
</kw>
<kw name="Open 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-08-22T23:51:02.763774" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.764137" 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-08-22T23:51:02.761408" 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-08-22T23:51:02.760873" elapsed="0.003514"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:51:02.701067" elapsed="0.063417"/>
</kw>
<msg time="2026-08-22T23:51:02.764577" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:51:02.764652" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "F "i "n "d "_ "A "n "d "_ "S "h "u "t "d "o "w "n "_ "D "e "v "i "c "e "_ "E "n "t "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:51:02.700489" elapsed="0.064200"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:51:02.764871" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:51:02.764766" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:02.764748" elapsed="0.000204"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.765333" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.765681" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:51:02.765753" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:51:02.699818" elapsed="0.066044"/>
</kw>
<msg time="2026-08-22T23:51:02.765955" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:51:02.765998" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "F "i "n "d "_ "A "n "d "_ "S "h "u "t "d "o "w "n "_ "D "e "v "i "c "e "_ "E "n "t "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:51:02.694951" elapsed="0.071081"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.766353" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:51:02.766107" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:02.766089" elapsed="0.000340"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:51:02.694812" elapsed="0.071640"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:51:02.773821" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:51:02.773713" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:02.773693" 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-08-22T23:51:02.775034" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:51:02.774926" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:02.774908" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:51:02.775538" level="INFO">${karaf_connection_index} = 87</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:51:02.775242" elapsed="0.000323"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:51:02.775964" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:51:02.775740" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:51:02.812884" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:51:02.776530" elapsed="0.036501"/>
</kw>
<msg time="2026-08-22T23:51:02.813220" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:51:02.813266" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:51:02.776182" elapsed="0.037120"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:51:02.843359" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "F "i "n "d "_ "A "n "d "_ "S "h "u "t "d "o "w "n "_ "D "e "v "i "c "e "_ "E "n "t "i "t "y "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:51:02.813970" elapsed="0.029494"/>
</kw>
<msg time="2026-08-22T23:51:02.843654" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:51:02.843706" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "F "i "n "d "_ "A "n "d "_ "S "h "u "t "d "o "w "n "_ "D "e "v "i "c "e "_ "E "n "t "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:51:02.813565" elapsed="0.030177"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.844069" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:51:02.843830" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:02.843805" elapsed="0.000349"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:02.844628" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "F "i "n "d "_ "A "n "d "_ "S "h "u "t "d "o "w "n "_ "D "e "v "i "c "e "_ "E "n "t "i "t "y "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:51:02.844298" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.844988" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:51:02.844770" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:02.844751" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:51:02.845104" 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-08-22T23:51:02.847833" elapsed="0.000177"/>
</kw>
<msg time="2026-08-22T23:51:02.848075" 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-08-22T23:51:02.846699" elapsed="0.001512"/>
</kw>
<kw name="Open 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-08-22T23:51:02.848490" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.848917" 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-08-22T23:51:02.846007" elapsed="0.003128"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:51:02.845400" elapsed="0.003801"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:51:02.774623" elapsed="0.074679"/>
</kw>
<msg time="2026-08-22T23:51:02.849397" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:51:02.849444" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "F "i "n "d "_ "A "n "d "_ "S "h "u "t "d "o "w "n "_ "D "e "v "i "c "e "_ "E "n "t "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:51:02.774039" elapsed="0.075442"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:51:02.849707" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:51:02.849560" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:02.849541" 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 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.850253" 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-08-22T23:51:02.850593" elapsed="0.000116"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:51:02.850761" 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-08-22T23:51:02.773345" elapsed="0.077533"/>
</kw>
<msg time="2026-08-22T23:51:02.850976" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:51:02.851022" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "F "i "n "d "_ "A "n "d "_ "S "h "u "t "d "o "w "n "_ "D "e "v "i "c "e "_ "E "n "t "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:51:02.766759" elapsed="0.084299"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.851390" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:51:02.851137" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:02.851120" elapsed="0.000382"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:51:02.766574" elapsed="0.084956"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:51:02.615165" elapsed="0.236398"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:51:02.612803" elapsed="0.238891"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:51:02.607773" elapsed="0.243983"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:51:02.607321" elapsed="0.244481"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:51:02.604393" elapsed="0.247463"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-08-22T23:51:02.865203" level="INFO">${device_type} = netconf</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-08-22T23:51:02.864999" elapsed="0.000231"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:51:02.865381" elapsed="0.000204"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:51:02.865970" level="INFO">${device_id_prefix} = KeyedInstanceIdentifier{targetType=interface org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node, path=[org.opendaylight.yang.gen.v1.urn.t...</msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:51:02.865754" elapsed="0.000244"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:02.866495" level="INFO">KeyedInstanceIdentifier{targetType=interface org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node, path=[org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology, org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology[key=TopologyKey{_topologyId=Uri{_value=topology-netconf}}], org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node[key=NodeKey{_nodeId=Uri{_value=</msg>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:51:02.866221" elapsed="0.000326"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:51:02.866718" elapsed="0.000188"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:51:02.867264" level="INFO">${device_id_suffix} = }}]]}</msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:51:02.867058" elapsed="0.000231"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:02.867719" level="INFO">}}]]}</msg>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:51:02.867456" elapsed="0.000306"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:51:02.868255" level="INFO">${id} = KeyedInstanceIdentifier{targetType=interface org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node, path=[org.opendaylight.yang.gen.v1.urn.t...</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:51:02.867911" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:02.868698" level="INFO">KeyedInstanceIdentifier{targetType=interface org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node, path=[org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology, org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology[key=TopologyKey{_topologyId=Uri{_value=topology-netconf}}], org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node[key=NodeKey{_nodeId=Uri{_value=netconf-test-device}}]]}</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:51:02.868445" elapsed="0.000301"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:51:02.869178" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:51:02.868895" elapsed="0.000308"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:51:02.876195" elapsed="0.000212"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:51:02.881402" elapsed="0.000225"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-08-22T23:51:02.882093" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-08-22T23:51:02.881786" elapsed="0.000333"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:51:02.882940" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:51:02.882673" elapsed="0.000294"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:51:02.883014" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:51:02.883202" level="INFO">${ip} = 10.30.170.200</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:51:02.882303" elapsed="0.000923"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:51:02.883777" level="INFO">${entity_type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:51:02.883387" elapsed="0.000417"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-08-22T23:51:02.884313" level="INFO">${url} = http://10.30.170.200:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-08-22T23:51:02.883963" elapsed="0.000376"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-08-22T23:51:02.884761" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "org.opendaylight.mdsal.ServiceEntityType",
            "name": "KeyedInstanceIdentifier{targetType=interface org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node, path=[org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology, org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology[key=TopologyKey{_topologyId=Uri{_value=topology-netconf}}], org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node[key=NodeKey{_nodeId=Uri{_value=netconf-test-device}}]]}"
        }
    }
    </msg>
<msg time="2026-08-22T23:51:02.937816" level="INFO">Response &lt;Response [200]&gt;</msg>
<msg time="2026-08-22T23:51:02.937990" level="INFO">Response JSON {'odl-entity-owners:output': {}}</msg>
<msg time="2026-08-22T23:51:02.938202" level="FAIL">KeyError: 'candidate-nodes'</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-08-22T23:51:02.884502" elapsed="0.054298">KeyError: 'candidate-nodes'</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.939218" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.939658" elapsed="0.000057"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.940089" elapsed="0.000046"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.940456" elapsed="0.000045"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.940905" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.941269" elapsed="0.000044"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.941890" elapsed="0.000049"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.942274" elapsed="0.000045"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.942664" elapsed="0.000048"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-08-22T23:51:02.941570" elapsed="0.001218"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-08-22T23:51:02.941417" elapsed="0.001429"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.943161" elapsed="0.000047"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-08-22T23:51:02.943297" elapsed="0.000036"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-08-22T23:51:02.880914" elapsed="0.062640">KeyError: 'candidate-nodes'</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-08-22T23:51:02.943744" elapsed="0.000037"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and KeyedInstanceIdentifier{targetType=interface org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node, path=[org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology, org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology[key=TopologyKey{_topologyId=Uri{_value=topology-netconf}}], org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node[key=NodeKey{_nodeId=Uri{_value=netconf-test-device}}]]}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-08-22T23:51:02.873804" elapsed="0.070217">KeyError: 'candidate-nodes'</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.944425" elapsed="0.000048"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and KeyedInstanceIdentifier{targetType=interface org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node, path=[org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology, org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology[key=TopologyKey{_topologyId=Uri{_value=topology-netconf}}], org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node[key=NodeKey{_nodeId=Uri{_value=netconf-test-device}}]]}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.951435" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.951648" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-08-22T23:51:02.951718" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type netconf. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-08-22T23:51:02.864433" elapsed="0.087392">KeyError: 'candidate-nodes'</status>
</kw>
<msg time="2026-08-22T23:51:02.951938" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:51:02.951984" level="INFO">${results} = KeyError: 'candidate-nodes'</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:51:02.863869" elapsed="0.088138"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-08-22T23:51:02.952239" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:51:02.952121" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:02.952096" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:51:02.953634" elapsed="0.000212"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-08-22T23:51:02.954306" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-08-22T23:51:02.954000" elapsed="0.000332"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:51:02.955139" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:51:02.954873" elapsed="0.000293"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:51:02.955215" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:51:02.955364" level="INFO">${ip} = 10.30.170.200</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:51:02.954516" elapsed="0.000873"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:51:02.955939" level="INFO">${entity_type} = netconf-node/netconf-test-device</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:51:02.955546" elapsed="0.000420"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-08-22T23:51:02.956497" level="INFO">${url} = http://10.30.170.200:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-08-22T23:51:02.956120" elapsed="0.000403"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-08-22T23:51:02.956901" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "netconf-node/netconf-test-device",
            "name": "netconf-test-device"
        }
    }
    </msg>
<msg time="2026-08-22T23:51:02.965025" level="INFO">Response &lt;Response [200]&gt;</msg>
<msg time="2026-08-22T23:51:02.965096" level="INFO">Response JSON {'odl-entity-owners:output': {}}</msg>
<msg time="2026-08-22T23:51:02.965183" level="FAIL">KeyError: 'candidate-nodes'</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-08-22T23:51:02.956701" elapsed="0.008672">KeyError: 'candidate-nodes'</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.965549" elapsed="0.000026"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.965744" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.965907" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.966071" elapsed="0.000019"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.966239" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.966440" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.966722" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.966892" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.967050" elapsed="0.000019"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-08-22T23:51:02.966576" elapsed="0.000526"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-08-22T23:51:02.966505" elapsed="0.000624"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.967267" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-08-22T23:51:02.967326" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type netconf. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-08-22T23:51:02.953070" elapsed="0.014365">KeyError: 'candidate-nodes'</status>
</kw>
<msg time="2026-08-22T23:51:02.967549" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:51:02.967598" level="INFO">${results} = KeyError: 'candidate-nodes'</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:51:02.952455" elapsed="0.015186"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-08-22T23:51:02.968263" level="FAIL">Could not parse owner and candidates for device netconf-test-device</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-08-22T23:51:02.967938" elapsed="0.000387">Could not parse owner and candidates for device netconf-test-device</status>
</kw>
<status status="FAIL" start="2026-08-22T23:51:02.967724" elapsed="0.000663">Could not parse owner and candidates for device netconf-test-device</status>
</branch>
<status status="FAIL" start="2026-08-22T23:51:02.967706" elapsed="0.000719">Could not parse owner and candidates for device netconf-test-device</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-08-22T23:51:02.968523" elapsed="0.000018"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type netconf. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-08-22T23:51:02.863276" elapsed="0.105367">Could not parse owner and candidates for device netconf-test-device</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.968822" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.968988" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-08-22T23:51:02.969050" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${followers}</var>
<arg>${DEVICE NAME}</arg>
<arg>netconf</arg>
<arg>1</arg>
<doc>Returns the owner and a list of successors for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-08-22T23:51:02.860666" elapsed="0.108482">Could not parse owner and candidates for device netconf-test-device</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${followers}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.969335" elapsed="0.000022"/>
</kw>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${followers}</arg>
<arg>2</arg>
<arg>Wrong count of followers returned</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.969515" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_device_owner}</arg>
<arg>${owner}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.969779" elapsed="0.000029"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${follower1}</arg>
<arg>${followers}[0]</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.970016" elapsed="0.000027"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${follower2}</arg>
<arg>${followers}[1]</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.970250" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<var>${original_device_owner_session}</var>
<arg>member_index=${original_device_owner}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.970981" elapsed="0.000037"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<var>${follower1_session}</var>
<arg>member_index=${follower1}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.971308" elapsed="0.000122"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<var>${follower2_session}</var>
<arg>member_index=${follower2}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.971880" elapsed="0.000034"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_device_owner_session}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.972132" elapsed="0.000029"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${follower1_session}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.972369" elapsed="0.000028"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${follower2_session}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.972638" elapsed="0.000030"/>
</kw>
<kw name="Kill_Single_Member" owner="ClusterManagement">
<arg>${owner}</arg>
<doc>Convenience keyword that kills the specified member of the cluster.
The KW will return a list of available members: ${updated index_list}=${original_index_list}-${member}</doc>
<status status="NOT RUN" start="2026-08-22T23:51:02.972991" elapsed="0.000033"/>
</kw>
<doc>Simulate a failure of the owner of the entity that represents the device.</doc>
<status status="FAIL" start="2026-08-22T23:51:02.603775" elapsed="0.369437">Could not parse owner and candidates for device netconf-test-device</status>
</test>
<test id="s1-s7-t9" name="Wait_For_New_Owner_To_Appear" line="161">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:51:02.977860" elapsed="0.000215"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:51:02.977571" 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-08-22T23:51:02.979128" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:51:02.979017" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:02.978998" 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-08-22T23:51:02.984226" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:51:02.984119" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:02.984101" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:51:02.985354" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:51:02.984968" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:51:02.985867" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:51:02.985538" elapsed="0.000355"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:51:02.985937" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:51:02.986093" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:51:02.984518" 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-08-22T23:51:02.991722" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:51:02.991610" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:02.991576" 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-08-22T23:51:02.993009" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:51:02.992873" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:02.992854" elapsed="0.000227"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:51:02.993524" level="INFO">${karaf_connection_index} = 85</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:51:02.993223" elapsed="0.000327"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:51:02.993950" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:51:02.993725" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:51:03.027111" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:51:02.994462" elapsed="0.032774"/>
</kw>
<msg time="2026-08-22T23:51:03.027417" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:51:03.027464" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:51:02.994132" elapsed="0.033367"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:51:03.046555" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "N "e "w "_ "O "w "n "e "r "_ "T "o "_ "A "p "p "e "a "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:51:03.028092" elapsed="0.018732"/>
</kw>
<msg time="2026-08-22T23:51:03.047074" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:51:03.047145" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "N "e "w "_ "O "w "n "e "r "_ "T "o "_ "A "p "p "e "a "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-08-22T23:51:03.027718" elapsed="0.019481"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:03.047700" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:51:03.047325" elapsed="0.000461"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:03.047292" elapsed="0.000532"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:03.048493" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "N "e "w "_ "O "w "n "e "r "_ "T "o "_ "A "p "p "e "a "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:51:03.048037" elapsed="0.000557"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:03.049052" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:51:03.048726" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:03.048698" elapsed="0.000473"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:51:03.049224" 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-08-22T23:51:03.052953" elapsed="0.000216"/>
</kw>
<msg time="2026-08-22T23:51:03.053255" 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-08-22T23:51:03.051440" elapsed="0.002002"/>
</kw>
<kw name="Open 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-08-22T23:51:03.053851" elapsed="0.000108"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:03.054321" 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-08-22T23:51:03.050528" elapsed="0.004155"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:51:03.049656" elapsed="0.005122"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:51:02.992550" elapsed="0.062369"/>
</kw>
<msg time="2026-08-22T23:51:03.055054" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:51:03.055117" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "N "e "w "_ "O "w "n "e "r "_ "T "o "_ "A "p "p "e "a "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-08-22T23:51:02.991972" elapsed="0.063198"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:51:03.055428" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:51:03.055279" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:03.055252" 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-08-22T23:51:03.056068" 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-08-22T23:51:03.056408" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:51:03.056480" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:51:02.991256" elapsed="0.065339"/>
</kw>
<msg time="2026-08-22T23:51:03.056711" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:51:03.056755" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "N "e "w "_ "O "w "n "e "r "_ "T "o "_ "A "p "p "e "a "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-08-22T23:51:02.986478" elapsed="0.070314"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:03.057119" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:51:03.056867" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:03.056850" elapsed="0.000346"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:51:02.986341" elapsed="0.070878"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:51:03.063027" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:51:03.062917" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:03.062897" elapsed="0.000317"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:51:03.064394" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:51:03.064284" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:03.064266" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:51:03.064931" level="INFO">${karaf_connection_index} = 86</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:51:03.064625" elapsed="0.000333"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:51:03.065335" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:51:03.065114" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:51:03.098353" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:51:03.065870" elapsed="0.032584"/>
</kw>
<msg time="2026-08-22T23:51:03.098651" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:51:03.098699" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:51:03.065517" elapsed="0.033217"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:51:03.117849" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "N "e "w "_ "O "w "n "e "r "_ "T "o "_ "A "p "p "e "a "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:51:03.099241" elapsed="0.018708"/>
</kw>
<msg time="2026-08-22T23:51:03.118112" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:51:03.118158" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "N "e "w "_ "O "w "n "e "r "_ "T "o "_ "A "p "p "e "a "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-08-22T23:51:03.098903" elapsed="0.019291"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:03.118493" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:51:03.118270" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:03.118250" elapsed="0.000328"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:03.119044" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "N "e "w "_ "O "w "n "e "r "_ "T "o "_ "A "p "p "e "a "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:51:03.118742" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:03.119389" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:51:03.119175" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:03.119157" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:51:03.119503" 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-08-22T23:51:03.122063" elapsed="0.000155"/>
</kw>
<msg time="2026-08-22T23:51:03.122281" 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-08-22T23:51:03.120986" 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-08-22T23:51:03.122717" elapsed="0.000085"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:03.123086" 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-08-22T23:51:03.120350" elapsed="0.002927"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:51:03.119784" elapsed="0.003558"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:51:03.063981" elapsed="0.059459"/>
</kw>
<msg time="2026-08-22T23:51:03.123534" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:51:03.123581" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "N "e "w "_ "O "w "n "e "r "_ "T "o "_ "A "p "p "e "a "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-08-22T23:51:03.063391" elapsed="0.060252"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:51:03.123836" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:51:03.123725" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:03.123706" elapsed="0.000234"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:03.124393" 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-08-22T23:51:03.124755" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:51:03.124828" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:51:03.062483" elapsed="0.062457"/>
</kw>
<msg time="2026-08-22T23:51:03.125034" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:51:03.125078" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "N "e "w "_ "O "w "n "e "r "_ "T "o "_ "A "p "p "e "a "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-08-22T23:51:03.057485" elapsed="0.067628"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:03.125438" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:51:03.125189" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:03.125171" elapsed="0.000347"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:51:03.057348" elapsed="0.068195"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:51:03.131292" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:51:03.131182" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:03.131162" 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-08-22T23:51:03.132584" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:51:03.132475" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:03.132457" elapsed="0.000221"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:51:03.133118" level="INFO">${karaf_connection_index} = 87</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:51:03.132820" elapsed="0.000325"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:51:03.133516" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:51:03.133298" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:51:03.169733" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:51:03.134047" elapsed="0.035828"/>
</kw>
<msg time="2026-08-22T23:51:03.170101" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:51:03.170167" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:51:03.133716" elapsed="0.036499"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:51:03.190372" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "N "e "w "_ "O "w "n "e "r "_ "T "o "_ "A "p "p "e "a "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:51:03.170951" elapsed="0.019572"/>
</kw>
<msg time="2026-08-22T23:51:03.190799" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:51:03.190867" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "N "e "w "_ "O "w "n "e "r "_ "T "o "_ "A "p "p "e "a "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-08-22T23:51:03.170449" elapsed="0.020468"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:03.191346" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:51:03.191025" elapsed="0.000401"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:03.190998" elapsed="0.000462"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:03.192125" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "N "e "w "_ "O "w "n "e "r "_ "T "o "_ "A "p "p "e "a "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:51:03.191695" 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-08-22T23:51:03.192641" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:51:03.192308" elapsed="0.000424"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:03.192283" elapsed="0.000483"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:51:03.192814" 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-08-22T23:51:03.196033" elapsed="0.000156"/>
</kw>
<msg time="2026-08-22T23:51:03.196250" 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-08-22T23:51:03.194893" 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-08-22T23:51:03.196710" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:03.197106" 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-08-22T23:51:03.194078" elapsed="0.003222"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:51:03.193234" elapsed="0.004134"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:51:03.132167" elapsed="0.065301"/>
</kw>
<msg time="2026-08-22T23:51:03.197651" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:51:03.197706" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "N "e "w "_ "O "w "n "e "r "_ "T "o "_ "A "p "p "e "a "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-08-22T23:51:03.131512" elapsed="0.066232"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:51:03.197935" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:51:03.197826" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:03.197807" 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-08-22T23:51:03.198410" 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-08-22T23:51:03.198764" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:51:03.198838" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:51:03.130835" elapsed="0.068113"/>
</kw>
<msg time="2026-08-22T23:51:03.199043" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:51:03.199087" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "W "a "i "t "_ "F "o "r "_ "N "e "w "_ "O "w "n "e "r "_ "T "o "_ "A "p "p "e "a "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-08-22T23:51:03.125917" elapsed="0.073205"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:03.199445" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:51:03.199198" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:51:03.199181" elapsed="0.000342"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:51:03.125775" elapsed="0.073772"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:51:02.986168" elapsed="0.213417"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:51:02.983756" elapsed="0.215986"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:51:02.978724" elapsed="0.221077"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:51:02.978279" elapsed="0.221569"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:51:02.974471" elapsed="0.225433"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:03.205319" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:03.200893" elapsed="0.004466">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:03.205536" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:03.205753" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:03.214219" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:03.214452" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:03.200588" elapsed="0.013985">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:04.225003" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:04.216094" elapsed="0.008972">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:04.225322" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:04.225670" elapsed="0.000032"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:04.235899" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:04.236093" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:04.215197" elapsed="0.021021">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:05.245405" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:05.237863" elapsed="0.007608">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:05.245751" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:05.246003" elapsed="0.000029"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:05.255494" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:05.255703" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:05.236960" elapsed="0.018876">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:06.265632" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:06.257628" elapsed="0.008078">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:06.265974" elapsed="0.000033"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:06.266225" elapsed="0.000029"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:06.275865" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:06.276066" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:06.256644" elapsed="0.019549">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:07.287843" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:07.277916" elapsed="0.009988">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:07.288158" elapsed="0.000026"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:07.288340" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:07.296895" elapsed="0.000037"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:07.297242" elapsed="0.000023"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:07.276977" elapsed="0.020414">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:08.308223" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:08.299031" elapsed="0.009241">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:08.308464" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:08.308661" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:08.317023" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:08.317215" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:08.298077" elapsed="0.019261">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:09.327785" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:09.318803" elapsed="0.009029">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:09.328021" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:09.328199" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:09.336661" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:09.336856" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:09.317960" elapsed="0.019017">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:10.347568" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:10.338140" elapsed="0.009548">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:10.347961" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:10.348139" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:10.356531" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:10.356736" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:10.337436" elapsed="0.019413">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:11.366394" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:11.358461" elapsed="0.008000">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:11.366884" elapsed="0.000035"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:11.367154" elapsed="0.000030"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:11.377061" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:11.377258" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:11.357535" elapsed="0.019854">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:12.386614" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:12.379097" elapsed="0.007584">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:12.386943" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:12.387193" elapsed="0.000029"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:12.396401" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:12.396615" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:12.378145" elapsed="0.018598">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:13.408060" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:13.398347" elapsed="0.009763">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:13.408303" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:13.408481" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:13.417025" elapsed="0.000042"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:13.417314" elapsed="0.000024"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:13.397429" elapsed="0.020027">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:14.427431" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:14.419043" elapsed="0.008454">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:14.427778" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:14.428029" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:14.437810" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:14.438001" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:14.418137" elapsed="0.020065">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:15.449784" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:15.439711" elapsed="0.010168">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:15.450078" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:15.450256" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:15.458662" elapsed="0.000027"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:15.458854" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:15.438867" elapsed="0.020111">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:16.469800" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:16.460713" elapsed="0.009142">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:16.470089" elapsed="0.000024"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:16.470267" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:16.478848" elapsed="0.000032"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:16.479050" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:16.459775" elapsed="0.019408">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:17.488407" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:17.480851" elapsed="0.007621">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:17.488799" elapsed="0.000035"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:17.489059" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:17.498519" elapsed="0.000027"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:17.498723" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:17.479930" elapsed="0.018916">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:18.510218" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:18.500816" elapsed="0.009470">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:18.510549" elapsed="0.000091"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:18.510866" elapsed="0.000027"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:18.519368" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:18.519722" elapsed="0.000023"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:18.499829" elapsed="0.020020">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:19.530671" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:19.521693" elapsed="0.009030">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:19.530912" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:19.531089" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:19.539728" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:19.539921" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:19.520735" elapsed="0.019308">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:20.549019" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:20.542102" elapsed="0.006990">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:20.549357" elapsed="0.000031"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:20.549626" elapsed="0.000030"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:20.558757" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:20.558983" elapsed="0.000023"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:20.541100" elapsed="0.018019">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:21.569966" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:21.560965" elapsed="0.009049">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:21.570205" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:21.570381" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:21.578848" elapsed="0.000027"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:21.579038" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:21.560043" elapsed="0.019116">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:22.589522" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:22.580426" elapsed="0.009232">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:22.590197" elapsed="0.000058"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:22.590662" elapsed="0.000049"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:22.599464" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:22.599826" elapsed="0.000026"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:22.579766" elapsed="0.020195">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:23.605444" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:23.601096" elapsed="0.004403">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:23.605701" elapsed="0.000024"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:23.605878" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:23.614242" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:23.614434" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:23.600525" elapsed="0.014042">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:24.625751" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:24.616247" elapsed="0.009553">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:24.625989" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:24.626165" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:24.634663" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:24.634857" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:24.615269" elapsed="0.019714">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:25.645886" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:25.636630" elapsed="0.009304">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:25.646127" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:25.646307" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:25.654991" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:25.655184" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:25.635734" elapsed="0.019572">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:26.666429" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:26.656816" elapsed="0.009662">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:26.666764" elapsed="0.000024"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:26.666945" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:26.675288" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:26.675479" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:26.655959" elapsed="0.019656">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:27.687077" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:27.677162" elapsed="0.009981">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:27.687409" elapsed="0.000031"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:27.687679" elapsed="0.000030"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:27.697936" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:27.698128" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:27.676270" elapsed="0.021980">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:28.709799" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:28.699950" elapsed="0.009951">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:28.710432" elapsed="0.000062"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:28.710898" elapsed="0.000048"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:28.722930" elapsed="0.000040"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:28.723199" elapsed="0.000029"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:28.698988" elapsed="0.024357">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:29.735427" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:29.725027" elapsed="0.010464">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:29.735769" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:29.736018" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:29.745528" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:29.745737" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:29.724101" elapsed="0.021852">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:30.757444" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:30.747694" elapsed="0.009800">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:30.757717" elapsed="0.000024"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:30.757899" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:30.766456" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:30.766667" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:30.746728" elapsed="0.020072">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:31.776874" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:31.768481" elapsed="0.008444">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:31.777124" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:31.777300" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:31.786112" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:31.786312" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:31.767516" elapsed="0.018926">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:32.797526" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:32.787993" elapsed="0.009597">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:32.797784" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:32.797964" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:32.806474" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:32.806681" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:32.787114" elapsed="0.019694">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:33.817670" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:33.808066" elapsed="0.009647">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:33.817895" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:33.818075" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:33.826609" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:33.826882" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:33.807321" elapsed="0.019680">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:34.838236" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:34.828470" elapsed="0.009864">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:34.838804" elapsed="0.000051"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:34.839254" elapsed="0.000051"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:34.847948" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:34.848144" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:34.827672" elapsed="0.020596">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:35.859895" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:35.849904" elapsed="0.010045">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:35.860143" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:35.860323" elapsed="0.000019"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:35.868831" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:35.869028" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:35.848949" elapsed="0.020213">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:36.881216" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:36.870761" elapsed="0.010556">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:36.881566" elapsed="0.000037"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:36.881760" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:36.890290" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:36.890492" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:36.869882" elapsed="0.020755">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:37.900670" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:37.892282" elapsed="0.008435">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:37.900908" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:37.901087" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:37.909621" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:37.909917" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:37.891381" elapsed="0.018662">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:38.920376" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:38.911657" elapsed="0.008768">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:38.920628" elapsed="0.000024"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:38.920809" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:38.929282" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:38.929478" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:38.910757" elapsed="0.018859">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:39.940960" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:39.931067" elapsed="0.009940">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:39.941197" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:39.941373" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:39.949846" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:39.950039" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:39.930246" elapsed="0.019914">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:40.961378" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:40.951762" elapsed="0.009712">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:40.961687" elapsed="0.000024"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:40.961866" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:40.970219" elapsed="0.000027"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:40.970412" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:40.950890" elapsed="0.019644">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:41.979989" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:41.972344" elapsed="0.007710">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:41.980450" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:41.980723" elapsed="0.000030"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:41.991329" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:41.991540" elapsed="0.000023"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:41.971362" elapsed="0.020333">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:43.003400" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:42.993214" elapsed="0.010282">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:43.003935" elapsed="0.000052"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:43.004343" elapsed="0.000045"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:43.014842" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:43.015035" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:42.992354" elapsed="0.022800">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:44.026689" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:44.016775" elapsed="0.009992">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:44.026962" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:44.027146" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:44.035556" elapsed="0.000039"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:44.035763" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:44.015853" elapsed="0.020037">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:45.045862" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:45.037504" elapsed="0.008421">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:45.046185" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:45.046451" elapsed="0.000029"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:45.057262" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:45.057458" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:45.036621" elapsed="0.021139">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:46.069571" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:46.059404" elapsed="0.010287">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:46.070101" elapsed="0.000051"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:46.070504" elapsed="0.000045"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:46.079552" elapsed="0.000039"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:46.079759" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:46.058454" elapsed="0.021427">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:47.088653" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:47.081393" elapsed="0.007322">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:47.088979" elapsed="0.000031"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:47.089229" elapsed="0.000027"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:47.099874" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:47.100067" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:47.080515" elapsed="0.019673">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:48.111392" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:48.101901" elapsed="0.009585">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:48.111923" elapsed="0.000050"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:48.112321" elapsed="0.000045"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:48.121514" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:48.121728" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:48.100919" elapsed="0.020934">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:49.131512" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:49.123480" elapsed="0.008110">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:49.131855" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:49.132105" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:49.141735" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:49.142003" elapsed="0.000023"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:49.122610" elapsed="0.019519">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:50.153532" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:50.143824" elapsed="0.009827">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:50.154062" elapsed="0.000051"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:50.154459" elapsed="0.000046"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:50.164345" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:50.164538" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:50.142815" elapsed="0.021862">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:51.171896" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:51.165884" elapsed="0.006076">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:51.172222" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:51.172474" elapsed="0.000029"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:51.184250" elapsed="0.000039"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:51.184520" elapsed="0.000030"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:51.165209" elapsed="0.019498">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:52.196443" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:52.186355" elapsed="0.010202">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:52.196995" elapsed="0.000051"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:52.197391" elapsed="0.000045"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:52.207886" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:52.208080" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:52.185443" elapsed="0.022759">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:53.213559" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:53.209189" elapsed="0.004428">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:53.213810" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:53.213986" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:53.222434" elapsed="0.000027"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:53.222725" elapsed="0.000023"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:53.208678" elapsed="0.014185">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:54.228219" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:54.223873" elapsed="0.004395">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:54.228458" elapsed="0.000026"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:54.228652" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:54.237090" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:54.237286" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:54.223325" elapsed="0.014102">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:55.249348" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:55.238718" elapsed="0.010685">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:55.249639" elapsed="0.000026"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:55.249823" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:55.259668" elapsed="0.000040"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:55.259935" elapsed="0.000029"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:55.238034" elapsed="0.022090">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:56.272294" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:56.261935" elapsed="0.010413">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:56.272548" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:56.272749" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:56.281377" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:56.281594" elapsed="0.000023"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:56.260903" elapsed="0.020829">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:57.293847" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:57.283732" elapsed="0.010211">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:57.294481" elapsed="0.000052"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:57.294920" elapsed="0.000046"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:57.305199" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:57.305394" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:57.282708" elapsed="0.022813">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:58.317935" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:58.307121" elapsed="0.010920">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:58.318490" elapsed="0.000055"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:58.318961" elapsed="0.000050"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:58.328556" elapsed="0.000045"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:58.328771" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:58.306183" elapsed="0.022718">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:51:59.340183" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:51:59.330473" elapsed="0.009806">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:59.340716" elapsed="0.000051"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:59.341119" elapsed="0.000046"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:59.351295" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:51:59.351491" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:51:59.329576" elapsed="0.022071">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:00.363015" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:00.353072" elapsed="0.010041">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:00.363525" elapsed="0.000076"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:00.363954" elapsed="0.000046"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:00.374340" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:00.374534" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:00.352233" elapsed="0.022523">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:01.387432" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:01.376708" elapsed="0.010828">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:01.387990" elapsed="0.000050"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:01.388387" elapsed="0.000044"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:01.398090" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:01.398293" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:01.375634" elapsed="0.022797">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:02.409858" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:02.400111" elapsed="0.009855">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:02.410258" elapsed="0.000031"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:02.410507" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:02.425075" elapsed="0.000065"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:02.425555" elapsed="0.000075"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:02.399125" elapsed="0.026732">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:03.437149" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:03.427484" elapsed="0.009765">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:03.437491" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:03.437685" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:03.446150" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:03.446350" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:03.426617" elapsed="0.019862">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:04.457970" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:04.448232" elapsed="0.009795">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:04.458258" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:04.458438" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:04.467000" elapsed="0.000033"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:04.467302" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:04.447209" elapsed="0.020230">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:05.476884" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:05.469256" elapsed="0.007696">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:05.477235" elapsed="0.000033"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:05.477497" elapsed="0.000029"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:05.487015" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:05.487213" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:05.468258" elapsed="0.019082">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:06.498896" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:06.488967" elapsed="0.010040">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:06.499514" elapsed="0.000056"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:06.499982" elapsed="0.000048"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:06.508767" elapsed="0.000031"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:06.508967" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:06.488073" elapsed="0.021022">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:07.520536" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:07.510986" elapsed="0.009626">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:07.520882" elapsed="0.000027"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:07.521067" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:07.529520" elapsed="0.000033"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:07.529735" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:07.510031" elapsed="0.019835">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:08.541176" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:08.531430" elapsed="0.009847">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:08.541617" elapsed="0.000037"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:08.541876" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:08.551836" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:08.552141" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:08.530611" elapsed="0.021663">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:09.563656" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:09.553983" elapsed="0.009771">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:09.564160" elapsed="0.000051"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:09.564557" elapsed="0.000073"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:09.574132" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:09.574329" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:09.553018" elapsed="0.021434">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:10.585833" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:10.575730" elapsed="0.010196">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:10.586325" elapsed="0.000049"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:10.586746" elapsed="0.000047"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:10.597395" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:10.597601" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:10.574991" elapsed="0.022729">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:11.608497" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:11.599389" elapsed="0.009234">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:11.609013" elapsed="0.000043"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:11.609372" elapsed="0.000040"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:11.619172" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:11.619367" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:11.598356" elapsed="0.021137">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:12.629997" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:12.621036" elapsed="0.009006">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:12.630339" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:12.630518" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:12.639039" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:12.639233" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:12.620132" elapsed="0.019224">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:13.649977" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:13.640886" elapsed="0.009155">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:13.650301" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:13.650551" elapsed="0.000046"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:13.661914" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:13.662109" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:13.640041" elapsed="0.022192">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:14.672977" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:14.663887" elapsed="0.009138">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:14.673212" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:14.673388" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:14.681761" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:14.681955" elapsed="0.000020"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:14.662953" elapsed="0.019125">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:15.691237" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:15.683705" elapsed="0.007596">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:15.691558" elapsed="0.000050"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:15.691830" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:15.702452" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:15.702666" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:15.682818" elapsed="0.020088">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:16.715183" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:16.704764" elapsed="0.010537">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:16.715806" elapsed="0.000026"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:16.715990" elapsed="0.000019"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:16.724455" elapsed="0.000031"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:16.724670" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:16.703835" elapsed="0.020968">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:17.735197" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:17.726475" elapsed="0.008792">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:17.735537" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:17.735825" elapsed="0.000031"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:17.746374" elapsed="0.000032"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:17.746597" elapsed="0.000023"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:17.725499" elapsed="0.021233">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:18.758660" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:18.748407" elapsed="0.010303">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:18.758900" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:18.759075" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:18.767531" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:18.767741" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:18.747468" elapsed="0.020406">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:19.777494" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:19.769559" elapsed="0.008002">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:19.777846" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:19.778096" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:19.788669" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:19.788968" elapsed="0.000023"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:19.768567" elapsed="0.020532">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:20.796324" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:20.790370" elapsed="0.006021">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:20.796659" elapsed="0.000029"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:20.796897" elapsed="0.000026"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:20.808526" elapsed="0.000038"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:20.808802" elapsed="0.000028"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:20.789693" elapsed="0.019274">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:21.820347" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:21.810611" elapsed="0.009835">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:21.820683" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:21.820861" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:21.829385" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:21.829589" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:21.809715" elapsed="0.020002">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:22.839455" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:22.831349" elapsed="0.008170">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:22.839798" elapsed="0.000031"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:22.840051" elapsed="0.000027"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:22.850723" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:22.850916" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:22.830405" elapsed="0.020635">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:23.860165" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:23.852657" elapsed="0.007577">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:23.860512" elapsed="0.000033"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:23.860793" elapsed="0.000030"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:23.871504" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:23.871818" elapsed="0.000023"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:23.851767" elapsed="0.020184">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:24.882816" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:24.873675" elapsed="0.009232">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:24.883253" elapsed="0.000037"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:24.883558" elapsed="0.000069"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:24.893262" elapsed="0.000032"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:24.893465" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:24.872735" elapsed="0.020877">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:25.904097" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:25.895244" elapsed="0.008902">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:25.904339" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:25.904516" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:25.912891" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:25.913082" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:25.894327" elapsed="0.018877">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:26.921864" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:26.914741" elapsed="0.007194">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:26.922196" elapsed="0.000031"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:26.922446" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:26.932960" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:26.933154" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:26.913897" elapsed="0.019394">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:27.941907" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:27.934672" elapsed="0.007297">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:27.942373" elapsed="0.000033"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:27.942644" elapsed="0.000030"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:27.952350" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:27.952547" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:27.933895" elapsed="0.018795">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:28.961616" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:28.954247" elapsed="0.007434">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:28.961942" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:28.962192" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:28.972504" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:28.972711" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:28.953382" elapsed="0.019449">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:29.983963" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:29.974273" elapsed="0.009789">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:29.984476" elapsed="0.000051"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:29.984907" elapsed="0.000045"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:29.994338" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:29.994531" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:29.973449" elapsed="0.021218">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:31.003439" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:30.996058" elapsed="0.007441">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:31.003799" elapsed="0.000038"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:31.004071" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:31.014587" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:31.014778" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:30.995250" elapsed="0.019696">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:32.023992" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:32.016270" elapsed="0.007785">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:32.024314" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:32.024561" elapsed="0.000046"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:32.034977" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:32.035168" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:32.015559" elapsed="0.019731">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:33.046616" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:33.036904" elapsed="0.009809">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:33.047034" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:33.047212" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:33.055633" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:33.055830" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:33.036002" elapsed="0.019951">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:34.067382" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:34.057562" elapsed="0.009923">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:34.067951" elapsed="0.000054"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:34.068382" elapsed="0.000048"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:34.078253" elapsed="0.000027"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:34.078447" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:34.056692" elapsed="0.021880">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:35.086109" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:35.079770" elapsed="0.006404">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:35.086435" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:35.086711" elapsed="0.000030"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:35.096188" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:35.096455" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:35.079117" elapsed="0.017469">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:36.106508" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:36.098498" elapsed="0.008078">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:36.106875" elapsed="0.000033"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:36.107141" elapsed="0.000030"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:36.116837" elapsed="0.000027"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:36.117029" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:36.097658" elapsed="0.019499">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:37.122436" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:37.118121" elapsed="0.004362">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:37.122690" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:37.122869" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:37.131368" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:37.131561" elapsed="0.000025"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:37.117624" elapsed="0.014077">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:38.143340" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:38.133577" elapsed="0.009811">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:38.143584" elapsed="0.000036"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:38.143780" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:38.152154" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:38.152348" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:38.132588" elapsed="0.019881">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:39.162991" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:39.154047" elapsed="0.009005">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:39.163315" elapsed="0.000031"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:39.163563" elapsed="0.000033"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:39.173905" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:39.174181" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:39.153152" elapsed="0.021155">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:40.183562" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:40.175648" elapsed="0.007977">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:40.183812" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:40.183988" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:40.192424" elapsed="0.000027"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:40.192658" elapsed="0.000025"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:40.174870" elapsed="0.017913">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:41.202753" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:41.194366" elapsed="0.008476">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:41.203108" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:41.203357" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:41.213117" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:41.213310" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:41.193452" elapsed="0.019983">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:42.222149" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:42.215068" elapsed="0.007144">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:42.222469" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:42.222740" elapsed="0.000029"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:42.232108" elapsed="0.000027"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:42.232301" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:42.214163" elapsed="0.018263">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:43.241831" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:43.234212" elapsed="0.007687">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:43.242281" elapsed="0.000036"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:43.242541" elapsed="0.000029"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:43.252033" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:43.252240" elapsed="0.000024"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:43.233244" elapsed="0.019127">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:44.264242" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:44.254050" elapsed="0.010242">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:44.264484" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:44.264681" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:44.273302" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:44.273499" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:44.253126" elapsed="0.020519">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:45.283120" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:45.275192" elapsed="0.007990">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:45.283437" elapsed="0.000036"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:45.283730" elapsed="0.000030"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:45.293471" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:45.293679" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:45.274303" elapsed="0.019504">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:46.304105" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:46.295429" elapsed="0.008723">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:46.304341" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:46.304519" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:46.313013" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:46.313206" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:46.294511" elapsed="0.018942">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:47.324580" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:47.315110" elapsed="0.009550">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:47.324925" elapsed="0.000031"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:47.325176" elapsed="0.000030"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:47.335821" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:47.336018" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:47.314148" elapsed="0.022003">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:48.346236" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:48.337790" elapsed="0.008508">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:48.346558" elapsed="0.000052"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:48.346831" elapsed="0.000029"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:48.356795" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:48.356991" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:48.336850" elapsed="0.020265">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:49.366389" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:49.358905" elapsed="0.007552">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:49.366747" elapsed="0.000034"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:49.367009" elapsed="0.000030"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:49.376947" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:49.377149" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:49.357928" elapsed="0.019350">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:50.389013" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:50.379027" elapsed="0.010041">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:50.389269" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:50.389447" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:50.397912" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:50.398217" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:50.378031" elapsed="0.020323">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:51.408710" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:51.400013" elapsed="0.008762">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:51.409064" elapsed="0.000035"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:51.409347" elapsed="0.000029"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:51.419329" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:51.419531" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:51.399094" elapsed="0.020584">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:52.429270" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:52.421272" elapsed="0.008062">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:52.429627" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:52.429878" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:52.439600" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:52.439796" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:52.420359" elapsed="0.019560">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:53.450011" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:53.441520" elapsed="0.008556">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:53.450341" elapsed="0.000031"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:53.450608" elapsed="0.000029"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:53.460136" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:53.460330" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:53.440626" elapsed="0.019827">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:54.469468" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:54.462102" elapsed="0.007431">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:54.469813" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:54.470061" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:54.479445" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:54.479750" elapsed="0.000023"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:54.461162" elapsed="0.018720">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:55.488677" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:55.481501" elapsed="0.007241">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:55.489002" elapsed="0.000031"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:55.489249" elapsed="0.000027"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:55.498654" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:55.498852" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:55.480567" elapsed="0.018416">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:56.509408" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:56.500719" elapsed="0.008755">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:56.509776" elapsed="0.000033"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:56.510028" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:56.519721" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:56.519919" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:56.499773" elapsed="0.020277">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:57.529980" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:57.521871" elapsed="0.008163">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:57.530235" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:57.530412" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:57.538944" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:57.539140" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:57.520839" elapsed="0.018435">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:58.549314" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:58.541048" elapsed="0.008330">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:58.549783" elapsed="0.000042"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:58.550094" elapsed="0.000039"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:58.559930" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:58.560144" elapsed="0.000023"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:58.540054" elapsed="0.020218">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:52:59.571815" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:52:59.561818" elapsed="0.010047">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:59.572056" elapsed="0.000024"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:59.572235" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:59.580752" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:52:59.580945" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:52:59.560980" elapsed="0.020087">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:53:00.592262" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:53:00.582626" elapsed="0.009734">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:53:00.592633" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:53:00.592820" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:53:00.601179" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:53:00.601379" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:53:00.581785" elapsed="0.019713">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:53:01.610187" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:53:01.603042" elapsed="0.007208">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:53:01.610507" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:53:01.610791" elapsed="0.000037"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:53:01.619963" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:53:01.620155" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:53:01.602168" elapsed="0.018203">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:53:02.631459" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:53:02.622092" elapsed="0.009416">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:53:02.631719" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:53:02.631897" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:53:02.640497" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:53:02.640708" elapsed="0.000022"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:53:02.621062" elapsed="0.019774">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Check_Owner_Reconfigured">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:53:03.650368" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>Original Owner Index: ${original_device_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-08-22T23:53:03.642618" elapsed="0.007827">Variable '${original_device_owner}' not found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 1: node${follower1}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:53:03.650729" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Follower 2: node${follower2}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:53:03.650976" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<var>${owner}</var>
<var>${candidates}</var>
<arg>${DEVICE_NAME}</arg>
<arg>netconf</arg>
<arg>${follower1}</arg>
<doc>Returns the owner and a list of candidates for the SB device netconf-test-device of type ${device_type}. Request is sent to member ${member_index}.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="NOT RUN" start="2026-08-22T23:53:03.661606" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${owner}</arg>
<arg>${original_device_owner}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-08-22T23:53:03.661801" elapsed="0.000021"/>
</kw>
<doc>Check whether the entity owner changed. Fail if not or no owner found.</doc>
<status status="FAIL" start="2026-08-22T23:53:03.641524" elapsed="0.020415">Variable '${original_device_owner}' not found.</status>
</kw>
<msg time="2026-08-22T23:53:03.662035" level="FAIL">Keyword 'Check_Owner_Reconfigured' failed after retrying for 2 minutes. The last error was: Variable '${original_device_owner}' not found.</msg>
<arg>${CLUSTER_RECOVERY_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Owner_Reconfigured</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:51:03.200076" elapsed="120.462085">Keyword 'Check_Owner_Reconfigured' failed after retrying for 2 minutes. The last error was: Variable '${original_device_owner}' not found.</status>
</kw>
<doc>Wait for the cluster to recover from the failure and choose a new owner for the entity.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-08-22T23:51:02.973655" elapsed="120.688686">Keyword 'Check_Owner_Reconfigured' failed after retrying for 2 minutes. The last error was: Variable '${original_device_owner}' not found.</status>
</test>
<test id="s1-s7-t10" name="Check_Config_Data_Before_Modification_With_Original_Owner_Down" 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-08-22T23:53:03.665624" elapsed="0.000231"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:53:03.665345" 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-08-22T23:53:03.667084" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:53:03.666869" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-08-22T23:53:03.666844" elapsed="0.000325"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:53:03.672281" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:53:03.672174" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:53:03.672156" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:53:03.673358" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:53:03.672965" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:53:03.673864" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:53:03.673541" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:53:03.673934" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:53:03.674167" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:53:03.672572" elapsed="0.001621"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:53:03.679684" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:53:03.679559" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-08-22T23:53:03.679540" 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-08-22T23:53:03.680939" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:53:03.680833" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:53:03.680815" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:53:03.681456" level="INFO">${karaf_connection_index} = 85</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:53:03.681148" elapsed="0.000335"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:53:03.681887" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:53:03.681655" elapsed="0.000258"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:53:03.723953" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:53:03.682419" elapsed="0.041636"/>
</kw>
<msg time="2026-08-22T23:53:03.724236" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:53:03.724283" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:53:03.682068" elapsed="0.042251"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:53:03.755827" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:53:03.724861" elapsed="0.031086"/>
</kw>
<msg time="2026-08-22T23:53:03.756106" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:53:03.756151" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "M "o "d "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:53:03.724488" elapsed="0.031700"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:53:03.756483" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:53:03.756265" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-08-22T23:53:03.756244" elapsed="0.000317"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:53:03.757026" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:53:03.756727" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:53:03.757383" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:53:03.757171" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:53:03.757153" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:53:03.757494" 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-08-22T23:53:03.760111" elapsed="0.000151"/>
</kw>
<msg time="2026-08-22T23:53:03.760323" 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-08-22T23:53:03.758958" elapsed="0.001493"/>
</kw>
<kw name="Open 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-08-22T23:53:03.762079" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:53:03.762450" 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-08-22T23:53:03.758306" elapsed="0.004404"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:53:03.757777" elapsed="0.004999"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:53:03.680506" elapsed="0.082402"/>
</kw>
<msg time="2026-08-22T23:53:03.763000" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:53:03.763044" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "M "o "d "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:53:03.679906" elapsed="0.083175"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:53:03.763264" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:53:03.763157" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:53:03.763139" 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-08-22T23:53:03.763780" 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-08-22T23:53:03.764111" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:53:03.764183" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:53:03.679219" elapsed="0.085071"/>
</kw>
<msg time="2026-08-22T23:53:03.764382" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:53:03.764427" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "M "o "d "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:53:03.674624" elapsed="0.089841"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:53:03.764812" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:53:03.764540" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-08-22T23:53:03.764523" elapsed="0.000367"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:53:03.674468" elapsed="0.090446"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:53:03.770306" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:53:03.770198" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:53:03.770180" 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-08-22T23:53:03.771554" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:53:03.771447" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-08-22T23:53:03.771429" elapsed="0.000217"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:53:03.772082" level="INFO">${karaf_connection_index} = 86</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:53:03.771786" elapsed="0.000323"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:53:03.772477" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:53:03.772261" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:53:03.807649" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:53:03.773007" elapsed="0.034741"/>
</kw>
<msg time="2026-08-22T23:53:03.807927" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:53:03.807974" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:53:03.772677" elapsed="0.035333"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:53:03.851750" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:53:03.808515" elapsed="0.043346"/>
</kw>
<msg time="2026-08-22T23:53:03.852018" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:53:03.852064" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "M "o "d "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:53:03.808177" elapsed="0.043923"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:53:03.852392" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:53:03.852177" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:53:03.852157" elapsed="0.000349"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:53:03.852972" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:53:03.852674" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:53:03.853327" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:53:03.853116" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-08-22T23:53:03.853098" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:53:03.853438" 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-08-22T23:53:03.855950" elapsed="0.000148"/>
</kw>
<msg time="2026-08-22T23:53:03.856160" 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-08-22T23:53:03.854919" 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-08-22T23:53:03.856565" elapsed="0.000167"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:53:03.856999" 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-08-22T23:53:03.854232" 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-08-22T23:53:03.853708" elapsed="0.003543"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:53:03.771145" elapsed="0.086205"/>
</kw>
<msg time="2026-08-22T23:53:03.857442" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:53:03.857485" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "M "o "d "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:53:03.770555" elapsed="0.086967"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:53:03.857735" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:53:03.857627" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:53:03.857607" 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-08-22T23:53:03.858396" 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-08-22T23:53:03.858762" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:53:03.858836" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:53:03.769860" elapsed="0.089085"/>
</kw>
<msg time="2026-08-22T23:53:03.859037" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:53:03.859081" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "M "o "d "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:53:03.765172" elapsed="0.093946"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:53:03.859441" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:53:03.859193" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-08-22T23:53:03.859176" elapsed="0.000343"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:53:03.765036" elapsed="0.094507"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:53:03.865091" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:53:03.864983" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:53:03.864963" 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-08-22T23:53:03.866304" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:53:03.866197" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:53:03.866179" elapsed="0.000213"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:53:03.866862" level="INFO">${karaf_connection_index} = 87</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:53:03.866543" elapsed="0.000345"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:53:03.867304" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:53:03.867082" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:53:03.901623" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:53:03.867848" elapsed="0.033877"/>
</kw>
<msg time="2026-08-22T23:53:03.901886" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:53:03.901932" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:53:03.867488" elapsed="0.034481"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:53:03.931379" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:53:03.902505" elapsed="0.028993"/>
</kw>
<msg time="2026-08-22T23:53:03.931680" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:53:03.931726" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "M "o "d "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:53:03.902138" elapsed="0.029626"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:53:03.932068" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:53:03.931841" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-08-22T23:53:03.931821" elapsed="0.000327"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:53:03.932615" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:53:03.932291" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:53:03.932974" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:53:03.932760" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-22T23:53:03.932742" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:53:03.933085" 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-08-22T23:53:03.935650" elapsed="0.000152"/>
</kw>
<msg time="2026-08-22T23:53:03.935868" 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-08-22T23:53:03.934518" elapsed="0.001486"/>
</kw>
<kw name="Open 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-08-22T23:53:03.936273" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:53:03.936622" 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-08-22T23:53:03.933880" 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-08-22T23:53:03.933337" elapsed="0.003532"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:53:03.865897" elapsed="0.071071"/>
</kw>
<msg time="2026-08-22T23:53:03.937060" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:53:03.937105" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "M "o "d "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:53:03.865310" elapsed="0.071833"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:53:03.937327" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:53:03.937220" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:53:03.937201" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:53:03.937822" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:53:03.938333" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:53:03.938459" 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-08-22T23:53:03.864644" elapsed="0.073929"/>
</kw>
<msg time="2026-08-22T23:53:03.938778" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:53:03.938823" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "B "e "f "o "r "e "_ "M "o "d "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:53:03.859907" elapsed="0.078953"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:53:03.939188" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:53:03.938936" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-08-22T23:53:03.938919" elapsed="0.000349"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:53:03.859767" elapsed="0.079525"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:53:03.674251" elapsed="0.265070"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:53:03.671811" elapsed="0.267568"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:53:03.666542" elapsed="0.272892"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:53:03.666068" elapsed="0.273410"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:53:03.663191" elapsed="0.276339"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:03.944624" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:03.940283" elapsed="0.004381">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:04.955262" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:04.945358" elapsed="0.009999">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:05.966481" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:05.956136" elapsed="0.010472">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:06.976323" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:06.967669" elapsed="0.008713">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:07.986926" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:07.977315" elapsed="0.009685">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:08.994445" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:08.987760" elapsed="0.006752">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:10.003348" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:09.995295" elapsed="0.008114">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:11.012570" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:11.004156" elapsed="0.008507">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:12.023783" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:12.013541" elapsed="0.010393">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:13.034685" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:13.025046" elapsed="0.009699">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:14.042531" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:14.035685" elapsed="0.006942">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:15.053490" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:15.043344" elapsed="0.010193">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:16.063091" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:16.054372" elapsed="0.008767">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:17.074318" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:17.063937" elapsed="0.010486">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:18.084054" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:18.075211" elapsed="0.008959">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:19.093880" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:19.084966" elapsed="0.008983">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:20.103730" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:20.095009" elapsed="0.008793">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:21.113568" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:21.104524" elapsed="0.009121">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:22.122263" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:22.114360" elapsed="0.007984">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:23.127802" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:23.123179" elapsed="0.004678">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:24.139381" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:24.129002" elapsed="0.010494">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:25.151208" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:25.140494" elapsed="0.010866">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:26.160003" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:26.152264" elapsed="0.007797">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:27.171274" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:27.160796" elapsed="0.010521">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:28.180258" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:28.172007" elapsed="0.008321">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:29.191923" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:29.181311" elapsed="0.010720">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:30.202061" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:30.193055" elapsed="0.009059">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:31.211270" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:31.203253" elapsed="0.008090">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:32.218218" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:32.212021" elapsed="0.006257">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:33.230294" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:33.218987" elapsed="0.011401">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:34.239221" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:34.231118" elapsed="0.008163">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:35.248176" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:35.240177" elapsed="0.008075">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:36.258261" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:36.249221" elapsed="0.009095">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:37.269392" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:37.259236" elapsed="0.010266">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:38.278906" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:38.270507" elapsed="0.008474">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:39.288998" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:39.279780" elapsed="0.009273">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:40.299958" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:40.290081" elapsed="0.009934">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:41.311384" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:41.301036" elapsed="0.010471">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:42.321132" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:42.312403" elapsed="0.008805">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:43.331400" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:43.322126" elapsed="0.009347">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:44.342906" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:44.332630" elapsed="0.010334">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:45.352475" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:45.343837" elapsed="0.008709">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:46.361915" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:46.353519" elapsed="0.008451">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:47.371856" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:47.362951" elapsed="0.008961">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:48.383308" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:48.372915" elapsed="0.010498">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:49.394914" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:49.384269" elapsed="0.010702">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:50.404998" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:50.395800" elapsed="0.009267">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:51.415079" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:51.405951" elapsed="0.009199">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:52.424974" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:52.416133" elapsed="0.008899">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:53.433972" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:53.425962" elapsed="0.008084">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:54.443207" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:54.435114" elapsed="0.008168">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:55.450701" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:55.444051" elapsed="0.006731">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:56.462107" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:56.451743" elapsed="0.010425">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:57.467503" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:57.462689" elapsed="0.004863">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:58.472538" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:58.468149" elapsed="0.004446">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:53:59.481068" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:53:59.473300" elapsed="0.007929">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:00.486702" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:00.482077" elapsed="0.004679">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:01.497863" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:01.487666" elapsed="0.010313">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:02.505808" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:02.498950" elapsed="0.006968">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:03.519166" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:03.506931" elapsed="0.012295">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:04.528521" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:04.520079" elapsed="0.008565">Variable '${follower1_session}' not found.</status>
</kw>
<msg time="2026-08-22T23:54:04.528800" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: Variable '${follower1_session}' not found.</msg>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${follower1_session}</arg>
<arg>${original_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:53:03.939712" elapsed="60.589316">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${follower2_session}</arg>
<arg>${original_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-08-22T23:54:04.529357" elapsed="0.000034"/>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:54:04.531425" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:54:04.530598" elapsed="0.000867"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-08-22T23:54:04.531827" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:54:04.531608" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.531554" elapsed="0.000411"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:54:04.532235" elapsed="0.000431"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:54:04.533560" level="FAIL">'6067' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:54:04.533199" elapsed="0.000441">'6067' does not contain '-'</status>
</kw>
<msg time="2026-08-22T23:54:04.533733" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:54:04.532837" elapsed="0.000921"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:54:04.534263" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=6067</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:54:04.533926" elapsed="0.000363"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:54:04.534764" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=6067</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:54:04.534448" elapsed="0.000343"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:54:04.535242" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:54:04.534944" elapsed="0.000325"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-08-22T23:54:04.535807" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=6067

Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: Variable '${follower1_session}' not found.</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-08-22T23:54:04.535421" elapsed="0.000435"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:54:04.536270" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=6067</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:54:04.536021" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-08-22T23:54:04.536982" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=6067'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-08-22T23:54:04.536638" elapsed="0.000392"/>
</kw>
<status status="PASS" start="2026-08-22T23:54:04.536381" elapsed="0.000775"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.536363" elapsed="0.000820"/>
</if>
<arg>6067</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:54:04.530037" elapsed="0.007199"/>
</kw>
<doc>Check if data is present and retrievable from follower nodes</doc>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=6067</tag>
<status status="FAIL" start="2026-08-22T23:53:03.662608" elapsed="60.874676">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=6067

Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: Variable '${follower1_session}' not found.</status>
</test>
<test id="s1-s7-t11" name="Modify_Device_Data_When_Original_Owner_Is_Down" line="182">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:54:04.540996" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:54:04.540731" elapsed="0.000530"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:54:04.542260" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:54:04.542150" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.542130" 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-08-22T23:54:04.547385" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:54:04.547279" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.547260" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:54:04.548485" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:54:04.548105" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:54:04.549005" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:54:04.548690" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:54:04.549074" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:54:04.549235" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:54:04.547699" 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-08-22T23:54:04.554784" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:54:04.554677" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.554658" 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-08-22T23:54:04.556124" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:54:04.555924" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.555905" elapsed="0.000295"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:54:04.556680" level="INFO">${karaf_connection_index} = 85</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:54:04.556348" elapsed="0.000359"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:54:04.557103" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:54:04.556867" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:54:04.591143" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:54:04.557635" elapsed="0.033615"/>
</kw>
<msg time="2026-08-22T23:54:04.591417" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:54:04.591464" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:54:04.557286" elapsed="0.034216"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:54:04.615321" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "h "e "n "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "I "s "_ "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-08-22T23:54:04.592068" elapsed="0.023569"/>
</kw>
<msg time="2026-08-22T23:54:04.615901" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:54:04.615951" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "h "e "n "_ "O "r "i "g "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:54:04.591696" elapsed="0.024295"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:54:04.616663" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:54:04.616283" elapsed="0.000444"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.616241" elapsed="0.000515"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:54:04.617319" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "h "e "n "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "I "s "_ "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-08-22T23:54:04.616910" 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-08-22T23:54:04.617699" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:54:04.617462" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.617443" elapsed="0.000337"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:54:04.617822" 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-08-22T23:54:04.620693" elapsed="0.000166"/>
</kw>
<msg time="2026-08-22T23:54:04.620922" 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-08-22T23:54:04.619447" elapsed="0.001614"/>
</kw>
<kw name="Open 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-08-22T23:54:04.621337" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:54:04.621696" 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-08-22T23:54:04.618778" 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-08-22T23:54:04.618167" elapsed="0.003786"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:54:04.555621" elapsed="0.066432"/>
</kw>
<msg time="2026-08-22T23:54:04.622153" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:54:04.622199" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "h "e "n "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:54:04.555002" elapsed="0.067241"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:54:04.622432" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:54:04.622323" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.622304" 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-08-22T23:54:04.622970" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:54:04.623318" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:54:04.623391" 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-08-22T23:54:04.554322" elapsed="0.069200"/>
</kw>
<msg time="2026-08-22T23:54:04.623726" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:54:04.623775" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "h "e "n "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:54:04.549658" elapsed="0.074161"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:54:04.624176" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:54:04.623900" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.623882" elapsed="0.000373"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:54:04.549500" elapsed="0.074779"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:54:04.630090" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:54:04.629980" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.629961" 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-08-22T23:54:04.631302" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:54:04.631195" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.631176" elapsed="0.000238"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:54:04.631973" level="INFO">${karaf_connection_index} = 86</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:54:04.631567" elapsed="0.000433"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:54:04.632399" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:54:04.632171" elapsed="0.000254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:54:04.666254" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:54:04.632944" elapsed="0.033586"/>
</kw>
<msg time="2026-08-22T23:54:04.666874" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:54:04.666944" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:54:04.632605" elapsed="0.034393"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:54:04.689979" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "h "e "n "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "I "s "_ "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-08-22T23:54:04.667953" elapsed="0.022138"/>
</kw>
<msg time="2026-08-22T23:54:04.690255" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:54:04.690302" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "h "e "n "_ "O "r "i "g "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:54:04.667331" elapsed="0.023010"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:54:04.690716" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:54:04.690436" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.690409" elapsed="0.000394"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:54:04.691257" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "h "e "n "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "I "s "_ "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-08-22T23:54:04.690950" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:54:04.691633" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:54:04.691399" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.691380" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:54:04.691751" 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-08-22T23:54:04.694495" elapsed="0.000185"/>
</kw>
<msg time="2026-08-22T23:54:04.694744" 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-08-22T23:54:04.693325" 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-08-22T23:54:04.695160" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:54:04.695499" 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-08-22T23:54:04.692680" elapsed="0.003031"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:54:04.692072" elapsed="0.003707"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:54:04.630893" elapsed="0.064985"/>
</kw>
<msg time="2026-08-22T23:54:04.695974" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:54:04.696019" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "h "e "n "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:54:04.630313" elapsed="0.065749"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:54:04.696262" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:54:04.696140" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.696121" 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-08-22T23:54:04.696787" 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-08-22T23:54:04.697296" elapsed="0.000038"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:54:04.697385" 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-08-22T23:54:04.629627" elapsed="0.067871"/>
</kw>
<msg time="2026-08-22T23:54:04.697639" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:54:04.697687" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "h "e "n "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:54:04.624565" elapsed="0.073160"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:54:04.698057" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:54:04.697803" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.697785" elapsed="0.000355"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:54:04.624422" elapsed="0.073743"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:54:04.703833" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:54:04.703722" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.703702" 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-08-22T23:54:04.705067" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:54:04.704958" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.704939" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:54:04.705604" level="INFO">${karaf_connection_index} = 87</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:54:04.705280" elapsed="0.000352"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:54:04.706031" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:54:04.705807" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:54:04.743654" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:54:04.706547" elapsed="0.037208"/>
</kw>
<msg time="2026-08-22T23:54:04.743934" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:54:04.743980" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:54:04.706215" elapsed="0.037801"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:54:04.772952" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "h "e "n "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "I "s "_ "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-08-22T23:54:04.744545" elapsed="0.028709"/>
</kw>
<msg time="2026-08-22T23:54:04.773693" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:54:04.773801" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "h "e "n "_ "O "r "i "g "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:54:04.744184" elapsed="0.029725"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:54:04.774762" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:54:04.774122" elapsed="0.000777"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.774061" elapsed="0.000897"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:54:04.776095" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "h "e "n "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "I "s "_ "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-08-22T23:54:04.775326" elapsed="0.000941"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:54:04.777001" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:54:04.776476" elapsed="0.000668"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.776432" elapsed="0.000762"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:54:04.777237" 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-08-22T23:54:04.779859" elapsed="0.000158"/>
</kw>
<msg time="2026-08-22T23:54:04.780144" 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-08-22T23:54:04.778814" elapsed="0.001468"/>
</kw>
<kw name="Open 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-08-22T23:54:04.780610" elapsed="0.000083"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:54:04.780959" 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-08-22T23:54:04.778133" 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-08-22T23:54:04.777548" elapsed="0.003666"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:54:04.704654" elapsed="0.076664"/>
</kw>
<msg time="2026-08-22T23:54:04.781419" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:54:04.781465" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "h "e "n "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:54:04.704052" elapsed="0.077453"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:54:04.781760" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:54:04.781626" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.781601" elapsed="0.000244"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:54:04.782262" 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-08-22T23:54:04.782647" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:54:04.782721" 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-08-22T23:54:04.703354" elapsed="0.079483"/>
</kw>
<msg time="2026-08-22T23:54:04.782938" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:54:04.782983" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "h "e "n "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:54:04.698442" elapsed="0.084580"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:54:04.783352" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:54:04.783103" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.783085" elapsed="0.000345"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:54:04.698300" elapsed="0.085155"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:54:04.549320" elapsed="0.234170"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:54:04.546918" elapsed="0.236640"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:54:04.541852" elapsed="0.241803"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:54:04.541411" elapsed="0.242295"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:54:04.538288" elapsed="0.245478"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:54:04.784557" level="INFO">${template_as_string} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${template_as_string}</var>
<arg>DEVICE_NAME=${device_name}</arg>
<arg>RESTCONF_ROOT=${RESTCONF_ROOT}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:54:04.783951" elapsed="0.000655"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<msg time="2026-08-22T23:54:04.789630" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${directory_with_template_folders}${/}datamod1</arg>
<arg>${template_as_string}</arg>
<arg>session=${follower1_session}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:54:04.784878" elapsed="0.004792">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:54:04.791010" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:54:04.790475" elapsed="0.000563"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-08-22T23:54:04.791256" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:54:04.791113" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.791095" elapsed="0.000279"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:54:04.791548" elapsed="0.000233"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:54:04.792727" level="FAIL">'4968' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:54:04.792310" elapsed="0.000494">'4968' does not contain '-'</status>
</kw>
<msg time="2026-08-22T23:54:04.792900" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:54:04.791946" elapsed="0.000979"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:54:04.793437" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:54:04.793101" elapsed="0.000363"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:54:04.793931" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:54:04.793638" elapsed="0.000320"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:54:04.794405" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:54:04.794114" elapsed="0.000318"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-08-22T23:54:04.795218" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968

Variable '${follower1_session}' not found.</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-08-22T23:54:04.794597" elapsed="0.000670"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:54:04.795681" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:54:04.795420" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-08-22T23:54:04.796392" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=4968'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-08-22T23:54:04.796033" elapsed="0.000416"/>
</kw>
<status status="PASS" start="2026-08-22T23:54:04.795794" elapsed="0.000745"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.795776" elapsed="0.000791"/>
</if>
<arg>4968</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:54:04.790124" elapsed="0.006508"/>
</kw>
<doc>Attempt to modify the data on the device after recovery and see if it still works.</doc>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=4968</tag>
<status status="FAIL" start="2026-08-22T23:54:04.537674" elapsed="0.259005">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968

Variable '${follower1_session}' not found.</status>
</test>
<test id="s1-s7-t12" name="Check_Config_Data_After_Modification_With_Original_Owner_Down" 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-08-22T23:54:04.800036" elapsed="0.000214"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:54:04.799770" 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-08-22T23:54:04.801332" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:54:04.801224" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.801205" 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-08-22T23:54:04.806340" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:54:04.806233" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.806215" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:54:04.807424" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:54:04.807042" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:54:04.807931" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:54:04.807624" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:54:04.808001" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:54:04.808155" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:54:04.806649" elapsed="0.001531"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:54:04.813898" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:54:04.813789" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.813770" 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-08-22T23:54:04.815177" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:54:04.815063" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.815003" elapsed="0.000243"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:54:04.815712" level="INFO">${karaf_connection_index} = 85</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:54:04.815390" elapsed="0.000349"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:54:04.816117" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:54:04.815894" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:54:04.852788" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:54:04.816700" elapsed="0.036196"/>
</kw>
<msg time="2026-08-22T23:54:04.853076" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:54:04.853124" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:54:04.816301" elapsed="0.036861"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:54:04.886335" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:54:04.853706" elapsed="0.032746"/>
</kw>
<msg time="2026-08-22T23:54:04.886642" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:54:04.886690" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:54:04.853336" elapsed="0.033392"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:54:04.887029" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:54:04.886807" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.886786" elapsed="0.000321"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:54:04.887547" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:54:04.887248" 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-08-22T23:54:04.887922" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:54:04.887709" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.887690" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:54:04.888031" 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-08-22T23:54:04.890528" elapsed="0.000176"/>
</kw>
<msg time="2026-08-22T23:54:04.890766" 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-08-22T23:54:04.889451" elapsed="0.001442"/>
</kw>
<kw name="Open 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-08-22T23:54:04.891169" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:54:04.891502" 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-08-22T23:54:04.888833" elapsed="0.002869"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:54:04.888283" elapsed="0.003482"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:54:04.814717" elapsed="0.077145"/>
</kw>
<msg time="2026-08-22T23:54:04.891952" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:54:04.891995" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:54:04.814117" elapsed="0.077919"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:54:04.892218" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:54:04.892112" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.892094" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:54:04.892741" elapsed="0.000060"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:54:04.893115" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:54:04.893186" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:54:04.813381" elapsed="0.079914"/>
</kw>
<msg time="2026-08-22T23:54:04.893388" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:54:04.893432" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:54:04.808614" elapsed="0.084855"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:54:04.893825" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:54:04.893544" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.893527" elapsed="0.000375"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:54:04.808445" elapsed="0.085481"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:54:04.899591" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:54:04.899468" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.899449" 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-08-22T23:54:04.900847" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:54:04.900740" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.900722" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:54:04.901351" level="INFO">${karaf_connection_index} = 86</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:54:04.901055" elapsed="0.000322"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:54:04.901779" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:54:04.901532" elapsed="0.000359"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:54:04.934782" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:54:04.902390" elapsed="0.032499"/>
</kw>
<msg time="2026-08-22T23:54:04.935064" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:54:04.935111" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:54:04.902057" elapsed="0.033091"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:54:04.963229" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:54:04.935676" elapsed="0.027702"/>
</kw>
<msg time="2026-08-22T23:54:04.963627" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:54:04.963690" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:54:04.935317" elapsed="0.028421"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:54:04.964136" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:54:04.963845" elapsed="0.000357"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.963814" elapsed="0.000419"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:54:04.964821" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:54:04.964401" 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-08-22T23:54:04.965193" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:54:04.964972" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.964953" elapsed="0.000320"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:54:04.965356" 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-08-22T23:54:04.967977" elapsed="0.000159"/>
</kw>
<msg time="2026-08-22T23:54:04.968198" 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-08-22T23:54:04.966873" elapsed="0.001457"/>
</kw>
<kw name="Open 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-08-22T23:54:04.968628" elapsed="0.000101"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:54:04.968997" 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-08-22T23:54:04.966215" elapsed="0.002972"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:54:04.965658" 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-08-22T23:54:04.900400" elapsed="0.068957"/>
</kw>
<msg time="2026-08-22T23:54:04.969452" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:54:04.969496" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:54:04.899831" elapsed="0.069703"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:54:04.969761" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:54:04.969649" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.969628" 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-08-22T23:54:04.970255" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:54:04.970671" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:54:04.970745" 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-08-22T23:54:04.899125" elapsed="0.071733"/>
</kw>
<msg time="2026-08-22T23:54:04.970955" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:54:04.971000" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:54:04.894185" elapsed="0.076853"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:54:04.971368" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:54:04.971117" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.971099" elapsed="0.000347"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:54:04.894049" elapsed="0.077422"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:54:04.977430" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:54:04.977319" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.977299" 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-08-22T23:54:04.978693" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:54:04.978555" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:04.978536" elapsed="0.000226"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:54:04.979212" level="INFO">${karaf_connection_index} = 87</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:54:04.978906" elapsed="0.000334"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:54:04.979640" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:54:04.979396" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:54:05.016573" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:54:04.980165" elapsed="0.036529"/>
</kw>
<msg time="2026-08-22T23:54:05.016879" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:54:05.016926" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:54:04.979825" elapsed="0.037138"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:54:05.053511" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:54:05.017507" elapsed="0.036287"/>
</kw>
<msg time="2026-08-22T23:54:05.054069" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:54:05.054116" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:54:05.017169" elapsed="0.036984"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:54:05.054450" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:54:05.054231" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:05.054211" elapsed="0.000319"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:54:05.054999" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:54:05.054700" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:54:05.055355" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:54:05.055142" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:05.055125" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:54:05.055465" 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-08-22T23:54:05.057954" elapsed="0.000155"/>
</kw>
<msg time="2026-08-22T23:54:05.058170" 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-08-22T23:54:05.056904" elapsed="0.001394"/>
</kw>
<kw name="Open 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-08-22T23:54:05.058568" elapsed="0.000104"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:54:05.058929" 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-08-22T23:54:05.056253" elapsed="0.002858"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:54:05.055737" elapsed="0.003438"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:54:04.978248" elapsed="0.081024"/>
</kw>
<msg time="2026-08-22T23:54:05.059363" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:54:05.059408" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:54:04.977672" elapsed="0.081773"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:54:05.059659" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:54:05.059520" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:05.059502" elapsed="0.000241"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:54:05.060131" 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-08-22T23:54:05.060462" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:54:05.060535" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:54:04.976959" elapsed="0.083708"/>
</kw>
<msg time="2026-08-22T23:54:05.060761" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:54:05.060805" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:54:04.971781" elapsed="0.089085"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:54:05.061193" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:54:05.060948" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-08-22T23:54:05.060927" elapsed="0.000380"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:54:04.971637" elapsed="0.089694"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:54:04.808236" elapsed="0.253125"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:54:04.805873" elapsed="0.255547"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:54:04.800933" elapsed="0.260544"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:54:04.800486" elapsed="0.261037"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:54:04.797494" elapsed="0.264102"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:05.066953" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:05.062358" elapsed="0.004689">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:06.077656" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:06.067835" elapsed="0.009919">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:07.089089" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:07.078743" elapsed="0.010410">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:08.097909" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:08.090041" elapsed="0.007943">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:09.106694" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:09.098922" elapsed="0.007842">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:10.118643" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:10.107708" elapsed="0.011057">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:11.129748" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:11.119803" elapsed="0.010001">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:12.138845" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:12.130787" elapsed="0.008131">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:13.148298" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:13.139851" elapsed="0.008520">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:14.157090" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:14.149325" elapsed="0.007847">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:15.167366" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:15.158144" elapsed="0.009281">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:16.175540" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:16.168346" elapsed="0.007286">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:17.186961" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:17.176772" elapsed="0.010246">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:18.195814" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:18.187937" elapsed="0.008217">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:19.207084" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:19.197241" elapsed="0.009899">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:20.215988" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:20.208101" elapsed="0.007960">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:21.227014" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:21.217029" elapsed="0.010061">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:22.236007" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:22.228508" elapsed="0.007576">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:23.247597" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:23.237047" elapsed="0.010605">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:24.258262" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:24.248423" elapsed="0.009943">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:25.269327" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:25.259247" elapsed="0.010156">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:26.279555" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:26.270377" elapsed="0.009248">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:27.290751" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:27.280469" elapsed="0.010339">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:28.300145" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:28.291751" elapsed="0.008474">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:29.310757" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:29.301173" elapsed="0.009645">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:30.322847" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:30.311931" elapsed="0.010977">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:31.334566" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:31.323909" elapsed="0.010787">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:32.345470" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:32.335707" elapsed="0.009823">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:33.356730" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:33.346418" elapsed="0.010381">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:34.366004" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:34.357971" elapsed="0.008107">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:35.377248" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:35.367126" elapsed="0.010190">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:36.388281" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:36.378260" elapsed="0.010163">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:37.397241" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:37.389340" elapsed="0.007994">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:38.406327" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:38.398341" elapsed="0.008055">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:39.415729" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:39.407390" elapsed="0.008419">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:40.425901" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:40.416682" elapsed="0.009273">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:41.438156" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:41.427013" elapsed="0.011210">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:42.443500" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:42.438871" elapsed="0.004684">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:43.454964" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:43.444475" elapsed="0.010582">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:44.461218" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:44.455745" elapsed="0.005581">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:45.471903" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:45.462622" elapsed="0.009398">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:46.482011" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:46.473043" elapsed="0.009027">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:47.487648" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:47.482704" elapsed="0.005077">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:48.494073" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:48.488512" elapsed="0.005621">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:49.505761" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:49.495111" elapsed="0.010807">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:50.515423" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:50.506987" elapsed="0.008524">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:51.525872" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:51.516447" elapsed="0.009478">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:52.531666" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:52.526528" elapsed="0.005209">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:53.543036" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:53.532665" elapsed="0.010442">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:54.554632" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:54.544049" elapsed="0.010701">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:55.563607" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:55.555732" elapsed="0.007948">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:56.573744" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:56.564688" elapsed="0.009136">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:57.584925" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:57.574800" elapsed="0.010230">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:58.593322" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:58.585886" elapsed="0.007497">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:54:59.606321" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:54:59.594625" elapsed="0.011831">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:00.616143" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:00.607401" elapsed="0.008804">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:01.624222" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:01.616899" elapsed="0.007397">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:02.635977" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:02.625519" elapsed="0.010570">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:03.644564" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:03.637083" elapsed="0.007565">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:04.657211" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:04.645687" elapsed="0.011644">Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:05.669897" level="FAIL">Variable '${follower1_session}' not found.</msg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:05.658336" elapsed="0.011678">Variable '${follower1_session}' not found.</status>
</kw>
<msg time="2026-08-22T23:55:05.670246" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: Variable '${follower1_session}' not found.</msg>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${follower1_session}</arg>
<arg>${modified_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:54:05.061770" elapsed="60.608655">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: Variable '${follower1_session}' not found.</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${follower2_session}</arg>
<arg>${modified_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-08-22T23:55:05.670700" elapsed="0.000026"/>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:55:05.672276" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:55:05.671631" elapsed="0.000674"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-08-22T23:55:05.672570" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:55:05.672398" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:05.672373" elapsed="0.000291"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:55:05.672872" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:55:05.674080" level="FAIL">'6067' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:55:05.673701" elapsed="0.000441">'6067' does not contain '-'</status>
</kw>
<msg time="2026-08-22T23:55:05.674237" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:55:05.673307" elapsed="0.000955"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:55:05.674824" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=6067</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:55:05.674432" elapsed="0.000419"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:55:05.675316" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=6067</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:55:05.675014" elapsed="0.000329"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:55:05.675834" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:55:05.675499" elapsed="0.000363"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-08-22T23:55:05.676390" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=6067

Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: Variable '${follower1_session}' not found.</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-08-22T23:55:05.676014" elapsed="0.000424"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:55:05.676858" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=6067</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:55:05.676610" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-08-22T23:55:05.677626" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=6067'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-08-22T23:55:05.677255" elapsed="0.000421"/>
</kw>
<status status="PASS" start="2026-08-22T23:55:05.676971" elapsed="0.000739"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:05.676953" elapsed="0.000782"/>
</if>
<arg>6067</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:55:05.671193" elapsed="0.006591"/>
</kw>
<doc>Check if data is written correctly when original owner is shut down</doc>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=6067</tag>
<status status="FAIL" start="2026-08-22T23:54:04.796921" elapsed="60.880909">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=6067

Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: Variable '${follower1_session}' not found.</status>
</test>
<test id="s1-s7-t13" name="Restart_Original_Entity_Owner" line="209">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:55:05.681737" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:55:05.681457" 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-08-22T23:55:05.683081" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:55:05.682954" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:05.682935" 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-08-22T23:55:05.688646" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:55:05.688515" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:05.688495" elapsed="0.000220"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:55:05.689831" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:55:05.689332" elapsed="0.000527"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:55:05.690323" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:55:05.690017" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:55:05.690395" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:55:05.690555" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:55:05.688943" 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-08-22T23:55:05.696315" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:55:05.696206" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:05.696187" 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-08-22T23:55:05.697623" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:55:05.697493" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:05.697475" elapsed="0.000217"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:55:05.698145" level="INFO">${karaf_connection_index} = 85</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:55:05.697836" elapsed="0.000336"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:55:05.698562" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:55:05.698328" elapsed="0.000291"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:55:05.732456" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:55:05.699114" elapsed="0.033534"/>
</kw>
<msg time="2026-08-22T23:55:05.732844" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:55:05.732893" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:55:05.698779" elapsed="0.034153"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:55:05.751217" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "R "e "s "t "a "r "t "_ "O "r "i "g "i "n "a "l "_ "E "n "t "i "t "y "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:55:05.733558" elapsed="0.017806"/>
</kw>
<msg time="2026-08-22T23:55:05.751545" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:55:05.751620" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "R "e "s "t "a "r "t "_ "O "r "i "g "i "n "a "l "_ "E "n "t "i "t "y "_ "O "w "n "e "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-08-22T23:55:05.733133" elapsed="0.018532"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:55:05.752017" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:55:05.751765" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:05.751736" elapsed="0.000363"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:55:05.752555" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "R "e "s "t "a "r "t "_ "O "r "i "g "i "n "a "l "_ "E "n "t "i "t "y "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:55:05.752243" elapsed="0.000551"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:55:05.753089" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:55:05.752867" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:05.752848" elapsed="0.000455"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:55:05.753342" 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-08-22T23:55:05.755991" elapsed="0.000157"/>
</kw>
<msg time="2026-08-22T23:55:05.756209" 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-08-22T23:55:05.754938" 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="NOT RUN" start="2026-08-22T23:55:05.756764" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:55:05.757107" elapsed="0.000285"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:55:05.754234" elapsed="0.003279"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:55:05.753661" elapsed="0.003939"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:55:05.697185" elapsed="0.060523"/>
</kw>
<msg time="2026-08-22T23:55:05.757802" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:55:05.757848" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "R "e "s "t "a "r "t "_ "O "r "i "g "i "n "a "l "_ "E "n "t "i "t "y "_ "O "w "n "e "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-08-22T23:55:05.696537" elapsed="0.061350"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:55:05.758075" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:55:05.757966" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:05.757947" 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-08-22T23:55:05.758562" 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-08-22T23:55:05.758936" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:55:05.759009" 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-08-22T23:55:05.695864" elapsed="0.063258"/>
</kw>
<msg time="2026-08-22T23:55:05.759217" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:55:05.759261" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "R "e "s "t "a "r "t "_ "O "r "i "g "i "n "a "l "_ "E "n "t "i "t "y "_ "O "w "n "e "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-08-22T23:55:05.690980" elapsed="0.068320"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:55:05.759698" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:55:05.759377" elapsed="0.000378"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:05.759359" elapsed="0.000421"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:55:05.690840" elapsed="0.068965"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:55:05.765384" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:55:05.765273" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:05.765253" 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-08-22T23:55:05.766632" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:55:05.766496" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:05.766478" elapsed="0.000222"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:55:05.767231" level="INFO">${karaf_connection_index} = 86</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:55:05.766842" elapsed="0.000427"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:55:05.767717" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:55:05.767457" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:55:05.800881" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:55:05.768242" elapsed="0.032881"/>
</kw>
<msg time="2026-08-22T23:55:05.801531" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:55:05.801693" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:55:05.767902" elapsed="0.034056"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:55:05.829164" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "R "e "s "t "a "r "t "_ "O "r "i "g "i "n "a "l "_ "E "n "t "i "t "y "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:55:05.803181" elapsed="0.026105"/>
</kw>
<msg time="2026-08-22T23:55:05.829451" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:55:05.829497" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "R "e "s "t "a "r "t "_ "O "r "i "g "i "n "a "l "_ "E "n "t "i "t "y "_ "O "w "n "e "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-08-22T23:55:05.802358" elapsed="0.027176"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:55:05.829882" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:55:05.829647" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:05.829622" elapsed="0.000341"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:55:05.830404" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "R "e "s "t "a "r "t "_ "O "r "i "g "i "n "a "l "_ "E "n "t "i "t "y "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:55:05.830105" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:55:05.830775" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:55:05.830537" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:05.830519" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:55:05.830889" 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">
<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-08-22T23:55:05.833510" elapsed="0.000179"/>
</kw>
<msg time="2026-08-22T23:55:05.833752" 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-08-22T23:55:05.832365" 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-08-22T23:55:05.834160" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:55:05.834493" 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-08-22T23:55:05.831736" elapsed="0.002959"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:55:05.831173" 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-08-22T23:55:05.766191" elapsed="0.068694"/>
</kw>
<msg time="2026-08-22T23:55:05.834988" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:55:05.835033" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "R "e "s "t "a "r "t "_ "O "r "i "g "i "n "a "l "_ "E "n "t "i "t "y "_ "O "w "n "e "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-08-22T23:55:05.765619" elapsed="0.069452"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:55:05.835255" elapsed="0.000230"/>
</return>
<status status="PASS" start="2026-08-22T23:55:05.835149" elapsed="0.000372"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:05.835131" elapsed="0.000415"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:55:05.835968" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:55:05.836298" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:55:05.836370" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:55:05.764907" elapsed="0.071572"/>
</kw>
<msg time="2026-08-22T23:55:05.836599" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:55:05.836646" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "R "e "s "t "a "r "t "_ "O "r "i "g "i "n "a "l "_ "E "n "t "i "t "y "_ "O "w "n "e "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-08-22T23:55:05.760077" elapsed="0.076607"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:55:05.837012" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:55:05.836761" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:05.836743" elapsed="0.000383"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:55:05.759935" elapsed="0.077216"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:55:05.842717" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:55:05.842609" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:05.842589" 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-08-22T23:55:05.843928" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:55:05.843821" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:05.843802" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:55:05.844432" level="INFO">${karaf_connection_index} = 87</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:55:05.844137" elapsed="0.000322"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:55:05.844853" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:55:05.844631" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:55:05.881320" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:55:05.845536" elapsed="0.035902"/>
</kw>
<msg time="2026-08-22T23:55:05.881618" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:55:05.881673" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:55:05.845034" elapsed="0.036677"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:55:05.904057" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "R "e "s "t "a "r "t "_ "O "r "i "g "i "n "a "l "_ "E "n "t "i "t "y "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:55:05.882220" elapsed="0.021945"/>
</kw>
<msg time="2026-08-22T23:55:05.904327" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:55:05.904373" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "R "e "s "t "a "r "t "_ "O "r "i "g "i "n "a "l "_ "E "n "t "i "t "y "_ "O "w "n "e "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-08-22T23:55:05.881881" elapsed="0.022531"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:55:05.904767" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:55:05.904502" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:05.904471" elapsed="0.000378"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:55:05.905319" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "R "e "s "t "a "r "t "_ "O "r "i "g "i "n "a "l "_ "E "n "t "i "t "y "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:55:05.904991" 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-08-22T23:55:05.905716" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:55:05.905460" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:05.905442" elapsed="0.000355"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:55:05.905832" 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">
<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-08-22T23:55:05.908401" elapsed="0.000170"/>
</kw>
<msg time="2026-08-22T23:55:05.908660" 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-08-22T23:55:05.907292" elapsed="0.001504"/>
</kw>
<kw name="Open 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-08-22T23:55:05.909069" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:55:05.909443" 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-08-22T23:55:05.906673" elapsed="0.002980"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:55:05.906106" elapsed="0.003614"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:55:05.843494" elapsed="0.066327"/>
</kw>
<msg time="2026-08-22T23:55:05.909916" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:55:05.909961" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "R "e "s "t "a "r "t "_ "O "r "i "g "i "n "a "l "_ "E "n "t "i "t "y "_ "O "w "n "e "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-08-22T23:55:05.842931" elapsed="0.067123"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:55:05.910247" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:55:05.910137" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:05.910118" 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-08-22T23:55:05.910975" 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-08-22T23:55:05.911330" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:55:05.911403" 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-08-22T23:55:05.842252" elapsed="0.069289"/>
</kw>
<msg time="2026-08-22T23:55:05.911756" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:55:05.911802" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "R "e "s "t "a "r "t "_ "O "r "i "g "i "n "a "l "_ "E "n "t "i "t "y "_ "O "w "n "e "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-08-22T23:55:05.837439" elapsed="0.074403"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:55:05.912176" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:55:05.911921" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:05.911903" elapsed="0.000353"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:55:05.837299" elapsed="0.074982"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:55:05.690658" elapsed="0.221654"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:55:05.688146" elapsed="0.224231"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:55:05.682648" elapsed="0.229790"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:55:05.682151" elapsed="0.230336"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:55:05.678826" elapsed="0.233721"/>
</kw>
<kw name="Start_Single_Member" owner="ClusterManagement">
<msg time="2026-08-22T23:55:05.917095" level="FAIL">Variable '${original_device_owner}' not found.</msg>
<arg>${original_device_owner}</arg>
<doc>Convenience keyword that starts the specified member of the cluster.</doc>
<status status="FAIL" start="2026-08-22T23:55:05.912858" elapsed="0.004279">Variable '${original_device_owner}' not found.</status>
</kw>
<doc>Restart the original entity owner and see if it can still see the device and the new data on it.</doc>
<status status="FAIL" start="2026-08-22T23:55:05.678245" elapsed="0.239079">Variable '${original_device_owner}' not found.</status>
</test>
<test id="s1-s7-t14" name="Check_Config_Data_After_Original_Owner_Restart" 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-08-22T23:55:05.920828" elapsed="0.000215"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:55:05.920529" 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-08-22T23:55:05.922162" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:55:05.922048" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:05.922030" 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-08-22T23:55:05.927192" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:55:05.927082" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:05.927064" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:55:05.928269" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:55:05.927885" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:55:05.928783" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:55:05.928454" elapsed="0.000355"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:55:05.928855" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:55:05.929010" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:55:05.927482" 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-08-22T23:55:05.935753" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:55:05.935638" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:05.935617" 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-08-22T23:55:05.937016" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:55:05.936906" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:05.936888" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:55:05.937563" level="INFO">${karaf_connection_index} = 85</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:55:05.937227" elapsed="0.000380"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:55:05.937992" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:55:05.937765" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:55:05.970706" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:55:05.938513" elapsed="0.032326"/>
</kw>
<msg time="2026-08-22T23:55:05.971017" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:55:05.971065" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:55:05.938177" elapsed="0.032926"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:55:05.993437" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:55:05.971671" elapsed="0.021904"/>
</kw>
<msg time="2026-08-22T23:55:05.993763" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:55:05.993810" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "O "r "i "g "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:55:05.971284" elapsed="0.022564"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:55:05.994188" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:55:05.993939" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:05.993913" elapsed="0.000356"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:55:05.994770" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:55:05.994413" 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-08-22T23:55:05.995129" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:55:05.994913" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:05.994894" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:55:05.995244" 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-08-22T23:55:05.998042" elapsed="0.000157"/>
</kw>
<msg time="2026-08-22T23:55:05.998261" 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-08-22T23:55:05.996804" 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-08-22T23:55:05.998705" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:55:05.999053" elapsed="0.000236"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:55:05.996141" elapsed="0.003272"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:55:05.995534" 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-08-22T23:55:05.936594" elapsed="0.063012"/>
</kw>
<msg time="2026-08-22T23:55:05.999704" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:55:05.999749" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:55:05.935992" elapsed="0.063798"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:55:06.000058" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:55:05.999948" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:05.999928" 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-08-22T23:55:06.000544" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:55:06.000900" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:55:06.000971" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:55:05.935261" elapsed="0.065820"/>
</kw>
<msg time="2026-08-22T23:55:06.001176" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:55:06.001220" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:55:05.929437" elapsed="0.071821"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:55:06.001638" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:55:06.001366" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:06.001317" elapsed="0.000400"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:55:05.929268" elapsed="0.072473"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:55:06.007750" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:55:06.007640" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:06.007619" 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-08-22T23:55:06.009016" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:55:06.008909" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:06.008890" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:55:06.009570" level="INFO">${karaf_connection_index} = 86</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:55:06.009226" elapsed="0.000387"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:55:06.009992" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:55:06.009771" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:55:06.046369" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:55:06.010509" elapsed="0.035959"/>
</kw>
<msg time="2026-08-22T23:55:06.046675" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:55:06.046723" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:55:06.010175" elapsed="0.036585"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:55:06.070111" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:55:06.047265" elapsed="0.022952"/>
</kw>
<msg time="2026-08-22T23:55:06.070374" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:55:06.070419" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "O "r "i "g "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:55:06.046929" elapsed="0.023527"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:55:06.070778" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:55:06.070533" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:06.070513" elapsed="0.000345"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:55:06.071293" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:55:06.070999" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:55:06.071736" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:55:06.071434" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:06.071416" elapsed="0.000400"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:55:06.071850" 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-08-22T23:55:06.074737" elapsed="0.000167"/>
</kw>
<msg time="2026-08-22T23:55:06.074966" 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-08-22T23:55:06.073256" elapsed="0.001850"/>
</kw>
<kw name="Open 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-08-22T23:55:06.075382" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:55:06.075736" elapsed="0.000186"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:55:06.072646" 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-08-22T23:55:06.072105" elapsed="0.003998"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:55:06.008602" elapsed="0.067600"/>
</kw>
<msg time="2026-08-22T23:55:06.076294" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:55:06.076337" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:55:06.007968" elapsed="0.068407"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:55:06.076559" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-08-22T23:55:06.076452" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:06.076434" 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-08-22T23:55:06.077051" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:55:06.077411" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:55:06.077492" 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-08-22T23:55:06.007256" elapsed="0.070361"/>
</kw>
<msg time="2026-08-22T23:55:06.077712" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:55:06.077757" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:55:06.002179" elapsed="0.075615"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:55:06.078115" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:55:06.077869" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:06.077852" elapsed="0.000340"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:55:06.001871" elapsed="0.076344"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:55:06.084105" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:55:06.083996" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:06.083976" 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-08-22T23:55:06.085310" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:55:06.085202" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:06.085184" elapsed="0.000210"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:55:06.085860" level="INFO">${karaf_connection_index} = 87</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:55:06.085537" elapsed="0.000351"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:55:06.086264" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:55:06.086044" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:55:06.119591" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:55:06.086840" elapsed="0.032850"/>
</kw>
<msg time="2026-08-22T23:55:06.119914" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:55:06.119961" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:55:06.086445" elapsed="0.033554"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:55:06.142733" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:55:06.120499" elapsed="0.022344"/>
</kw>
<msg time="2026-08-22T23:55:06.143005" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:55:06.143051" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "O "r "i "g "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:55:06.120165" elapsed="0.022923"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:55:06.143391" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:55:06.143166" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:06.143145" elapsed="0.000325"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:55:06.143958" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "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-08-22T23:55:06.143654" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:55:06.144316" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:55:06.144100" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:06.144082" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:55:06.144429" 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-08-22T23:55:06.147005" elapsed="0.000151"/>
</kw>
<msg time="2026-08-22T23:55:06.147217" 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-08-22T23:55:06.145908" elapsed="0.001438"/>
</kw>
<kw name="Open 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-08-22T23:55:06.147637" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:55:06.147970" 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-08-22T23:55:06.145249" elapsed="0.003045"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:55:06.144722" 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-08-22T23:55:06.084900" elapsed="0.063576"/>
</kw>
<msg time="2026-08-22T23:55:06.148568" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:55:06.148634" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:55:06.084322" elapsed="0.064351"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:55:06.148857" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:55:06.148751" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:06.148732" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:55:06.149328" 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-08-22T23:55:06.149689" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:55:06.149761" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:55:06.083650" elapsed="0.066222"/>
</kw>
<msg time="2026-08-22T23:55:06.149965" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:55:06.150008" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:55:06.078473" elapsed="0.071574"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:55:06.150416" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:55:06.150167" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-08-22T23:55:06.150148" elapsed="0.000346"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:55:06.078337" elapsed="0.072181"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:55:05.929091" elapsed="0.221457"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:55:05.926721" elapsed="0.223902"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:55:05.921715" elapsed="0.228966"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:55:05.921247" elapsed="0.229481"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:55:05.918340" elapsed="0.232442"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:06.155650" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:06.151539" elapsed="0.004152">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:07.165744" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:07.156551" elapsed="0.009301">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:08.174182" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:08.166880" elapsed="0.007375">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:09.182443" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:09.175249" elapsed="0.007265">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:10.192864" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:10.183448" elapsed="0.009562">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:11.203168" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:11.194009" elapsed="0.009265">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:12.212409" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:12.204201" elapsed="0.008281">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:13.222996" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:13.213463" elapsed="0.009647">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:14.233771" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:14.224194" elapsed="0.009718">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:15.242202" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:15.235096" elapsed="0.007184">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:16.252341" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:16.243731" elapsed="0.008689">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:17.262851" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:17.253561" elapsed="0.009413">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:18.273326" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:18.263986" elapsed="0.009394">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:19.280825" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:19.274142" elapsed="0.006751">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:20.288740" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:20.281705" elapsed="0.007102">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:21.296223" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:21.289496" elapsed="0.006829">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:22.306058" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:22.297314" elapsed="0.008849">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:23.314289" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:23.307247" elapsed="0.007117">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:24.320948" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:24.315051" elapsed="0.005967">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:25.330011" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:25.321920" elapsed="0.008165">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:26.341001" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:26.331035" elapsed="0.010093">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:27.349021" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:27.342035" elapsed="0.007059">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:28.359036" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:28.350052" elapsed="0.009087">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:29.369568" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:29.360059" elapsed="0.009666">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:30.379711" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:30.370726" elapsed="0.009038">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:31.389760" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:31.380762" elapsed="0.009105">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:32.399771" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:32.390856" elapsed="0.009023">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:33.409262" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:33.400820" elapsed="0.008516">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:34.419778" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:34.410178" elapsed="0.009725">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:35.429784" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:35.420973" elapsed="0.008870">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:36.437930" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:36.430744" elapsed="0.007259">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:37.446047" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:37.439005" elapsed="0.007123">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:38.455714" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:38.447099" elapsed="0.008673">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:39.465710" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:39.456731" elapsed="0.009091">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:40.476142" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:40.467091" elapsed="0.009158">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:41.486504" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:41.477281" elapsed="0.009361">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:42.497446" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:42.487649" elapsed="0.009899">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:43.505361" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:43.498637" elapsed="0.006804">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:44.513494" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:44.506399" elapsed="0.007169">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:45.523122" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:45.514610" elapsed="0.008662">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:46.533042" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:46.524159" elapsed="0.008989">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:47.537873" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:47.533828" elapsed="0.004099">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:48.548446" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:48.539084" elapsed="0.009458">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:49.556748" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:49.549763" elapsed="0.007056">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:50.566059" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:50.557517" elapsed="0.008630">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:51.574345" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:51.567091" elapsed="0.007322">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:52.584786" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:52.575306" elapsed="0.009546">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:53.594887" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:53.585881" elapsed="0.009112">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:54.605029" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:54.595941" elapsed="0.009141">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:55.615289" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:55.606049" elapsed="0.009354">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:56.625015" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:56.616315" elapsed="0.008778">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:57.635333" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:57.626168" elapsed="0.009277">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:58.645316" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:58.636456" elapsed="0.008964">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:55:59.653363" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:55:59.646183" elapsed="0.007240">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:56:00.664687" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:00.654488" elapsed="0.010309">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:56:01.674779" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:01.665762" elapsed="0.009140">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:56:02.684654" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:02.675817" elapsed="0.008943">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:56:03.694537" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:03.685742" elapsed="0.008865">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:56:04.704219" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:04.695308" elapsed="0.009011">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:56:05.714020" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:05.705282" elapsed="0.008844">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Check_Config_Data">
<msg time="2026-08-22T23:56:06.724275" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:06.715163" elapsed="0.009166">Variable '${original_device_owner_session}' not found.</status>
</kw>
<msg time="2026-08-22T23:56:06.724443" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: Variable '${original_device_owner_session}' not found.</msg>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${original_device_owner_session}</arg>
<arg>${modified_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:55:06.150955" elapsed="60.573653">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:06.726189" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:06.725531" elapsed="0.000686"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-08-22T23:56:06.726464" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:56:06.726308" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:06.726283" elapsed="0.000253"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:56:06.726753" elapsed="0.000232"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:56:06.727889" level="FAIL">'5761' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:56:06.727507" elapsed="0.000442">'5761' does not contain '-'</status>
</kw>
<msg time="2026-08-22T23:56:06.728042" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:56:06.727148" elapsed="0.000918"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:56:06.728564" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=5761</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:56:06.728233" elapsed="0.000373"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:06.729061" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5761</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:06.728767" elapsed="0.000320"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:06.729530" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:06.729238" elapsed="0.000318"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-08-22T23:56:06.730096" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5761

Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: Variable '${original_device_owner_session}' not found.</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-08-22T23:56:06.729726" elapsed="0.000499"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:06.730641" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5761</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:06.730381" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-08-22T23:56:06.731370" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=5761'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-08-22T23:56:06.731009" elapsed="0.000410"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:06.730754" elapsed="0.000698"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:06.730736" elapsed="0.000742"/>
</if>
<arg>5761</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:56:06.725118" elapsed="0.006410"/>
</kw>
<doc>Sanity check if we still can retrieve our data from the original device owner.</doc>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=5761</tag>
<status status="FAIL" start="2026-08-22T23:55:05.917733" elapsed="60.813839">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5761

Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: Variable '${original_device_owner_session}' not found.</status>
</test>
<test id="s1-s7-t15" name="Modify_Device_Data_With_Original_Owner" line="223">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:56:06.735250" elapsed="0.000220"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:56:06.734836" elapsed="0.000689"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:56:06.736519" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:56:06.736410" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:06.736391" 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-08-22T23:56:06.741881" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:56:06.741773" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:06.741755" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:56:06.742961" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:56:06.742548" elapsed="0.000440"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:56:06.743456" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:56:06.743149" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:56:06.743527" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:56:06.743704" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:56:06.742176" 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-08-22T23:56:06.749204" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:56:06.749095" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:06.749076" 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-08-22T23:56:06.750464" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:56:06.750358" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:06.750340" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:56:06.751026" level="INFO">${karaf_connection_index} = 85</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:56:06.750703" elapsed="0.000349"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:56:06.751443" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:56:06.751212" elapsed="0.000257"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:56:06.788555" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:56:06.751988" elapsed="0.036686"/>
</kw>
<msg time="2026-08-22T23:56:06.788853" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:56:06.788899" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:56:06.751654" elapsed="0.037282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:56:06.811824" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:56:06.789450" elapsed="0.022738"/>
</kw>
<msg time="2026-08-22T23:56:06.812420" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:56:06.812468" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "O "r "i "g "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:56:06.789107" elapsed="0.023400"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:06.813002" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:06.812666" elapsed="0.000396"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:06.812630" elapsed="0.000460"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:06.813631" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:06.813239" elapsed="0.000463"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:06.813986" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:06.813769" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:06.813751" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:56:06.814103" 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-08-22T23:56:06.817014" elapsed="0.000170"/>
</kw>
<msg time="2026-08-22T23:56:06.817249" 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-08-22T23:56:06.815724" 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-08-22T23:56:06.817695" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:06.818036" elapsed="0.000430"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:56:06.815051" elapsed="0.003569"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:56:06.814426" elapsed="0.004264"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:56:06.750055" elapsed="0.068735"/>
</kw>
<msg time="2026-08-22T23:56:06.818885" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:56:06.818929" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:56:06.749423" elapsed="0.069545"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:56:06.819160" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-08-22T23:56:06.819049" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:06.819030" 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-08-22T23:56:06.819684" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:06.820025" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:56:06.820103" 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-08-22T23:56:06.748758" elapsed="0.071458"/>
</kw>
<msg time="2026-08-22T23:56:06.820311" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:56:06.820355" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:56:06.744106" elapsed="0.076290"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:06.820752" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:06.820471" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:06.820454" elapsed="0.000377"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:56:06.743966" elapsed="0.076888"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:56:06.826626" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:56:06.826455" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:06.826436" elapsed="0.000328"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:56:06.827965" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:56:06.827855" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:06.827837" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:56:06.828493" level="INFO">${karaf_connection_index} = 86</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:56:06.828181" elapsed="0.000338"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:56:06.828921" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:56:06.828693" elapsed="0.000255"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:56:06.863857" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:56:06.829438" elapsed="0.034646"/>
</kw>
<msg time="2026-08-22T23:56:06.864315" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:56:06.864364" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:56:06.829104" elapsed="0.035299"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:56:06.886777" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:56:06.865114" elapsed="0.021806"/>
</kw>
<msg time="2026-08-22T23:56:06.887104" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:56:06.887151" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "O "r "i "g "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:56:06.864678" elapsed="0.022511"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:06.887568" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:06.887294" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:06.887263" elapsed="0.000427"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:06.888166" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:06.887838" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:06.888517" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:06.888304" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:06.888286" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:56:06.888660" 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-08-22T23:56:06.891734" elapsed="0.000162"/>
</kw>
<msg time="2026-08-22T23:56:06.891959" 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-08-22T23:56:06.890405" elapsed="0.001692"/>
</kw>
<kw name="Open 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-08-22T23:56:06.892377" elapsed="0.000330"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:06.893097" 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-08-22T23:56:06.889610" elapsed="0.003682"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:56:06.888995" 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-08-22T23:56:06.827523" elapsed="0.065935"/>
</kw>
<msg time="2026-08-22T23:56:06.893551" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:56:06.893611" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:56:06.826929" elapsed="0.066722"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:56:06.893836" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:56:06.893728" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:06.893710" 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 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:06.894417" 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-08-22T23:56:06.894773" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:56:06.894846" 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-08-22T23:56:06.826098" elapsed="0.068858"/>
</kw>
<msg time="2026-08-22T23:56:06.895051" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:56:06.895096" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:56:06.821175" elapsed="0.073958"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:06.895458" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:06.895208" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:06.895191" elapsed="0.000345"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:56:06.821007" elapsed="0.074554"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:56:06.901054" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:56:06.900946" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:06.900928" 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-08-22T23:56:06.902377" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:56:06.902268" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:06.902248" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:56:06.902979" level="INFO">${karaf_connection_index} = 87</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:56:06.902611" elapsed="0.000396"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:56:06.903388" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:56:06.903166" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:56:06.939218" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:56:06.903939" elapsed="0.035382"/>
</kw>
<msg time="2026-08-22T23:56:06.939506" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:56:06.939552" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:56:06.903571" elapsed="0.036041"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:56:06.974859" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:56:06.940122" elapsed="0.034846"/>
</kw>
<msg time="2026-08-22T23:56:06.975140" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:56:06.975188" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "O "r "i "g "i ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:56:06.939782" elapsed="0.035447"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:06.975637" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:06.975351" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:06.975325" elapsed="0.000399"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:06.976187" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:06.975870" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:06.976631" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:06.976327" elapsed="0.000381"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:06.976307" elapsed="0.000435"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:56:06.976861" 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-08-22T23:56:06.980330" elapsed="0.000165"/>
</kw>
<msg time="2026-08-22T23:56:06.980560" 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-08-22T23:56:06.978974" elapsed="0.001755"/>
</kw>
<kw name="Open 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-08-22T23:56:06.981030" elapsed="0.000284"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:06.981731" 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-08-22T23:56:06.978058" elapsed="0.003896"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:56:06.977237" elapsed="0.004790"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:56:06.901949" elapsed="0.080184"/>
</kw>
<msg time="2026-08-22T23:56:06.982261" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:56:06.982311" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:56:06.901271" elapsed="0.081080"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:56:06.982545" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-08-22T23:56:06.982433" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:06.982413" elapsed="0.000288"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:06.983118" 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-08-22T23:56:06.983550" elapsed="0.000111"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:56:06.983729" 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-08-22T23:56:06.900600" elapsed="0.083273"/>
</kw>
<msg time="2026-08-22T23:56:06.983995" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:56:06.984053" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "W "i "t "h "_ "O "r "i "g "i ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:56:06.895848" elapsed="0.088256"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:06.984544" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:06.984204" elapsed="0.000456"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:06.984180" elapsed="0.000518"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:56:06.895708" elapsed="0.089028"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:56:06.743787" elapsed="0.240997"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:56:06.741392" elapsed="0.243488"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:56:06.736117" elapsed="0.248856"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:56:06.735694" elapsed="0.249350"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:56:06.732385" elapsed="0.252735"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:56:06.985948" level="INFO">${template_as_string} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${template_as_string}</var>
<arg>DEVICE_NAME=${device_name}</arg>
<arg>RESTCONF_ROOT=${RESTCONF_ROOT}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:56:06.985351" elapsed="0.000633"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<msg time="2026-08-22T23:56:06.991534" level="FAIL">Variable '${original_device_owner_session}' not found.</msg>
<arg>${directory_with_template_folders}${/}datamod2</arg>
<arg>${template_as_string}</arg>
<arg>session=${original_device_owner_session}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:56:06.986320" elapsed="0.005275">Variable '${original_device_owner_session}' not found.</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:06.992969" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:06.992425" elapsed="0.000572"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-08-22T23:56:06.993282" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:56:06.993117" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:06.993098" elapsed="0.000264"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:56:06.993598" elapsed="0.000263"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:56:06.995029" level="FAIL">'5761' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:56:06.994561" elapsed="0.000558">'5761' does not contain '-'</status>
</kw>
<msg time="2026-08-22T23:56:06.995235" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:56:06.994104" elapsed="0.001161"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:56:06.995917" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=5761</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:56:06.995476" elapsed="0.000473"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:06.996519" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5761</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:06.996153" elapsed="0.000398"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:06.997148" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:06.996775" elapsed="0.000405"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-08-22T23:56:06.997840" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5761

Variable '${original_device_owner_session}' not found.</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-08-22T23:56:06.997375" elapsed="0.000544"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:06.998415" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5761</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:06.998117" elapsed="0.000353"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-08-22T23:56:06.999301" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=5761'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-08-22T23:56:06.998876" elapsed="0.000484"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:06.998554" elapsed="0.000847"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:06.998532" elapsed="0.000900"/>
</if>
<arg>5761</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:56:06.992044" elapsed="0.007446"/>
</kw>
<doc>Check that the original owner of the entity is still able to modify the data on the device</doc>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=5761</tag>
<status status="FAIL" start="2026-08-22T23:56:06.731819" elapsed="0.267726">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=5761

Variable '${original_device_owner_session}' not found.</status>
</test>
<test id="s1-s7-t16" name="Check_Config_Data_After_Modification_With_Original_Owner_Up" line="234">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:56:07.004751" elapsed="0.000294"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:56:07.004299" elapsed="0.000821"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:56:07.006487" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:56:07.006335" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:07.006310" elapsed="0.000289"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:56:07.013278" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:56:07.013136" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:07.013112" elapsed="0.000260"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:56:07.014747" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:56:07.014219" elapsed="0.000565"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:56:07.015427" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:56:07.015002" elapsed="0.000464"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:56:07.015529" elapsed="0.000063"/>
</return>
<msg time="2026-08-22T23:56:07.015770" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:56:07.013705" elapsed="0.002099"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:56:07.027215" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:56:07.026810" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:07.026766" elapsed="0.000618"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:56:07.030127" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:56:07.029883" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:07.029841" elapsed="0.000441"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:56:07.031324" level="INFO">${karaf_connection_index} = 85</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:56:07.030639" elapsed="0.000747"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:56:07.032287" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:56:07.031781" elapsed="0.000566"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:56:07.066002" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:56:07.033495" elapsed="0.032726"/>
</kw>
<msg time="2026-08-22T23:56:07.066500" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:56:07.066569" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:56:07.032745" elapsed="0.033913"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:56:07.092091" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "U "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:56:07.067527" elapsed="0.024687"/>
</kw>
<msg time="2026-08-22T23:56:07.092382" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:56:07.092428" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:56:07.066960" elapsed="0.025507"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:07.092849" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:07.092565" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:07.092536" elapsed="0.000399"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:07.093395" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "U "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:07.093080" 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-08-22T23:56:07.093823" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:07.093603" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:07.093563" elapsed="0.000339"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:56:07.093940" 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-08-22T23:56:07.096861" elapsed="0.000163"/>
</kw>
<msg time="2026-08-22T23:56:07.097088" 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-08-22T23:56:07.095551" elapsed="0.001680"/>
</kw>
<kw name="Open 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-08-22T23:56:07.097538" elapsed="0.000106"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:07.097917" elapsed="0.000188"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:56:07.094883" elapsed="0.003372"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:56:07.094271" elapsed="0.004053"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:56:07.029130" elapsed="0.069295"/>
</kw>
<msg time="2026-08-22T23:56:07.098520" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:56:07.098566" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:56:07.027765" elapsed="0.070867"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:56:07.098888" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:56:07.098774" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:07.098754" elapsed="0.000220"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:07.099382" 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-08-22T23:56:07.099798" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:56:07.099871" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:56:07.025987" elapsed="0.073993"/>
</kw>
<msg time="2026-08-22T23:56:07.100074" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:56:07.100118" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:56:07.016379" elapsed="0.083776"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:07.100478" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:07.100231" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:07.100214" elapsed="0.000341"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:56:07.016119" elapsed="0.084518"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:56:07.106146" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:56:07.106038" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:07.106017" 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-08-22T23:56:07.107339" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:56:07.107233" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:07.107215" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:56:07.107871" level="INFO">${karaf_connection_index} = 86</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:56:07.107548" elapsed="0.000349"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:56:07.108269" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:56:07.108052" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:56:07.142246" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:56:07.108796" elapsed="0.033556"/>
</kw>
<msg time="2026-08-22T23:56:07.142528" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:56:07.142574" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:56:07.108448" elapsed="0.034183"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:56:07.171846" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "U "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:56:07.143147" elapsed="0.028819"/>
</kw>
<msg time="2026-08-22T23:56:07.172132" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:56:07.172180" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:56:07.142805" elapsed="0.029413"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:07.172534" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:07.172301" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:07.172279" elapsed="0.000363"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:07.173098" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "U "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:07.172787" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:07.173543" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:07.173258" elapsed="0.000362"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:07.173239" elapsed="0.000406"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:56:07.173680" 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-08-22T23:56:07.176431" elapsed="0.000180"/>
</kw>
<msg time="2026-08-22T23:56:07.176675" 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-08-22T23:56:07.175187" 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-08-22T23:56:07.177089" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:07.177456" 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-08-22T23:56:07.174525" elapsed="0.003143"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:56:07.173971" elapsed="0.003764"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:56:07.106934" elapsed="0.070900"/>
</kw>
<msg time="2026-08-22T23:56:07.177928" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:56:07.177973" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:56:07.106361" elapsed="0.071650"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:56:07.178196" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:56:07.178088" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:07.178069" 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-08-22T23:56:07.178703" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:07.179040" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:56:07.179112" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:56:07.105688" elapsed="0.073532"/>
</kw>
<msg time="2026-08-22T23:56:07.179315" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:56:07.179359" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:56:07.100912" elapsed="0.078484"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:07.179827" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:07.179471" elapsed="0.000410"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:07.179454" elapsed="0.000451"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:56:07.100773" elapsed="0.079156"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:56:07.185439" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:56:07.185325" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:07.185236" elapsed="0.000271"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:56:07.186679" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:56:07.186545" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:07.186527" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:56:07.187216" level="INFO">${karaf_connection_index} = 87</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:56:07.186912" elapsed="0.000331"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:56:07.187749" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:56:07.187504" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:56:07.224056" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:56:07.188264" elapsed="0.035901"/>
</kw>
<msg time="2026-08-22T23:56:07.224400" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:56:07.224447" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:56:07.187932" elapsed="0.036553"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:56:07.256503" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "U "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:56:07.225068" elapsed="0.031721"/>
</kw>
<msg time="2026-08-22T23:56:07.257082" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:56:07.257131" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:56:07.224684" elapsed="0.032487"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:07.257727" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:07.257313" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:07.257268" elapsed="0.000555"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:07.258487" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f "i "c "a "t "i "o "n "_ "W "i "t "h "_ "O "r "i "g "i "n "a "l "_ "O "w "n "e "r "_ "U "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:07.257982" elapsed="0.000589"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:07.258887" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:07.258666" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:07.258646" elapsed="0.000320"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:56:07.259008" 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-08-22T23:56:07.262002" elapsed="0.000166"/>
</kw>
<msg time="2026-08-22T23:56:07.262230" 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-08-22T23:56:07.260929" elapsed="0.001446"/>
</kw>
<kw name="Open 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-08-22T23:56:07.262675" elapsed="0.000082"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:07.263017" 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-08-22T23:56:07.260036" elapsed="0.003173"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:56:07.259376" elapsed="0.003900"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:56:07.186244" elapsed="0.077135"/>
</kw>
<msg time="2026-08-22T23:56:07.263480" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:56:07.263526" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:56:07.185673" elapsed="0.077895"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:56:07.263788" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:56:07.263678" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:07.263658" 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-08-22T23:56:07.264306" 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-08-22T23:56:07.264689" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:56:07.264763" 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-08-22T23:56:07.184899" elapsed="0.079992"/>
</kw>
<msg time="2026-08-22T23:56:07.264995" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:56:07.265040" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "C "h "e "c "k "_ "C "o "n "f "i "g "_ "D "a "t "a "_ "A "f "t "e "r "_ "M "o "d "i "f ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:56:07.180194" elapsed="0.084887"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:07.265531" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:07.265272" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:07.265252" elapsed="0.000379"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:56:07.180058" elapsed="0.085597"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:56:07.015879" elapsed="0.249814"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:56:07.012660" elapsed="0.253101"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:56:07.005958" elapsed="0.259865"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:56:07.005330" elapsed="0.260544"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:56:07.000808" elapsed="0.265125"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:07.267551" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:07.267158" elapsed="0.000463"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:07.275380" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:07.275126" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:07.275846" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:07.275593" 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-08-22T23:56:07.297686" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:07.298008" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:07.298304" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:07.278084" elapsed="0.020280"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:07.275958" elapsed="0.022520"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:07.298993" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:07.298548" elapsed="0.000596"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:07.275940" elapsed="0.023253"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:07.307458" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:07.301745" elapsed="0.005823"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:07.301205" elapsed="0.006472"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:07.301160" elapsed="0.006575"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:07.313346" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:07.308349" elapsed="0.005045"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:07.307860" elapsed="0.005569"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:07.307824" elapsed="0.005630"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:07.314070" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:07.313660" 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-08-22T23:56:07.314407" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:07.314168" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:07.314974" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:07.314669" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:07.314490" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:07.314150" elapsed="0.000991"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:07.315691" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:07.315306" 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-08-22T23:56:07.316019" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:07.315787" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:07.316555" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:07.316261" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:07.316104" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:07.315769" 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-08-22T23:56:07.316819" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:07.317655" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:07.317331" 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-08-22T23:56:07.317835" 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-08-22T23:56:07.300086" elapsed="0.020312"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:07.320606" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-08-22T23:56:07.320471" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:07.320452" 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-08-22T23:56:07.320873" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:07.320945" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:56:07.323366" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:07.270764" elapsed="0.052634"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:07.323461" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:56:07.323636" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:07.267837" elapsed="0.055826"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:07.324358" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:07.323958" elapsed="0.000482">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:07.323738" elapsed="0.000776">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:07.323719" elapsed="0.000829">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:07.324817" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:07.324665" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:07.324618" elapsed="0.000280"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:07.266753" elapsed="0.058233">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:08.328065" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:08.327076" elapsed="0.001063"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:08.338965" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:08.338703" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:08.339421" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:08.339172" 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-08-22T23:56:08.358734" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:08.359026" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:08.359246" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:08.341720" elapsed="0.017584"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:08.339544" elapsed="0.019855"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:08.359833" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:08.359459" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:08.339521" elapsed="0.020507"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:08.369315" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:08.362424" elapsed="0.006985"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:08.361925" elapsed="0.007535"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:08.361883" elapsed="0.007615"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:08.373385" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:08.369919" elapsed="0.003533"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:08.369602" elapsed="0.003901"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:08.369555" elapsed="0.003984"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:08.374363" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:08.373804" 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-08-22T23:56:08.374858" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:08.374503" elapsed="0.000438"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:08.375661" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:08.375202" elapsed="0.000500"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:08.374977" elapsed="0.000776"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:08.374478" elapsed="0.001306"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:08.376567" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:08.376004" 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-08-22T23:56:08.377055" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:08.376726" elapsed="0.000429"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:08.377911" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:08.377471" elapsed="0.000477"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:08.377198" elapsed="0.000801"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:08.376701" 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-08-22T23:56:08.378265" elapsed="0.000380"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:08.379111" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:08.378808" 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-08-22T23:56:08.379290" 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-08-22T23:56:08.360861" elapsed="0.020895"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:08.382001" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:56:08.381884" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:08.381865" 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-08-22T23:56:08.382241" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:08.382312" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:56:08.384721" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:08.334330" elapsed="0.050421"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:08.384812" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:56:08.384964" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:08.328807" elapsed="0.056183"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:08.385662" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:08.385281" elapsed="0.000463">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:08.385060" elapsed="0.000758">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:08.385043" elapsed="0.000809">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:08.386070" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:08.385924" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:08.385907" elapsed="0.000245"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:08.325937" elapsed="0.060297">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:09.389413" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:09.388339" elapsed="0.001152"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:09.401157" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:09.400788" elapsed="0.000438"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:09.401839" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:09.401465" elapsed="0.000437"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:56:09.419993" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:09.420160" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:09.420402" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:09.404537" elapsed="0.015925"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:09.402009" elapsed="0.018553"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:09.421026" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:09.420674" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:09.401978" elapsed="0.019385"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:09.429284" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:09.423787" elapsed="0.005611"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:09.423252" elapsed="0.006226"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:09.423210" elapsed="0.006328"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:09.433200" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:09.430195" elapsed="0.003052"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:09.429703" elapsed="0.003580"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:09.429663" elapsed="0.003645"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:09.433907" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:09.433488" 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-08-22T23:56:09.434240" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:09.434006" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:09.434821" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:09.434498" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:09.434323" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:09.433988" elapsed="0.000920"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:09.435431" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:09.435068" 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-08-22T23:56:09.435777" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:09.435529" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:09.436319" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:09.436017" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:09.435860" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:09.435511" 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-08-22T23:56:09.436554" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:09.437383" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:09.437083" 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-08-22T23:56:09.437563" elapsed="0.002361"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:56:09.422222" elapsed="0.017767"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:09.440171" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:56:09.440060" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:09.440042" 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-08-22T23:56:09.440416" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:09.440487" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:56:09.442918" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:09.394260" elapsed="0.048688"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:09.443008" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:56:09.443162" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:09.390057" elapsed="0.053132"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:09.443879" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:09.443466" elapsed="0.000492">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:09.443259" elapsed="0.000812">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:09.443242" elapsed="0.000866">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:09.444329" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:09.444179" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:09.444162" elapsed="0.000247"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:09.387195" elapsed="0.057299">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:10.447635" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:10.446608" elapsed="0.001101"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:10.461321" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:10.460949" elapsed="0.000441"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:10.461884" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:10.461598" 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-08-22T23:56:10.486055" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:10.486368" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:10.486643" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:10.464778" elapsed="0.021931"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:10.462030" elapsed="0.024785"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:10.487282" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:10.486884" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:10.462000" elapsed="0.025496"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:10.495714" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:10.490043" elapsed="0.005787"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:10.489515" elapsed="0.006398"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:10.489474" elapsed="0.006577"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:10.499410" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:10.496801" elapsed="0.002658"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:10.496220" elapsed="0.003275"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:10.496169" elapsed="0.003351"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:10.501090" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:10.499718" elapsed="0.001404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:10.501445" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:10.501195" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:10.502015" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:10.501710" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:10.501531" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:10.501177" elapsed="0.000923"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:10.502678" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:10.502257" 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-08-22T23:56:10.503100" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:10.502860" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:10.503674" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:10.503341" elapsed="0.000359"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:10.503182" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:10.502840" 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-08-22T23:56:10.503915" elapsed="0.000432"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:10.504861" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:10.504529" 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-08-22T23:56:10.505045" 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-08-22T23:56:10.488479" elapsed="0.019158"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:10.507824" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:56:10.507710" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:10.507691" 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-08-22T23:56:10.508111" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:10.508183" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:56:10.510643" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:10.454817" elapsed="0.055856"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:10.510734" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:56:10.510891" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:10.448285" elapsed="0.062633"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:10.511610" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:10.511205" elapsed="0.000493">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:10.510991" elapsed="0.000784">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:10.510974" elapsed="0.000836">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:10.512074" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:10.511880" elapsed="0.000262"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:10.511863" elapsed="0.000308"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:10.445381" elapsed="0.066894">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:11.515853" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:11.514757" elapsed="0.001172"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:11.527789" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:11.527499" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:11.528382" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:11.528097" 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-08-22T23:56:11.550151" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:11.550347" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:11.550466" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:11.530705" elapsed="0.019793"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:11.528514" elapsed="0.022040"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:11.550834" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:11.550617" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:11.528487" elapsed="0.022453"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:11.554934" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:11.552073" elapsed="0.002914"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:11.551841" elapsed="0.003184"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:11.551822" elapsed="0.003228"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:11.557780" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:11.555337" elapsed="0.002491"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:11.555108" elapsed="0.002757"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:11.555090" elapsed="0.002801"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:11.558660" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:11.558125" 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-08-22T23:56:11.559156" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:11.558801" elapsed="0.000441"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:11.559943" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:11.559519" elapsed="0.000462"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:11.559286" elapsed="0.000743"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:11.558773" elapsed="0.001284"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:11.560770" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:11.560272" elapsed="0.000535"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:11.561223" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:11.560902" elapsed="0.000402"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:11.561870" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:11.561539" elapsed="0.000377"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:11.561343" elapsed="0.000614"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:11.560877" elapsed="0.001103"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:56:11.562138" elapsed="0.000387"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:11.563096" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:11.562777" 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-08-22T23:56:11.563278" 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-08-22T23:56:11.551381" elapsed="0.014409"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:11.566000" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:56:11.565863" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:11.565844" 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-08-22T23:56:11.566331" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:11.566404" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:56:11.568832" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:11.522530" elapsed="0.046331"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:11.568923" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:56:11.569097" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:11.516475" elapsed="0.052649"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:11.569842" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:11.569410" elapsed="0.000568">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:11.569198" elapsed="0.000870">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:11.569180" elapsed="0.000929">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:11.570339" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:11.570188" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:11.570170" elapsed="0.000252"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:11.513384" elapsed="0.057122">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:12.574014" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:12.572906" elapsed="0.001188"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:12.586296" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:12.586022" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:12.586782" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:12.586502" 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-08-22T23:56:12.609427" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:12.609779" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:12.610044" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:12.589138" elapsed="0.020971"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:12.586931" elapsed="0.023283"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:12.610671" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:12.610278" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:12.586904" elapsed="0.023999"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:12.618630" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:12.613625" elapsed="0.005087"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:12.612915" elapsed="0.005859"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:12.612866" elapsed="0.005945"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:12.622545" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:12.619215" elapsed="0.003421"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:12.618894" elapsed="0.003793"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:12.618870" elapsed="0.003852"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:12.623608" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:12.622985" elapsed="0.000666"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:12.624098" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:12.623758" elapsed="0.000469"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:12.624982" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:12.624512" elapsed="0.000511"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:12.624276" elapsed="0.000800"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:12.623730" elapsed="0.001377"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:12.625919" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:12.625358" 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-08-22T23:56:12.626409" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:12.626060" elapsed="0.000437"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:12.627216" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:12.626782" elapsed="0.000472"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:12.626532" elapsed="0.000776"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:12.626035" elapsed="0.001303"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:56:12.627598" elapsed="0.000513"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:12.628876" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:12.628417" 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-08-22T23:56:12.629140" elapsed="0.002383"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:56:12.611796" elapsed="0.019808"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:12.631792" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:56:12.631677" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:12.631658" 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-08-22T23:56:12.632039" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:12.632111" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:56:12.634560" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:12.581019" elapsed="0.053586"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:12.634669" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:56:12.634823" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:12.574694" elapsed="0.060156"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:12.635504" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:12.635134" elapsed="0.000468">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:12.634920" elapsed="0.000759">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:12.634903" elapsed="0.000849">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:12.635979" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:12.635828" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:12.635810" elapsed="0.000250"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:12.571480" elapsed="0.064668">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:13.639231" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:13.638223" elapsed="0.001081"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:13.651415" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:13.651146" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:13.651886" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:13.651635" 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-08-22T23:56:13.673399" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:13.673732" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:13.673956" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:13.654111" elapsed="0.019905"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:13.652010" elapsed="0.022105"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:13.674521" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:13.674177" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:13.651986" elapsed="0.022772"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:13.682708" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:13.677117" elapsed="0.005732"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:13.676620" elapsed="0.006327"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:13.676547" elapsed="0.006458"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:13.686997" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:13.683655" elapsed="0.003388"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:13.683131" elapsed="0.003948"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:13.683093" elapsed="0.004011"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:13.687694" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:13.687283" 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-08-22T23:56:13.688026" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:13.687792" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:13.688570" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:13.688269" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:13.688109" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:13.687775" elapsed="0.000899"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:13.689192" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:13.688829" 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-08-22T23:56:13.689615" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:13.689363" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:13.690158" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:13.689859" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:13.689700" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:13.689343" 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-08-22T23:56:13.690395" elapsed="0.000369"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:13.691304" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:13.690997" 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-08-22T23:56:13.691484" 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-08-22T23:56:13.675633" elapsed="0.018336"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:13.694147" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:56:13.694038" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:13.694020" 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-08-22T23:56:13.694385" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:13.694455" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:56:13.696810" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:13.645945" elapsed="0.050894"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:13.696899" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:56:13.697049" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:13.639835" elapsed="0.057240"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:13.697724" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:13.697351" elapsed="0.000450">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:13.697145" elapsed="0.000728">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:13.697128" elapsed="0.000781">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:13.698123" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:13.697978" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:13.697961" elapsed="0.000240"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:13.637108" elapsed="0.061175">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:14.700493" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:14.699810" elapsed="0.000736"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:14.712873" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:14.712241" elapsed="0.000749"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:14.713998" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:14.713513" elapsed="0.000555"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:56:14.733031" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:14.733341" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:14.733632" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:14.717328" elapsed="0.016401"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:14.714187" elapsed="0.019657"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:14.734319" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:14.733914" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:14.714154" elapsed="0.020363"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:14.741624" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:14.736981" elapsed="0.004744"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:14.736439" elapsed="0.005344"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:14.736395" elapsed="0.005428"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:14.745832" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:14.742249" elapsed="0.003655"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:14.741911" elapsed="0.004046"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:14.741884" elapsed="0.004111"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:14.746945" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:14.746270" 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-08-22T23:56:14.747420" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:14.747087" elapsed="0.000415"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:14.748213" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:14.747784" elapsed="0.000470"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:14.747537" elapsed="0.000770"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:14.747061" elapsed="0.001277"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:14.749090" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:14.748558" 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-08-22T23:56:14.749548" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:14.749227" elapsed="0.000468"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:14.750334" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:14.749963" elapsed="0.000398"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:14.749736" elapsed="0.000662"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:14.749202" 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-08-22T23:56:14.750589" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:14.751414" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:14.751106" 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-08-22T23:56:14.751609" elapsed="0.002407"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:56:14.735400" elapsed="0.018684"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:14.754274" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:56:14.754156" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:14.754137" 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-08-22T23:56:14.754613" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:14.754687" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:56:14.757088" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:14.704884" elapsed="0.052234"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:14.757180" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:56:14.757335" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:14.700910" elapsed="0.056451"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:14.758048" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:14.757672" elapsed="0.000458">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:14.757433" elapsed="0.000774">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:14.757416" elapsed="0.000829">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:14.758462" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:14.758316" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:14.758299" elapsed="0.000244"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:14.698988" elapsed="0.059655">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:15.761730" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:15.760717" elapsed="0.001085"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:15.773746" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:15.773465" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:15.774194" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:15.773949" 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-08-22T23:56:15.816039" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:15.816380" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:15.816695" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:15.776505" elapsed="0.040299"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:15.774315" elapsed="0.042589"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:15.817340" elapsed="0.000069"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:15.816965" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:15.774291" elapsed="0.043268"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:15.825531" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:15.819935" elapsed="0.005743"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:15.819405" elapsed="0.006312"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:15.819363" elapsed="0.006380"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:15.828340" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:15.826041" elapsed="0.002345"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:15.825801" elapsed="0.002619"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:15.825784" elapsed="0.002661"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:15.829052" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:15.828635" 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-08-22T23:56:15.829390" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:15.829150" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:15.829948" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:15.829647" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:15.829472" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:15.829131" elapsed="0.000903"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:15.830551" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:15.830188" 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-08-22T23:56:15.830896" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:15.830664" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:15.831428" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:15.831133" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:15.830977" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:15.830646" elapsed="0.000865"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:56:15.831679" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:15.832484" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:15.832188" 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-08-22T23:56:15.832675" elapsed="0.002308"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:56:15.818417" elapsed="0.016630"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:15.835226" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:56:15.835117" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:15.835099" 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-08-22T23:56:15.835468" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:15.835539" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:56:15.837899" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:15.767937" elapsed="0.069992"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:15.837988" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:56:15.838139" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:15.762293" elapsed="0.075872"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:15.838819" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:15.838441" elapsed="0.000454">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:15.838234" elapsed="0.000734">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:15.838217" elapsed="0.000822">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:15.839262" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:15.839114" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:15.839097" elapsed="0.000251"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:15.759558" elapsed="0.079874">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:16.842532" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:16.841548" elapsed="0.001086"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:16.853323" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:16.853063" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:16.853791" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:16.853526" 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-08-22T23:56:16.871472" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:16.871802" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:16.872049" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:16.856012" elapsed="0.016097"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:16.853912" elapsed="0.018293"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:16.872644" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:16.872264" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:16.853890" elapsed="0.018950"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:16.880486" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:16.875157" elapsed="0.005378"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:16.874664" elapsed="0.005905"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:16.874620" elapsed="0.005990"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:16.883265" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:16.880885" elapsed="0.002426"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:16.880667" elapsed="0.002679"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:16.880651" elapsed="0.002719"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:16.884047" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:16.883599" 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-08-22T23:56:16.884386" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:16.884150" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:16.884939" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:16.884640" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:16.884467" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:16.884132" elapsed="0.000890"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:16.885539" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:16.885179" 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-08-22T23:56:16.885884" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:16.885652" elapsed="0.000356"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:16.886488" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:16.886191" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:16.886034" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:16.885633" 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-08-22T23:56:16.886745" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:16.887548" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:16.887256" 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-08-22T23:56:16.887740" 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-08-22T23:56:16.873684" elapsed="0.016552"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:16.890414" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:56:16.890306" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:16.890287" 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-08-22T23:56:16.890779" elapsed="0.000042"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:16.890874" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:56:16.893386" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:16.848722" elapsed="0.044695"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:16.893478" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:56:16.893652" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:16.843130" elapsed="0.050550"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:16.894339" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:16.893966" elapsed="0.000453">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:16.893754" elapsed="0.000738">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:16.893736" elapsed="0.000791">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:16.894761" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:16.894613" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:16.894595" elapsed="0.000248"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:16.840341" elapsed="0.054585">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:17.898261" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:17.897176" elapsed="0.001168"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:17.909278" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:17.909016" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:17.909750" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:17.909478" 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-08-22T23:56:17.926920" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:17.927115" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:17.927253" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:17.912079" elapsed="0.015210"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:17.909949" elapsed="0.017399"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:17.927642" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:17.927386" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:17.909925" elapsed="0.017843"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:17.935237" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:17.929349" elapsed="0.005962"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:17.929031" elapsed="0.006336"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:17.929005" elapsed="0.006399"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:17.939116" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:17.935866" elapsed="0.003315"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:17.935520" elapsed="0.003709"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:17.935495" elapsed="0.003769"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:17.940171" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:17.939520" 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-08-22T23:56:17.940658" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:17.940309" elapsed="0.000438"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:17.941428" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:17.941002" elapsed="0.000466"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:17.940781" elapsed="0.000738"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:17.940283" elapsed="0.001266"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:17.942321" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:17.941790" 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-08-22T23:56:17.942828" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:17.942460" elapsed="0.000469"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:17.943734" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:17.943213" elapsed="0.000574"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:17.942972" elapsed="0.000875"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:17.942434" elapsed="0.001447"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:56:17.944097" elapsed="0.000414"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:17.945011" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:17.944708" 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-08-22T23:56:17.945190" elapsed="0.002339"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:56:17.928267" elapsed="0.019343"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:17.947795" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:56:17.947682" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:17.947664" 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-08-22T23:56:17.948037" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:17.948171" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:56:17.950519" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:17.903066" elapsed="0.047482"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:17.950623" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:56:17.950777" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:17.898921" elapsed="0.051883"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:17.951460" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:17.951081" elapsed="0.000458">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:17.950874" elapsed="0.000752">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:17.950857" elapsed="0.000805">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:17.951878" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:17.951732" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:17.951715" elapsed="0.000243"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:17.895891" elapsed="0.056149">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:18.953941" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:18.953435" elapsed="0.000543"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:19.008949" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:19.008605" elapsed="0.000402"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:19.009423" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:19.009172" 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-08-22T23:56:19.025029" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:19.025181" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:19.025297" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:19.011695" elapsed="0.013629"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:19.009548" elapsed="0.015821"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:19.025551" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:19.025397" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:19.009524" elapsed="0.016140"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:19.029260" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:19.026762" elapsed="0.002548"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:19.026523" elapsed="0.002887"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:19.026504" elapsed="0.002936"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:19.032132" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:19.029742" elapsed="0.002437"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:19.029498" elapsed="0.002717"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:19.029481" elapsed="0.002759"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:19.032825" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:19.032412" 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-08-22T23:56:19.033163" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:19.032925" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:19.033734" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:19.033410" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:19.033248" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:19.032907" elapsed="0.000916"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:19.034351" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:19.033982" 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-08-22T23:56:19.034699" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:19.034450" elapsed="0.000382"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:19.035343" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:19.035038" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:19.034861" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:19.034432" 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-08-22T23:56:19.035596" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:19.036403" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:19.036112" 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-08-22T23:56:19.036625" 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-08-22T23:56:19.026051" elapsed="0.013081"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:19.039312" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:56:19.039203" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:19.039184" 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-08-22T23:56:19.039552" elapsed="0.000036"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:19.039640" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:56:19.042157" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:18.956891" elapsed="0.085295"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:19.042250" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:56:19.042404" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:18.954216" elapsed="0.088215"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:19.043222" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:19.042830" elapsed="0.000470">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:19.042504" elapsed="0.000874">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:19.042486" elapsed="0.000961">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:19.043688" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:19.043523" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:19.043505" elapsed="0.000267"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:18.952803" elapsed="0.091053">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:20.046943" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:20.045944" elapsed="0.001070"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:20.059157" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:20.058893" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:20.059620" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:20.059358" 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-08-22T23:56:20.077742" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:20.078038" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:20.078258" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:20.061890" elapsed="0.016427"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:20.059746" elapsed="0.018673"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:20.078883" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:20.078506" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:20.059723" elapsed="0.019361"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:20.087550" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:20.081405" elapsed="0.006218"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:20.080900" elapsed="0.006760"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:20.080858" elapsed="0.006828"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:20.090298" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:20.087968" elapsed="0.002377"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:20.087743" elapsed="0.002638"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:20.087726" elapsed="0.002679"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:20.091044" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:20.090627" 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-08-22T23:56:20.091378" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:20.091142" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:20.091941" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:20.091639" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:20.091465" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:20.091125" elapsed="0.000901"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:20.092546" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:20.092182" 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-08-22T23:56:20.092930" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:20.092669" elapsed="0.000394"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:20.093550" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:20.093249" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:20.093089" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:20.092643" 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-08-22T23:56:20.093803" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:20.094656" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:20.094318" 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-08-22T23:56:20.094836" elapsed="0.002484"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:56:20.079917" elapsed="0.017479"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:20.097611" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:56:20.097481" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:20.097460" 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-08-22T23:56:20.097868" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:20.097941" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:56:20.100282" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:20.053191" elapsed="0.047120"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:20.100372" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:56:20.100523" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:20.047509" elapsed="0.053040"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:20.101221" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:20.100843" elapsed="0.000457">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:20.100635" elapsed="0.000742">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:20.100618" elapsed="0.000793">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:20.101641" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:20.101481" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:20.101464" elapsed="0.000259"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:20.044827" elapsed="0.056977">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:21.105026" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:21.103959" elapsed="0.001154"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:21.117124" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:21.116856" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:21.117593" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:21.117329" 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-08-22T23:56:21.135879" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:21.136185" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:21.136427" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:21.119935" elapsed="0.016549"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:21.117826" elapsed="0.018802"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:21.137063" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:21.136697" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:21.117800" elapsed="0.019460"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:21.144630" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:21.139716" elapsed="0.004986"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:21.139164" elapsed="0.005590"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:21.139117" elapsed="0.005672"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:21.148466" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:21.145176" elapsed="0.003355"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:21.144867" elapsed="0.003732"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:21.144844" elapsed="0.003793"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:21.149439" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:21.148877" 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-08-22T23:56:21.149928" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:21.149596" elapsed="0.000413"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:21.150726" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:21.150265" elapsed="0.000503"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:21.150043" elapsed="0.000777"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:21.149552" elapsed="0.001298"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:21.151637" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:21.151068" 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-08-22T23:56:21.152093" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:21.151772" elapsed="0.000402"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:21.152865" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:21.152428" elapsed="0.000473"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:21.152208" elapsed="0.000743"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:21.151747" 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-08-22T23:56:21.153191" elapsed="0.000510"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:21.154329" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:21.153927" 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-08-22T23:56:21.154640" elapsed="0.002660"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:56:21.138127" elapsed="0.019242"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:21.157552" elapsed="0.000052"/>
</return>
<status status="PASS" start="2026-08-22T23:56:21.157442" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:21.157422" 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-08-22T23:56:21.157821" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:21.157951" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:56:21.160330" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:21.111405" elapsed="0.048954"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:21.160420" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:56:21.160574" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:21.105671" elapsed="0.054944"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:21.161259" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:21.160896" elapsed="0.000442">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:21.160687" elapsed="0.000725">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:21.160670" elapsed="0.000776">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:21.161676" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:21.161515" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:21.161498" elapsed="0.000261"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:21.102749" elapsed="0.059093">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:22.164718" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:22.163756" elapsed="0.001033"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:22.179942" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:22.179679" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:22.180390" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:22.180146" 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-08-22T23:56:22.197849" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:22.197994" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:22.198092" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:22.182720" elapsed="0.015399"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:22.180509" elapsed="0.017654"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:22.198344" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:22.198190" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:22.180487" elapsed="0.017987"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:22.203488" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:22.199937" elapsed="0.003620"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:22.199628" elapsed="0.004074"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:22.199600" elapsed="0.004142"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:22.207486" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:22.204138" elapsed="0.003416"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:22.203825" elapsed="0.003801"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:22.203801" elapsed="0.003862"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:22.208479" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:22.207900" 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-08-22T23:56:22.208933" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:22.208678" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:22.209481" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:22.209178" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:22.209017" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:22.208655" elapsed="0.000914"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:22.210112" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:22.209745" 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-08-22T23:56:22.210450" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:22.210212" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:22.211009" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:22.210711" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:22.210534" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:22.210194" 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-08-22T23:56:22.211244" elapsed="0.000379"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:22.212081" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:22.211788" 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-08-22T23:56:22.212272" 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-08-22T23:56:22.199018" elapsed="0.015817"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:22.215014" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:56:22.214905" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:22.214887" 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-08-22T23:56:22.215253" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:22.215325" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:56:22.217976" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:22.171313" elapsed="0.046693"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:22.218068" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:56:22.218221" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:22.165278" elapsed="0.052970"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:22.218917" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:22.218529" elapsed="0.000465">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:22.218321" elapsed="0.000745">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:22.218304" elapsed="0.000829">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:22.219357" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:22.219209" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:22.219192" elapsed="0.000248"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:22.162689" elapsed="0.056835">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:23.222776" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:23.221731" elapsed="0.001123"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:23.233107" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:23.232845" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:23.233552" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:23.233307" 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-08-22T23:56:23.255118" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:23.255437" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:23.255702" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:23.235807" elapsed="0.019957"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:23.233701" elapsed="0.022164"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:23.256278" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:23.255930" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:23.233672" elapsed="0.022809"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:23.264688" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:23.258965" elapsed="0.005797"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:23.258361" elapsed="0.006451"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:23.258318" elapsed="0.006532"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:23.268761" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:23.265266" elapsed="0.003562"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:23.264931" elapsed="0.003947"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:23.264907" elapsed="0.004006"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:23.269755" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:23.269163" 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-08-22T23:56:23.270240" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:23.269894" elapsed="0.000432"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:23.271063" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:23.270615" elapsed="0.000486"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:23.270361" elapsed="0.000791"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:23.269868" elapsed="0.001313"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:23.271964" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:23.271400" 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-08-22T23:56:23.272423" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:23.272101" elapsed="0.000540"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:23.273328" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:23.272909" elapsed="0.000456"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:23.272680" elapsed="0.000737"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:23.272076" 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-08-22T23:56:23.273731" elapsed="0.000527"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:23.274999" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:23.274489" 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-08-22T23:56:23.275262" elapsed="0.004074"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:56:23.257337" elapsed="0.022068"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:23.279604" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-08-22T23:56:23.279477" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:23.279458" 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-08-22T23:56:23.279862" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:23.279933" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:56:23.282277" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:23.228494" elapsed="0.053812"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:23.282368" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:56:23.282520" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:23.223377" elapsed="0.059170"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:23.283218" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:23.282847" elapsed="0.000459">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:23.282640" elapsed="0.000743">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:23.282622" elapsed="0.000796">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:23.283650" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:23.283487" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:23.283471" elapsed="0.000262"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:23.220403" elapsed="0.063415">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:24.286939" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:24.285914" elapsed="0.001102"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:24.298371" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:24.298106" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:24.298845" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:24.298590" 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-08-22T23:56:24.317277" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:24.317442" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:24.317542" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:24.301187" elapsed="0.016381"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:24.299065" elapsed="0.018570"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:24.317824" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:24.317667" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:24.299037" elapsed="0.018876"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:24.321444" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:24.318951" elapsed="0.002542"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:24.318727" elapsed="0.002802"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:24.318708" elapsed="0.002847"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:24.324224" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:24.321852" elapsed="0.002419"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:24.321629" elapsed="0.002678"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:24.321611" elapsed="0.002721"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:24.324962" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:24.324518" 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-08-22T23:56:24.325299" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:24.325062" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:24.326050" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:24.325745" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:24.325383" elapsed="0.000730"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:24.325044" elapsed="0.001090"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:24.326679" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:24.326291" 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-08-22T23:56:24.327006" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:24.326776" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:24.327538" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:24.327244" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:24.327088" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:24.326758" 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-08-22T23:56:24.327807" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:24.328663" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:24.328324" 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-08-22T23:56:24.328841" 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-08-22T23:56:24.318282" elapsed="0.012970"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:24.331435" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:56:24.331323" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:24.331304" 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-08-22T23:56:24.331728" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:24.331843" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:56:24.334169" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:24.293298" elapsed="0.040900"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:24.334258" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:56:24.334410" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:24.287517" elapsed="0.046919"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:24.335147" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:24.334778" elapsed="0.000457">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:24.334506" elapsed="0.000805">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:24.334489" elapsed="0.000857">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:24.335613" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:24.335414" elapsed="0.000259"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:24.335398" elapsed="0.000298"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:24.284785" elapsed="0.050997">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:25.338927" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:25.337930" elapsed="0.001071"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:25.352647" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:25.352352" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:25.353104" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:25.352851" 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-08-22T23:56:25.371346" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:25.371695" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:25.371922" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:25.355361" elapsed="0.016623"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:25.353230" elapsed="0.018855"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:25.372518" elapsed="0.000093"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:25.372149" elapsed="0.000568"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:25.353205" elapsed="0.019563"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:25.380736" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:25.375076" elapsed="0.005729"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:25.374546" elapsed="0.006427"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:25.374505" elapsed="0.006511"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:25.384765" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:25.381412" elapsed="0.003419"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:25.381099" elapsed="0.003782"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:25.381075" elapsed="0.003840"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:25.385757" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:25.385166" 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-08-22T23:56:25.386226" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:25.385897" elapsed="0.000410"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:25.387007" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:25.386565" elapsed="0.000480"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:25.386341" elapsed="0.000758"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:25.385871" elapsed="0.001259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:25.387881" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:25.387350" 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-08-22T23:56:25.388361" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:25.388034" elapsed="0.000410"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:25.389142" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:25.388721" elapsed="0.000457"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:25.388478" elapsed="0.000751"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:25.388008" elapsed="0.001251"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:56:25.389472" elapsed="0.000514"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:25.390648" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:25.390212" 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-08-22T23:56:25.390899" elapsed="0.003057"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:56:25.373562" elapsed="0.020463"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:25.394208" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:56:25.394097" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:25.394078" 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-08-22T23:56:25.394454" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:25.394524" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:56:25.396882" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:25.345916" elapsed="0.050995"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:25.396971" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:56:25.397120" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:25.339503" elapsed="0.057643"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:25.397809" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:25.397425" elapsed="0.000477">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:25.397218" elapsed="0.000759">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:25.397201" elapsed="0.000851">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:25.398273" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:25.398127" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:25.398110" elapsed="0.000244"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:25.336693" elapsed="0.061744">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:26.401345" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:26.400366" elapsed="0.001048"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:26.415119" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:26.414857" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:26.415608" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:26.415333" 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-08-22T23:56:26.434525" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:26.434860" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:26.435102" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:26.417860" elapsed="0.017302"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:26.415738" elapsed="0.019524"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:26.435730" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:26.435324" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:26.415714" elapsed="0.020218"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:26.442661" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:26.438281" elapsed="0.004452"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:26.437729" elapsed="0.005056"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:26.437686" elapsed="0.005137"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:26.446596" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:26.443231" elapsed="0.003434"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:26.442917" elapsed="0.003798"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:26.442880" elapsed="0.003870"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:26.447627" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:26.447010" 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-08-22T23:56:26.448105" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:26.447771" elapsed="0.000433"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:26.449052" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:26.448483" elapsed="0.000613"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:26.448250" elapsed="0.000899"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:26.447744" elapsed="0.001436"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:26.449908" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:26.449405" 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-08-22T23:56:26.450239" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:26.450007" elapsed="0.000351"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:26.450885" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:26.450550" elapsed="0.000362"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:26.450385" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:26.449988" 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-08-22T23:56:26.451131" elapsed="0.000381"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:26.452003" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:26.451699" 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-08-22T23:56:26.452185" elapsed="0.002384"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:56:26.436749" elapsed="0.017902"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:26.454847" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:56:26.454723" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:26.454704" 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-08-22T23:56:26.455095" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:26.455168" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:56:26.457562" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:26.407550" elapsed="0.050055"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:26.457667" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:56:26.457819" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:26.401945" elapsed="0.055900"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:26.458525" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:26.458122" elapsed="0.000628">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:26.457915" elapsed="0.000915">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:26.457898" elapsed="0.000968">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:26.459088" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:26.458938" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:26.458920" elapsed="0.000253"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:26.399231" elapsed="0.060030">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:27.461333" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:27.460856" elapsed="0.000515"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:27.469074" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:27.468806" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:27.469524" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:27.469275" 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-08-22T23:56:27.488223" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:27.488385" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:27.488512" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:27.471835" elapsed="0.016705"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:27.469744" elapsed="0.018864"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:27.488796" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:27.488639" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:27.469718" elapsed="0.019167"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:27.492392" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:27.489926" elapsed="0.002519"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:27.489705" elapsed="0.002776"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:27.489687" elapsed="0.002819"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:27.495101" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:27.492805" elapsed="0.002342"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:27.492562" elapsed="0.002620"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:27.492546" elapsed="0.002661"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:27.495791" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:27.495380" 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-08-22T23:56:27.496263" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:27.495889" elapsed="0.000436"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:27.496858" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:27.496520" elapsed="0.000365"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:27.496354" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:27.495871" elapsed="0.001071"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:27.497455" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:27.497096" 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-08-22T23:56:27.497894" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:27.497549" elapsed="0.000403"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:27.498441" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:27.498139" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:27.497977" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:27.497532" 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-08-22T23:56:27.498695" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:27.499511" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:27.499209" 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-08-22T23:56:27.499705" elapsed="0.002341"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:56:27.489251" elapsed="0.012860"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:27.502291" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:56:27.502182" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:27.502162" 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-08-22T23:56:27.502530" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:27.502671" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:56:27.505037" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:27.464131" elapsed="0.040936"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:27.505127" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:56:27.505280" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:27.461623" elapsed="0.043683"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:27.505969" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:27.505605" elapsed="0.000445">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:27.505377" elapsed="0.000744">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:27.505359" elapsed="0.000796">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:27.506374" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:27.506225" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:27.506208" elapsed="0.000245"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:27.460056" elapsed="0.046480">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:28.509790" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:28.508701" elapsed="0.001164"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:28.522817" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:28.522528" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:28.523267" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:28.523021" 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-08-22T23:56:28.541023" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:28.541335" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:28.541619" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:28.525513" elapsed="0.016172"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:28.523395" 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-08-22T23:56:28.542209" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:28.541852" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:28.523367" elapsed="0.019040"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:28.549642" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:28.544885" elapsed="0.004834"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:28.544348" elapsed="0.005508"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:28.544305" elapsed="0.005594"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:28.554107" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:28.550330" elapsed="0.003848"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:28.549996" elapsed="0.004237"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:28.549960" elapsed="0.004310"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:28.555228" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:28.554538" elapsed="0.000737"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:28.555786" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:28.555402" elapsed="0.000474"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:28.556684" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:28.556154" elapsed="0.000573"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:28.555913" elapsed="0.000871"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:28.555370" elapsed="0.001446"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:28.557640" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:28.557051" elapsed="0.000630"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:28.558181" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:28.557786" elapsed="0.000481"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:28.558997" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:28.558535" elapsed="0.000539"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:28.558303" elapsed="0.000836"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:28.557759" 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-08-22T23:56:28.559431" elapsed="0.000425"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:28.560334" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:28.560019" 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-08-22T23:56:28.560516" 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-08-22T23:56:28.543276" elapsed="0.019721"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:28.563321" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-08-22T23:56:28.563182" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:28.563155" 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-08-22T23:56:28.563597" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:28.563671" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:56:28.566201" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:28.518157" elapsed="0.048076"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:28.566305" elapsed="0.000038"/>
</return>
<msg time="2026-08-22T23:56:28.566483" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:28.510366" elapsed="0.056144"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:28.567271" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:28.566827" elapsed="0.000535">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:28.566606" elapsed="0.000833">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:28.566567" elapsed="0.000988">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:28.567804" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:28.567651" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:28.567632" elapsed="0.000253"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:28.507430" elapsed="0.060544">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:29.570981" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:29.569954" elapsed="0.001101"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:29.581865" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:29.581597" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:29.582318" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:29.582069" 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-08-22T23:56:29.601304" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:29.601662" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:29.601886" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:29.584989" elapsed="0.016956"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:29.582447" elapsed="0.019595"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:29.602464" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:29.602105" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:29.582422" elapsed="0.020275"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:29.610043" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:29.605027" elapsed="0.005085"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:29.604495" elapsed="0.005669"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:29.604453" elapsed="0.005746"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:29.613863" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:29.610609" elapsed="0.003318"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:29.610278" elapsed="0.003699"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:29.610255" elapsed="0.003755"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:29.614841" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:29.614253" 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-08-22T23:56:29.615308" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:29.614978" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:29.616127" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:29.615669" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:29.615424" elapsed="0.000794"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:29.614953" elapsed="0.001295"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:29.617010" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:29.616468" 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-08-22T23:56:29.617470" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:29.617146" elapsed="0.000505"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:29.618338" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:29.617919" elapsed="0.000456"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:29.617688" elapsed="0.000738"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:29.617121" elapsed="0.001336"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:56:29.618695" elapsed="0.000499"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:29.619903" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:29.619425" 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-08-22T23:56:29.620160" 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-08-22T23:56:29.603491" elapsed="0.019270"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:29.622946" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:56:29.622832" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:29.622812" 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-08-22T23:56:29.623193" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:29.623265" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:56:29.625651" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:29.577070" elapsed="0.048611"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:29.625741" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:56:29.625893" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:29.571563" elapsed="0.054356"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:29.626565" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:29.626200" elapsed="0.000468">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:29.625990" elapsed="0.000753">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:29.625973" elapsed="0.000805">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:29.626998" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:29.626848" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:29.626832" elapsed="0.000247"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:29.568773" elapsed="0.058390">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:30.632425" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:30.629448" elapsed="0.003051"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:30.642237" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:30.641678" elapsed="0.000615"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:30.642731" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:30.642454" 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-08-22T23:56:30.661546" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:30.661881" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:30.662129" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:30.645084" elapsed="0.017103"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:30.642956" elapsed="0.019329"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:30.662761" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:30.662347" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:30.642929" elapsed="0.020032"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:30.670792" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:30.665269" elapsed="0.005573"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:30.664774" elapsed="0.006104"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:30.664733" elapsed="0.006170"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:30.673555" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:30.671181" elapsed="0.002439"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:30.670960" elapsed="0.002696"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:30.670943" elapsed="0.002739"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:30.674298" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:30.673876" 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-08-22T23:56:30.674655" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:30.674397" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:30.675201" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:30.674902" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:30.674740" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:30.674379" elapsed="0.000907"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:30.675826" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:30.675441" 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-08-22T23:56:30.676151" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:30.675923" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:30.676696" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:30.676386" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:30.676231" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:30.675905" elapsed="0.000875"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:56:30.676934" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:30.677775" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:30.677441" 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-08-22T23:56:30.677962" elapsed="0.002343"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:56:30.663794" elapsed="0.016576"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:30.680551" elapsed="0.000052"/>
</return>
<status status="PASS" start="2026-08-22T23:56:30.680441" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:30.680422" 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-08-22T23:56:30.680813" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:30.680930" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:56:30.683426" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:30.636741" elapsed="0.046715"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:30.683516" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:56:30.683685" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:30.633088" elapsed="0.050624"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:30.684355" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:30.683992" elapsed="0.000448">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:30.683783" elapsed="0.000734">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:30.683766" elapsed="0.000785">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:30.684786" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:30.684639" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:30.684622" elapsed="0.000244"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:30.628267" elapsed="0.056683">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:31.688540" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:31.687359" elapsed="0.001288"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:31.700505" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:31.700144" elapsed="0.000429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:31.701154" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:31.700811" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:56:31.719701" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:31.720058" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:31.720296" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:31.703656" elapsed="0.016703"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:31.701327" elapsed="0.019135"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:31.720941" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:31.720531" elapsed="0.000568"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:31.701292" elapsed="0.019859"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:31.729615" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:31.723684" elapsed="0.006048"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:31.723121" elapsed="0.006811"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:31.723076" elapsed="0.006903"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:31.732652" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:31.730265" elapsed="0.002434"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:31.730038" elapsed="0.002697"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:31.730021" elapsed="0.002739"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:31.733405" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:31.732950" 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-08-22T23:56:31.733767" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:31.733505" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:31.734318" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:31.734015" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:31.733851" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:31.733487" elapsed="0.000918"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:31.734949" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:31.734565" 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-08-22T23:56:31.735280" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:31.735047" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:31.735841" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:31.735522" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:31.735362" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:31.735029" 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-08-22T23:56:31.736086" elapsed="0.000363"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:31.736947" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:31.736629" 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-08-22T23:56:31.737143" 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-08-22T23:56:31.722074" elapsed="0.017669"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:31.739928" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-08-22T23:56:31.739814" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:31.739796" 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-08-22T23:56:31.740191" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:31.740264" elapsed="0.000014"/>
</return>
<msg time="2026-08-22T23:56:31.742715" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:31.693985" elapsed="0.048760"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:31.742807" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:56:31.742959" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:31.689165" elapsed="0.053820"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:31.743663" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:31.743270" elapsed="0.000483">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:31.743058" elapsed="0.000773">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:31.743041" elapsed="0.000866">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:31.744134" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:31.743984" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:31.743967" elapsed="0.000270"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:31.686136" elapsed="0.058188">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:32.747469" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:32.746467" elapsed="0.001074"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:32.759235" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:32.758971" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:32.759703" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:32.759438" 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-08-22T23:56:32.777655" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:32.778006" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:32.778305" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:32.761963" elapsed="0.016412"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:32.759830" elapsed="0.018662"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:32.779036" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:32.778616" elapsed="0.000578"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:32.759805" elapsed="0.019444"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:32.787434" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:32.781876" elapsed="0.005607"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:32.781285" elapsed="0.006234"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:32.781240" elapsed="0.006306"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:32.790228" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:32.787845" elapsed="0.002429"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:32.787621" elapsed="0.002688"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:32.787603" elapsed="0.002731"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:32.790939" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:32.790514" 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-08-22T23:56:32.791273" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:32.791038" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:32.791836" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:32.791515" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:32.791356" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:32.791020" elapsed="0.000900"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:32.792437" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:32.792076" 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-08-22T23:56:32.792885" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:32.792649" elapsed="0.000379"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:32.793520" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:32.793219" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:32.793054" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:32.792629" elapsed="0.001010"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:56:32.793794" elapsed="0.000371"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:32.794672" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:32.794327" 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-08-22T23:56:32.794852" elapsed="0.002335"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:56:32.780188" elapsed="0.017066"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:32.797438" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:56:32.797325" elapsed="0.000399"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:32.797306" elapsed="0.000468"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:32.797948" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:32.798028" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:56:32.800542" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:32.754272" elapsed="0.046300"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:32.800649" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:56:32.800804" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:32.748195" elapsed="0.052635"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:32.801496" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:32.801118" elapsed="0.000486">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:32.800899" elapsed="0.000783">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:32.800882" elapsed="0.000835">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:32.801940" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:32.801792" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:32.801775" elapsed="0.000245"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:32.745239" elapsed="0.056865">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:33.805165" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:33.804156" elapsed="0.001085"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:33.818785" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:33.818499" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:33.819255" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:33.818989" 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-08-22T23:56:33.839245" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:33.839485" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:33.839716" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:33.821633" elapsed="0.018144"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:33.819504" elapsed="0.020372"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:33.840281" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:33.839935" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:33.819478" elapsed="0.020999"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:33.848120" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:33.842848" elapsed="0.005323"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:33.842322" elapsed="0.005885"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:33.842281" elapsed="0.005952"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:33.850899" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:33.848509" elapsed="0.002439"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:33.848289" elapsed="0.002695"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:33.848273" elapsed="0.002737"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:33.851598" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:33.851185" 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-08-22T23:56:33.851959" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:33.851700" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:33.852509" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:33.852203" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:33.852043" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:33.851682" elapsed="0.000929"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:33.853138" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:33.852769" 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-08-22T23:56:33.853467" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:33.853235" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:33.854037" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:33.853723" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:33.853550" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:33.853218" 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-08-22T23:56:33.854273" elapsed="0.000390"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:33.855136" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:33.854827" 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-08-22T23:56:33.855321" 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-08-22T23:56:33.841339" elapsed="0.016460"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:33.857983" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:56:33.857872" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:33.857853" 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-08-22T23:56:33.858229" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:33.858367" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:56:33.860875" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:33.811455" elapsed="0.049450"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:33.860969" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:56:33.861126" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:33.805776" elapsed="0.055378"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:33.861828" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:33.861439" elapsed="0.000468">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:33.861227" elapsed="0.000753">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:33.861210" elapsed="0.000806">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:33.862236" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:33.862087" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:33.862070" elapsed="0.000248"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:33.802970" elapsed="0.059433">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:34.865621" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:34.864549" elapsed="0.001149"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:34.877997" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:34.877713" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:34.878450" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:34.878201" 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-08-22T23:56:34.898362" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:34.898523" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:34.898647" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:34.880803" elapsed="0.017872"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:34.878592" elapsed="0.020128"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:34.899064" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:34.898750" elapsed="0.000460"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:34.878551" elapsed="0.020707"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:34.907877" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:34.901621" elapsed="0.006403"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:34.901070" elapsed="0.007166"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:34.901029" elapsed="0.007293"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:34.912353" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:34.909018" elapsed="0.003383"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:34.908456" elapsed="0.003982"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:34.908418" elapsed="0.004045"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:34.913072" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:34.912657" 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-08-22T23:56:34.913411" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:34.913173" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:34.914124" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:34.913675" elapsed="0.000477"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:34.913495" elapsed="0.000695"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:34.913154" elapsed="0.001059"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:34.914756" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:34.914372" 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-08-22T23:56:34.915090" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:34.914854" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:34.915648" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:34.915333" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:34.915175" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:34.914836" 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-08-22T23:56:34.915884" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:34.916717" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:34.916392" 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-08-22T23:56:34.916897" 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-08-22T23:56:34.900085" elapsed="0.019368"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:34.919650" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:56:34.919524" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:34.919505" 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-08-22T23:56:34.919897" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:34.919969" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:56:34.922388" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:34.872488" elapsed="0.049929"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:34.922479" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:56:34.922646" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:34.866200" elapsed="0.056474"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:34.923323" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:34.922954" elapsed="0.000451">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:34.922746" elapsed="0.000732">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:34.922729" elapsed="0.000825">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:34.923795" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:34.923647" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:34.923629" elapsed="0.000249"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:34.863345" elapsed="0.060616">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:35.926983" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:35.926008" elapsed="0.001045"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:35.937547" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:35.937288" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:35.938012" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:35.937765" 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-08-22T23:56:35.956624" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:35.956961" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:35.957209" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:35.940229" elapsed="0.017055"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:35.938139" elapsed="0.019252"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:35.957905" elapsed="0.000069"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:35.957471" elapsed="0.000621"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:35.938113" elapsed="0.020040"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:35.966072" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:35.960811" elapsed="0.005332"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:35.960270" elapsed="0.005923"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:35.960225" elapsed="0.006004"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:35.970051" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:35.966638" elapsed="0.003480"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:35.966307" elapsed="0.003860"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:35.966284" elapsed="0.003919"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:35.971051" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:35.970440" 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-08-22T23:56:35.971525" elapsed="0.000080"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:35.971191" elapsed="0.000471"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:35.972447" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:35.971969" elapsed="0.000525"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:35.971697" elapsed="0.000859"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:35.971166" elapsed="0.001454"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:35.973452" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:35.972869" 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-08-22T23:56:35.973955" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:35.973616" elapsed="0.000526"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:35.974863" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:35.974412" elapsed="0.000488"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:35.974182" elapsed="0.000776"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:35.973567" 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-08-22T23:56:35.975228" elapsed="0.000544"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:35.976488" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:35.976065" elapsed="0.000461"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:56:35.976771" 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-08-22T23:56:35.959193" elapsed="0.020065"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:35.979466" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:56:35.979330" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:35.979310" 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-08-22T23:56:35.979741" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:35.979820" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:56:35.982181" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:35.932963" elapsed="0.049248"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:35.982272" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:56:35.982424" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:35.927549" elapsed="0.055004"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:35.983244" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:35.982876" elapsed="0.000453">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:35.982645" elapsed="0.000758">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:35.982626" elapsed="0.000812">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:35.983684" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:35.983508" elapsed="0.000237"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:35.983491" elapsed="0.000278"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:35.924885" elapsed="0.058999">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:36.986804" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:36.985821" elapsed="0.001056"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:36.999693" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:36.999394" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:37.000146" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:36.999896" 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-08-22T23:56:37.021102" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:37.021258" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:37.021360" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:37.002459" elapsed="0.018927"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:37.000364" elapsed="0.021066"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:37.021639" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:37.021459" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:37.000339" elapsed="0.021389"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:37.025226" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:37.022766" elapsed="0.002510"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:37.022526" elapsed="0.002786"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:37.022508" elapsed="0.002829"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:37.027963" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:37.025629" elapsed="0.002381"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:37.025392" elapsed="0.002653"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:37.025376" elapsed="0.002695"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:37.028662" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:37.028246" 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-08-22T23:56:37.028996" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:37.028760" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:37.029538" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:37.029240" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:37.029079" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:37.028742" elapsed="0.000897"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:37.030160" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:37.029802" 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-08-22T23:56:37.030485" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:37.030256" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:37.031030" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:37.030737" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:37.030565" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:37.030238" 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-08-22T23:56:37.031264" elapsed="0.000394"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:37.032112" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:37.031819" 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-08-22T23:56:37.032289" elapsed="0.002333"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:56:37.022099" elapsed="0.012588"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:37.034866" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:56:37.034757" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:37.034738" 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-08-22T23:56:37.035105" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:37.035218" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:56:37.037587" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:36.993212" elapsed="0.044406"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:37.037681" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:56:37.037836" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:36.987368" elapsed="0.050495"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:37.038508" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:37.038144" elapsed="0.000457">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:37.037935" elapsed="0.000742">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:37.037918" elapsed="0.000795">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:37.038929" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:37.038783" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:37.038767" elapsed="0.000244"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:36.984710" elapsed="0.054384">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:38.041767" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:38.040835" elapsed="0.000997"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:38.056254" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:38.055995" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:38.056724" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:38.056458" 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-08-22T23:56:38.073753" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:38.073977" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:38.074215" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:38.058927" elapsed="0.015347"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:38.056852" elapsed="0.017518"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:38.074808" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:38.074427" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:38.056823" elapsed="0.018183"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:38.083019" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:38.077381" elapsed="0.005748"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:38.076872" elapsed="0.006461"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:38.076824" elapsed="0.006575"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:38.086288" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:38.083967" elapsed="0.002367"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:38.083615" elapsed="0.002755"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:38.083546" elapsed="0.002848"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:38.086966" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:38.086562" 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-08-22T23:56:38.087298" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:38.087064" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:38.087874" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:38.087552" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:38.087380" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:38.087046" elapsed="0.000914"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:38.088600" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:38.088116" 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-08-22T23:56:38.088935" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:38.088702" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:38.089468" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:38.089174" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:38.089017" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:38.088684" 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-08-22T23:56:38.089717" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:38.090507" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:38.090224" 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-08-22T23:56:38.090699" elapsed="0.002333"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:56:38.075874" elapsed="0.017223"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:38.093274" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-08-22T23:56:38.093166" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:38.093148" 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-08-22T23:56:38.093507" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:38.093594" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:56:38.096117" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:38.051352" elapsed="0.044794"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:38.096206" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:56:38.096356" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:38.042309" elapsed="0.054073"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:38.097195" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:38.096675" elapsed="0.000596">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:38.096453" elapsed="0.000889">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:38.096436" elapsed="0.000982">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:38.097666" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:38.097493" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:38.097476" elapsed="0.000273"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:38.039854" elapsed="0.057977">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:39.101205" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:39.099968" elapsed="0.001310"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:39.113096" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:39.112823" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:39.113547" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:39.113301" 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-08-22T23:56:39.148036" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:39.148201" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:39.148302" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:39.115848" elapsed="0.032480"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:39.113691" elapsed="0.034681"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:39.148555" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:39.148401" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:39.113667" elapsed="0.035000"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:39.152335" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:39.149751" elapsed="0.002635"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:39.149507" elapsed="0.002915"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:39.149488" elapsed="0.002960"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:39.155067" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:39.152742" elapsed="0.002372"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:39.152505" elapsed="0.002645"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:39.152488" elapsed="0.002687"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:39.155763" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:39.155351" 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-08-22T23:56:39.156138" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:39.155861" elapsed="0.000336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:39.156703" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:39.156382" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:39.156222" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:39.155843" elapsed="0.000945"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:39.157307" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:39.156945" 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-08-22T23:56:39.157648" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:39.157404" elapsed="0.000389"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:39.158285" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:39.157987" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:39.157821" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:39.157386" 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-08-22T23:56:39.158521" elapsed="0.000379"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:39.159375" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:39.159077" 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-08-22T23:56:39.159555" elapsed="0.002338"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:56:39.149074" elapsed="0.012884"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:39.162136" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:56:39.162028" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:39.162009" 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-08-22T23:56:39.162379" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:39.162450" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:56:39.164839" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:39.107561" elapsed="0.057308"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:39.164930" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:56:39.165083" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:39.101825" elapsed="0.063285"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:39.165765" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:39.165388" elapsed="0.000454">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:39.165180" elapsed="0.000733">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:39.165163" elapsed="0.000785">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:39.166165" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:39.166017" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:39.166001" elapsed="0.000245"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:39.098768" elapsed="0.067560">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:40.169144" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:40.168122" elapsed="0.001091"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:40.183851" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:40.183563" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:40.184296" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:40.184052" 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-08-22T23:56:40.202634" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:40.202771" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:40.202875" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:40.186725" elapsed="0.016187"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:40.184532" elapsed="0.018456"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:40.203256" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:40.203034" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:40.184509" elapsed="0.018871"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:40.208446" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:40.204927" elapsed="0.003589"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:40.204555" elapsed="0.004013"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:40.204529" elapsed="0.004098"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:40.212600" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:40.209032" elapsed="0.003637"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:40.208708" elapsed="0.004012"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:40.208684" elapsed="0.004072"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:40.213597" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:40.213028" 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-08-22T23:56:40.214003" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:40.213740" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:40.214548" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:40.214246" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:40.214087" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:40.213714" elapsed="0.000938"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:40.215175" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:40.214811" 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-08-22T23:56:40.215505" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:40.215273" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:40.216069" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:40.215766" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:40.215604" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:40.215255" 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-08-22T23:56:40.216305" elapsed="0.000383"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:40.217315" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:40.217020" 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-08-22T23:56:40.217494" 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-08-22T23:56:40.203937" elapsed="0.016015"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:40.220131" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-08-22T23:56:40.220023" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:40.220004" 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-08-22T23:56:40.220368" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:40.220479" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:56:40.222890" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:40.175303" elapsed="0.047622"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:40.222987" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:56:40.223139" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:40.169732" elapsed="0.053434"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:40.223820" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:40.223443" elapsed="0.000453">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:40.223237" elapsed="0.000730">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:40.223220" elapsed="0.000782">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:40.224219" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:40.224072" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:40.224055" elapsed="0.000246"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:40.167086" elapsed="0.057297">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:41.227272" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:41.226337" elapsed="0.001000"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:41.239242" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:41.238981" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:41.239710" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:41.239445" 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-08-22T23:56:41.258897" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:41.259139" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:41.259356" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:41.241905" elapsed="0.017510"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:41.239827" elapsed="0.019686"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:41.259951" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:41.259571" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:41.239807" elapsed="0.020338"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:41.268014" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:41.262448" elapsed="0.005677"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:41.261924" elapsed="0.006368"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:41.261882" elapsed="0.006473"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:41.272497" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:41.269016" elapsed="0.003528"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:41.268486" elapsed="0.004108"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:41.268448" elapsed="0.004173"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:41.273178" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:41.272790" 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-08-22T23:56:41.273510" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:41.273277" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:41.274098" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:41.273770" elapsed="0.000359"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:41.273608" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:41.273259" elapsed="0.000929"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:41.274724" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:41.274345" 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-08-22T23:56:41.275052" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:41.274822" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:41.275597" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:41.275288" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:41.275133" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:41.274804" 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-08-22T23:56:41.275847" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:41.276662" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:41.276360" 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-08-22T23:56:41.276841" 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-08-22T23:56:41.260945" elapsed="0.018416"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:41.279537" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-08-22T23:56:41.279429" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:41.279411" 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-08-22T23:56:41.279790" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:41.279861" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:56:41.282231" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:41.233959" elapsed="0.048302"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:41.282321" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:56:41.282473" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:41.227849" elapsed="0.054650"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:41.283152" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:41.282796" elapsed="0.000429">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:41.282571" elapsed="0.000725">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:41.282554" elapsed="0.000812">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:41.283605" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:41.283442" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:41.283425" elapsed="0.000264"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:41.225156" elapsed="0.058616">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:42.286781" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:42.285795" elapsed="0.001058"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:42.297719" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:42.297343" elapsed="0.000445"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:42.298386" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:42.298036" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:56:42.321384" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:42.321637" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:42.321799" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:42.303525" elapsed="0.018321"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:42.298554" elapsed="0.023365"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:42.322327" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:42.321965" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:42.298523" 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-08-22T23:56:42.331315" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:42.325031" elapsed="0.006396"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:42.324454" elapsed="0.007053"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:42.324412" elapsed="0.007236"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:42.334425" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:42.332086" elapsed="0.002386"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:42.331782" elapsed="0.002726"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:42.331743" elapsed="0.002789"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:42.335154" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:42.334726" 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-08-22T23:56:42.335494" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:42.335255" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:42.336096" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:42.335776" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:42.335612" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:42.335235" elapsed="0.000949"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:42.336730" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:42.336343" 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-08-22T23:56:42.337086" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:42.336836" elapsed="0.000381"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:42.337734" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:42.337411" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:42.337244" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:42.336813" elapsed="0.001010"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:56:42.338000" elapsed="0.000362"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:42.338880" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:42.338529" 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-08-22T23:56:42.339065" elapsed="0.003788"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:56:42.323392" elapsed="0.019529"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:42.343113" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:56:42.342993" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:42.342973" 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-08-22T23:56:42.343359" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:42.343433" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:56:42.345862" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:42.291167" elapsed="0.054726"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:42.345955" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:56:42.346111" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:42.287380" elapsed="0.058758"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:42.346831" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:42.346439" elapsed="0.000483">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:42.346209" elapsed="0.000788">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:42.346191" elapsed="0.000841">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:42.347254" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:42.347105" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:42.347088" elapsed="0.000249"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:42.284659" elapsed="0.062760">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:43.350573" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:43.349529" elapsed="0.001172"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:43.362365" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:43.362100" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:43.362833" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:43.362568" 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-08-22T23:56:43.380732" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:43.380885" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:43.381060" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:43.365121" elapsed="0.015999"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:43.363016" elapsed="0.018202"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:43.381699" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:43.381282" elapsed="0.000570"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:43.362991" elapsed="0.018912"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:43.389774" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:43.384232" elapsed="0.005653"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:43.383733" elapsed="0.006210"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:43.383690" elapsed="0.006279"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:43.392559" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:43.390247" elapsed="0.002374"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:43.390025" elapsed="0.002632"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:43.390008" elapsed="0.002674"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:43.393255" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:43.392858" 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-08-22T23:56:43.393620" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:43.393367" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:43.394174" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:43.393865" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:43.393704" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:43.393349" elapsed="0.000910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:43.394819" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:43.394416" 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-08-22T23:56:43.395153" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:43.394918" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:43.395719" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:43.395399" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:43.395238" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:43.394900" 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-08-22T23:56:43.395977" elapsed="0.000361"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:43.396828" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:43.396502" 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-08-22T23:56:43.397011" elapsed="0.002357"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:56:43.382749" elapsed="0.016684"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:43.399633" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:56:43.399504" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:43.399485" 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-08-22T23:56:43.399876" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:43.400055" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:56:43.402461" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:43.356821" elapsed="0.045670"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:43.402553" elapsed="0.000050"/>
</return>
<msg time="2026-08-22T23:56:43.402736" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:43.351210" elapsed="0.051552"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:43.403410" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:43.403046" elapsed="0.000443">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:43.402835" elapsed="0.000729">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:43.402817" elapsed="0.000799">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:43.403835" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:43.403687" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:43.403671" elapsed="0.000245"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:43.348318" elapsed="0.055683">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:44.406888" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:44.405880" elapsed="0.001079"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:44.422091" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:44.421830" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:44.422537" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:44.422290" 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-08-22T23:56:44.440786" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:44.441057" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:44.441270" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:44.424858" elapsed="0.016469"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:44.422673" elapsed="0.018747"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:44.441876" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:44.441479" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:44.422650" elapsed="0.019433"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:44.450507" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:44.444561" elapsed="0.006092"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:44.444031" elapsed="0.006787"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:44.443988" elapsed="0.006892"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:44.453657" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:44.451334" elapsed="0.002370"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:44.451025" elapsed="0.002715"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:44.450980" elapsed="0.002784"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:44.454328" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:44.453937" 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-08-22T23:56:44.454677" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:44.454426" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:44.455222" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:44.454920" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:44.454761" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:44.454408" elapsed="0.000913"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:44.455858" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:44.455477" 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-08-22T23:56:44.456183" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:44.455954" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:44.456733" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:44.456419" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:44.456264" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:44.455936" 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-08-22T23:56:44.456966" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:44.457787" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:44.457475" 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-08-22T23:56:44.457966" 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-08-22T23:56:44.442959" elapsed="0.017533"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:44.460687" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:56:44.460561" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:44.460542" 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-08-22T23:56:44.460927" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:44.460997" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:56:44.463341" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:44.413809" elapsed="0.049562"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:44.463432" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:56:44.463600" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:44.407535" elapsed="0.056094"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:44.464268" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:44.463910" elapsed="0.000434">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:44.463701" elapsed="0.000714">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:44.463684" elapsed="0.000800">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:44.464727" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:44.464560" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:44.464543" elapsed="0.000268"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:44.404809" elapsed="0.060086">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:45.467414" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:45.466502" elapsed="0.000976"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:45.478604" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:45.478234" elapsed="0.000440"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:45.479228" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:45.478885" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:56:45.497656" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:45.497780" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:45.497877" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:45.482324" elapsed="0.015579"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:45.479388" elapsed="0.018557"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:45.498334" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:45.497999" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:45.479361" elapsed="0.019165"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:45.506292" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:45.500808" elapsed="0.005534"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:45.500290" elapsed="0.006087"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:45.500249" elapsed="0.006154"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:45.509129" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:45.506696" elapsed="0.002481"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:45.506459" elapsed="0.002753"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:45.506442" elapsed="0.002795"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:45.509810" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:45.509399" 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-08-22T23:56:45.510138" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:45.509907" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:45.510697" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:45.510378" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:45.510221" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:45.509889" elapsed="0.000893"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:45.511300" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:45.510938" 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-08-22T23:56:45.511645" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:45.511398" elapsed="0.000349"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:45.512233" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:45.511936" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:45.511774" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:45.511380" 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-08-22T23:56:45.512468" elapsed="0.000368"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:45.513277" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:45.512999" 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-08-22T23:56:45.513456" elapsed="0.002319"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:56:45.499326" elapsed="0.016513"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:45.516013" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-08-22T23:56:45.515908" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:45.515890" 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-08-22T23:56:45.516243" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:45.516314" elapsed="0.000014"/>
</return>
<msg time="2026-08-22T23:56:45.518770" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:45.472135" elapsed="0.046665"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:45.518861" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:56:45.519014" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:45.467990" elapsed="0.051050"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:45.519686" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:45.519317" elapsed="0.000442">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:45.519110" elapsed="0.000718">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:45.519094" elapsed="0.000768">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:45.520077" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:45.519932" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:45.519916" elapsed="0.000242"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:45.465526" elapsed="0.054713">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:46.522863" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:46.521934" elapsed="0.000998"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:46.537373" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:46.537110" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:46.537841" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:46.537590" 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-08-22T23:56:46.555511" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:46.555837" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:46.556097" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:46.540244" elapsed="0.015913"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:46.538145" elapsed="0.018111"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:46.556699" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:46.556318" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:46.538122" elapsed="0.018780"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:46.564750" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:46.559222" elapsed="0.005638"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:46.558725" elapsed="0.006214"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:46.558683" elapsed="0.006312"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:46.567605" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:46.565278" elapsed="0.002374"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:46.565058" elapsed="0.002629"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:46.565042" elapsed="0.002670"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:46.568298" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:46.567896" 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-08-22T23:56:46.568650" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:46.568396" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:46.569191" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:46.568892" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:46.568733" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:46.568378" elapsed="0.000895"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:46.569807" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:46.569428" 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-08-22T23:56:46.570134" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:46.569903" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:46.570684" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:46.570372" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:46.570216" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:46.569886" 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-08-22T23:56:46.570916" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:46.571727" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:46.571422" 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-08-22T23:56:46.571928" elapsed="0.002344"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:56:46.557746" elapsed="0.016590"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:46.574515" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:56:46.574407" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:46.574388" 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-08-22T23:56:46.574769" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:46.574875" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:56:46.577272" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:46.529085" elapsed="0.048216"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:46.577362" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:56:46.577514" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:46.523412" elapsed="0.054128"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:46.578194" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:46.577837" elapsed="0.000433">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:46.577628" elapsed="0.000713">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:46.577610" elapsed="0.000764">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:46.578603" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:46.578444" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:46.578427" elapsed="0.000257"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:46.520956" elapsed="0.057809">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:47.581742" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:47.580753" elapsed="0.001060"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:47.598422" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:47.598156" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:47.598910" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:47.598662" 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-08-22T23:56:47.617304" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:47.617458" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:47.617572" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:47.601118" elapsed="0.016504"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:47.599035" elapsed="0.018631"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:47.617852" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:47.617695" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:47.599011" elapsed="0.018930"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:47.625886" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:47.620148" elapsed="0.005857"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:47.619650" elapsed="0.006592"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:47.619605" elapsed="0.006705"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:47.629395" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:47.627058" elapsed="0.002384"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:47.626495" elapsed="0.002982"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:47.626452" elapsed="0.003050"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:47.630099" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:47.629693" 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-08-22T23:56:47.630451" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:47.630198" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:47.631018" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:47.630712" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:47.630535" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:47.630180" elapsed="0.000925"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:47.631642" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:47.631263" 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-08-22T23:56:47.631975" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:47.631741" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:47.632512" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:47.632215" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:47.632057" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:47.631723" 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-08-22T23:56:47.632766" elapsed="0.000419"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:47.633665" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:47.633347" 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-08-22T23:56:47.633845" elapsed="0.002334"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:56:47.618668" elapsed="0.017577"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:47.636427" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:56:47.636317" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:47.636298" 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-08-22T23:56:47.636683" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:47.636756" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:56:47.640833" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:47.591911" elapsed="0.048992"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:47.641043" elapsed="0.000065"/>
</return>
<msg time="2026-08-22T23:56:47.641387" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:47.582305" elapsed="0.059141"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:47.643013" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:47.642161" elapsed="0.001011">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:47.641679" elapsed="0.001646">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:47.641566" elapsed="0.001919">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:47.644015" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:47.643683" elapsed="0.000461"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:47.643643" elapsed="0.000555"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:47.579648" elapsed="0.064730">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:48.647530" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:48.646506" elapsed="0.001133"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:48.659053" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:48.658688" elapsed="0.000433"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:48.659699" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:48.659334" 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-08-22T23:56:48.678012" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:48.678299" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:48.678518" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:48.662787" elapsed="0.015830"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:48.659873" elapsed="0.018848"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:48.679131" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:48.678784" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:48.659841" elapsed="0.019483"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:48.687569" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:48.681700" elapsed="0.006021"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:48.681171" elapsed="0.006631"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:48.681129" elapsed="0.006731"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:48.691806" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:48.688478" elapsed="0.003375"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:48.687985" elapsed="0.003903"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:48.687948" elapsed="0.003965"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:48.692491" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:48.692092" 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-08-22T23:56:48.692844" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:48.692604" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:48.693404" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:48.693103" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:48.692927" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:48.692571" elapsed="0.000918"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:48.694039" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:48.693661" 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-08-22T23:56:48.694367" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:48.694137" elapsed="0.000349"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:48.694992" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:48.694688" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:48.694512" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:48.694119" 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-08-22T23:56:48.695236" elapsed="0.000372"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:48.696072" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:48.695772" 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-08-22T23:56:48.696253" 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-08-22T23:56:48.680138" elapsed="0.018593"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:48.698920" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:56:48.698808" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:48.698788" 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-08-22T23:56:48.699162" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:48.699234" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:56:48.701638" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:48.652515" elapsed="0.049152"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:48.701728" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:56:48.701879" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:48.648144" elapsed="0.053761"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:48.702547" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:48.702186" elapsed="0.000458">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:48.701975" elapsed="0.000742">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:48.701958" elapsed="0.000793">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:48.702969" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:48.702821" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:48.702804" elapsed="0.000246"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:48.645345" elapsed="0.057787">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:49.706123" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:49.705146" elapsed="0.001050"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:49.717760" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:49.717369" elapsed="0.000459"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:49.718398" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:49.718045" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:56:49.744115" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:49.744410" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:49.744665" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:49.721379" elapsed="0.023348"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:49.718683" elapsed="0.026142"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:49.745231" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:49.744886" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:49.718650" elapsed="0.026774"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:49.751567" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:49.747771" elapsed="0.003891"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:49.747243" elapsed="0.004471"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:49.747202" elapsed="0.004547"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:49.755536" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:49.752152" elapsed="0.003470"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:49.751843" elapsed="0.003831"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:49.751819" elapsed="0.003892"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:49.756555" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:49.755997" 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-08-22T23:56:49.757049" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:49.756718" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:49.757833" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:49.757388" elapsed="0.000484"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:49.757165" elapsed="0.000759"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:49.756693" elapsed="0.001261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:49.758702" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:49.758173" 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-08-22T23:56:49.759332" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:49.758839" elapsed="0.000577"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:49.760286" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:49.759695" elapsed="0.000620"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:49.759451" elapsed="0.000902"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:49.758814" elapsed="0.001566"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:56:49.760541" elapsed="0.000403"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:49.761405" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:49.761107" 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-08-22T23:56:49.761599" 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-08-22T23:56:49.746259" elapsed="0.017821"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:49.764264" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:56:49.764153" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:49.764133" 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-08-22T23:56:49.764510" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:49.764687" elapsed="0.000019"/>
</return>
<msg time="2026-08-22T23:56:49.767138" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:49.710879" elapsed="0.056289"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:49.767231" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:56:49.767387" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:49.706723" elapsed="0.060691"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:49.768104" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:49.767708" elapsed="0.000477">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:49.767485" elapsed="0.000775">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:49.767468" elapsed="0.000827">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:49.768513" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:49.768365" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:49.768348" elapsed="0.000263"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:49.704046" elapsed="0.064652">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:50.771867" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:50.770818" elapsed="0.001127"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:50.784338" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:50.783926" elapsed="0.000485"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:50.784995" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:50.784647" 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-08-22T23:56:50.803110" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:50.803295" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:50.803528" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:50.787980" elapsed="0.015651"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:50.785166" elapsed="0.018567"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:50.804141" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:50.803796" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:50.785133" elapsed="0.019201"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:50.812334" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:50.806752" elapsed="0.005691"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:50.806179" elapsed="0.006493"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:50.806138" elapsed="0.006601"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:50.816863" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:50.813370" elapsed="0.003540"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:50.812871" elapsed="0.004075"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:50.812832" elapsed="0.004138"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:50.817573" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:50.817155" 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-08-22T23:56:50.817928" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:50.817689" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:50.818481" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:50.818177" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:50.818012" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:50.817670" elapsed="0.000897"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:50.819122" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:50.818756" 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-08-22T23:56:50.819454" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:50.819220" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:50.820009" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:50.819711" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:50.819536" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:50.819202" 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-08-22T23:56:50.820255" elapsed="0.000369"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:50.821093" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:50.820787" 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-08-22T23:56:50.821272" elapsed="0.002484"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:56:50.805179" elapsed="0.018645"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:50.824005" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:56:50.823894" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:50.823875" 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-08-22T23:56:50.824257" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:50.824328" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:56:50.826717" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:50.777649" elapsed="0.049097"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:50.826807" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:56:50.826959" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:50.772448" elapsed="0.054538"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:50.827650" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:50.827267" elapsed="0.000469">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:50.827056" elapsed="0.000757">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:50.827039" elapsed="0.000854">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:50.828119" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:50.827971" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:50.827953" elapsed="0.000248"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:50.769631" elapsed="0.058654">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:51.831823" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:51.830538" elapsed="0.001363"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:51.843213" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:51.842932" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:51.843707" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:51.843426" elapsed="0.000334"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:56:51.861709" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:51.861864" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:51.861974" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:51.846108" elapsed="0.015894"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:51.843847" elapsed="0.018201"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:51.862409" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:51.862085" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:51.843820" elapsed="0.018838"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:51.870934" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:51.865066" elapsed="0.005920"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:51.864528" elapsed="0.006495"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:51.864484" elapsed="0.006567"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:51.873723" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:51.871338" elapsed="0.002432"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:51.871108" elapsed="0.002698"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:51.871091" elapsed="0.002740"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:51.874412" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:51.874009" 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-08-22T23:56:51.874765" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:51.874510" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:51.875309" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:51.875009" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:51.874850" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:51.874492" elapsed="0.000904"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:51.875932" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:51.875552" 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-08-22T23:56:51.876261" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:51.876030" elapsed="0.000356"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:51.876892" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:51.876575" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:51.876414" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:51.876012" 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-08-22T23:56:51.877132" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:51.877987" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:51.877685" 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-08-22T23:56:51.878171" 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-08-22T23:56:51.863527" elapsed="0.017123"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:51.880833" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:56:51.880721" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:51.880702" 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-08-22T23:56:51.881077" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:51.881149" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:56:51.883588" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:51.838493" elapsed="0.045126"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:51.883680" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:56:51.883834" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:51.832415" elapsed="0.051446"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:51.884497" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:51.884138" elapsed="0.000453">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:51.883931" elapsed="0.000736">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:51.883914" elapsed="0.000788">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:51.885021" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:51.884873" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:51.884855" elapsed="0.000249"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:51.829265" elapsed="0.055921">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:52.888454" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:52.887476" elapsed="0.001050"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:52.901867" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:52.901568" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:52.902329" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:52.902075" 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-08-22T23:56:52.920112" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:52.920327" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:52.920556" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:52.904627" elapsed="0.016042"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:52.902518" elapsed="0.018267"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:52.921194" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:52.920848" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:52.902495" elapsed="0.018895"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:52.929451" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:52.923793" elapsed="0.005767"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:52.923266" elapsed="0.006410"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:52.923225" elapsed="0.006509"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:52.933307" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:52.930353" elapsed="0.003000"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:52.929860" elapsed="0.003529"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:52.929823" elapsed="0.003591"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:52.934012" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:52.933595" 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-08-22T23:56:52.934348" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:52.934112" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:52.934931" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:52.934595" elapsed="0.000364"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:52.934431" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:52.934094" elapsed="0.000923"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:52.935540" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:52.935175" 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-08-22T23:56:52.935887" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:52.935655" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:52.936423" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:52.936128" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:52.935970" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:52.935637" elapsed="0.000870"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:56:52.936674" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:52.937482" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:52.937187" 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-08-22T23:56:52.937679" 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-08-22T23:56:52.922221" elapsed="0.017962"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:52.940367" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-22T23:56:52.940255" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:52.940235" 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-08-22T23:56:52.940626" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:52.940739" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:56:52.943144" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:52.895227" elapsed="0.047947"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:52.943236" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:56:52.943391" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:52.889080" elapsed="0.054338"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:52.944089" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:52.943720" elapsed="0.000464">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:52.943490" elapsed="0.000770">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:52.943473" elapsed="0.000824">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:52.944519" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:52.944370" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:52.944353" elapsed="0.000279"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:52.886320" elapsed="0.058404">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:53.947857" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:53.946841" elapsed="0.001089"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:53.960526" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:53.960257" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:53.960994" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:53.960748" 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-08-22T23:56:53.979369" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:53.979698" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:53.979923" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:53.963306" elapsed="0.016678"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:53.961117" elapsed="0.018966"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:53.980482" elapsed="0.000102"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:53.980145" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:53.961094" elapsed="0.019677"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:53.988874" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:53.983129" elapsed="0.005855"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:53.982633" elapsed="0.006553"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:53.982561" elapsed="0.006699"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:53.991988" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:53.989631" elapsed="0.002404"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:53.989386" elapsed="0.002685"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:53.989364" elapsed="0.002732"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:53.992698" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:53.992280" 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-08-22T23:56:53.993049" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:53.992798" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:53.993615" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:53.993294" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:53.993133" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:53.992780" elapsed="0.000924"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:53.994228" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:53.993863" 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-08-22T23:56:53.994556" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:53.994326" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:53.995113" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:53.994818" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:53.994659" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:53.994309" 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-08-22T23:56:53.995354" elapsed="0.000368"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:53.996183" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:53.995885" 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-08-22T23:56:53.996362" elapsed="0.002521"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:56:53.981646" elapsed="0.017303"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:53.999129" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:56:53.999019" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:53.999001" 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-08-22T23:56:53.999369" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:53.999440" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:56:54.001837" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:53.954457" elapsed="0.047409"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:54.001927" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:56:54.002078" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:53.948422" elapsed="0.053682"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:54.002761" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:54.002382" elapsed="0.000459">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:54.002175" elapsed="0.000741">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:54.002159" elapsed="0.000833">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:54.003225" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:54.003069" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:54.003051" elapsed="0.000256"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:53.945762" elapsed="0.057628">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:55.006159" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:55.005213" elapsed="0.001011"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:55.017614" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:55.017349" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:55.018058" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:55.017815" 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-08-22T23:56:55.034877" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:55.034997" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:55.035093" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:55.020247" elapsed="0.014871"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:55.018170" elapsed="0.016991"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:55.035466" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:55.035187" elapsed="0.000469"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:55.018152" elapsed="0.017555"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:55.043828" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:55.037968" elapsed="0.005971"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:55.037450" elapsed="0.006568"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:55.037411" elapsed="0.006664"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:55.046773" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:55.044461" elapsed="0.002358"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:55.044201" elapsed="0.002653"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:55.044164" elapsed="0.002714"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:55.047417" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:55.047039" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:55.047778" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:55.047515" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:55.048319" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:55.048018" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:55.047861" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:55.047497" elapsed="0.000908"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:55.048936" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:55.048560" 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-08-22T23:56:55.049261" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:55.049032" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:55.049858" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:55.049543" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:55.049381" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:55.049015" 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-08-22T23:56:55.050092" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:55.050897" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:55.050618" 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-08-22T23:56:55.051074" 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-08-22T23:56:55.036478" elapsed="0.017006"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:55.053678" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-08-22T23:56:55.053554" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:55.053536" 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-08-22T23:56:55.053909" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:55.053981" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:56:55.056346" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:55.012371" elapsed="0.044004"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:55.056435" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:56:55.056590" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:55.006788" elapsed="0.049842"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:55.057255" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:55.056908" elapsed="0.000415">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:55.056702" elapsed="0.000690">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:55.056685" elapsed="0.000741">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:55.057658" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:55.057495" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:55.057478" elapsed="0.000262"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:55.004210" elapsed="0.053610">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:56.060521" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:56.059585" elapsed="0.001039"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:56.073782" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:56.073394" elapsed="0.000457"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:56.074416" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:56.074066" 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-08-22T23:56:56.091095" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:56.091237" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:56.091471" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:56.077036" elapsed="0.014496"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:56.074667" elapsed="0.017007"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:56.092081" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:56.091736" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:56.074638" elapsed="0.017640"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:56.100215" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:56.094570" elapsed="0.005772"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:56.094080" elapsed="0.006338"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:56.094040" elapsed="0.006410"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:56.103045" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:56.100742" elapsed="0.002350"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:56.100506" elapsed="0.002621"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:56.100489" elapsed="0.002663"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:56.103745" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:56.103322" 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-08-22T23:56:56.104078" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:56.103843" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:56.104650" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:56.104325" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:56.104161" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:56.103826" elapsed="0.000910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:56.105256" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:56.104893" 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-08-22T23:56:56.105585" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:56.105352" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:56.106134" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:56.105840" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:56.105682" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:56.105334" 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-08-22T23:56:56.106367" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:56.107181" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:56.106894" 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-08-22T23:56:56.107357" elapsed="0.002362"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:56:56.093100" elapsed="0.016684"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:56.109962" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-08-22T23:56:56.109854" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:56.109835" 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-08-22T23:56:56.110198" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:56.110303" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:56:56.112691" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:56.066588" elapsed="0.046132"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:56.112780" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:56:56.112931" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:56.061112" elapsed="0.051845"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:56.113590" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:56.113233" elapsed="0.000448">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:56.113027" elapsed="0.000725">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:56.113010" elapsed="0.000776">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:56.114001" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:56.113855" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:56.113839" elapsed="0.000242"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:56.058548" elapsed="0.055614">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:57.116843" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:57.115872" elapsed="0.001036"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:57.130679" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:57.130407" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:57.131131" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:57.130885" 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-08-22T23:56:57.147037" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:57.147171" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:57.147290" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:57.133355" elapsed="0.013968"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:57.131246" elapsed="0.016173"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:57.147884" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:57.147487" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:57.131226" elapsed="0.016854"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:57.155914" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:57.150399" elapsed="0.005626"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:57.149899" elapsed="0.006301"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:57.149857" elapsed="0.006407"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:57.159611" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:57.156979" elapsed="0.002680"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:57.156393" elapsed="0.003302"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:57.156355" elapsed="0.003364"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:57.160284" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:57.159891" 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-08-22T23:56:57.160631" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:57.160381" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:57.161196" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:57.160878" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:57.160715" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:57.160363" elapsed="0.000918"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:57.161824" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:57.161442" 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-08-22T23:56:57.162152" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:57.161921" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:57.162705" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:57.162391" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:57.162234" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:57.161903" 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-08-22T23:56:57.162938" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:57.163749" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:57.163444" 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-08-22T23:56:57.163927" elapsed="0.002351"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:56:57.148915" elapsed="0.017426"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:57.166520" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-08-22T23:56:57.166411" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:57.166392" 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-08-22T23:56:57.166775" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:57.166847" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:56:57.169326" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:57.125972" elapsed="0.043383"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:57.169415" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:56:57.169567" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:57.117385" elapsed="0.052224"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:57.170259" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:57.169901" elapsed="0.000431">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:57.169691" elapsed="0.000712">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:57.169674" elapsed="0.000796">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:57.170709" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:57.170545" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:57.170527" elapsed="0.000264"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:57.114926" elapsed="0.055946">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:58.173684" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:58.172729" elapsed="0.001033"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:58.185098" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:58.184840" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:58.185546" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:58.185298" 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-08-22T23:56:58.202219" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:58.202371" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:58.202657" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:58.187801" elapsed="0.014919"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:58.185695" elapsed="0.017126"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:58.203224" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:58.202882" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:58.185674" elapsed="0.017752"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:58.211909" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:58.205827" elapsed="0.006253"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:58.205293" elapsed="0.006872"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:58.205252" elapsed="0.006975"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:58.215082" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:58.212714" elapsed="0.002415"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:58.212364" elapsed="0.002801"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:58.212321" elapsed="0.002869"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:58.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-08-22T23:56:58.215363" 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-08-22T23:56:58.216138" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:58.215883" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:58.216705" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:58.216385" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:58.216224" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:58.215864" elapsed="0.000928"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:58.217313" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:58.216950" 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-08-22T23:56:58.217661" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:58.217410" elapsed="0.000365"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:58.218262" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:58.217963" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:58.217801" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:58.217393" 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-08-22T23:56:58.218498" elapsed="0.000371"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:58.219328" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:58.219034" 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-08-22T23:56:58.219509" elapsed="0.002432"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:56:58.204285" elapsed="0.017721"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:58.222189" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-08-22T23:56:58.222078" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:58.222059" 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-08-22T23:56:58.222439" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:58.222511" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:56:58.224949" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:58.178629" elapsed="0.046350"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:58.225044" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:56:58.225196" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:58.174253" elapsed="0.050971"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:58.225878" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:58.225502" elapsed="0.000452">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:58.225295" elapsed="0.000729">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:58.225278" elapsed="0.000782">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:58.226276" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:58.226130" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:58.226113" elapsed="0.000245"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:58.171721" elapsed="0.054718">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:59.229576" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:59.228547" elapsed="0.001141"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:59.241291" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:59.241024" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:59.241763" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:59.241494" 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-08-22T23:56:59.258982" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:56:59.259135" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:56:59.259236" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:56:59.244065" elapsed="0.015198"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:59.241960" elapsed="0.017350"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:59.259749" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:59.259344" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:59.241937" elapsed="0.018025"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:59.268032" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:59.262395" elapsed="0.005748"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:59.261887" elapsed="0.006337"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:59.261843" elapsed="0.006437"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:56:59.272183" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:56:59.268942" elapsed="0.003288"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:59.268409" elapsed="0.003856"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:59.268371" elapsed="0.003919"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:59.272885" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:59.272468" 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-08-22T23:56:59.273218" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:59.272983" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:59.273797" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:59.273477" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:59.273300" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:59.272965" elapsed="0.000916"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:56:59.274412" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:59.274047" 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-08-22T23:56:59.274757" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:59.274508" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:56:59.275289" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:56:59.274995" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-08-22T23:56:59.274839" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:59.274490" 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-08-22T23:56:59.275530" elapsed="0.000369"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:56:59.276356" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:56:59.276061" 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-08-22T23:56:59.276533" 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-08-22T23:56:59.260837" elapsed="0.018159"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:56:59.279179" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:56:59.279068" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:56:59.279048" 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-08-22T23:56:59.279422" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:56:59.279533" elapsed="0.000018"/>
</return>
<msg time="2026-08-22T23:56:59.281959" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:56:59.236201" elapsed="0.045787"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:56:59.282051" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:56:59.282207" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:56:59.230238" elapsed="0.051996"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:56:59.282957" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:56:59.282562" elapsed="0.000477">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:56:59.282306" elapsed="0.000808">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:56:59.282289" elapsed="0.000860">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:56:59.283366" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:56:59.283219" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:56:59.283202" elapsed="0.000245"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:56:59.227385" elapsed="0.056146">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:00.286729" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:00.285662" elapsed="0.001142"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:00.298540" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:00.298273" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:00.299018" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:00.298764" 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-08-22T23:57:00.316388" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:00.316728" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:57:00.316996" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:57:00.301405" elapsed="0.015656"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:00.299141" elapsed="0.018020"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:00.317573" elapsed="0.000086"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:00.317224" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:00.299118" elapsed="0.018693"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:00.325801" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:00.320133" elapsed="0.005778"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:00.319633" elapsed="0.006473"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:00.319558" elapsed="0.006620"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:00.328862" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:00.326471" elapsed="0.002438"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:00.326247" elapsed="0.002714"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:00.326230" elapsed="0.002757"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:00.329575" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:00.329165" 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-08-22T23:57:00.329929" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:00.329693" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:00.330472" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:00.330171" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:00.330012" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:00.329674" elapsed="0.000884"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:00.331094" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:00.330731" 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-08-22T23:57:00.331443" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:00.331193" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:00.332007" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:00.331705" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:00.331529" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:00.331174" 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-08-22T23:57:00.332243" elapsed="0.000372"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:57:00.333119" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:00.332778" elapsed="0.000369"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:57:00.333299" 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-08-22T23:57:00.318639" elapsed="0.017213"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:57:00.336032" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-22T23:57:00.335921" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:00.335902" 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-08-22T23:57:00.336275" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:00.336345" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:57:00.338735" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:57:00.292183" elapsed="0.046582"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:57:00.338826" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:57:00.338978" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:57:00.287310" elapsed="0.051694"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:57:00.339671" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:57:00.339286" elapsed="0.000468">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:00.339077" elapsed="0.000753">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:57:00.339060" elapsed="0.000847">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:00.340132" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:00.339985" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:00.339967" elapsed="0.000247"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:57:00.284347" elapsed="0.055952">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:01.343254" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:01.342233" elapsed="0.001091"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:01.356041" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:01.355727" elapsed="0.000373"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:01.356508" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:01.356261" 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-08-22T23:57:01.374234" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:01.374543" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:57:01.374829" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:57:01.359708" elapsed="0.015187"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:01.356652" elapsed="0.018352"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:01.375556" elapsed="0.000095"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:01.375174" elapsed="0.000584"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:01.356627" elapsed="0.019185"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:01.382615" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:01.378337" elapsed="0.004351"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:01.377840" elapsed="0.004900"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:01.377797" elapsed="0.004981"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:01.386525" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:01.383185" elapsed="0.003426"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:01.382857" elapsed="0.003805"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:01.382834" elapsed="0.003863"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:01.387566" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:01.386938" 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-08-22T23:57:01.387929" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:01.387686" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:01.388479" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:01.388175" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:01.388013" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:01.387668" elapsed="0.000899"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:01.389110" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:01.388742" 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-08-22T23:57:01.389442" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:01.389210" elapsed="0.000338"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:01.390056" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:01.389756" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:01.389578" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:01.389192" elapsed="0.000950"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:57:01.390295" elapsed="0.000382"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:57:01.391147" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:01.390841" 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-08-22T23:57:01.391349" 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-08-22T23:57:01.376747" elapsed="0.017098"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:57:01.394030" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:57:01.393918" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:01.393899" 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-08-22T23:57:01.394275" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:01.394348" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:57:01.396794" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:57:01.348890" elapsed="0.047933"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:57:01.396886" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:57:01.397038" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:57:01.343855" elapsed="0.053209"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:57:01.397724" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:57:01.397343" elapsed="0.000463">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:01.397134" elapsed="0.000745">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:57:01.397118" elapsed="0.000795">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:01.398233" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:01.398083" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:01.398064" elapsed="0.000253"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:57:01.341111" elapsed="0.057290">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:02.401653" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:02.400650" elapsed="0.001079"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:02.413461" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:02.413196" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:02.413934" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:02.413682" 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-08-22T23:57:02.431869" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:02.432223" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:57:02.432477" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:57:02.416346" elapsed="0.016212"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:02.414134" elapsed="0.018607"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:02.433166" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:02.432807" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:02.414108" elapsed="0.019261"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:02.441186" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:02.436133" elapsed="0.005104"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:02.435488" elapsed="0.005786"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:02.435430" elapsed="0.005870"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:02.443904" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:02.441581" elapsed="0.002371"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:02.441356" elapsed="0.002631"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:02.441339" elapsed="0.002673"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:02.444690" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:02.444228" 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-08-22T23:57:02.445025" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:02.444790" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:02.445566" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:02.445266" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:02.445108" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:02.444771" elapsed="0.000898"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:02.446186" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:02.445824" 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-08-22T23:57:02.446509" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:02.446282" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:02.447060" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:02.446765" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:02.446608" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:02.446264" 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-08-22T23:57:02.447295" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:57:02.448155" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:02.447822" 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-08-22T23:57:02.448334" 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-08-22T23:57:02.434327" elapsed="0.016643"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:57:02.451181" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-08-22T23:57:02.451054" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:02.451030" 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-08-22T23:57:02.451468" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:02.451628" elapsed="0.000021"/>
</return>
<msg time="2026-08-22T23:57:02.454478" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:57:02.406906" elapsed="0.047605"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:57:02.454601" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:57:02.454784" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:57:02.402225" elapsed="0.052597"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:57:02.455733" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:57:02.455146" elapsed="0.000684">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:02.454903" elapsed="0.001013">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:57:02.454884" elapsed="0.001073">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:02.456258" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:02.456038" elapsed="0.000288"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:02.456018" elapsed="0.000335"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:57:02.399326" elapsed="0.057134">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:03.458223" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:03.457647" elapsed="0.000618"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:03.469036" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:03.468779" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:03.469482" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:03.469238" 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-08-22T23:57:03.486893" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:03.487031" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:57:03.487129" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:57:03.471682" elapsed="0.015474"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:03.469614" elapsed="0.017585"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:03.487381" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:03.487226" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:03.469580" elapsed="0.017907"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:03.495428" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:03.489858" elapsed="0.005682"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:03.489322" elapsed="0.006428"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:03.489281" elapsed="0.006536"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:03.498963" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:03.496526" elapsed="0.002485"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:03.496004" elapsed="0.003043"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:03.495963" elapsed="0.003110"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:03.499656" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:03.499247" 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-08-22T23:57:03.500008" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:03.499758" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:03.500564" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:03.500256" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:03.500094" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:03.499740" elapsed="0.000940"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:03.501204" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:03.500839" 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-08-22T23:57:03.501537" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:03.501302" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:03.502101" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:03.501801" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:03.501640" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:03.501284" 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-08-22T23:57:03.502338" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:57:03.503158" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:03.502868" 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-08-22T23:57:03.503353" 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-08-22T23:57:03.488346" elapsed="0.017671"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:57:03.506195" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-08-22T23:57:03.506087" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:03.506069" 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-08-22T23:57:03.506435" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:03.506510" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:57:03.508949" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:57:03.462391" elapsed="0.046588"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:57:03.509041" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:57:03.509192" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:57:03.458572" elapsed="0.050647"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:57:03.509895" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:57:03.509499" elapsed="0.000471">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:03.509290" elapsed="0.000752">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:57:03.509273" elapsed="0.000844">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:03.510344" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:03.510195" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:03.510177" elapsed="0.000250"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:57:03.456996" elapsed="0.053514">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:04.513348" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:04.512312" elapsed="0.001105"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:04.526167" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:04.525809" elapsed="0.000429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:04.526881" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:04.526450" 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-08-22T23:57:04.543936" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:04.544081" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:57:04.544181" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:57:04.529291" elapsed="0.014917"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:04.527047" elapsed="0.017205"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:04.544440" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:04.544281" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:04.527018" elapsed="0.017618"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:04.552933" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:04.547046" elapsed="0.006001"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:04.546447" elapsed="0.006679"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:04.546407" elapsed="0.006778"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:04.557241" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:04.553906" elapsed="0.003383"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:04.553314" elapsed="0.004010"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:04.553275" elapsed="0.004074"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:04.557936" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:04.557525" 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-08-22T23:57:04.558275" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:04.558036" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:04.558859" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:04.558520" elapsed="0.000366"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:04.558359" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:04.558017" elapsed="0.000929"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:04.559477" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:04.559102" 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-08-22T23:57:04.559825" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:04.559575" elapsed="0.000358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:04.560416" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:04.560120" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:04.559959" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:04.559557" 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-08-22T23:57:04.560673" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:57:04.561475" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:04.561186" 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-08-22T23:57:04.561673" 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-08-22T23:57:04.545448" elapsed="0.018626"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:57:04.564251" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-08-22T23:57:04.564144" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:04.564125" 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-08-22T23:57:04.564489" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:04.564561" elapsed="0.000019"/>
</return>
<msg time="2026-08-22T23:57:04.566937" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:57:04.519691" elapsed="0.047275"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:57:04.567027" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:57:04.567179" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:57:04.513982" elapsed="0.053224"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:57:04.567860" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:57:04.567485" elapsed="0.000451">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:04.567276" elapsed="0.000730">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:57:04.567259" elapsed="0.000782">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:04.568255" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:04.568110" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:04.568094" elapsed="0.000241"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:57:04.511233" elapsed="0.057181">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:05.571534" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:05.570525" elapsed="0.001120"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:05.585133" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:05.584759" elapsed="0.000444"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:05.585715" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:05.585425" 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-08-22T23:57:05.604804" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:05.605129" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:57:05.605352" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:57:05.588043" elapsed="0.017368"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:05.585927" elapsed="0.019581"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:05.605957" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:05.605574" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:05.585899" elapsed="0.020255"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:05.613904" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:05.608465" elapsed="0.005489"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:05.607969" elapsed="0.006027"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:05.607928" elapsed="0.006092"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:05.616621" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:05.614297" elapsed="0.002371"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:05.614076" elapsed="0.002627"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:05.614059" elapsed="0.002669"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:05.617353" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:05.616928" 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-08-22T23:57:05.617737" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:05.617453" elapsed="0.000342"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:05.618282" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:05.617981" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:05.617820" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:05.617432" elapsed="0.000935"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:05.618911" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:05.618527" 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-08-22T23:57:05.619238" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:05.619008" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:05.619808" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:05.619480" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:05.619324" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:05.618990" 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-08-22T23:57:05.620044" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:57:05.620934" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:05.620556" 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-08-22T23:57:05.621140" 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-08-22T23:57:05.606986" elapsed="0.016585"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:57:05.623771" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:57:05.623659" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:05.623640" 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-08-22T23:57:05.624019" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:05.624134" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:57:05.626820" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:57:05.578190" elapsed="0.048664"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:57:05.626917" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:57:05.627073" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:57:05.572144" elapsed="0.054955"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:57:05.627766" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:57:05.627379" elapsed="0.000475">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:05.627169" elapsed="0.000762">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:57:05.627153" elapsed="0.000813">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:05.628181" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:05.628035" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:05.628018" elapsed="0.000243"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:57:05.569365" elapsed="0.058980">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:06.631364" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:06.630335" elapsed="0.001099"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:06.645039" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:06.644777" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:06.645484" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:06.645241" 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-08-22T23:57:06.665537" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:06.665883" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:57:06.666126" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:57:06.647747" elapsed="0.018462"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:06.645623" elapsed="0.020685"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:06.666749" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:06.666370" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:06.645597" elapsed="0.021352"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:06.673285" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:06.669242" elapsed="0.004112"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:06.668743" elapsed="0.004730"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:06.668702" elapsed="0.004810"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:06.677249" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:06.673926" elapsed="0.003388"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:06.673616" elapsed="0.003748"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:06.673570" elapsed="0.003829"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:06.678274" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:06.677669" 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-08-22T23:57:06.678799" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:06.678421" elapsed="0.000473"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:06.679389" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:06.679087" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:06.678925" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:06.678396" elapsed="0.001081"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:06.680019" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:06.679653" 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-08-22T23:57:06.680348" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:06.680117" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:06.680903" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:06.680605" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:06.680430" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:06.680099" 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-08-22T23:57:06.681141" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:57:06.681985" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:06.681677" 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-08-22T23:57:06.682165" 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-08-22T23:57:06.667764" elapsed="0.016872"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:57:06.684928" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:57:06.684812" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:06.684792" 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-08-22T23:57:06.685176" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:06.685247" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:57:06.687802" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:57:06.639279" elapsed="0.048553"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:57:06.687893" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:57:06.688045" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:57:06.631962" elapsed="0.056110"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:57:06.688745" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:57:06.688353" elapsed="0.000479">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:06.688143" elapsed="0.000764">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:57:06.688126" elapsed="0.000851">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:06.689200" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:06.689052" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:06.689035" elapsed="0.000247"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:57:06.629214" elapsed="0.060153">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:07.692439" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:07.691496" elapsed="0.001011"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:07.703903" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:07.703644" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:07.704353" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:07.704103" 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-08-22T23:57:07.722656" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:07.722994" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:57:07.723222" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:57:07.706565" elapsed="0.016717"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:07.704474" elapsed="0.018906"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:07.723845" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:07.723442" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:07.704453" elapsed="0.019595"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:07.731926" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:07.726360" elapsed="0.005616"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:07.725864" elapsed="0.006148"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:07.725823" elapsed="0.006216"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:07.734712" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:07.732318" elapsed="0.002441"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:07.732096" elapsed="0.002699"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:07.732079" elapsed="0.002741"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:07.735411" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:07.735004" 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-08-22T23:57:07.735763" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:07.735509" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:07.736302" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:07.736001" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:07.735845" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:07.735491" elapsed="0.000895"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:07.736943" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:07.736541" 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-08-22T23:57:07.737269" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:07.737040" elapsed="0.000336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:07.737885" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:07.737563" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:07.737401" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:07.737022" 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-08-22T23:57:07.738124" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:57:07.739004" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:07.738668" 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-08-22T23:57:07.739188" elapsed="0.002330"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:57:07.724875" elapsed="0.016724"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:57:07.741783" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:57:07.741672" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:07.741653" 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-08-22T23:57:07.742022" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:07.742094" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:57:07.744751" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:57:07.697446" elapsed="0.047334"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:57:07.744840" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:57:07.744993" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${session}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:57:07.693026" elapsed="0.051994"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:57:07.745675" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:57:07.745298" elapsed="0.000458">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:07.745089" elapsed="0.000738">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:57:07.745073" elapsed="0.000788">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:07.746078" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:07.745930" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:07.745913" elapsed="0.000245"/>
</if>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Check that the data on the device matches the specified expectations.
TODO: Needs to be extracted into a suitable Resource as there is
the same code in at least two other suites (CRUD and clustered
CRUD).</doc>
<status status="FAIL" start="2026-08-22T23:57:07.690432" elapsed="0.055808">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<msg time="2026-08-22T23:57:07.746336" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${node1_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:56:07.266119" elapsed="60.480318">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${node2_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:07.746645" elapsed="0.000023"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${node3_session}</arg>
<arg>${modified_data_2}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:07.746879" elapsed="0.000021"/>
</kw>
<doc>Check if data has really been written as we expect. Fails if Modify_Device_Data_With_Original_Owner fails.</doc>
<status status="FAIL" start="2026-08-22T23:56:06.999840" elapsed="60.747248">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</test>
<test id="s1-s7-t17" name="Deconfigure_Device_In_Netconf" line="255">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:57:07.750605" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:57:07.750323" elapsed="0.000549"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:57:07.751889" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:07.751777" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:07.751759" 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-08-22T23:57:07.757180" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:07.757071" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:07.757053" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:57:07.758252" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:57:07.757873" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:57:07.758762" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:57:07.758439" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:57:07.758834" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:57:07.758990" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:57:07.757472" 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-08-22T23:57:07.764563" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:07.764455" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:07.764436" 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-08-22T23:57:07.765842" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:07.765734" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:07.765716" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:07.766355" level="INFO">${karaf_connection_index} = 85</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:57:07.766055" elapsed="0.000327"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:07.766789" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:57:07.766541" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:57:07.799129" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:57:07.767329" elapsed="0.032183"/>
</kw>
<msg time="2026-08-22T23:57:07.799743" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:57:07.799795" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:07.766973" elapsed="0.032861"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:57:07.819313" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:57:07.800357" elapsed="0.019158"/>
</kw>
<msg time="2026-08-22T23:57:07.819701" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:57:07.819748" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:07.800015" elapsed="0.019768"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:07.820105" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:07.819874" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:07.819843" elapsed="0.000391"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:07.820704" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:07.820380" 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-08-22T23:57:07.821056" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:07.820838" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:07.820819" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:57:07.821168" 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-08-22T23:57:07.823721" elapsed="0.000153"/>
</kw>
<msg time="2026-08-22T23:57:07.823936" 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-08-22T23:57:07.822630" elapsed="0.001436"/>
</kw>
<kw name="Open 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-08-22T23:57:07.824480" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:07.824846" 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-08-22T23:57:07.821997" elapsed="0.003034"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:57:07.821438" 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-08-22T23:57:07.765404" elapsed="0.059791"/>
</kw>
<msg time="2026-08-22T23:57:07.825288" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:07.825332" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:07.764799" elapsed="0.060568"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:57:07.825551" elapsed="0.000049"/>
</return>
<status status="PASS" start="2026-08-22T23:57:07.825444" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:07.825426" elapsed="0.000234"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:07.826061" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:07.826393" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:57:07.826466" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:57:07.764118" elapsed="0.062461"/>
</kw>
<msg time="2026-08-22T23:57:07.826754" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:07.826800" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:07.759422" elapsed="0.067413"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:07.827161" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:07.826911" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:07.826894" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:57:07.759278" elapsed="0.067985"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:57:07.832789" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:07.832681" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:07.832662" 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-08-22T23:57:07.833997" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:07.833890" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:07.833872" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:07.834497" level="INFO">${karaf_connection_index} = 86</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:57:07.834203" elapsed="0.000321"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:07.834961" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:57:07.834738" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:57:07.866547" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:57:07.835505" elapsed="0.031158"/>
</kw>
<msg time="2026-08-22T23:57:07.866843" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:57:07.866891" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:07.835144" elapsed="0.031783"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:57:07.896341" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:57:07.867432" elapsed="0.029015"/>
</kw>
<msg time="2026-08-22T23:57:07.896633" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:57:07.896682" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:07.867095" elapsed="0.029623"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:07.897052" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:07.896798" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:07.896777" elapsed="0.000358"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:07.897607" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:07.897277" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:07.897981" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:07.897766" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:07.897748" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:57:07.898091" 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-08-22T23:57:07.900700" elapsed="0.000164"/>
</kw>
<msg time="2026-08-22T23:57:07.900935" 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-08-22T23:57:07.899541" elapsed="0.001542"/>
</kw>
<kw name="Open 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-08-22T23:57:07.901356" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:07.901714" 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-08-22T23:57:07.898916" elapsed="0.002983"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:57:07.898361" 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-08-22T23:57:07.833564" elapsed="0.068497"/>
</kw>
<msg time="2026-08-22T23:57:07.902152" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:07.902196" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:07.833006" elapsed="0.069225"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:57:07.902615" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-08-22T23:57:07.902308" elapsed="0.000371"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:07.902289" elapsed="0.000414"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:07.903092" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:07.903423" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:57:07.903535" 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-08-22T23:57:07.832317" elapsed="0.071472"/>
</kw>
<msg time="2026-08-22T23:57:07.903887" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:07.903931" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:07.827567" elapsed="0.076399"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:07.904293" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:07.904042" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:07.904024" elapsed="0.000347"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:57:07.827427" elapsed="0.076968"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:57:07.909804" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:07.909696" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:07.909676" 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-08-22T23:57:07.911017" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:07.910910" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:07.910892" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:07.911521" level="INFO">${karaf_connection_index} = 87</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:57:07.911226" elapsed="0.000321"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:07.911998" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:57:07.911776" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:57:07.944063" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:57:07.912513" elapsed="0.031653"/>
</kw>
<msg time="2026-08-22T23:57:07.944328" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:57:07.944374" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:07.912181" elapsed="0.032228"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:57:07.963113" level="INFO">"t "x "t ". "E "n "t "i "t "y ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:57:07.944934" elapsed="0.018280"/>
</kw>
<msg time="2026-08-22T23:57:07.963373" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:57:07.963418" level="INFO">${message_wait} =  "t "x "t ". "E "n "t "i "t "y ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:07.944576" elapsed="0.018877"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:07.963772" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:07.963529" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:07.963510" elapsed="0.000340"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:07.964313" level="INFO"> "t "x "t ". "E "n "t "i "t "y ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:07.964015" elapsed="0.000361"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:07.964676" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:07.964443" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:07.964425" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:57:07.964787" 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-08-22T23:57:07.967246" elapsed="0.000150"/>
</kw>
<msg time="2026-08-22T23:57:07.967456" 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-08-22T23:57:07.966193" elapsed="0.001412"/>
</kw>
<kw name="Open 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-08-22T23:57:07.967944" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:07.968279" 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-08-22T23:57:07.965556" elapsed="0.002906"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:57:07.965037" elapsed="0.003489"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:57:07.910607" elapsed="0.058041"/>
</kw>
<msg time="2026-08-22T23:57:07.968743" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:07.968786" level="INFO">${message} =  "t "x "t ". "E "n "t "i "t "y ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:07.910020" elapsed="0.058802"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:57:07.969007" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:57:07.968899" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:07.968880" 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-08-22T23:57:07.969693" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:07.970027" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:57:07.970098" 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-08-22T23:57:07.909342" elapsed="0.060868"/>
</kw>
<msg time="2026-08-22T23:57:07.970302" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:07.970345" level="INFO">${output} =  "t "x "t ". "E "n "t "i "t "y ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:07.904679" elapsed="0.065701"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:07.970787" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:07.970455" elapsed="0.000388"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:07.970438" elapsed="0.000429"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:57:07.904517" elapsed="0.066374"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:57:07.759092" elapsed="0.211827"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:57:07.756701" elapsed="0.214276"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:57:07.751467" elapsed="0.219564"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:07.751037" elapsed="0.220038"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:57:07.748130" elapsed="0.222998"/>
</kw>
<kw name="Remove_Device_From_Netconf" owner="NetconfKeywords">
<kw name="Pop From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:07.972114" level="INFO">${device_type} = configure-via-topology</msg>
<var>${device_type}</var>
<arg>${NetconfKeywords__mounted_device_types}</arg>
<arg>${device_name}</arg>
<doc>Pops the given ``key`` from the ``dictionary`` and returns its value.</doc>
<status status="PASS" start="2026-08-22T23:57:07.971830" elapsed="0.000311"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:57:07.972760" level="INFO">${mapping} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping}</var>
<arg>DEVICE_NAME=${device_name}</arg>
<arg>RESTCONF_ROOT=${RESTCONF_ROOT}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:57:07.972304" elapsed="0.000483"/>
</kw>
<kw name="Set_Variable_If_At_Least_Scandium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Set_Variable_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Set Variable If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:57:07.991135" elapsed="0.000418"/>
</kw>
<msg time="2026-08-22T23:57:07.991622" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>BuiltIn.Set_Variable_If</arg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:57:07.990777" elapsed="0.000894"/>
</kw>
<arg>scandium</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Compare ${lower_bound} to titanium and return scandium if titanium is at least ${lower_bound},
return calcium otherwise.</doc>
<status status="PASS" start="2026-08-22T23:57:07.990370" elapsed="0.001374"/>
</kw>
<msg time="2026-08-22T23:57:07.991787" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Set_Variable_If_At_Least</arg>
<arg>scandium</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:57:07.981726" elapsed="0.010103"/>
</kw>
<msg time="2026-08-22T23:57:07.991996" level="INFO">${version} = scandium</msg>
<var>${version}</var>
<arg>scandium</arg>
<arg>calcium</arg>
<doc>Compare scandium to titanium and return ${value_if_true} if titanium is at least scandium, return ${value_if_false} otherwise.</doc>
<status status="PASS" start="2026-08-22T23:57:07.981390" elapsed="0.010632"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.035087" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:08.034711" elapsed="0.000404"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:57:08.035898" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:57:08.035627" elapsed="0.000339">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:57:08.036060" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:57:08.035276" elapsed="0.000808"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.036678" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:57:08.036273" elapsed="0.000432"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:57:08.037002" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:57:08.037158" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:57:08.036865" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.037595" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:08.037337" 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-08-22T23:57:08.038575" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:08.038319" elapsed="0.000319"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.039054" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:57:08.038793" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.039748" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:57:08.039432" elapsed="0.000341"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:57:08.040508" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:57:08.040284" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:57:08.040600" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:57:08.040754" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:57:08.039956" elapsed="0.000823"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:57:08.040928" elapsed="0.000225"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:08.039301" elapsed="0.001892"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.041749" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:57:08.041433" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:57:08.042481" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:57:08.042270" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:57:08.042556" elapsed="0.000044"/>
</return>
<msg time="2026-08-22T23:57:08.042726" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:57:08.041957" elapsed="0.000793"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:57:08.042896" elapsed="0.000221"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:57:08.041305" elapsed="0.001852"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:57:08.039129" elapsed="0.004105"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:57:08.043282" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:57:08.043443" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:57:08.037999" elapsed="0.005469"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:08.037708" elapsed="0.005792"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.043689" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:08.043524" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.037689" elapsed="0.006079"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.044521" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:08.043909" elapsed="0.000639"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:57:08.044614" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:57:08.034077" elapsed="0.010664"/>
</kw>
<msg time="2026-08-22T23:57:08.044794" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:57:08.021135" elapsed="0.023706"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.057687" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.070115" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.082606" 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-08-22T23:57:08.082800" 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-08-22T23:57:08.082971" 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-08-22T23:57:08.083332" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:08.083190" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:08.083176" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.083550" 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-08-22T23:57:08.083739" 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-08-22T23:57:08.083902" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:57:08.083148" elapsed="0.000806"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:57:08.083046" elapsed="0.000935"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.084126" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:08.084240" elapsed="0.000017"/>
</return>
<msg time="2026-08-22T23:57:08.084361" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:57:08.016787" elapsed="0.067630"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.085520" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:08.085269" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:57:08.102235" level="INFO">DELETE Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:08.102299" level="INFO">DELETE Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:08.102424" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:57:08.087705" elapsed="0.014757"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:08.085652" elapsed="0.016878"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.102974" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:08.102575" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.085633" elapsed="0.017526"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.110829" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:08.105398" elapsed="0.005528"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:08.104915" elapsed="0.006087"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.104873" elapsed="0.006184"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.115156" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:08.111696" elapsed="0.003506"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:08.111182" elapsed="0.004055"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.111144" elapsed="0.004118"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.115825" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:08.115422" 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-08-22T23:57:08.116156" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:08.115923" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.116736" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:08.116396" elapsed="0.000366"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:08.116238" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.115906" elapsed="0.000914"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.117334" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:08.116976" 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-08-22T23:57:08.117677" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:08.117429" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.118211" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:08.117918" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:08.117760" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.117412" 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-08-22T23:57:08.118439" elapsed="0.000364"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:57:08.119244" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:08.118965" 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-08-22T23:57:08.119463" elapsed="0.002506"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_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-08-22T23:57:08.103957" elapsed="0.018076"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:57:08.122079" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:57:08.124347" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-08-22T23:57:08.084696" elapsed="0.039678"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:57:08.124429" elapsed="0.000028"/>
</return>
<arg>${DIRECTORY_WITH_DEVICE_TEMPLATES}${/}${version}${/}${device_type}</arg>
<arg>${mapping}</arg>
<arg>session=${session}</arg>
<arg>location=${location}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-08-22T23:57:07.992242" elapsed="0.132328"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${node1_session}</arg>
<doc>Tell Netconf to deconfigure the specified device</doc>
<status status="PASS" start="2026-08-22T23:57:07.971348" elapsed="0.153305"/>
</kw>
<kw name="Wait_Device_Fully_Removed" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Completely_Gone" owner="NetconfKeywords">
<kw name="Check_Device_Has_No_Netconf_Connector" owner="NetconfKeywords">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.137390" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:08.135310" elapsed="0.002107"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.137757" elapsed="0.000021"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-22T23:57:08.137607" elapsed="0.000208"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-22T23:57:08.137471" elapsed="0.000369"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.138139" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:08.137901" elapsed="0.000296"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.138932" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:08.138449" elapsed="0.000509"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:08.138221" elapsed="0.000775"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.139182" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:08.139020" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.137885" elapsed="0.001373"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:08.139292" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:57:08.139436" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:08.134866" elapsed="0.004594"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:08.139506" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:57:08.139663" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:08.134354" elapsed="0.005335"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.147053" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:08.146803" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.147492" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:08.147250" 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-08-22T23:57:08.155742" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:08.155902" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1011'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}} 
 </msg>
<msg time="2026-08-22T23:57:08.156045" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:57:08.149694" elapsed="0.006378"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:08.147625" elapsed="0.008492"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.156294" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:08.156143" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.147606" elapsed="0.008776"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.161663" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:08.157820" elapsed="0.003921"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:08.157489" elapsed="0.004303"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.157462" elapsed="0.004364"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.165692" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:08.162213" elapsed="0.003532"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:08.161904" elapsed="0.003877"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.161880" elapsed="0.003927"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.166339" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:08.165966" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.166698" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:08.166437" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.167246" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:08.166943" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:08.166784" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.166419" elapsed="0.000911"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.167877" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:08.167487" 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-08-22T23:57:08.168205" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:08.167974" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.168779" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:08.168444" elapsed="0.000361"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:08.168287" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.167957" 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-08-22T23:57:08.169013" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:57:08.169820" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:08.169520" 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-08-22T23:57:08.169997" 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-08-22T23:57:08.156900" elapsed="0.015725"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:08.172836" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:08.172698" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.172679" elapsed="0.000226"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:57:08.176085" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:57:08.173049" elapsed="0.003066"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:57:08.176202" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:57:08.176364" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:57:08.142442" elapsed="0.033949"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:57:08.176450" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:57:08.176622" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:57:08.139906" elapsed="0.036928"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.177255" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:08.177001" elapsed="0.000310"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.177876" level="INFO">${actual_count} = 0</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:08.177462" elapsed="0.000441"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-22T23:57:08.177951" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:57:08.178102" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-22T23:57:08.126875" elapsed="0.051252"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.178537" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:57:08.178281" elapsed="0.000338"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="PASS" start="2026-08-22T23:57:08.126410" elapsed="0.052271"/>
</kw>
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.189137" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:08.186990" elapsed="0.002174"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.189841" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:08.189495" elapsed="0.000373"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:08.189345" elapsed="0.000560"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.190450" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:08.190133" elapsed="0.000344"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:08.189984" elapsed="0.000530"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:08.189217" elapsed="0.001326"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.191323" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:08.190861" elapsed="0.000489"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:08.190624" elapsed="0.000763"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.191594" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:08.191412" elapsed="0.000243"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.191835" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:08.191679" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.190605" elapsed="0.001306"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:08.191945" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:57:08.192128" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:08.186521" elapsed="0.005633"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:08.192202" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:57:08.192346" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>config</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:08.185972" elapsed="0.006399"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:57:08.199350" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0y817n599feopdgubhsati6zm1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:08.199463" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:08.199607" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:57:08.193182" elapsed="0.006474"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} == 404 or ${resp.status_code} == 409">
<return>
<status status="PASS" start="2026-08-22T23:57:08.207945" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:57:08.199790" elapsed="0.008238"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.199763" elapsed="0.008299"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.208271" elapsed="0.000031"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The request failed with code ${resp.status_code}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.208501" elapsed="0.000028"/>
</kw>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config in ClusterManagement__session_1 using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="PASS" start="2026-08-22T23:57:08.192749" elapsed="0.015884"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device has no Netconf connectors nor associated data.</doc>
<status status="PASS" start="2026-08-22T23:57:08.125913" elapsed="0.082801"/>
</kw>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Completely_Gone</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:57:08.125327" elapsed="0.083455"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${node1_session}</arg>
<doc>Wait until all netconf connectors for the device with the given name disappear.
Call of Remove_Device_From_Netconf returns before netconf gets
around deleting the device's connector. To ensure the device is
really gone from netconf, use this keyword to make sure all
connectors disappear. If a call to Remove_Device_From_Netconf
is not made before using this keyword, the wait will fail.
Using this keyword is more readable than putting the WUKS below
into a test case.</doc>
<status status="PASS" start="2026-08-22T23:57:08.124857" elapsed="0.084014"/>
</kw>
<kw name="Wait_Device_Fully_Removed" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Completely_Gone" owner="NetconfKeywords">
<kw name="Check_Device_Has_No_Netconf_Connector" owner="NetconfKeywords">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.221842" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:08.219742" elapsed="0.002127"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.222189" elapsed="0.000021"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-22T23:57:08.222037" elapsed="0.000210"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-22T23:57:08.221923" elapsed="0.000348"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.222572" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:08.222334" elapsed="0.000315"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.223377" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:08.222906" elapsed="0.000499"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:08.222674" elapsed="0.000768"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.223647" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:08.223466" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.222317" elapsed="0.001441"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:08.223797" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:57:08.223947" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:08.219275" elapsed="0.004697"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:08.224018" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:57:08.224159" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:08.218804" elapsed="0.005380"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.231661" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:08.231392" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.232110" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:08.231863" 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-08-22T23:57:08.250128" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:08.250330" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1011'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}} 
 </msg>
<msg time="2026-08-22T23:57:08.250482" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:57:08.234718" elapsed="0.015806"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:08.232222" elapsed="0.018420"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.251066" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:08.250714" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.232204" elapsed="0.019057"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.259922" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:08.253563" elapsed="0.006483"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:08.253054" elapsed="0.007073"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.253013" elapsed="0.007170"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.263858" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:08.260845" elapsed="0.003061"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:08.260312" elapsed="0.003629"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.260272" elapsed="0.003694"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.264498" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:08.264124" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.264855" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:08.264619" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.265413" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:08.265092" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:08.264936" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.264580" elapsed="0.000967"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.266101" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:08.265734" 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-08-22T23:57:08.266426" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:08.266197" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.266987" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:08.266691" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:08.266508" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.266179" 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-08-22T23:57:08.267216" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:57:08.268024" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:08.267748" 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-08-22T23:57:08.268200" 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-08-22T23:57:08.252079" elapsed="0.018670"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:08.270926" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:08.270819" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.270801" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:57:08.274178" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:57:08.271135" elapsed="0.003074"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:57:08.274260" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:57:08.274419" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:57:08.227021" elapsed="0.047425"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:57:08.274503" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:57:08.274678" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:57:08.224394" elapsed="0.050311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.275113" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:08.274862" elapsed="0.000306"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.275726" level="INFO">${actual_count} = 0</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:08.275318" elapsed="0.000435"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-22T23:57:08.275798" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:57:08.275949" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-22T23:57:08.211382" elapsed="0.064592"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.276427" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:57:08.276124" elapsed="0.000357"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="PASS" start="2026-08-22T23:57:08.210939" elapsed="0.065601"/>
</kw>
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.287053" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:08.284940" elapsed="0.002139"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.287753" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:08.287412" elapsed="0.000367"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:08.287263" elapsed="0.000553"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.288357" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:08.288041" elapsed="0.000342"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:08.287894" elapsed="0.000525"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:08.287132" elapsed="0.001316"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.289249" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:08.288764" elapsed="0.000518"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:08.288511" elapsed="0.000808"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.289513" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:08.289344" elapsed="0.000225"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.289767" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:08.289608" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.288493" elapsed="0.001350"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:08.289876" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:57:08.290025" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:08.284458" elapsed="0.005592"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:08.290096" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:57:08.290236" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>config</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:08.283904" elapsed="0.006358"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:57:08.297851" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hrz2gdn2du0u1mbavc6k1k2h61.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:08.297963" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:08.298058" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:57:08.291037" elapsed="0.007048"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} == 404 or ${resp.status_code} == 409">
<return>
<status status="PASS" start="2026-08-22T23:57:08.303346" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:57:08.298166" elapsed="0.005263"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.298146" elapsed="0.005317"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.303699" elapsed="0.000033"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The request failed with code ${resp.status_code}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.303931" elapsed="0.000028"/>
</kw>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config in ClusterManagement__session_2 using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="PASS" start="2026-08-22T23:57:08.290632" elapsed="0.013408"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device has no Netconf connectors nor associated data.</doc>
<status status="PASS" start="2026-08-22T23:57:08.210418" elapsed="0.093701"/>
</kw>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Completely_Gone</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:57:08.209864" elapsed="0.094377"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${node2_session}</arg>
<doc>Wait until all netconf connectors for the device with the given name disappear.
Call of Remove_Device_From_Netconf returns before netconf gets
around deleting the device's connector. To ensure the device is
really gone from netconf, use this keyword to make sure all
connectors disappear. If a call to Remove_Device_From_Netconf
is not made before using this keyword, the wait will fail.
Using this keyword is more readable than putting the WUKS below
into a test case.</doc>
<status status="PASS" start="2026-08-22T23:57:08.209207" elapsed="0.095121"/>
</kw>
<kw name="Wait_Device_Fully_Removed" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Completely_Gone" owner="NetconfKeywords">
<kw name="Check_Device_Has_No_Netconf_Connector" owner="NetconfKeywords">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.318703" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:08.316567" elapsed="0.002164"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.319052" elapsed="0.000021"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-22T23:57:08.318900" elapsed="0.000209"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-22T23:57:08.318783" elapsed="0.000351"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.319436" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:08.319197" elapsed="0.000295"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.320234" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:08.319766" elapsed="0.000494"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:08.319517" elapsed="0.000780"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.320482" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:08.320321" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.319180" elapsed="0.001379"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:08.320612" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:57:08.320762" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:08.316116" elapsed="0.004672"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:08.320834" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:57:08.320976" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:08.315642" elapsed="0.005359"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.328467" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:08.328216" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.328929" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:08.328683" 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-08-22T23:57:08.345325" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0179ip0zxsj0s9108c1r30zjro01.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:08.345647" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1011'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}} 
 </msg>
<msg time="2026-08-22T23:57:08.345877" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:57:08.331127" elapsed="0.014809"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:08.329040" elapsed="0.016992"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.346508" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:08.346162" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.329022" elapsed="0.017721"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.354514" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:08.349029" elapsed="0.005541"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:08.348506" elapsed="0.006119"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.348465" elapsed="0.006187"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.357362" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:08.354933" elapsed="0.002476"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:08.354710" elapsed="0.002735"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.354693" elapsed="0.002794"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.358049" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:08.357670" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.358384" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:08.358150" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.358964" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:08.358662" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:08.358467" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.358131" elapsed="0.000919"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.359573" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:08.359208" 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-08-22T23:57:08.359930" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:08.359698" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.360467" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:08.360170" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:08.360013" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.359681" 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-08-22T23:57:08.360719" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:57:08.361533" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:08.361230" 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-08-22T23:57:08.361735" elapsed="0.002675"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:57:08.347521" elapsed="0.016954"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:08.364671" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:08.364546" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.364526" elapsed="0.000214"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:57:08.367899" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:57:08.364884" elapsed="0.003045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:57:08.367983" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:57:08.368143" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:57:08.323827" elapsed="0.044376"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:57:08.368264" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:57:08.368416" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:57:08.321214" elapsed="0.047229"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.368872" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:08.368617" elapsed="0.000313"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.369479" level="INFO">${actual_count} = 0</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:08.369083" elapsed="0.000465"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-22T23:57:08.369628" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:57:08.369787" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-22T23:57:08.307465" elapsed="0.062347"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.370224" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:57:08.369966" elapsed="0.000312"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="PASS" start="2026-08-22T23:57:08.306843" elapsed="0.063495"/>
</kw>
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.380833" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:08.378685" elapsed="0.002174"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.381514" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:08.381190" elapsed="0.000354"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:08.381041" elapsed="0.000569"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.382159" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:08.381842" elapsed="0.000344"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:08.381692" elapsed="0.000530"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:08.380912" elapsed="0.001339"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.383033" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:08.382551" elapsed="0.000510"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:08.382315" elapsed="0.000783"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.383292" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:08.383124" elapsed="0.000225"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.383528" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:08.383372" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.382298" elapsed="0.001327"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:08.383660" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:57:08.383807" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:08.378215" elapsed="0.005618"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:08.383880" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:57:08.384070" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>config</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:08.377663" elapsed="0.006433"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:57:08.392092" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0179ip0zxsj0s9108c1r30zjro01.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:08.392205" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:08.392298" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:57:08.384880" elapsed="0.007444"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} == 404 or ${resp.status_code} == 409">
<return>
<status status="PASS" start="2026-08-22T23:57:08.398098" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:57:08.392405" elapsed="0.005776"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.392386" elapsed="0.005830"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.398423" elapsed="0.000031"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The request failed with code ${resp.status_code}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:08.398722" elapsed="0.000030"/>
</kw>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config in ClusterManagement__session_3 using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="PASS" start="2026-08-22T23:57:08.384455" elapsed="0.014379"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device has no Netconf connectors nor associated data.</doc>
<status status="PASS" start="2026-08-22T23:57:08.306124" elapsed="0.092790"/>
</kw>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Completely_Gone</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:57:08.305331" elapsed="0.093653"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${node3_session}</arg>
<doc>Wait until all netconf connectors for the device with the given name disappear.
Call of Remove_Device_From_Netconf returns before netconf gets
around deleting the device's connector. To ensure the device is
really gone from netconf, use this keyword to make sure all
connectors disappear. If a call to Remove_Device_From_Netconf
is not made before using this keyword, the wait will fail.
Using this keyword is more readable than putting the WUKS below
into a test case.</doc>
<status status="PASS" start="2026-08-22T23:57:08.304638" elapsed="0.094431"/>
</kw>
<doc>Make request to deconfigure the device on Netconf connector and see if it works.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-08-22T23:57:07.747557" elapsed="0.651667"/>
</test>
<kw name="Teardown_Everything" type="TEARDOWN">
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-08-22T23:57:08.400398" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-08-22T23:57:08.400295" elapsed="0.000223"/>
</kw>
<kw name="Stop_Testtool" owner="NetconfKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.402009" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:08.401476" elapsed="0.000571"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-08-22T23:57:08.402259" elapsed="0.000367"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-08-22T23:57:08.401189" elapsed="0.001517"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-08-22T23:57:08.739135" level="INFO">[?2004l^C[?2004h[jenkins@releng-63244-201-1-mininet-ovs-217-0 ~]&gt;</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-08-22T23:57:08.402851" elapsed="0.336485"/>
</kw>
<kw name="Get File" owner="SSHLibrary">
<msg time="2026-08-22T23:57:08.797679" level="INFO">'testtool--netconf-clustering-txt-Entity.1787442511.392.log' -&gt; '/w/workspace/netconf-csit-3node-clustering-only-titanium/testtool--netconf-clustering-txt-Entity.1787442511.392.log'</msg>
<arg>${testtool_log}</arg>
<doc>Downloads file(s) from the remote machine to the local machine.</doc>
<status status="PASS" start="2026-08-22T23:57:08.739700" elapsed="0.058127"/>
</kw>
<doc>Stop testtool and download its log.</doc>
<status status="PASS" start="2026-08-22T23:57:08.400832" elapsed="0.397158"/>
</kw>
<doc>Teardown the test infrastructure, perform cleanup and release all resources.</doc>
<status status="PASS" start="2026-08-22T23:57:08.399996" elapsed="0.398109"/>
</kw>
<doc>Test suite for netconf device entity ownership handling during outages.

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

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


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

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

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

The suite checks the integrity of the presence of the device and the data
seen on the device only for nodes that have at least one of the roles
("CONFIGURER", "SETTER" and "CHECKER") assigned. A better design would have
a "checker list" of sorts and have only one checking test case that runs
through the check list and performs the test on each node listed. However
this currently has fairly low priority due to Beryllium delivery date so
it was left out.</doc>
<status status="FAIL" start="2026-08-22T23:48:26.131672" elapsed="522.666504"/>
</suite>
<suite id="s1-s8" name="CRUD" source="/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/CRUD.robot">
<kw name="Setup_Everything" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.897620" 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-08-22T23:57:08.893247" elapsed="0.004426"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-08-22T23:57:08.893013" elapsed="0.004724"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.903023" 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-08-22T23:57:08.898851" elapsed="0.004206"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-08-22T23:57:08.903318" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:08.903166" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.903130" elapsed="0.000282"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.904101" 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-08-22T23:57:08.903676" elapsed="0.000475"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.904738" 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-08-22T23:57:08.904346" elapsed="0.000422"/>
</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-08-22T23:57:08.905388" elapsed="0.000351"/>
</kw>
<msg time="2026-08-22T23:57:08.905866" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:08.905923" 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-08-22T23:57:08.904974" elapsed="0.000974"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.906567" 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-08-22T23:57:08.906147" elapsed="0.000479"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.907871" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:57:08.907466" elapsed="0.000435"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.908372" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:57:08.908075" elapsed="0.000330"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.908958" 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-08-22T23:57:08.908622" elapsed="0.000367"/>
</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-08-22T23:57:08.912688" elapsed="0.000235"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.913411" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:57:08.913082" elapsed="0.000357"/>
</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-08-22T23:57:08.913606" elapsed="0.000237"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.914645" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:08.914326" elapsed="0.000346"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:57:08.914720" elapsed="0.000039"/>
</return>
<msg time="2026-08-22T23:57:08.914883" 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-08-22T23:57:08.914036" elapsed="0.000871"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:57:08.915690" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.200:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396b87d5f90&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-08-22T23:57:08.915061" elapsed="0.000786"/>
</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-08-22T23:57:08.916079" elapsed="0.000194"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-08-22T23:57:08.912110" elapsed="0.004223"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:57:08.911918" elapsed="0.004461"/>
</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-08-22T23:57:08.917216" elapsed="0.000189"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.917991" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:57:08.917656" elapsed="0.000363"/>
</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-08-22T23:57:08.918169" elapsed="0.000221"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.919186" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:08.918892" elapsed="0.000320"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:57:08.919257" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:57:08.919410" 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-08-22T23:57:08.918600" elapsed="0.000835"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:57:08.920032" level="INFO">Creating Session using : alias=ClusterManagement__session_2, url=http://10.30.170.12:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396b85b2b90&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-08-22T23:57:08.919625" elapsed="0.000512"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-08-22T23:57:08.920297" 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-08-22T23:57:08.916665" elapsed="0.003880"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:57:08.916467" elapsed="0.004140"/>
</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-08-22T23:57:08.921416" elapsed="0.000205"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.922096" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:57:08.921776" elapsed="0.000347"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:57:08.922271" elapsed="0.000218"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.923276" 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-08-22T23:57:08.922983" elapsed="0.000319"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-08-22T23:57:08.923348" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:57:08.923499" 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-08-22T23:57:08.922693" elapsed="0.000830"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:57:08.924117" level="INFO">Creating Session using : alias=ClusterManagement__session_3, url=http://10.30.170.79:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396b885cd10&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-08-22T23:57:08.923711" elapsed="0.000511"/>
</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-08-22T23:57:08.924379" 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-08-22T23:57:08.920867" elapsed="0.003783"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:57:08.920691" elapsed="0.004002"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-08-22T23:57:08.909065" elapsed="0.015657"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.925284" 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-08-22T23:57:08.924886" elapsed="0.000440"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.925898" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.200', 2: '10.30.170.12', 3: '10.30.170.79'}</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-08-22T23:57:08.925483" elapsed="0.000457"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.926478" 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-08-22T23:57:08.926097" elapsed="0.000425"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-08-22T23:57:08.906943" elapsed="0.019654"/>
</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-08-22T23:57:08.898487" elapsed="0.028169"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:57:08.926877" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:08.926760" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.926741" elapsed="0.000203"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.930287" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:57:08.929914" elapsed="0.000400"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.930796" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:57:08.930470" elapsed="0.000351"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:57:08.930866" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:57:08.931020" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:57:08.929570" elapsed="0.001474"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:08.932039" level="INFO">${member_ip} = 10.30.170.200</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-08-22T23:57:08.931776" elapsed="0.000289"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:08.932795" level="INFO">index=89
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:57:08.932897" level="INFO">${current_connection} = index=89
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:57:08.932649" elapsed="0.000274"/>
</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-08-22T23:57:08.936298" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:08.935716" elapsed="0.000669"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:08.935696" elapsed="0.000727"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:08.936929" level="INFO">index=89
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:57:08.937161" level="INFO">${current_ssh_connection} = index=89
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:57:08.936651" elapsed="0.000562"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.938162" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.200" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:08.937481" elapsed="0.000789"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:08.939502" level="INFO">${conn_id} = 91</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:57:08.938544" elapsed="0.001014"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:57:08.941459" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:57:08.941660" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:57:08.941097" elapsed="0.000609"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:57:08.942046" elapsed="0.000462"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:57:08.945524" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:57:09.540940" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:57:09 UTC 2026

  System load:  0.0                Processes:             119
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:48:30 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:57:08.943363" elapsed="0.597776"/>
</kw>
<msg time="2026-08-22T23:57:09.541221" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:57:08.942918" elapsed="0.598448"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:57:08.940141" elapsed="0.601372"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:57:09.542428" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-08-22T23:57:09.555408" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-08-22T23:57:09.555835" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:57:09.556068" 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-08-22T23:57:09.541927" elapsed="0.014254"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:57:09.556914" elapsed="0.001558"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:09.561159" 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-08-22T23:57:09.559854" elapsed="0.001546"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:57:09.562504" elapsed="0.000191"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:09.561933" elapsed="0.000880"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:09.561871" elapsed="0.000996"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:57:09.563298" elapsed="0.000089"/>
</return>
<status status="PASS" start="2026-08-22T23:57:09.562981" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:09.562956" elapsed="0.000615"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:57:09.563798" elapsed="0.000030"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<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-08-22T23:57:09.569571" elapsed="0.000254"/>
</kw>
<msg time="2026-08-22T23:57:09.569919" 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-08-22T23:57:09.568628" elapsed="0.001869"/>
</kw>
<kw name="Open 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-08-22T23:57:09.570882" elapsed="0.000037"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:09.571175" 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-08-22T23:57:09.564492" elapsed="0.006797"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:57:08.934733" elapsed="0.636734"/>
</kw>
<msg time="2026-08-22T23:57:09.571523" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:57:08.934067" elapsed="0.637509"/>
</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-08-22T23:57:08.933574" elapsed="0.638109"/>
</kw>
<msg time="2026-08-22T23:57:09.571725" 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-08-22T23:57:08.933076" elapsed="0.638696"/>
</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-08-22T23:57:09.575048" elapsed="0.000149"/>
</kw>
<msg time="2026-08-22T23:57:09.575241" 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-08-22T23:57:09.574472" elapsed="0.000831"/>
</kw>
<kw name="Open 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-08-22T23:57:09.575460" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:09.575637" 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-08-22T23:57:09.572059" elapsed="0.003661"/>
</kw>
<msg time="2026-08-22T23:57:09.575813" 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-08-22T23:57:08.932281" elapsed="0.643557"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:09.576325" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:09.576071" elapsed="0.000296"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:57:09.576409" 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-08-22T23:57:08.931394" elapsed="0.645142"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:57:08.931220" elapsed="0.645355"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:09.577542" level="INFO">${member_ip} = 10.30.170.12</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-08-22T23:57:09.577259" elapsed="0.000310"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:09.578317" level="INFO">index=89
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:57:09.578420" level="INFO">${current_connection} = index=89
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:57:09.578186" elapsed="0.000261"/>
</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-08-22T23:57:09.582052" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:09.581458" elapsed="0.000681"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:09.581438" elapsed="0.000740"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:09.582675" level="INFO">index=89
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:57:09.582911" level="INFO">${current_ssh_connection} = index=89
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:57:09.582378" elapsed="0.000586"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:09.583906" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.12" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:09.583229" elapsed="0.000783"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:09.585210" level="INFO">${conn_id} = 92</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:57:09.584279" elapsed="0.000982"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:57:09.587131" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:57:09.587312" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:57:09.586765" elapsed="0.000591"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:57:09.587754" elapsed="0.000458"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:57:09.589346" level="INFO">Logging into '10.30.170.12:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:57:10.184506" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:57:09 UTC 2026

  System load:  0.16               Processes:             118
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.12
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:48:27 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:57:09.589020" elapsed="0.595634"/>
</kw>
<msg time="2026-08-22T23:57:10.184730" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:57:09.588558" elapsed="0.596318"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:57:09.585833" elapsed="0.599192"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:57:10.185892" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-08-22T23:57:10.198829" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-08-22T23:57:10.199201" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:57:10.199434" 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-08-22T23:57:10.185381" elapsed="0.014316"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:57:10.200425" elapsed="0.001129"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:10.204218" 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-08-22T23:57:10.202886" elapsed="0.001571"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:57:10.205159" elapsed="0.000070"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:10.204805" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:10.204767" 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-08-22T23:57:10.205853" elapsed="0.000084"/>
</return>
<status status="PASS" start="2026-08-22T23:57:10.205506" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:10.205481" elapsed="0.000623"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:57:10.206190" 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">
<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-08-22T23:57:10.212339" elapsed="0.000221"/>
</kw>
<msg time="2026-08-22T23:57:10.212675" 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-08-22T23:57:10.211375" elapsed="0.001726"/>
</kw>
<kw name="Open 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-08-22T23:57:10.213387" elapsed="0.000038"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:10.213709" 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-08-22T23:57:10.206941" elapsed="0.006884"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:57:09.580525" elapsed="0.633475"/>
</kw>
<msg time="2026-08-22T23:57:10.214055" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:57:09.579908" elapsed="0.634196"/>
</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-08-22T23:57:09.579372" elapsed="0.634815"/>
</kw>
<msg time="2026-08-22T23:57:10.214227" 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-08-22T23:57:09.578619" elapsed="0.635653"/>
</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-08-22T23:57:10.217534" elapsed="0.000178"/>
</kw>
<msg time="2026-08-22T23:57:10.217755" 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-08-22T23:57:10.217044" 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-08-22T23:57:10.217972" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:10.218131" 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-08-22T23:57:10.214558" elapsed="0.003654"/>
</kw>
<msg time="2026-08-22T23:57:10.218305" 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-08-22T23:57:09.577801" elapsed="0.640529"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:10.218776" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:10.218503" elapsed="0.000316"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:57:10.218861" 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-08-22T23:57:09.576896" elapsed="0.642090"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:57:09.576709" elapsed="0.642315"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:10.219965" level="INFO">${member_ip} = 10.30.170.79</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-08-22T23:57:10.219689" elapsed="0.000303"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:10.220741" level="INFO">index=89
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:57:10.220886" level="INFO">${current_connection} = index=89
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:57:10.220611" 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-08-22T23:57:10.224235" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:10.223661" elapsed="0.000660"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:10.223640" elapsed="0.000720"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:10.224860" level="INFO">index=89
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:57:10.225094" level="INFO">${current_ssh_connection} = index=89
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:57:10.224560" elapsed="0.000587"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:10.226103" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.79" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:10.225407" elapsed="0.000808"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:10.227407" level="INFO">${conn_id} = 93</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:57:10.226482" elapsed="0.000976"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:57:10.229498" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:57:10.229750" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:57:10.229133" elapsed="0.000664"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:57:10.230135" elapsed="0.000486"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:57:10.231825" level="INFO">Logging into '10.30.170.79:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:57:10.809131" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:57:10 UTC 2026

  System load:  0.01               Processes:             119
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.79
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:48:28 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:57:10.231416" elapsed="0.577899"/>
</kw>
<msg time="2026-08-22T23:57:10.809409" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:57:10.230973" elapsed="0.578645"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-08-22T23:57:10.228047" elapsed="0.581758"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:57:10.810754" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-08-22T23:57:10.823567" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-08-22T23:57:10.823988" level="INFO">${stdout} = </msg>
<msg time="2026-08-22T23:57:10.824222" 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-08-22T23:57:10.810205" elapsed="0.014129"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:57:10.825058" elapsed="0.001184"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:10.828966" 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-08-22T23:57:10.827557" elapsed="0.001643"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:57:10.830321" elapsed="0.000112"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:10.829571" elapsed="0.001067"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:10.829513" elapsed="0.001182"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:57:10.831127" elapsed="0.000084"/>
</return>
<status status="PASS" start="2026-08-22T23:57:10.830812" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:10.830787" elapsed="0.000673"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-08-22T23:57:10.831552" 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">
<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-08-22T23:57:10.837183" elapsed="0.000234"/>
</kw>
<msg time="2026-08-22T23:57:10.837477" 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-08-22T23:57:10.836245" elapsed="0.001866"/>
</kw>
<kw name="Open 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-08-22T23:57:10.838496" elapsed="0.000051"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:10.838872" elapsed="0.000037"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:57:10.832262" elapsed="0.006726"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-08-22T23:57:10.222716" elapsed="0.616448"/>
</kw>
<msg time="2026-08-22T23:57:10.839221" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:57:10.222072" elapsed="0.617201"/>
</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-08-22T23:57:10.221569" elapsed="0.617787"/>
</kw>
<msg time="2026-08-22T23:57:10.839398" 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-08-22T23:57:10.221066" elapsed="0.618380"/>
</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-08-22T23:57:10.842940" elapsed="0.000151"/>
</kw>
<msg time="2026-08-22T23:57:10.843135" 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-08-22T23:57:10.842376" elapsed="0.000822"/>
</kw>
<kw name="Open 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-08-22T23:57:10.843353" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:10.843513" 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-08-22T23:57:10.839761" elapsed="0.003858"/>
</kw>
<msg time="2026-08-22T23:57:10.843715" 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-08-22T23:57:10.220234" elapsed="0.623508"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:10.844165" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:10.843916" elapsed="0.000290"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:57:10.844249" 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-08-22T23:57:10.219311" elapsed="0.625062"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:57:10.219126" elapsed="0.625284"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:57:08.931095" elapsed="1.913354"/>
</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-08-22T23:57:08.927161" elapsed="1.917351"/>
</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-08-22T23:57:10.844682" elapsed="0.000214"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:57:10.858321" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:10.858211" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:10.858191" elapsed="0.000200"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:10.858689" level="INFO">index=89
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:57:10.858797" level="INFO">${current_ssh_connection_object} = index=89
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:57:10.858547" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:10.859234" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:10.858975" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:10.859745" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:10.859468" elapsed="0.000321"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:10.860543" 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-08-22T23:57:10.860311" elapsed="0.000368">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-08-22T23:57:10.860786" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:57:10.860831" 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-08-22T23:57:10.859946" elapsed="0.000908"/>
</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-08-22T23:57:10.861154" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:10.860931" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:10.860912" elapsed="0.000341"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:10.862022" level="INFO">${ip_address} = 10.30.170.200</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:57:10.861741" elapsed="0.000308"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:57:10.862097" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:57:10.862244" level="INFO">${odl_ip} = 10.30.170.200</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:57:10.861453" elapsed="0.000815"/>
</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-08-22T23:57:10.862419" elapsed="0.000441"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:10.863137" level="INFO">index=94
host=10.30.170.200
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-08-22T23:57:10.863237" level="INFO">${karaf_connection_object} = index=94
host=10.30.170.200
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-08-22T23:57:10.863027" 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-08-22T23:57:10.863408" elapsed="0.002349"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:57:10.866215" level="INFO">Logging into '10.30.170.200:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:57:11.025330" 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-08-22T23:57:10.865951" elapsed="0.159473"/>
</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-08-22T23:57:11.029186" elapsed="0.000238"/>
</kw>
<msg time="2026-08-22T23:57:11.029486" 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-08-22T23:57:11.028625" elapsed="0.000930"/>
</kw>
<kw name="Open 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-08-22T23:57:11.029736" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:11.029896" 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-08-22T23:57:11.026338" elapsed="0.003641"/>
</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-08-22T23:57:11.025735" elapsed="0.004290"/>
</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-08-22T23:57:10.857925" elapsed="0.172151"/>
</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-08-22T23:57:10.845635" elapsed="0.184488"/>
</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-08-22T23:57:10.845248" elapsed="0.184981"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:57:10.845107" elapsed="0.185163"/>
</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-08-22T23:57:11.043871" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:11.043755" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:11.043730" elapsed="0.000214"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:11.044221" level="INFO">index=89
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:57:11.044327" level="INFO">${current_ssh_connection_object} = index=89
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:57:11.044097" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:11.044955" level="INFO">{1: 94}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:11.044506" elapsed="0.000494"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:11.045394" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:11.045151" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:11.046207" 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-08-22T23:57:11.045981" elapsed="0.000329">Dictionary does not contain key '2'.</status>
</kw>
<msg time="2026-08-22T23:57:11.046417" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:57:11.046481" 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-08-22T23:57:11.045611" elapsed="0.000895"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:11.046822" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:11.046597" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:11.046564" elapsed="0.000356"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:11.047688" level="INFO">${ip_address} = 10.30.170.12</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:57:11.047397" elapsed="0.000318"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:57:11.047763" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:57:11.047913" level="INFO">${odl_ip} = 10.30.170.12</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:57:11.047129" elapsed="0.000809"/>
</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-08-22T23:57:11.048090" elapsed="0.000411"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:11.048802" level="INFO">index=95
host=10.30.170.12
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-08-22T23:57:11.048902" level="INFO">${karaf_connection_object} = index=95
host=10.30.170.12
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:57:11.048691" elapsed="0.000237"/>
</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-08-22T23:57:11.049072" elapsed="0.002190"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:57:11.051695" level="INFO">Logging into '10.30.170.12:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:57:11.264932" 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-08-22T23:57:11.051420" elapsed="0.213618"/>
</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-08-22T23:57:11.269116" elapsed="0.000241"/>
</kw>
<msg time="2026-08-22T23:57:11.269417" 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-08-22T23:57:11.268530" 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-08-22T23:57:11.269667" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:11.269829" elapsed="0.000019"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:57:11.265989" elapsed="0.003922"/>
</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-08-22T23:57:11.265363" elapsed="0.004595"/>
</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-08-22T23:57:11.043444" elapsed="0.226564"/>
</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-08-22T23:57:11.030922" elapsed="0.239135"/>
</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-08-22T23:57:11.030533" elapsed="0.239576"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:57:11.030374" elapsed="0.239775"/>
</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-08-22T23:57:11.283390" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:11.283276" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:11.283252" elapsed="0.000212"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:11.283751" level="INFO">index=89
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:57:11.283857" level="INFO">${current_ssh_connection_object} = index=89
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:57:11.283628" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:11.284292" level="INFO">{1: 94, 2: 95}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:11.284031" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:11.284743" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:11.284482" elapsed="0.000305"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:11.285512" 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-08-22T23:57:11.285297" elapsed="0.000332">Dictionary does not contain key '3'.</status>
</kw>
<msg time="2026-08-22T23:57:11.285738" level="INFO">${status} = FAIL</msg>
<msg time="2026-08-22T23:57:11.285783" 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-08-22T23:57:11.284941" elapsed="0.000865"/>
</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-08-22T23:57:11.286100" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:11.285880" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:11.285862" elapsed="0.000335"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:11.286947" level="INFO">${ip_address} = 10.30.170.79</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:57:11.286680" elapsed="0.000292"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-08-22T23:57:11.287020" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:57:11.287194" level="INFO">${odl_ip} = 10.30.170.79</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-08-22T23:57:11.286393" elapsed="0.000828"/>
</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-08-22T23:57:11.287374" elapsed="0.000448"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:11.288100" level="INFO">index=96
host=10.30.170.79
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-08-22T23:57:11.288201" level="INFO">${karaf_connection_object} = index=96
host=10.30.170.79
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:57:11.287990" 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-08-22T23:57:11.288422" elapsed="0.002347"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-08-22T23:57:11.291204" level="INFO">Logging into '10.30.170.79:8101' as 'karaf'.</msg>
<msg time="2026-08-22T23:57:11.493927" 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-08-22T23:57:11.290931" elapsed="0.203245"/>
</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-08-22T23:57:11.499239" elapsed="0.000254"/>
</kw>
<msg time="2026-08-22T23:57:11.499557" 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-08-22T23:57:11.498535" elapsed="0.001131"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:11.499878" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:11.500046" 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-08-22T23:57:11.495918" elapsed="0.004215"/>
</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-08-22T23:57:11.494821" elapsed="0.005360"/>
</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-08-22T23:57:11.282980" elapsed="0.217254"/>
</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-08-22T23:57:11.270777" elapsed="0.229507"/>
</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-08-22T23:57:11.270386" elapsed="0.229952"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:57:11.270250" elapsed="0.230130"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-08-22T23:57:10.844955" elapsed="0.655467"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-08-22T23:57:08.898048" elapsed="2.602442"/>
</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-08-22T23:57:11.503208" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:11.503079" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:11.503053" elapsed="0.000232"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:57:11.508283" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:11.508174" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:11.508156" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:57:11.509330" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:57:11.508931" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:57:11.509860" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:57:11.509520" elapsed="0.000366"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:57:11.509934" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:57:11.510092" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:57:11.508593" 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-08-22T23:57:11.515390" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:11.515280" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:11.515261" 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-08-22T23:57:11.516792" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:11.516659" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:11.516639" elapsed="0.000222"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:11.517336" level="INFO">${karaf_connection_index} = 94</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:57:11.517006" elapsed="0.000357"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:11.517775" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:57:11.517519" elapsed="0.000283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:57:11.555957" 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 "/ "n "e "t "[78Cc "[A[78Co</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:57:11.518451" elapsed="0.037648"/>
</kw>
<msg time="2026-08-22T23:57:11.556236" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:57:11.556284" 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-08-22T23:57:11.517960" elapsed="0.038361"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:57:11.602730" level="INFO">"n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "C "R "U "[78CD "[A[78C.
 "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-08-22T23:57:11.557027" elapsed="0.046022"/>
</kw>
<msg time="2026-08-22T23:57:11.603178" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:57:11.603224" level="INFO">${message_wait} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:57:11.556494" elapsed="0.046766"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:11.603605" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:11.603337" elapsed="0.000418"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:11.603318" elapsed="0.000465"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:11.604313" level="INFO"> "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "C "R "U "[78CD "[A[78C.
 "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-08-22T23:57:11.603928" elapsed="0.000467"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:11.604831" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:11.604464" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:11.604445" elapsed="0.000558"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:57:11.605038" 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-08-22T23:57:11.607596" elapsed="0.000161"/>
</kw>
<msg time="2026-08-22T23:57:11.607800" 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-08-22T23:57:11.606965" elapsed="0.000955"/>
</kw>
<kw name="Open 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-08-22T23:57:11.608283" elapsed="0.000065"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:11.608734" elapsed="0.000065"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:57:11.606175" elapsed="0.002722"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:57:11.605306" 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-08-22T23:57:11.516344" elapsed="0.092786"/>
</kw>
<msg time="2026-08-22T23:57:11.609222" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:11.609266" level="INFO">${message} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:57:11.515697" elapsed="0.093606"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:57:11.609754" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-08-22T23:57:11.609419" elapsed="0.000400"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:11.609399" elapsed="0.000446"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:11.610252" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:11.610611" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:57:11.610685" 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-08-22T23:57:11.514988" elapsed="0.095808"/>
</kw>
<msg time="2026-08-22T23:57:11.610890" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:11.610934" level="INFO">${output} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:57:11.510497" elapsed="0.100474"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:11.611320" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:11.611048" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:11.611030" elapsed="0.000374"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:57:11.510355" elapsed="0.101073"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:57:11.616760" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:11.616648" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:11.616629" 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-08-22T23:57:11.618014" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:11.617886" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:11.617867" elapsed="0.000215"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:11.618542" level="INFO">${karaf_connection_index} = 95</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:57:11.618229" elapsed="0.000340"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:11.618974" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:57:11.618744" elapsed="0.000256"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:57:11.651711" 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 "/ "n "e "t "[78Cc "[A[78Co</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:57:11.619662" elapsed="0.032178"/>
</kw>
<msg time="2026-08-22T23:57:11.651967" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:57:11.652013" 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-08-22T23:57:11.619155" elapsed="0.032895"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:57:11.689450" level="INFO">"n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "C "R "U "[78CD "[A[78C.
 "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-08-22T23:57:11.652785" elapsed="0.036826"/>
</kw>
<msg time="2026-08-22T23:57:11.689740" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:57:11.689785" level="INFO">${message_wait} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:57:11.652248" elapsed="0.037574"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:11.690136" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:11.689898" elapsed="0.000383"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:11.689879" elapsed="0.000429"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:11.690940" level="INFO"> "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "C "R "U "[78CD "[A[78C.
 "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-08-22T23:57:11.690451" 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-08-22T23:57:11.691364" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:11.691126" elapsed="0.000385"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:11.691106" elapsed="0.000431"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:57:11.691572" 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-08-22T23:57:11.694182" elapsed="0.000155"/>
</kw>
<msg time="2026-08-22T23:57:11.694380" 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-08-22T23:57:11.693597" 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="NOT RUN" start="2026-08-22T23:57:11.694886" elapsed="0.000064"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:11.695262" elapsed="0.000062"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:57:11.692835" elapsed="0.002585"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:57:11.691848" elapsed="0.003704"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:57:11.617572" elapsed="0.078101"/>
</kw>
<msg time="2026-08-22T23:57:11.695765" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:11.695809" level="INFO">${message} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:57:11.616981" elapsed="0.078866"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:57:11.696030" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:57:11.695924" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:11.695905" 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-08-22T23:57:11.696792" 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-08-22T23:57:11.697128" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:57:11.697201" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:57:11.616338" elapsed="0.080973"/>
</kw>
<msg time="2026-08-22T23:57:11.697405" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:11.697477" level="INFO">${output} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:57:11.611751" elapsed="0.085765"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:11.698086" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:11.697608" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:11.697589" elapsed="0.000576"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:57:11.611552" elapsed="0.086637"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:57:11.703447" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:11.703338" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:11.703320" 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-08-22T23:57:11.704773" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:11.704641" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:11.704620" elapsed="0.000222"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:11.705297" level="INFO">${karaf_connection_index} = 96</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:57:11.704984" elapsed="0.000340"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:11.705744" level="INFO">${current_connection_index} = 89</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:57:11.705479" elapsed="0.000291"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:57:11.743340" 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 "/ "n "e "t "[78Cc "[A[78Co</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:57:11.706410" elapsed="0.037112"/>
</kw>
<msg time="2026-08-22T23:57:11.743696" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:57:11.743743" 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-08-22T23:57:11.705926" elapsed="0.037857"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:57:11.790736" level="INFO">"n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "C "R "U "[78CD "[A[78C.
 "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-08-22T23:57:11.744467" elapsed="0.046418"/>
</kw>
<msg time="2026-08-22T23:57:11.791018" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:57:11.791065" level="INFO">${message_wait} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:57:11.743951" elapsed="0.047152"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:11.791423" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:11.791181" elapsed="0.000389"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:11.791161" elapsed="0.000465"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:11.792128" level="INFO"> "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "n "e "t "c "o "n "f "/ "c "l "u "s "t "e "r "i "n "g "/ "C "R "U "[78CD "[A[78C.
 "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-08-22T23:57:11.791772" elapsed="0.000438"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:11.792524" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:11.792277" elapsed="0.000605"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:11.792259" elapsed="0.000650"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:57:11.792945" 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-08-22T23:57:11.795419" elapsed="0.000155"/>
</kw>
<msg time="2026-08-22T23:57:11.795650" 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-08-22T23:57:11.794839" elapsed="0.000930"/>
</kw>
<kw name="Open 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-08-22T23:57:11.796096" elapsed="0.000063"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:11.796472" elapsed="0.000087"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:57:11.794076" elapsed="0.002598"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:57:11.793203" 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-08-22T23:57:11.704315" elapsed="0.092590"/>
</kw>
<msg time="2026-08-22T23:57:11.796997" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:11.797041" level="INFO">${message} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:57:11.703693" elapsed="0.093385"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:57:11.797261" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:57:11.797154" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:11.797135" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:11.797766" 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-08-22T23:57:11.799770" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:57:11.799849" 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-08-22T23:57:11.703043" elapsed="0.096926"/>
</kw>
<msg time="2026-08-22T23:57:11.800064" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:11.800108" level="INFO">${output} =  "n "f "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "t "i "t "a "n "i "u "m "/ "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-08-22T23:57:11.698448" elapsed="0.101738"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:11.800518" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:11.800265" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:11.800247" elapsed="0.000398"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:57:11.698311" elapsed="0.102359"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:57:11.510174" elapsed="0.290524"/>
</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-08-22T23:57:11.507877" elapsed="0.292876"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-08-22T23:57:11.501123" elapsed="0.299684"/>
</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-08-22T23:57:11.500668" elapsed="0.300179"/>
</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-08-22T23:57:08.892699" elapsed="2.908199"/>
</kw>
<kw name="Setup_NetconfKeywords" owner="NetconfKeywords">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:57:11.801842" level="INFO">${tmp} = {}</msg>
<var>${tmp}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:57:11.801430" elapsed="0.000439"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:11.806024" level="INFO">${NetconfKeywords__mounted_device_types} = {}</msg>
<arg>${NetconfKeywords__mounted_device_types}</arg>
<arg>${tmp}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:57:11.802027" elapsed="0.004044"/>
</kw>
<if>
<branch type="IF" condition="${create_session_for_templated_requests}">
<kw name="Create_Default_Session" owner="TemplatedRequests">
<arg>timeout=2</arg>
<doc>Create "default" session to ${url} with authentication and connection parameters.
This Keyword is in this Resource only so that user do not need to call RequestsLibrary directly.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:11.809513" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:11.806144" elapsed="0.003436"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:11.806125" elapsed="0.003493"/>
</if>
<kw name="Initialize_Artifact_Deployment_And_Usage" owner="NexusKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:11.814882" level="INFO">${odl_connection} = 97</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:57:11.814460" elapsed="0.000448"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:57:11.816538" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:57:11.816654" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:57:11.816255" elapsed="0.000424"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:57:11.816834" elapsed="0.000319"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:57:11.818018" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:57:12.132272" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:57:09 UTC 2026

  System load:  0.0                Processes:             119
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:57:09 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:57:11.817698" elapsed="0.314696"/>
</kw>
<msg time="2026-08-22T23:57:12.132469" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:57:11.817318" elapsed="0.315222"/>
</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-08-22T23:57:11.815824" elapsed="0.316842"/>
</kw>
<msg time="2026-08-22T23:57:12.132719" 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-08-22T23:57:11.815421" elapsed="0.317346"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:57:11.815090" elapsed="0.317753"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:57:12.132893" elapsed="0.000039"/>
</return>
<msg time="2026-08-22T23:57:12.133093" level="INFO">${odl} = 97</msg>
<var>${odl}</var>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:57:11.814162" elapsed="0.318957"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-08-22T23:57:12.143320" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-08-22T23:57:12.151134" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../../tools/deployment/search.sh' -&gt; '/home/jenkins//search.sh'</msg>
<arg>/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../../tools/deployment/search.sh</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-08-22T23:57:12.133391" elapsed="0.017878"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:57:12.151654" elapsed="0.000530"/>
</kw>
<if>
<branch type="IF" condition="not (${tools_system_connect})">
<return>
<status status="NOT RUN" start="2026-08-22T23:57:12.152701" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:12.152351" elapsed="0.000446"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:12.152304" elapsed="0.000546"/>
</if>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:12.160497" level="INFO">${tools_connection} = 98</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-08-22T23:57:12.159948" elapsed="0.000587"/>
</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-08-22T23:57:12.162939" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:57:12.163017" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:57:12.162551" elapsed="0.000490"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:57:12.163199" elapsed="0.000323"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:57:12.164374" level="INFO">Logging into '10.30.171.196:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:57:12.745703" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:57:12 UTC 2026

  System load:  0.04               Processes:             119
  Usage of /:   19.8% of 38.58GB   Users logged in:       1
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.196
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:48:30 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:57:12.164061" elapsed="0.581824"/>
</kw>
<msg time="2026-08-22T23:57:12.745975" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:57:12.163707" elapsed="0.582361"/>
</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-08-22T23:57:12.161939" elapsed="0.584254"/>
</kw>
<msg time="2026-08-22T23:57:12.746246" 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-08-22T23:57:12.161288" elapsed="0.585006"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-08-22T23:57:12.160823" elapsed="0.585550"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-08-22T23:57:12.746429" elapsed="0.000043"/>
</return>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:57:12.159422" elapsed="0.587206"/>
</kw>
<doc>Places search utility to ODL system, which will be needed for version detection.
By default also initialize a SSH connection to Tools system,
as following Keywords assume a working connection towards target system.</doc>
<status status="PASS" start="2026-08-22T23:57:11.809870" elapsed="0.936819"/>
</kw>
<arg>create_session_for_templated_requests=False</arg>
<doc>Setup the environment for the other keywords of this Resource to work properly.</doc>
<status status="PASS" start="2026-08-22T23:57:11.801142" elapsed="0.945600"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:57:12.747487" level="INFO">Creating Session using : alias=node1, url=http://10.30.170.200:8181, headers={'Content-Type': 'application/xml'},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396b88eb190&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>node1</arg>
<arg>http://${ODL_SYSTEM_1_IP}:${RESTCONFPORT}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-08-22T23:57:12.747055" elapsed="0.000666"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:57:12.748216" level="INFO">Creating Session using : alias=node2, url=http://10.30.170.12:8181, headers={'Content-Type': 'application/xml'},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396b881f950&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>node2</arg>
<arg>http://${ODL_SYSTEM_2_IP}:${RESTCONFPORT}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-08-22T23:57:12.747904" elapsed="0.000448"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:57:12.748839" level="INFO">Creating Session using : alias=node3, url=http://10.30.170.79:8181, headers={'Content-Type': 'application/xml'},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7396bae960d0&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>node3</arg>
<arg>http://${ODL_SYSTEM_3_IP}:${RESTCONFPORT}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-08-22T23:57:12.748517" elapsed="0.000456"/>
</kw>
<doc>Initialize SetupUtils, setup everything needed for the test cases.</doc>
<status status="PASS" start="2026-08-22T23:57:08.892367" elapsed="3.856751"/>
</kw>
<test id="s1-s8-t1" name="Start_Testtool" line="68">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:57:12.752705" elapsed="0.000254"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:57:12.752416" 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-08-22T23:57:12.754127" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:12.753987" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:12.753963" 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-08-22T23:57:12.759182" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:12.759074" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:12.759055" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:57:12.760268" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:57:12.759873" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:57:12.760829" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:57:12.760457" elapsed="0.000398"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:57:12.760900" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:57:12.761055" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:57:12.759475" elapsed="0.001605"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:57:12.766450" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:12.766342" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:12.766323" 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-08-22T23:57:12.767756" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:12.767646" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:12.767628" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:12.768270" level="INFO">${karaf_connection_index} = 94</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:57:12.767969" elapsed="0.000327"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:12.768716" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:57:12.768456" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:57:12.803548" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:57:12.769231" elapsed="0.034630"/>
</kw>
<msg time="2026-08-22T23:57:12.804240" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:57:12.804345" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:12.768899" elapsed="0.035529"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:57:12.818506" level="INFO">"t "x "t ". "C "R "U "D ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:57:12.806053" elapsed="0.012700"/>
</kw>
<msg time="2026-08-22T23:57:12.819156" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:57:12.819265" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                           ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:12.804895" elapsed="0.014452"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:12.820084" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:12.819518" elapsed="0.000689"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:12.819475" elapsed="0.000786"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:12.821262" level="INFO"> "t "x "t ". "C "R "U "D ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:12.820571" elapsed="0.000822"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:12.822287" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:12.821540" elapsed="0.000873"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:12.821500" elapsed="0.000968"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:57:12.822543" elapsed="0.000088"/>
</return>
<kw name="Run Keyword 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-08-22T23:57:12.825756" elapsed="0.000152"/>
</kw>
<msg time="2026-08-22T23:57:12.825968" 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-08-22T23:57:12.824676" elapsed="0.001420"/>
</kw>
<kw name="Open 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-08-22T23:57:12.826367" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:12.826729" 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-08-22T23:57:12.824042" elapsed="0.002872"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:57:12.823209" 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="PASS" start="2026-08-22T23:57:12.767321" elapsed="0.059757"/>
</kw>
<msg time="2026-08-22T23:57:12.827201" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:12.827246" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                           ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:12.766685" elapsed="0.060599"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:57:12.827468" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:57:12.827361" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:12.827342" 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-08-22T23:57:12.827984" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:12.828317" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:57:12.828389" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:57:12.766006" elapsed="0.062490"/>
</kw>
<msg time="2026-08-22T23:57:12.828606" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:12.828653" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                           ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:12.761468" elapsed="0.067225"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:12.829015" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:12.828768" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:12.828750" elapsed="0.000342"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:57:12.761325" elapsed="0.067791"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:57:12.834508" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:12.834401" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:12.834383" 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-08-22T23:57:12.835776" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:12.835669" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:12.835650" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:12.836276" level="INFO">${karaf_connection_index} = 95</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:57:12.835984" elapsed="0.000318"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:12.836695" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:57:12.836458" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:57:12.870288" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:57:12.837204" elapsed="0.033184"/>
</kw>
<msg time="2026-08-22T23:57:12.870603" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:57:12.870653" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:12.836875" elapsed="0.033816"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:57:12.882732" level="INFO">"t "x "t ". "C "R "U "D ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:57:12.871194" elapsed="0.011635"/>
</kw>
<msg time="2026-08-22T23:57:12.882987" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:57:12.883034" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                           ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:12.870858" elapsed="0.012211"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:12.883378" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:12.883145" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:12.883125" elapsed="0.000332"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:12.883915" level="INFO"> "t "x "t ". "C "R "U "D ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:12.883619" elapsed="0.000356"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:12.884255" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:12.884043" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:12.884025" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:57:12.884367" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<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-08-22T23:57:12.886825" elapsed="0.000151"/>
</kw>
<msg time="2026-08-22T23:57:12.887035" 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-08-22T23:57:12.885796" 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="NOT RUN" start="2026-08-22T23:57:12.887458" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:12.887814" 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-08-22T23:57:12.885163" elapsed="0.002830"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:57:12.884640" elapsed="0.003417"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:57:12.835329" elapsed="0.052825"/>
</kw>
<msg time="2026-08-22T23:57:12.888244" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:12.888287" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                           ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:12.834760" elapsed="0.053563"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:57:12.888503" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:57:12.888398" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:12.888380" 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-08-22T23:57:12.889004" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:12.889331" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:57:12.889401" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:57:12.834066" elapsed="0.055440"/>
</kw>
<msg time="2026-08-22T23:57:12.889623" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:12.889668" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                           ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:12.829377" elapsed="0.060332"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:12.890068" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:12.889819" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:12.889801" elapsed="0.000345"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:57:12.829241" elapsed="0.060929"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:57:12.895542" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:12.895434" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:12.895415" 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-08-22T23:57:12.896762" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:12.896653" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:12.896635" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:12.897261" level="INFO">${karaf_connection_index} = 96</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:57:12.896969" elapsed="0.000318"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:12.897678" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:57:12.897441" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:57:12.934078" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:57:12.898188" elapsed="0.036124"/>
</kw>
<msg time="2026-08-22T23:57:12.934554" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:57:12.934623" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:12.897860" elapsed="0.036803"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:57:12.948387" level="INFO">"t "x "t ". "C "R "U "D ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:57:12.935464" elapsed="0.013391"/>
</kw>
<msg time="2026-08-22T23:57:12.949019" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:57:12.949065" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                           ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:12.934950" elapsed="0.014151"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:12.949463" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:12.949203" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:12.949173" elapsed="0.000376"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:12.950030" level="INFO"> "t "x "t ". "C "R "U "D ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:12.949717" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:12.950372" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:12.950157" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:12.950138" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:57:12.950489" 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-08-22T23:57:12.953314" elapsed="0.000161"/>
</kw>
<msg time="2026-08-22T23:57:12.953538" 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-08-22T23:57:12.952094" 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-08-22T23:57:12.953974" elapsed="0.000081"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:12.954310" 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-08-22T23:57:12.951431" elapsed="0.003067"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:57:12.950847" 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-08-22T23:57:12.896329" elapsed="0.058517"/>
</kw>
<msg time="2026-08-22T23:57:12.955030" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:12.955076" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                           ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:12.895774" elapsed="0.059339"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:57:12.955300" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:57:12.955192" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:12.955173" 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-08-22T23:57:12.955838" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:12.956176" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:57:12.956249" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:57:12.895070" elapsed="0.061287"/>
</kw>
<msg time="2026-08-22T23:57:12.956456" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:12.956500" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "S "t "a "r "t "_ "T "e "s "t "t "o "o "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                           ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:12.890428" elapsed="0.066108"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:12.956931" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:12.956680" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:12.956662" elapsed="0.000347"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:57:12.890291" elapsed="0.066742"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:57:12.761138" elapsed="0.195930"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:57:12.758691" elapsed="0.198445"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:57:12.753685" elapsed="0.203515"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:12.753172" elapsed="0.204080"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:57:12.749865" elapsed="0.207448"/>
</kw>
<kw name="Install_And_Start_Testtool" owner="NetconfKeywords">
<kw name="Deploy_Test_Tool" owner="NexusKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:12.977850" level="INFO">${name_prefix} = netconf-testtool-</msg>
<var>${name_prefix}</var>
<arg>${artifact}-</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:12.977523" elapsed="0.000354"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:57:12.978375" level="INFO">${extension} = jar</msg>
<var>${extension}</var>
<arg>'${component}'=='odl-micro'</arg>
<arg>tar</arg>
<arg>jar</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:57:12.978040" elapsed="0.000361"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:57:12.978974" level="INFO">${name_suffix} = -executable.jar</msg>
<var>${name_suffix}</var>
<arg>"${suffix}" != ""</arg>
<arg>-${suffix}.${extension}</arg>
<arg>.${extension}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:57:12.978564" elapsed="0.000435"/>
</kw>
<kw name="Deploy_Artifact" owner="NexusKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_url}""" != ""</arg>
<arg>Deploy_From_Url</arg>
<arg>${explicit_url}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:57:12.980250" elapsed="0.000304"/>
</kw>
<kw name="Fetch From Left" owner="String">
<msg time="2026-08-22T23:57:12.980944" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot</msg>
<var>${urlbase}</var>
<arg>${BUNDLE_URL}</arg>
<arg>/org/opendaylight</arg>
<doc>Returns contents of the ``string`` before the first occurrence of ``marker``.</doc>
<status status="PASS" start="2026-08-22T23:57:12.980730" elapsed="0.000240"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:57:12.981508" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot</msg>
<var>${urlbase}</var>
<arg>'${urlbase}' != '${BUNDLE_URL}'</arg>
<arg>${urlbase}</arg>
<arg>${fallback_url}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:57:12.981126" elapsed="0.000409"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Magnesium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_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-08-22T23:57:13.000337" elapsed="0.000425"/>
</kw>
<arg>magnesium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to titanium and in case titanium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'carpeople'] {} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:57:12.999879" elapsed="0.000953"/>
</kw>
<msg time="2026-08-22T23:57:13.000917" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>magnesium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:57:12.991304" elapsed="0.009666"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>carpeople</arg>
<doc>Compare magnesium to titanium and in case titanium is at most magnesium,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:57:12.990904" elapsed="0.010145"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Aluminium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_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-08-22T23:57:13.019508" elapsed="0.000456"/>
</kw>
<arg>aluminium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to titanium and in case titanium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'netconf'] {} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:57:13.019053" elapsed="0.000981"/>
</kw>
<msg time="2026-08-22T23:57:13.020080" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>aluminium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:57:13.010494" elapsed="0.009634"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>netconf</arg>
<doc>Compare aluminium to titanium and in case titanium is at most aluminium,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:57:13.010105" elapsed="0.010099"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Silicon" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_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-08-22T23:57:13.039082" elapsed="0.000403"/>
</kw>
<arg>silicon</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to titanium and in case titanium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'bgpcep'] {} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:57:13.038625" elapsed="0.000930"/>
</kw>
<msg time="2026-08-22T23:57:13.039629" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>silicon</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:57:13.030007" elapsed="0.009675"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>bgpcep</arg>
<doc>Compare silicon to titanium and in case titanium is at most silicon,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-08-22T23:57:13.029616" elapsed="0.010142"/>
</kw>
<if>
<branch type="IF" condition="'${build_version}'=='${EMPTY}'">
<kw name="NexusKeywords__Detect_Version_To_Pull" owner="NexusKeywords">
<kw name="NexusKeywords__Get_Items_To_Look_At" owner="NexusKeywords">
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<arg>Component not supported by NexusKeywords version detection: ${component}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:57:13.042755" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:57:13.043509" elapsed="0.000224"/>
</kw>
<msg time="2026-08-22T23:57:13.043780" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Collections.Get_From_Dictionary</arg>
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:57:13.043169" elapsed="0.000659"/>
</kw>
<msg time="2026-08-22T23:57:13.043929" level="INFO">${itemlist} = netconf-api</msg>
<var>${itemlist}</var>
<arg>${component}</arg>
<doc>Get a list of items that might contain the version number that we are looking for.</doc>
<status status="PASS" start="2026-08-22T23:57:13.042420" elapsed="0.001533"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:13.044245" level="INFO">index=98
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-08-22T23:57:13.044345" level="INFO">${current_ssh_connection} = index=98
host=10.30.171.196
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-08-22T23:57:13.044114" elapsed="0.000258"/>
</kw>
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:13.049453" level="INFO">${odl_connection} = 99</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-08-22T23:57:13.049045" elapsed="0.000435"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.051564" level="INFO">Length is 0.</msg>
<msg time="2026-08-22T23:57:13.051697" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:57:13.051271" elapsed="0.000452"/>
</kw>
<kw name="Run Keyword And Return 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-08-22T23:57:13.051880" elapsed="0.000355"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-08-22T23:57:13.053506" level="INFO">Logging into '10.30.170.200:22' as 'jenkins'.</msg>
<msg time="2026-08-22T23:57:13.367597" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-186-generic x86_64)

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

 System information as of Sat Aug 22 23:57:09 UTC 2026

  System load:  0.0                Processes:             119
  Usage of /:   13.7% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.200
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Aug 22 23:57:12 2026 from 10.30.170.57
[?2004h[jenkins@releng-63244-201-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-08-22T23:57:13.052791" elapsed="0.315070"/>
</kw>
<msg time="2026-08-22T23:57:13.367939" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:57:13.052403" elapsed="0.315615"/>
</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-08-22T23:57:13.050460" elapsed="0.317664"/>
</kw>
<msg time="2026-08-22T23:57:13.368177" 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-08-22T23:57:13.050067" elapsed="0.318159"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-08-22T23:57:13.049686" elapsed="0.318618"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-08-22T23:57:13.368355" elapsed="0.000074"/>
</return>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-08-22T23:57:13.048703" elapsed="0.319862"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:57:13.369096" level="INFO">Executing command 'sh search.sh /tmp/netconf-karaf-9.0.4-SNAPSHOT/system netconf-api'.</msg>
<msg time="2026-08-22T23:57:13.401971" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:57:13.402220" level="INFO">${version} = 9.0.4-SNAPSHOT
org/opendaylight/netconf</msg>
<msg time="2026-08-22T23:57:13.402321" level="INFO">${result} = 0</msg>
<var>${version}</var>
<var>${result}</var>
<arg>sh search.sh ${WORKSPACE}/${BUNDLEFOLDER}/system ${itemlist}</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:57:13.368805" elapsed="0.033568"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-08-22T23:57:13.402796" elapsed="0.000509"/>
</kw>
<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-08-22T23:57:13.411014" elapsed="0.000320"/>
</kw>
<msg time="2026-08-22T23:57:13.411428" 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-08-22T23:57:13.409852" elapsed="0.001688"/>
</kw>
<kw name="Open 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-08-22T23:57:13.411926" elapsed="0.000049"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:13.412286" elapsed="0.000044"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:57:13.403953" elapsed="0.008559"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.413620" level="INFO">9.0.4-SNAPSHOT
org/opendaylight/netconf</msg>
<arg>${version}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:13.412914" elapsed="0.000753"/>
</kw>
<if>
<branch type="IF" condition="${result}!=0">
<kw name="Fail" owner="BuiltIn">
<arg>Component "${component}": searching for "${itemlist}" found no version, cannot locate test tool.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:13.413992" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:13.413756" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:13.413730" elapsed="0.000344"/>
</if>
<kw name="Split String" owner="String">
<msg time="2026-08-22T23:57:13.414460" level="INFO">${version} = 9.0.4-SNAPSHOT</msg>
<msg time="2026-08-22T23:57:13.414506" level="INFO">${location} = org/opendaylight/netconf</msg>
<var>${version}</var>
<var>${location}</var>
<arg>${version}</arg>
<arg>max_split=1</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-08-22T23:57:13.414221" elapsed="0.000308"/>
</kw>
<return>
<value>${version}</value>
<value>${location}</value>
<status status="PASS" start="2026-08-22T23:57:13.414594" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:57:13.414791" level="INFO">${version} = 9.0.4-SNAPSHOT</msg>
<msg time="2026-08-22T23:57:13.414835" level="INFO">${location} = org/opendaylight/netconf</msg>
<var>${version}</var>
<var>${location}</var>
<arg>${component}</arg>
<doc>Determine the exact Nexus directory to be used as a source for a particular test tool
Figure out what version of the tool needs to be pulled out of the
Nexus by looking at the version directory of the subsystem from
which the tool is being pulled. This code is REALLY UGLY but there
is no way around it until the bug
https://bugs.opendaylight.org/show_bug.cgi?id=5206 gets fixed.
I also don't want to depend on maven-metadata-local.xml and other
bits and pieces of ODL distribution which are not required for ODL
to function properly.</doc>
<status status="PASS" start="2026-08-22T23:57:13.042000" elapsed="0.372858"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:13.039830" elapsed="0.375070"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${version}</var>
<var>${location}</var>
<arg>${build_version}</arg>
<arg>${build_location}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:13.415077" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:13.414925" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:13.039811" elapsed="0.375350"/>
</if>
<if>
<branch type="IF" condition="'SNAPSHOT' in '${version}'">
<kw name="Remove Values From List" owner="Collections">
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>netconf</arg>
<arg>bgpcep</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:57:13.415435" elapsed="0.000221"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:13.415218" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:13.415202" elapsed="0.000520"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.416250" level="INFO">${is_staged} = "FALSE"</msg>
<var>${is_staged}</var>
<arg>"opendaylight.release" not in '${urlbase}' and "opendaylight.snapshot" not in '${urlbase}'</arg>
<arg>"TRUE"</arg>
<arg>"FALSE"</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:57:13.415875" elapsed="0.000402"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.416895" level="INFO">${is_mri_component} = "FALSE"</msg>
<var>${is_mri_component}</var>
<arg>'${component}' in ${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>"TRUE"</arg>
<arg>"FALSE"</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:57:13.416443" elapsed="0.000478"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.417531" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot</msg>
<var>${urlbase}</var>
<arg>${is_mri_component} == "TRUE" and ${is_staged} == "FALSE"</arg>
<arg>${NEXUS_RELEASE_BASE_URL}</arg>
<arg>${urlbase}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:57:13.417135" elapsed="0.000422"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.418101" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.4-SNAPSHOT</msg>
<var>${url}</var>
<arg>${urlbase}/${location}/${artifact}/${version}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:13.417734" elapsed="0.000394"/>
</kw>
<kw name="Execute_Command_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:57:13.420086" level="INFO">Executing command 'curl -L https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.4-SNAPSHOT/maven-metadata.xml'.</msg>
<msg time="2026-08-22T23:57:13.503846" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:57:13.504108" level="INFO">${stdout} = &lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;metadata modelVersion="1.1.0"&gt;
  &lt;groupId&gt;org.opendaylight.netconf&lt;/groupId&gt;
  &lt;artifactId&gt;netconf-testtool&lt;/artifactId&gt;
  &lt;versioning&gt;
    &lt;lastUpdated&gt;2026082...</msg>
<msg time="2026-08-22T23:57:13.504216" level="INFO">${stderr} =   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0   ...</msg>
<msg time="2026-08-22T23:57:13.504312" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:57:13.419907" elapsed="0.084457"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.506226" level="INFO">Length is 316.</msg>
<msg time="2026-08-22T23:57:13.506412" level="FAIL">'  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  2763  100  2763    0     0  43914      0 --:--:-- --:--:-- --:--:-- 44564' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-08-22T23:57:13.505633" elapsed="0.000929">'  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  2763  100  2763    0     0  43914      0 --:--:-- --:--:-- --:--:-- 44564' should be empty.</status>
</kw>
<msg time="2026-08-22T23:57:13.506834" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-08-22T23:57:13.506933" level="INFO">${result} = '  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0  ...</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:13.504838" elapsed="0.002148"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.508306" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:57:13.507351" elapsed="0.001014"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.511063" level="INFO">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;metadata modelVersion="1.1.0"&gt;
  &lt;groupId&gt;org.opendaylight.netconf&lt;/groupId&gt;
  &lt;artifactId&gt;netconf-testtool&lt;/artifactId&gt;
  &lt;versioning&gt;
    &lt;lastUpdated&gt;20260822052751&lt;/lastUpdated&gt;
    &lt;snapshot&gt;
      &lt;timestamp&gt;20260822.052751&lt;/timestamp&gt;
      &lt;buildNumber&gt;14&lt;/buildNumber&gt;
    &lt;/snapshot&gt;
    &lt;snapshotVersions&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;pom&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;javadoc&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;executable&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;stress-client&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;rest-perf-client&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;scale-util&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;stress-client&lt;/classifier&gt;
        &lt;extension&gt;tar.gz&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;cyclonedx&lt;/classifier&gt;
        &lt;extension&gt;xml&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;cyclonedx&lt;/classifier&gt;
        &lt;extension&gt;json&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;sources&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
    &lt;/snapshotVersions&gt;
  &lt;/versioning&gt;
  &lt;version&gt;9.0.4-SNAPSHOT&lt;/version&gt;
&lt;/metadata&gt;</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:13.510440" elapsed="0.000900"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.512250" level="INFO">  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  2763  100  2763    0     0  43914      0 --:--:-- --:--:-- --:--:-- 44564</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:13.511711" elapsed="0.000641"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.513290" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:13.512755" elapsed="0.000631"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:57:13.509352" elapsed="0.004158"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:13.508537" elapsed="0.005094"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:13.508493" elapsed="0.005207"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:57:13.513939" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:13.513833" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:13.513804" elapsed="0.000201"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:57:13.514143" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:57:13.514055" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:13.514041" elapsed="0.000185"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:13.514366" elapsed="0.000021"/>
</kw>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:57:13.419294" elapsed="0.095191"/>
</kw>
<msg time="2026-08-22T23:57:13.514559" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:57:13.418739" elapsed="0.095884"/>
</kw>
<msg time="2026-08-22T23:57:13.514784" level="INFO">${metadata} = &lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;metadata modelVersion="1.1.0"&gt;
  &lt;groupId&gt;org.opendaylight.netconf&lt;/groupId&gt;
  &lt;artifactId&gt;netconf-testtool&lt;/artifactId&gt;
  &lt;versioning&gt;
    &lt;lastUpdated&gt;2026082...</msg>
<var>${metadata}</var>
<arg>curl -L ${url}/maven-metadata.xml</arg>
<doc>A wrapper for Execute_Command_Passes with return_success_only=False
Also, log_on_success defaults to True (but is customizable, unlike return_success_only)..</doc>
<status status="PASS" start="2026-08-22T23:57:13.418329" elapsed="0.096485"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:57:13.517353" level="INFO">Executing command 'echo "&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;metadata modelVersion="1.1.0"&gt;
  &lt;groupId&gt;org.opendaylight.netconf&lt;/groupId&gt;
  &lt;artifactId&gt;netconf-testtool&lt;/artifactId&gt;
  &lt;versioning&gt;
    &lt;lastUpdated&gt;20260822052751&lt;/lastUpdated&gt;
    &lt;snapshot&gt;
      &lt;timestamp&gt;20260822.052751&lt;/timestamp&gt;
      &lt;buildNumber&gt;14&lt;/buildNumber&gt;
    &lt;/snapshot&gt;
    &lt;snapshotVersions&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;pom&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;javadoc&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;executable&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;stress-client&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;rest-perf-client&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;scale-util&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;stress-client&lt;/classifier&gt;
        &lt;extension&gt;tar.gz&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;cyclonedx&lt;/classifier&gt;
        &lt;extension&gt;xml&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;cyclonedx&lt;/classifier&gt;
        &lt;extension&gt;json&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;classifier&gt;sources&lt;/classifier&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.4-20260822.052751-14&lt;/value&gt;
        &lt;updated&gt;20260822052751&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
    &lt;/snapshotVersions&gt;
  &lt;/versioning&gt;
  &lt;version&gt;9.0.4-SNAPSHOT&lt;/version&gt;
&lt;/metadata&gt;" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1'.</msg>
<msg time="2026-08-22T23:57:13.555560" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:57:13.555842" level="INFO">${stdout} = 9.0.4-20260822.052751-14</msg>
<msg time="2026-08-22T23:57:13.556009" level="INFO">${stderr} = </msg>
<msg time="2026-08-22T23:57:13.556106" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:57:13.517171" elapsed="0.038986"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.558024" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-08-22T23:57:13.557368" elapsed="0.000756"/>
</kw>
<msg time="2026-08-22T23:57:13.558333" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-08-22T23:57:13.558432" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:13.556548" elapsed="0.001933"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.559860" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:57:13.558912" elapsed="0.001006"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.562112" level="INFO">9.0.4-20260822.052751-14</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:13.561772" elapsed="0.000401"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.562727" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:13.562376" elapsed="0.000407"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.563307" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:13.562982" elapsed="0.000384"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-08-22T23:57:13.560902" elapsed="0.002540"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:13.560089" elapsed="0.003405"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:13.560046" elapsed="0.003483"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-08-22T23:57:13.563768" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:13.563629" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:13.563604" elapsed="0.000255"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-08-22T23:57:13.564052" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:57:13.563932" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:13.563910" elapsed="0.000255"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:13.564359" elapsed="0.000030"/>
</kw>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-08-22T23:57:13.516559" elapsed="0.047964"/>
</kw>
<msg time="2026-08-22T23:57:13.564617" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:57:13.516043" elapsed="0.048653"/>
</kw>
<arg>echo "${metadata}" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1</arg>
<arg>stderr_must_be_empty=${True}</arg>
<doc>A wrapper for Execute_Command_Passes with return_success_only=False
Also, log_on_success defaults to True (but is customizable, unlike return_success_only)..</doc>
<status status="PASS" start="2026-08-22T23:57:13.515564" elapsed="0.049290"/>
</kw>
<msg time="2026-08-22T23:57:13.564997" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:13.565057" level="INFO">${namepart} = 9.0.4-20260822.052751-14</msg>
<var>${status}</var>
<var>${namepart}</var>
<arg>SSHKeywords.Execute_Command_Should_Pass</arg>
<arg>echo "${metadata}" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1</arg>
<arg>stderr_must_be_empty=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:13.514971" elapsed="0.050117"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.565707" level="INFO">Length is 24.</msg>
<msg time="2026-08-22T23:57:13.565838" level="INFO">${length} = 24</msg>
<var>${length}</var>
<arg>${namepart}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-08-22T23:57:13.565306" elapsed="0.000572"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.566668" level="INFO">${namepart} = 9.0.4-20260822.052751-14</msg>
<var>${namepart}</var>
<arg>"${status}" != "PASS" or ${length} == 0</arg>
<arg>${version}</arg>
<arg>${namepart}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:57:13.566102" elapsed="0.000603"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.567394" level="INFO">${filename} = netconf-testtool-9.0.4-20260822.052751-14-executable.jar</msg>
<var>${filename}</var>
<arg>${name_prefix}${namepart}${name_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:13.566923" elapsed="0.000506"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.567991" level="INFO">netconf-testtool-9.0.4-20260822.052751-14-executable.jar</msg>
<arg>${filename}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:13.567659" elapsed="0.000392"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.568705" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.4-SNAPSHOT/netconf-testtool-9.0.4-20260822.052751-14-executable.jar</msg>
<var>${url}</var>
<arg>${url}/${filename}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:13.568252" elapsed="0.000490"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:57:13.569222" level="INFO">Executing command 'wget -q -N 'https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.4-SNAPSHOT/netconf-testtool-9.0.4-20260822.052751-14-executable.jar' 2&gt;&amp;1'.</msg>
<msg time="2026-08-22T23:57:13.637798" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:57:13.638039" level="INFO">${response} = </msg>
<msg time="2026-08-22T23:57:13.638136" level="INFO">${result} = 0</msg>
<var>${response}</var>
<var>${result}</var>
<arg>wget -q -N '${url}' 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:57:13.568990" elapsed="0.069197"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.639157" level="INFO"/>
<arg>${response}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:13.638557" elapsed="0.000691"/>
</kw>
<if>
<branch type="IF" condition="${result} == 0">
<return>
<value>${filename}</value>
<status status="PASS" start="2026-08-22T23:57:13.639678" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-08-22T23:57:13.639400" elapsed="0.000414"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:13.639358" elapsed="0.000509"/>
</if>
<kw name="Replace String Using Regexp" owner="String">
<var>${release_url}</var>
<arg>${url}</arg>
<arg>autorelease-[0-9]{4}</arg>
<arg>opendaylight.release</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:13.640192" elapsed="0.000049"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${response}</var>
<var>${result}</var>
<arg>wget -q -N '${release_url}' 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:13.640617" elapsed="0.000049"/>
</kw>
<if>
<branch type="IF" condition="${result} != 0">
<kw name="Fail" owner="BuiltIn">
<arg>Artifact "${artifact}" in component "${component}" could not be downloaded from ${release_url} nor ${url}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:13.641159" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:13.640829" elapsed="0.000447"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:13.640791" elapsed="0.000538"/>
</if>
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-08-22T23:57:13.641401" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:57:13.641740" level="INFO">${filename} = netconf-testtool-9.0.4-20260822.052751-14-executable.jar</msg>
<var>${filename}</var>
<arg>${component}</arg>
<arg>${artifact}</arg>
<arg>${name_prefix}</arg>
<arg>${name_suffix}</arg>
<arg>${fallback_url}</arg>
<arg>${explicit_url}</arg>
<arg>${build_version}</arg>
<arg>${build_location}</arg>
<doc>Deploy the specified artifact from Nexus to the cwd of the machine to which the active SSHLibrary connection points.
netconf is a name part of an artifact present in system/ of ODl installation with the same version as netconf-testtool should have.
Must have https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-karaf/9.0.4-SNAPSHOT/netconf-karaf-9.0.4-20260822.052751-14.zip variable set to the URL from which the
tested ODL distribution was downloaded and this place must be
inside a repository created by a standard distribution
construction job. If this is detected to ne be the case, fallback URL is used.
If  is non-empty, Deploy_From_Utrl is called instead.
TODO: Allow deploying to a specific directory, we have SSHKeywords.Execute_Command_At_Cwd_Should_Pass now.</doc>
<status status="PASS" start="2026-08-22T23:57:12.979611" elapsed="0.662186"/>
</kw>
<return>
<value>${filename}</value>
<status status="PASS" start="2026-08-22T23:57:13.641945" elapsed="0.000058"/>
</return>
<msg time="2026-08-22T23:57:13.642276" level="INFO">${filename} = netconf-testtool-9.0.4-20260822.052751-14-executable.jar</msg>
<var>${filename}</var>
<arg>netconf</arg>
<arg>netconf-testtool</arg>
<doc>Deploy a test tool.
The test tools have naming convention of the form
"&lt;repository_url&gt;/some/dir/somewhere/&lt;tool-name&gt;/&lt;tool-name&gt;-&lt;version-tag&gt;-${suffix}.jar"
where "&lt;tool-name&gt;" is the name of the tool and "&lt;version-tag&gt;" is
the version tag that is digged out of the maven metadata. This
keyword calculates ${name_prefix} and ${name_suffix} for
"Deploy_Artifact" and then calls "Deploy_Artifact" to do the real
work of deploying the artifact.</doc>
<status status="PASS" start="2026-08-22T23:57:12.971773" elapsed="0.670558"/>
</kw>
<kw name="Start_Testtool" owner="NetconfKeywords">
<kw name="NetconfKeywords__Deploy_Additional_Schemas" owner="NetconfKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:57:13.645794" level="INFO">Executing command 'rm -rf schemas 2&gt;&amp;1'.</msg>
<msg time="2026-08-22T23:57:13.691385" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:57:13.691650" level="INFO">${response} = </msg>
<var>${response}</var>
<arg>rm -rf schemas 2&gt;&amp;1</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:57:13.645616" elapsed="0.046093"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.692676" level="INFO"/>
<arg>${response}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:13.692073" elapsed="0.000697"/>
</kw>
<if>
<branch type="IF" condition="'${schemas}' == 'none'">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-08-22T23:57:13.693203" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:13.692923" elapsed="0.000381"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:13.692881" elapsed="0.000471"/>
</if>
<kw name="Put Directory" owner="SSHLibrary">
<msg time="2026-08-22T23:57:13.740790" level="INFO">[chan 5] Opened sftp connection (server version 3)</msg>
<msg time="2026-08-22T23:57:13.827324" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/yang-ext@2013-07-09.yang' -&gt; '/home/jenkins/./schemas/yang-ext@2013-07-09.yang'</msg>
<msg time="2026-08-22T23:57:13.827386" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/example-action@2016-07-07.yang' -&gt; '/home/jenkins/./schemas/example-action@2016-07-07.yang'</msg>
<msg time="2026-08-22T23:57:13.827424" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/car@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/car@2014-08-18.yang'</msg>
<msg time="2026-08-22T23:57:13.827459" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/car-purchase@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/car-purchase@2014-08-18.yang'</msg>
<msg time="2026-08-22T23:57:13.827495" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/ncmount-l2fib@2016-03-07.yang' -&gt; '/home/jenkins/./schemas/ncmount-l2fib@2016-03-07.yang'</msg>
<msg time="2026-08-22T23:57:13.827529" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/augment-main-a@2014-01-21.yang' -&gt; '/home/jenkins/./schemas/augment-main-a@2014-01-21.yang'</msg>
<msg time="2026-08-22T23:57:13.827564" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/ietf-netconf-monitoring@2010-10-04.yang' -&gt; '/home/jenkins/./schemas/ietf-netconf-monitoring@2010-10-04.yang'</msg>
<msg time="2026-08-22T23:57:13.827621" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/ietf-netconf-monitoring-extension@2013-12-10.yang' -&gt; '/home/jenkins/./schemas/ietf-netconf-monitoring-extension@2013-12-10.yang'</msg>
<msg time="2026-08-22T23:57:13.827722" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/people@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/people@2014-08-18.yang'</msg>
<msg time="2026-08-22T23:57:13.827761" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/test@2014-10-18.yang' -&gt; '/home/jenkins/./schemas/test@2014-10-18.yang'</msg>
<msg time="2026-08-22T23:57:13.827796" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/car-people@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/car-people@2014-08-18.yang'</msg>
<msg time="2026-08-22T23:57:13.827830" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/ietf-inet-types@2010-09-24.yang' -&gt; '/home/jenkins/./schemas/ietf-inet-types@2010-09-24.yang'</msg>
<msg time="2026-08-22T23:57:13.827864" level="INFO">'/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas/main@2014-01-21.yang' -&gt; '/home/jenkins/./schemas/main@2014-01-21.yang'</msg>
<arg>${schemas}</arg>
<arg>destination=./schemas</arg>
<doc>Uploads a directory, including its content, from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-08-22T23:57:13.693706" elapsed="0.134222"/>
</kw>
<kw name="List Directory" owner="SSHLibrary">
<msg time="2026-08-22T23:57:13.831352" level="INFO">13 items:
augment-main-a@2014-01-21.yang
car-people@2014-08-18.yang
car-purchase@2014-08-18.yang
car@2014-08-18.yang
example-action@2016-07-07.yang
ietf-inet-types@2010-09-24.yang
ietf-netconf-monitoring-extension@2013-12-10.yang
ietf-netconf-monitoring@2010-10-04.yang
main@2014-01-21.yang
ncmount-l2fib@2016-03-07.yang
people@2014-08-18.yang
test@2014-10-18.yang
yang-ext@2013-07-09.yang</msg>
<arg>./schemas</arg>
<doc>Returns and logs items in the remote ``path``, optionally filtered with ``pattern``.</doc>
<status status="PASS" start="2026-08-22T23:57:13.828158" elapsed="0.003273"/>
</kw>
<return>
<value>--schemas-dir ./schemas</value>
<status status="PASS" start="2026-08-22T23:57:13.831496" elapsed="0.000048"/>
</return>
<msg time="2026-08-22T23:57:13.831725" level="INFO">${schemas_option} = --schemas-dir ./schemas</msg>
<var>${schemas_option}</var>
<arg>${schemas}</arg>
<doc>Internal keyword for Install_And_Start_TestTool
This deploys the additional schemas if any and returns a
command line argument to be added to the testtool commandline
to tell it to load them. While this code could be integrated
into its only user, I considered the resulting code to be too
unreadable as the actions are quite different in the two
possibilities (additional schemas present versus no additional
schemas present), therefore a separate keyword is used.</doc>
<status status="PASS" start="2026-08-22T23:57:13.644820" elapsed="0.186941"/>
</kw>
<kw name="NetconfKeywords__Deploy_Custom_RPC" owner="NetconfKeywords">
<if>
<branch type="IF" condition="'${rpc_config}' == 'none'">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-08-22T23:57:13.832784" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:57:13.832628" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:13.832600" elapsed="0.000302"/>
</if>
<kw name="Copy_File_To_Tools_System" owner="SSHKeywords">
<arg>${TOOLS_SYSTEM_1_IP}</arg>
<arg>${rpc_config}</arg>
<arg>/tmp</arg>
<doc>Wrapper keyword to make it easier to copy a file to an Tools specific system</doc>
<status status="NOT RUN" start="2026-08-22T23:57:13.833166" elapsed="0.000034"/>
</kw>
<return>
<value>--rpc-config /tmp/customaction.xml</value>
<status status="NOT RUN" start="2026-08-22T23:57:13.833267" elapsed="0.000022"/>
</return>
<msg time="2026-08-22T23:57:13.836073" level="INFO">${rpc_config_option} = </msg>
<var>${rpc_config_option}</var>
<arg>${rpc_config}</arg>
<doc>Internal keyword for Install_And_Start_TestTool
This deploys the optional custom rpc file.
Drop out of the keyword, returning no command line argument when there
is no rpc file to deploy.</doc>
<status status="PASS" start="2026-08-22T23:57:13.832248" elapsed="0.003862"/>
</kw>
<kw name="Compose_Full_Java_Command" owner="NexusKeywords">
<kw name="Compose_Base_Java_Command" owner="NexusKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${openjdk}""" == "openjdk8"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_8_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_8_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:57:13.838088" elapsed="0.000346"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${openjdk}""" == "openjdk11"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_11_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_11_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:57:13.838616" elapsed="0.000307"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${openjdk}""" == "openjdk17"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_17_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_17_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:57:13.839085" elapsed="0.000300"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Compose_Dilemma_Filepath" owner="NexusKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:57:13.840624" level="INFO">Executing command 'ls -lA /usr/lib/jvm/java-21-openjdk-amd64/bin/java 2&gt;&amp;1'.</msg>
<msg time="2026-08-22T23:57:13.852615" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:57:13.852762" level="INFO">${out} = -rwxr-xr-x 1 root root 14456 Apr 26 09:33 /usr/lib/jvm/java-21-openjdk-amd64/bin/java</msg>
<msg time="2026-08-22T23:57:13.852822" level="INFO">${rc} = 0</msg>
<var>${out}</var>
<var>${rc}</var>
<arg>ls -lA ${specific_path} 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:57:13.840433" elapsed="0.012421"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${specific_path}</value>
<status status="PASS" start="2026-08-22T23:57:13.853111" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:57:13.852963" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:13.852937" elapsed="0.000289"/>
</if>
<return>
<value>${default_path}</value>
<status status="NOT RUN" start="2026-08-22T23:57:13.853273" elapsed="0.000020"/>
</return>
<arg>${JAVA_21_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_21_HOME_UBUNTU}/bin/java</arg>
<doc>Query active SSH connection, return specific path if it exists else default path.</doc>
<status status="PASS" start="2026-08-22T23:57:13.840048" elapsed="0.013408"/>
</kw>
<msg time="2026-08-22T23:57:13.853529" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>"""${openjdk}""" == "openjdk21"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_21_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_21_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:57:13.839545" elapsed="0.014073"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${out}</var>
<var>${rc}</var>
<arg>java -version 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:13.853858" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>java</value>
<status status="NOT RUN" start="2026-08-22T23:57:13.854106" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:13.854025" elapsed="0.000265"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:13.853988" elapsed="0.000355"/>
</if>
<kw name="Execute Command" owner="SSHLibrary">
<var>${java}</var>
<arg>echo $JAVA_HOME/bin/java 2&gt;&amp;1</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:13.854699" elapsed="0.000050"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${out}</var>
<var>${rc}</var>
<arg>${java} -version 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:13.855084" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${java}</value>
<status status="NOT RUN" start="2026-08-22T23:57:13.855370" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:13.855290" elapsed="0.000168"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:13.855254" elapsed="0.000250"/>
</if>
<kw name="Get Environment Variable" owner="OperatingSystem">
<var>${JAVA_HOME}</var>
<arg>JAVA_HOME</arg>
<arg>${EMPTY}</arg>
<doc>Returns the value of an environment variable with the given name.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:13.855841" elapsed="0.000049"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${java}</var>
<arg>"""${JAVA_HOME}"""!=""</arg>
<arg>${JAVA_HOME}/bin/java</arg>
<arg>false</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:13.856235" elapsed="0.000045"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${out}</var>
<var>${rc}</var>
<arg>${java} -version 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:13.856651" elapsed="0.000047"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${java}</value>
<status status="NOT RUN" start="2026-08-22T23:57:13.856936" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:13.856856" elapsed="0.000167"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:13.856820" elapsed="0.000249"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unable to find Java; specify \${JDKVERSION}, put it to your PATH or set JAVA_HOME environment variable.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:13.857366" elapsed="0.000046"/>
</kw>
<msg time="2026-08-22T23:57:13.857689" level="INFO">${base_command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java</msg>
<var>${base_command}</var>
<arg>openjdk=${openjdk}</arg>
<doc>Return string suitable for launching Java programs over SSHLibrary, depending on JRE version needed.
This requires that the SSH connection on which the command is going to be used is active as it is needed for querying files.
Commands composed for one SSH connection shall not be reused on other SSH connections as the two connections may have different Java setups.
Not directly related to Nexus, but versioned Java tools may need this.</doc>
<status status="PASS" start="2026-08-22T23:57:13.837531" elapsed="0.020221"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.858853" level="INFO">${full_command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.4-20260822.052751-14-executable.jar  --device-count 1 --debug true --schemas-dir ./...</msg>
<var>${full_command}</var>
<arg>${base_command} ${options}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:13.858087" elapsed="0.000828"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.859830" level="INFO">/usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.4-20260822.052751-14-executable.jar  --device-count 1 --debug true --schemas-dir ./schemas  --md-sal true</msg>
<arg>${full_command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:13.859252" elapsed="0.000680"/>
</kw>
<return>
<value>${full_command}</value>
<status status="PASS" start="2026-08-22T23:57:13.860025" elapsed="0.000061"/>
</return>
<msg time="2026-08-22T23:57:13.860360" level="INFO">${command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.4-20260822.052751-14-executable.jar  --device-count 1 --debug true --schemas-dir ./...</msg>
<var>${command}</var>
<arg>${java_options} -jar ${filename} ${tool_options} --device-count ${device-count} --debug ${debug} ${schemas_option} ${rpc_config_option} --md-sal ${mdsal}</arg>
<doc>Return full Bash command to run Java with given options.
This requires that the SSH connection on which the command is going to be used is active as it is needed for querying files.
The options may include JVM options, application command line arguments, Bash redirects and other constructs.</doc>
<status status="PASS" start="2026-08-22T23:57:13.836428" elapsed="0.023991"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.861342" level="INFO">Running testtool: /usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.4-20260822.052751-14-executable.jar  --device-count 1 --debug true --schemas-dir ./schemas  --md-sal true</msg>
<arg>Running testtool: ${command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:13.860790" elapsed="0.000699"/>
</kw>
<kw name="Get Log File Name" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.864654" level="INFO">${name} = netconf-clustering-txt-CRUD</msg>
<var>${name}</var>
<arg>"""${SUITE_NAME}""".replace(" ","-").replace("/","-").replace(".","-")</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:13.864277" elapsed="0.000405"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.866996" level="INFO">${suffix} = </msg>
<var>${suffix}</var>
<arg>'${testcase}' != ''</arg>
<arg>--${testcase}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:57:13.864849" elapsed="0.002174"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-08-22T23:57:13.867362" level="INFO">${date} = 2026-08-22 23:57:13.867</msg>
<var>${date}</var>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-08-22T23:57:13.867186" elapsed="0.000202"/>
</kw>
<kw name="Convert Date" owner="DateTime">
<msg time="2026-08-22T23:57:13.867872" level="INFO">${timestamp} = 1787443033.867</msg>
<var>${timestamp}</var>
<arg>${date}</arg>
<arg>epoch</arg>
<doc>Converts between supported `date formats`.</doc>
<status status="PASS" start="2026-08-22T23:57:13.867534" elapsed="0.000365"/>
</kw>
<return>
<value>${testtool}--${name}${suffix}.${timestamp}.log</value>
<status status="PASS" start="2026-08-22T23:57:13.867947" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:57:13.868181" level="INFO">${logfile} = testtool--netconf-clustering-txt-CRUD.1787443033.867.log</msg>
<var>${logfile}</var>
<arg>testtool</arg>
<doc>Get the name of the suite sanitized to be usable as a part of filename.
These names are used to constructs names of the log files produced
by the testing tools so two suites using a tool wont overwrite the
log files if they happen to run in one job.</doc>
<status status="PASS" start="2026-08-22T23:57:13.861970" elapsed="0.006236"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.872822" level="INFO">${testtool_log} = testtool--netconf-clustering-txt-CRUD.1787443033.867.log</msg>
<arg>${testtool_log}</arg>
<arg>${logfile}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:57:13.868368" elapsed="0.004547"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:57:13.894399" level="INFO">/usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.4-20260822.052751-14-executable.jar  --device-count 1 --debug true --schemas-dir ./schemas  --md-sal true &gt;testtool--netconf-clustering-txt-CRUD.1787443033.867.log 2&gt;&amp;1</msg>
<arg>${command} &gt;${logfile} 2&gt;&amp;1</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:57:13.873072" elapsed="0.021398"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.898522" level="INFO">${NetconfKeywords__testtool_device_count} = 1</msg>
<arg>${NetconfKeywords__testtool_device_count}</arg>
<arg>${device-count}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:57:13.894661" elapsed="0.003917"/>
</kw>
<kw name="Perform_Operation_On_Each_Device" owner="NetconfKeywords">
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-08-22T23:57:13.899421" level="INFO">${current_Date} = 2026-08-22 23:57:13.899</msg>
<var>${current_Date}</var>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-08-22T23:57:13.899259" elapsed="0.000188"/>
</kw>
<kw name="Add Time To Date" owner="DateTime">
<msg time="2026-08-22T23:57:13.899954" level="INFO">${deadline_Date} = 2026-08-23 00:42:13.899</msg>
<var>${deadline_Date}</var>
<arg>${current_Date}</arg>
<arg>${timeout}</arg>
<doc>Adds time to date and returns the resulting date.</doc>
<status status="PASS" start="2026-08-22T23:57:13.899609" elapsed="0.000371"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.904516" level="INFO">${current_port} = 17830</msg>
<arg>${current_port}</arg>
<arg>${BASE_NETCONF_DEVICE_PORT}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:57:13.900138" elapsed="0.004425"/>
</kw>
<kw name="Repeat Keyword" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.905056" level="INFO">Repeating keyword, round 1/1.</msg>
<kw name="NetconfKeywords__Perform_Operation_With_Checking_On_Next_Device" owner="NetconfKeywords">
<kw name="NetconfKeywords__Check_Netconf_Test_Timeout_Not_Expired" owner="NetconfKeywords">
<if>
<branch type="IF" condition="not ${ENABLE_NETCONF_TEST_TIMEOUT}">
<return>
<status status="NOT RUN" start="2026-08-22T23:57:13.906205" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:13.906086" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:13.906066" elapsed="0.000206"/>
</if>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-08-22T23:57:13.906571" level="INFO">${current_Date} = 2026-08-22 23:57:13.906</msg>
<var>${current_Date}</var>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-08-22T23:57:13.906420" elapsed="0.000193"/>
</kw>
<kw name="Subtract Date From Date" owner="DateTime">
<msg time="2026-08-22T23:57:13.907069" level="INFO">${ellapsed_seconds} = 2699.993</msg>
<var>${ellapsed_seconds}</var>
<arg>${deadline_Date}</arg>
<arg>${current_Date}</arg>
<doc>Subtracts date from another date and returns time between.</doc>
<status status="PASS" start="2026-08-22T23:57:13.906761" elapsed="0.000334"/>
</kw>
<if>
<branch type="IF" condition="${ellapsed_seconds}&lt;0">
<kw name="Fail" owner="BuiltIn">
<arg>The global time out period expired</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:13.907413" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:13.907165" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:13.907147" elapsed="0.000343"/>
</if>
<arg>${deadline_Date}</arg>
<status status="PASS" start="2026-08-22T23:57:13.905843" elapsed="0.001694"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.908059" level="INFO">${number} = 1</msg>
<var>${number}</var>
<arg>${current_port}-${BASE_NETCONF_DEVICE_PORT}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:13.907696" elapsed="0.000389"/>
</kw>
<kw name="Run Keyword" owner="BuiltIn">
<kw name="NetconfKeywords__Wait_Device_Is_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.909489" level="INFO">${number} = 1</msg>
<var>${number}</var>
<arg>'${device_name}'.split('-').pop()</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:13.909152" elapsed="0.000363"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.911138" level="INFO">${device-port} = 17830</msg>
<var>${device-port}</var>
<arg>${FIRST_TESTTOOL_PORT}+${device-number}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:13.910559" elapsed="0.000608"/>
</kw>
<kw name="NetconfKeywords__Check_Device_Is_Up" owner="NetconfKeywords">
<kw name="Count_Port_Occurences" owner="SSHKeywords">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_And_Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:57:13.916145" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-08-22T23:57:13.928645" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:57:13.928877" level="INFO">${netstat_installed} = net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET...</msg>
<var>${netstat_installed}</var>
<arg>netstat --version</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:57:13.916046" elapsed="0.012891"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<doc>Install netstat if it is not already installed.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:13.929878" elapsed="0.000057"/>
</kw>
<msg time="2026-08-22T23:57:13.930014" level="FAIL">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</msg>
<status status="FAIL" start="2026-08-22T23:57:13.929104" elapsed="0.001097">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</branch>
<status status="FAIL" start="2026-08-22T23:57:13.929060" elapsed="0.001236">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="FAIL" start="2026-08-22T23:57:13.915769" elapsed="0.014839">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</kw>
<arg>Check_And_Install_Netstat</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:13.915182" elapsed="0.015704"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:57:13.934081" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-08-22T23:57:13.988432" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:57:13.988875" level="INFO">${output} = 0</msg>
<var>${output}</var>
<arg>${NETSTAT_COMMAND} 2&gt; /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:57:13.933206" elapsed="0.055766"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:57:13.989112" elapsed="0.000119"/>
</return>
<msg time="2026-08-22T23:57:13.989873" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${last-port}</arg>
<arg>LISTEN</arg>
<arg>java</arg>
<doc>Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.</doc>
<status status="PASS" start="2026-08-22T23:57:13.911826" elapsed="0.078222"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-08-22T23:57:13.992313" level="FAIL">0 != 1</msg>
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-08-22T23:57:13.990905" elapsed="0.001657">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-08-22T23:57:13.911345" elapsed="0.081819">0 != 1</status>
</kw>
<arg>${number}</arg>
<doc>Query netstat on remote machine whether testtool device with the specified number has its port open and fail if not.</doc>
<status status="FAIL" start="2026-08-22T23:57:13.910242" elapsed="0.083135">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:14.996927" level="INFO">${device-port} = 17830</msg>
<var>${device-port}</var>
<arg>${FIRST_TESTTOOL_PORT}+${device-number}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:14.995344" elapsed="0.001658"/>
</kw>
<kw name="NetconfKeywords__Check_Device_Is_Up" owner="NetconfKeywords">
<kw name="Count_Port_Occurences" owner="SSHKeywords">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_And_Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:57:15.004125" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-08-22T23:57:15.017186" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:57:15.017407" level="INFO">${netstat_installed} = net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET...</msg>
<var>${netstat_installed}</var>
<arg>netstat --version</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:57:15.003879" elapsed="0.013587"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<doc>Install netstat if it is not already installed.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:15.018428" elapsed="0.000056"/>
</kw>
<msg time="2026-08-22T23:57:15.018562" level="FAIL">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</msg>
<status status="FAIL" start="2026-08-22T23:57:15.017691" elapsed="0.001133">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</branch>
<status status="FAIL" start="2026-08-22T23:57:15.017635" elapsed="0.001295">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="FAIL" start="2026-08-22T23:57:15.003172" elapsed="0.016051">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</kw>
<arg>Check_And_Install_Netstat</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:15.001855" elapsed="0.017646"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:57:15.022002" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-08-22T23:57:15.071022" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:57:15.071428" level="INFO">${output} = 0</msg>
<var>${output}</var>
<arg>${NETSTAT_COMMAND} 2&gt; /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:57:15.021484" elapsed="0.050043"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:57:15.071724" elapsed="0.000136"/>
</return>
<msg time="2026-08-22T23:57:15.072450" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${last-port}</arg>
<arg>LISTEN</arg>
<arg>java</arg>
<doc>Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.</doc>
<status status="PASS" start="2026-08-22T23:57:14.998478" elapsed="0.074191"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-08-22T23:57:15.074972" level="FAIL">0 != 1</msg>
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-08-22T23:57:15.073480" elapsed="0.001751">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-08-22T23:57:14.997423" elapsed="0.078913">0 != 1</status>
</kw>
<arg>${number}</arg>
<doc>Query netstat on remote machine whether testtool device with the specified number has its port open and fail if not.</doc>
<status status="FAIL" start="2026-08-22T23:57:14.994279" elapsed="0.082287">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:16.079802" level="INFO">${device-port} = 17830</msg>
<var>${device-port}</var>
<arg>${FIRST_TESTTOOL_PORT}+${device-number}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:16.078362" elapsed="0.001510"/>
</kw>
<kw name="NetconfKeywords__Check_Device_Is_Up" owner="NetconfKeywords">
<kw name="Count_Port_Occurences" owner="SSHKeywords">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_And_Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:57:16.085434" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-08-22T23:57:16.098481" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:57:16.098646" level="INFO">${netstat_installed} = net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET...</msg>
<var>${netstat_installed}</var>
<arg>netstat --version</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:57:16.085280" elapsed="0.013408"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<doc>Install netstat if it is not already installed.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:16.099632" elapsed="0.000060"/>
</kw>
<msg time="2026-08-22T23:57:16.099770" level="FAIL">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</msg>
<status status="FAIL" start="2026-08-22T23:57:16.098855" elapsed="0.001123">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</branch>
<status status="FAIL" start="2026-08-22T23:57:16.098795" elapsed="0.001287">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="FAIL" start="2026-08-22T23:57:16.084887" elapsed="0.015483">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</kw>
<arg>Check_And_Install_Netstat</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:16.084045" elapsed="0.016643"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:57:16.103637" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-08-22T23:57:16.146979" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:57:16.147388" level="INFO">${output} = 0</msg>
<var>${output}</var>
<arg>${NETSTAT_COMMAND} 2&gt; /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:57:16.102835" elapsed="0.044651"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:57:16.147680" elapsed="0.000132"/>
</return>
<msg time="2026-08-22T23:57:16.148379" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${last-port}</arg>
<arg>LISTEN</arg>
<arg>java</arg>
<doc>Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.</doc>
<status status="PASS" start="2026-08-22T23:57:16.081345" elapsed="0.067209"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-08-22T23:57:16.150939" level="FAIL">0 != 1</msg>
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-08-22T23:57:16.149418" elapsed="0.001686">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-08-22T23:57:16.080292" elapsed="0.071166">0 != 1</status>
</kw>
<arg>${number}</arg>
<doc>Query netstat on remote machine whether testtool device with the specified number has its port open and fail if not.</doc>
<status status="FAIL" start="2026-08-22T23:57:16.077391" elapsed="0.074234">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:17.154958" level="INFO">${device-port} = 17830</msg>
<var>${device-port}</var>
<arg>${FIRST_TESTTOOL_PORT}+${device-number}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:17.153468" elapsed="0.001563"/>
</kw>
<kw name="NetconfKeywords__Check_Device_Is_Up" owner="NetconfKeywords">
<kw name="Count_Port_Occurences" owner="SSHKeywords">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_And_Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:57:17.163061" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-08-22T23:57:17.186170" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:57:17.186399" level="INFO">${netstat_installed} = net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET...</msg>
<var>${netstat_installed}</var>
<arg>netstat --version</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:57:17.162221" elapsed="0.024238"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<doc>Install netstat if it is not already installed.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:17.187421" elapsed="0.000057"/>
</kw>
<msg time="2026-08-22T23:57:17.187617" level="FAIL">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</msg>
<status status="FAIL" start="2026-08-22T23:57:17.186680" elapsed="0.001158">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</branch>
<status status="FAIL" start="2026-08-22T23:57:17.186622" elapsed="0.001324">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="FAIL" start="2026-08-22T23:57:17.161347" elapsed="0.026894">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</kw>
<arg>Check_And_Install_Netstat</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:17.160027" elapsed="0.028488"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:57:17.191453" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-08-22T23:57:17.259188" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:57:17.259683" level="INFO">${output} = 0</msg>
<var>${output}</var>
<arg>${NETSTAT_COMMAND} 2&gt; /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:57:17.190689" elapsed="0.069101"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:57:17.259946" elapsed="0.000137"/>
</return>
<msg time="2026-08-22T23:57:17.260709" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${last-port}</arg>
<arg>LISTEN</arg>
<arg>java</arg>
<doc>Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.</doc>
<status status="PASS" start="2026-08-22T23:57:17.156529" elapsed="0.104361"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-08-22T23:57:17.263236" level="FAIL">0 != 1</msg>
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-08-22T23:57:17.261759" elapsed="0.001745">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-08-22T23:57:17.155448" elapsed="0.108722">0 != 1</status>
</kw>
<arg>${number}</arg>
<doc>Query netstat on remote machine whether testtool device with the specified number has its port open and fail if not.</doc>
<status status="FAIL" start="2026-08-22T23:57:17.152459" elapsed="0.111931">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.268009" level="INFO">${device-port} = 17830</msg>
<var>${device-port}</var>
<arg>${FIRST_TESTTOOL_PORT}+${device-number}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:18.266484" elapsed="0.001613"/>
</kw>
<kw name="NetconfKeywords__Check_Device_Is_Up" owner="NetconfKeywords">
<kw name="Count_Port_Occurences" owner="SSHKeywords">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_And_Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:57:18.273309" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-08-22T23:57:18.286439" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:57:18.286701" level="INFO">${netstat_installed} = net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET...</msg>
<var>${netstat_installed}</var>
<arg>netstat --version</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:57:18.273104" elapsed="0.013659"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<doc>Install netstat if it is not already installed.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.287721" elapsed="0.000057"/>
</kw>
<msg time="2026-08-22T23:57:18.287858" level="FAIL">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</msg>
<status status="FAIL" start="2026-08-22T23:57:18.286949" elapsed="0.001135">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</branch>
<status status="FAIL" start="2026-08-22T23:57:18.286895" elapsed="0.001294">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="FAIL" start="2026-08-22T23:57:18.272702" elapsed="0.015802">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</kw>
<arg>Check_And_Install_Netstat</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:18.271861" elapsed="0.016954"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-08-22T23:57:18.291842" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-08-22T23:57:18.334853" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-08-22T23:57:18.335263" level="INFO">${output} = 1</msg>
<var>${output}</var>
<arg>${NETSTAT_COMMAND} 2&gt; /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-08-22T23:57:18.291026" elapsed="0.044338"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-08-22T23:57:18.335513" elapsed="0.000179"/>
</return>
<msg time="2026-08-22T23:57:18.336268" level="INFO">${count} = 1</msg>
<var>${count}</var>
<arg>${last-port}</arg>
<arg>LISTEN</arg>
<arg>java</arg>
<doc>Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.</doc>
<status status="PASS" start="2026-08-22T23:57:18.269669" elapsed="0.066779"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-08-22T23:57:18.337364" elapsed="0.001447"/>
</kw>
<arg>${device-port}</arg>
<status status="PASS" start="2026-08-22T23:57:18.268522" elapsed="0.070682"/>
</kw>
<arg>${number}</arg>
<doc>Query netstat on remote machine whether testtool device with the specified number has its port open and fail if not.</doc>
<status status="PASS" start="2026-08-22T23:57:18.265386" elapsed="0.073928"/>
</kw>
<arg>${TESTTOOL_BOOT_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Device_Up_And_Running</arg>
<arg>${number}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:57:13.909726" elapsed="4.429687"/>
</kw>
<arg>${DEVICE_NAME_BASE}-${number}</arg>
<arg>log_response=${log_response}</arg>
<status status="PASS" start="2026-08-22T23:57:13.908711" elapsed="4.430831"/>
</kw>
<arg>${operation}</arg>
<arg>${DEVICE_NAME_BASE}-${number}</arg>
<arg>log_response=${log_response}</arg>
<doc>Executes the given keyword with the given arguments.</doc>
<status status="PASS" start="2026-08-22T23:57:13.908237" elapsed="4.431450"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.340923" level="INFO">${next} = 17831</msg>
<var>${next}</var>
<arg>${current_port}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:18.340036" elapsed="0.000947"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.342147" level="INFO">${current_port} = 17831</msg>
<arg>${current_port}</arg>
<arg>${next}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-08-22T23:57:18.341396" elapsed="0.000793"/>
</kw>
<arg>${operation}</arg>
<arg>${deadline_Date}</arg>
<arg>log_response=${log_response}</arg>
<status status="PASS" start="2026-08-22T23:57:13.905252" elapsed="4.437000"/>
</kw>
<arg>${count} times</arg>
<arg>NetconfKeywords__Perform_Operation_With_Checking_On_Next_Device</arg>
<arg>${operation}</arg>
<arg>${deadline_Date}</arg>
<arg>log_response=${log_response}</arg>
<doc>Executes the specified keyword multiple times.</doc>
<status status="PASS" start="2026-08-22T23:57:13.904740" elapsed="4.437565"/>
</kw>
<arg>NetconfKeywords__Wait_Device_Is_Up_And_Running</arg>
<arg>log_response=${log_response}</arg>
<status status="PASS" start="2026-08-22T23:57:13.898798" elapsed="4.443573"/>
</kw>
<arg>${filename}</arg>
<arg>${device-count}</arg>
<arg>${debug}</arg>
<arg>${schemas}</arg>
<arg>${rpc_config}</arg>
<arg>${tool_options}</arg>
<arg>${java_options}</arg>
<arg>${mdsal}</arg>
<arg>log_response=${log_response}</arg>
<doc>Arrange to collect tool's output into a log file.
Will use specific /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas unless argument resolves to 'none',
which signifies that there are no additional schemas to be deployed.
If so the directory for the additional schemas is deleted on the
remote machine and the additional schemas argument is left out.</doc>
<status status="PASS" start="2026-08-22T23:57:13.642959" elapsed="4.699465"/>
</kw>
<arg>device-count=1</arg>
<arg>schemas=/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/schemas</arg>
<doc>Install and run testtool.</doc>
<status status="PASS" start="2026-08-22T23:57:12.957541" elapsed="5.384997"/>
</kw>
<doc>Deploy and start test tool, then wait for all its devices to become online.</doc>
<status status="PASS" start="2026-08-22T23:57:12.749188" elapsed="5.593488"/>
</test>
<test id="s1-s8-t2" name="Check_Device_Is_Not_Mounted_At_Beginning" 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-08-22T23:57:18.346518" elapsed="0.000227"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:57:18.346253" elapsed="0.000549"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:57:18.347810" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:18.347694" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.347674" 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-08-22T23:57:18.352777" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:18.352669" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.352651" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.353873" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:57:18.353471" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.354366" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:57:18.354061" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:57:18.354436" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:57:18.354606" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:57:18.353074" 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-08-22T23:57:18.360047" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:18.359940" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.359921" 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-08-22T23:57:18.361270" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:18.361150" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.361132" elapsed="0.000208"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:18.361826" level="INFO">${karaf_connection_index} = 94</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:57:18.361486" elapsed="0.000367"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:18.362242" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:57:18.362012" elapsed="0.000256"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:57:18.394470" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:57:18.362777" elapsed="0.031826"/>
</kw>
<msg time="2026-08-22T23:57:18.394769" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:57:18.394815" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:18.362424" elapsed="0.032428"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:57:18.415258" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:57:18.395363" elapsed="0.020002"/>
</kw>
<msg time="2026-08-22T23:57:18.415524" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:57:18.415570" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "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-08-22T23:57:18.395021" elapsed="0.020609"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.415977" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:18.415749" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.415728" elapsed="0.000329"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.416505" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:18.416202" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.416878" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:18.416662" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.416643" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:57:18.416989" 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-08-22T23:57:18.419472" elapsed="0.000172"/>
</kw>
<msg time="2026-08-22T23:57:18.419706" 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-08-22T23:57:18.418464" 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-08-22T23:57:18.420107" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.420433" 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-08-22T23:57:18.417855" elapsed="0.002780"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:57:18.417271" elapsed="0.003430"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:57:18.360850" elapsed="0.059948"/>
</kw>
<msg time="2026-08-22T23:57:18.420890" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:18.420934" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "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-08-22T23:57:18.360264" elapsed="0.060707"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:57:18.421154" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:57:18.421047" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.421028" 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-08-22T23:57:18.421683" 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-08-22T23:57:18.422017" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:57:18.422088" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:57:18.359596" elapsed="0.062600"/>
</kw>
<msg time="2026-08-22T23:57:18.422290" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:18.422333" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "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-08-22T23:57:18.355025" elapsed="0.067345"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.422801" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:18.422443" elapsed="0.000413"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.422427" elapsed="0.000453"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:57:18.354881" elapsed="0.068022"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:57:18.428235" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:18.428127" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.428108" 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-08-22T23:57:18.429493" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:18.429330" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.429312" elapsed="0.000254"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:18.430125" level="INFO">${karaf_connection_index} = 95</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:57:18.429766" elapsed="0.000386"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:18.430526" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:57:18.430307" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:57:18.466191" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:57:18.431062" elapsed="0.035242"/>
</kw>
<msg time="2026-08-22T23:57:18.466470" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:57:18.466517" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:18.430730" elapsed="0.035825"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:57:18.492873" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:57:18.467112" elapsed="0.025867"/>
</kw>
<msg time="2026-08-22T23:57:18.493139" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:57:18.493185" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "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-08-22T23:57:18.466754" elapsed="0.026473"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.493559" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:18.493309" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.493287" elapsed="0.000380"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.494104" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:18.493809" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.494452" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:18.494240" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.494222" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:57:18.494564" 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-08-22T23:57:18.497064" elapsed="0.000153"/>
</kw>
<msg time="2026-08-22T23:57:18.497278" 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-08-22T23:57:18.496031" 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-08-22T23:57:18.497790" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.498124" 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-08-22T23:57:18.495393" 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-08-22T23:57:18.494863" elapsed="0.003510"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:57:18.429031" elapsed="0.069439"/>
</kw>
<msg time="2026-08-22T23:57:18.498561" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:18.498628" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "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-08-22T23:57:18.428451" elapsed="0.070216"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:57:18.498848" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:57:18.498743" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.498724" 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-08-22T23:57:18.499324" 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-08-22T23:57:18.499684" elapsed="0.000064"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:57:18.499799" 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-08-22T23:57:18.427792" elapsed="0.072116"/>
</kw>
<msg time="2026-08-22T23:57:18.500002" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:18.500046" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "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-08-22T23:57:18.423167" elapsed="0.076915"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.500406" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:18.500158" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.500141" elapsed="0.000343"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:57:18.423030" elapsed="0.077477"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:57:18.505965" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:18.505856" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.505838" 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-08-22T23:57:18.507165" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:18.507058" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.507040" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:18.507685" level="INFO">${karaf_connection_index} = 96</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:57:18.507371" elapsed="0.000340"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:18.508082" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:57:18.507865" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:57:18.541848" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:57:18.508613" elapsed="0.033343"/>
</kw>
<msg time="2026-08-22T23:57:18.542132" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:57:18.542178" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:18.508263" elapsed="0.033951"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:57:18.566197" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:57:18.542757" elapsed="0.023750"/>
</kw>
<msg time="2026-08-22T23:57:18.566703" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:57:18.566752" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "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-08-22T23:57:18.542386" elapsed="0.024403"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.567106" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:18.566873" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.566850" elapsed="0.000336"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.567653" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "A "t "_ "B "e "g "i "n "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:18.567326" 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-08-22T23:57:18.568009" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:18.567795" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.567775" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:57:18.568120" 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-08-22T23:57:18.570639" elapsed="0.000158"/>
</kw>
<msg time="2026-08-22T23:57:18.570858" 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-08-22T23:57:18.569566" elapsed="0.001462"/>
</kw>
<kw name="Open 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-08-22T23:57:18.571301" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.571651" 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-08-22T23:57:18.568938" elapsed="0.002898"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:57:18.568383" 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-08-22T23:57:18.506756" elapsed="0.065241"/>
</kw>
<msg time="2026-08-22T23:57:18.572089" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:18.572133" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "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-08-22T23:57:18.506181" elapsed="0.065989"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:57:18.572354" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:57:18.572246" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.572228" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.572847" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.573174" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:57:18.573245" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:57:18.505504" elapsed="0.067848"/>
</kw>
<msg time="2026-08-22T23:57:18.573446" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:18.573490" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "I "s "_ "N "o "t "_ "M "o "u "n "t "e "d "_ "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-08-22T23:57:18.500794" elapsed="0.072733"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.574146" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:18.573736" elapsed="0.000464"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.573717" elapsed="0.000507"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:57:18.500657" elapsed="0.073591"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:57:18.354695" elapsed="0.219583"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:57:18.352294" elapsed="0.222045"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:57:18.347375" elapsed="0.227024"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:18.346951" elapsed="0.227495"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:57:18.343656" elapsed="0.230847"/>
</kw>
<kw name="Check_Device_Has_No_Netconf_Connector" owner="NetconfKeywords">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.585765" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:18.583494" elapsed="0.002297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.586121" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-22T23:57:18.585970" elapsed="0.000209"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-22T23:57:18.585848" elapsed="0.000358"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.586505" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:18.586267" elapsed="0.000295"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.587301" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:18.586830" elapsed="0.000498"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:18.586601" elapsed="0.000799"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.587607" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:18.587427" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.586251" elapsed="0.001435"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:18.587721" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:57:18.587869" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:18.583045" elapsed="0.004849"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:18.587940" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:57:18.588081" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:18.582546" elapsed="0.005559"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.595366" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:18.595116" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.595824" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:18.595563" 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-08-22T23:57:18.607438" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:18.607638" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Fri, 21-Aug-2026 23:57:18 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1011'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}} 
 </msg>
<msg time="2026-08-22T23:57:18.607895" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:57:18.598059" elapsed="0.009877"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:18.595933" elapsed="0.012069"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.608328" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:18.608042" elapsed="0.000391"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.595915" elapsed="0.012552"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.613756" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:18.610053" elapsed="0.003784"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:18.609725" elapsed="0.004164"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.609697" elapsed="0.004229"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.617902" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:18.614336" elapsed="0.003635"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:18.614010" elapsed="0.004013"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.613985" elapsed="0.004074"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.618862" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:18.618298" 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-08-22T23:57:18.619196" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:18.618960" elapsed="0.000337"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.619807" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:18.619483" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:18.619322" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.618942" elapsed="0.000951"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.620415" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:18.620050" 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-08-22T23:57:18.620760" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:18.620512" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.621303" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:18.621007" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:18.620849" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.620494" 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-08-22T23:57:18.621533" elapsed="0.000373"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:57:18.622372" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:18.622069" 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-08-22T23:57:18.622550" 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-08-22T23:57:18.609039" elapsed="0.016137"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:18.625351" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:18.625246" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.625228" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:57:18.628522" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:57:18.625566" elapsed="0.002985"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:57:18.628621" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:57:18.628780" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:57:18.590744" elapsed="0.038063"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:57:18.628864" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:57:18.629011" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:57:18.588321" elapsed="0.040716"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.629445" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:18.629195" elapsed="0.000305"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.630062" level="INFO">${actual_count} = 0</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:18.629675" elapsed="0.000447"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-22T23:57:18.630170" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:57:18.630324" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-22T23:57:18.575215" elapsed="0.055133"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.630818" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:57:18.630502" elapsed="0.000372"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${NODE_CONFIGURER}</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="PASS" start="2026-08-22T23:57:18.574741" elapsed="0.056192"/>
</kw>
<doc>Sanity check making sure our device is not there. Fail if found.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-08-22T23:57:18.343027" elapsed="0.288016"/>
</test>
<test id="s1-s8-t3" name="Configure_Device_On_Netconf" line="79">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:57:18.634392" elapsed="0.000226"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:57:18.634133" elapsed="0.000541"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:57:18.635666" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:18.635520" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.635502" 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-08-22T23:57:18.640837" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:18.640731" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.640713" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.641919" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:57:18.641497" elapsed="0.000449"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.642407" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:57:18.642103" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:57:18.642476" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:57:18.642647" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:57:18.641123" elapsed="0.001549"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:57:18.648247" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:18.648139" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.648120" 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-08-22T23:57:18.649457" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:18.649353" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.649335" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:18.650010" level="INFO">${karaf_connection_index} = 94</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:57:18.649711" elapsed="0.000326"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:18.650408" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:57:18.650190" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:57:18.696320" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:57:18.650936" elapsed="0.045503"/>
</kw>
<msg time="2026-08-22T23:57:18.696632" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:57:18.696680" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:18.650606" elapsed="0.046110"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:57:18.712360" level="INFO">"t "x "t ". "C "R "U "D ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:57:18.697272" elapsed="0.015185"/>
</kw>
<msg time="2026-08-22T23:57:18.712634" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:57:18.712681" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&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-08-22T23:57:18.696904" elapsed="0.015860"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.713079" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:18.712851" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.712826" elapsed="0.000333"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.713613" level="INFO"> "t "x "t ". "C "R "U "D ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:18.713298" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.713983" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:18.713768" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.713725" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:57:18.714094" 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-08-22T23:57:18.716635" elapsed="0.000153"/>
</kw>
<msg time="2026-08-22T23:57:18.716848" 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-08-22T23:57:18.715542" elapsed="0.001436"/>
</kw>
<kw name="Open 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-08-22T23:57:18.717248" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.717575" 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-08-22T23:57:18.714921" elapsed="0.002875"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:57:18.714366" 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-08-22T23:57:18.649054" elapsed="0.068905"/>
</kw>
<msg time="2026-08-22T23:57:18.718053" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:18.718096" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&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-08-22T23:57:18.648465" elapsed="0.069670"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:57:18.718318" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:57:18.718211" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.718194" 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-08-22T23:57:18.718829" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.719158" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:57:18.719230" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:57:18.647797" elapsed="0.071541"/>
</kw>
<msg time="2026-08-22T23:57:18.719431" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:18.719475" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&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-08-22T23:57:18.643035" elapsed="0.076478"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.719946" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:18.719695" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.719571" elapsed="0.000452"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:57:18.642896" elapsed="0.077151"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:57:18.725600" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:18.725477" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.725458" 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-08-22T23:57:18.726818" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:18.726711" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.726693" elapsed="0.000229"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:18.727365" level="INFO">${karaf_connection_index} = 95</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:57:18.727066" elapsed="0.000326"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:18.727782" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:57:18.727547" elapsed="0.000264"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:57:18.763052" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:57:18.728299" elapsed="0.034862"/>
</kw>
<msg time="2026-08-22T23:57:18.763323" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:57:18.763370" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:18.727968" elapsed="0.035438"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:57:18.778852" level="INFO">"t "x "t ". "C "R "U "D ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:57:18.763938" elapsed="0.015012"/>
</kw>
<msg time="2026-08-22T23:57:18.779108" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:57:18.779153" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&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-08-22T23:57:18.763576" elapsed="0.015614"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.779484" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:18.779267" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.779247" elapsed="0.000316"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.780021" level="INFO"> "t "x "t ". "C "R "U "D ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:18.779728" elapsed="0.000355"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.780361" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:18.780150" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.780132" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:57:18.780471" 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-08-22T23:57:18.782995" elapsed="0.000150"/>
</kw>
<msg time="2026-08-22T23:57:18.783205" 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-08-22T23:57:18.781939" 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-08-22T23:57:18.783623" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.783956" 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-08-22T23:57:18.781275" elapsed="0.002861"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:57:18.780745" elapsed="0.003455"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:57:18.726387" elapsed="0.057910"/>
</kw>
<msg time="2026-08-22T23:57:18.784389" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:18.784433" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&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-08-22T23:57:18.725834" elapsed="0.058637"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:57:18.784676" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:57:18.784547" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.784529" 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-08-22T23:57:18.785147" 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-08-22T23:57:18.785515" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:57:18.785660" 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-08-22T23:57:18.725135" elapsed="0.060640"/>
</kw>
<msg time="2026-08-22T23:57:18.785896" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:18.785943" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&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-08-22T23:57:18.720309" elapsed="0.065673"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.786304" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:18.786058" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.786040" elapsed="0.000341"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:57:18.720172" elapsed="0.066232"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:57:18.791946" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:18.791838" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.791820" 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-08-22T23:57:18.793146" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:18.793039" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.793021" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:18.793665" level="INFO">${karaf_connection_index} = 96</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:57:18.793353" elapsed="0.000339"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:18.794095" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:57:18.793875" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:57:18.829391" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:57:18.794632" elapsed="0.034862"/>
</kw>
<msg time="2026-08-22T23:57:18.829681" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:57:18.829727" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:18.794277" elapsed="0.035487"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:57:18.846717" level="INFO">"t "x "t ". "C "R "U "D ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:57:18.830280" elapsed="0.016541"/>
</kw>
<msg time="2026-08-22T23:57:18.846980" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:57:18.847025" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&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-08-22T23:57:18.829943" elapsed="0.017120"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.847358" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:18.847140" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.847121" elapsed="0.000314"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.847928" level="INFO"> "t "x "t ". "C "R "U "D ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:18.847598" 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-08-22T23:57:18.848275" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:18.848064" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.848047" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:57:18.848383" 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-08-22T23:57:18.850910" elapsed="0.000151"/>
</kw>
<msg time="2026-08-22T23:57:18.851154" 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-08-22T23:57:18.849803" 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-08-22T23:57:18.851553" elapsed="0.000097"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.851947" 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-08-22T23:57:18.849173" elapsed="0.002959"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:57:18.848655" 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-08-22T23:57:18.792740" elapsed="0.059551"/>
</kw>
<msg time="2026-08-22T23:57:18.852383" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:18.852427" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&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-08-22T23:57:18.792163" elapsed="0.060302"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:57:18.852678" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:57:18.852541" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.852523" 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 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.853145" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.853472" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:57:18.853543" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:57:18.791485" elapsed="0.062190"/>
</kw>
<msg time="2026-08-22T23:57:18.853768" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:18.853812" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "O "n "_ "N "e "t "c "o "n "f "[K"
[?1l&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-08-22T23:57:18.786727" elapsed="0.067123"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.854181" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:18.853925" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.853907" elapsed="0.000351"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:57:18.786524" elapsed="0.067757"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:57:18.642723" elapsed="0.211587"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:57:18.640358" elapsed="0.214011"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:57:18.635236" elapsed="0.219189"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:18.634820" elapsed="0.219652"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:57:18.631979" elapsed="0.222547"/>
</kw>
<kw name="Configure_Device_In_Netconf" owner="NetconfKeywords">
<kw name="Set_Variable_If_At_Least_Scandium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Set_Variable_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Set Variable If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:57:18.877762" elapsed="0.000446"/>
</kw>
<msg time="2026-08-22T23:57:18.878266" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>BuiltIn.Set_Variable_If</arg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:57:18.877371" elapsed="0.000947"/>
</kw>
<arg>scandium</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Compare ${lower_bound} to titanium and return scandium if titanium is at least ${lower_bound},
return calcium otherwise.</doc>
<status status="PASS" start="2026-08-22T23:57:18.876971" elapsed="0.001423"/>
</kw>
<msg time="2026-08-22T23:57:18.878437" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Set_Variable_If_At_Least</arg>
<arg>scandium</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:57:18.868240" elapsed="0.010240"/>
</kw>
<msg time="2026-08-22T23:57:18.878601" level="INFO">${version} = scandium</msg>
<var>${version}</var>
<arg>scandium</arg>
<arg>calcium</arg>
<doc>Compare scandium to titanium and return ${value_if_true} if titanium is at least scandium, return ${value_if_false} otherwise.</doc>
<status status="PASS" start="2026-08-22T23:57:18.867917" elapsed="0.010710"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.879694" level="INFO">${mapping} = {'DEVICE_IP': '10.30.171.196', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/t...</msg>
<var>${mapping}</var>
<arg>DEVICE_IP=${device_address}</arg>
<arg>DEVICE_NAME=${device_name}</arg>
<arg>DEVICE_PORT=${device_port}</arg>
<arg>DEVICE_USER=${device_user}</arg>
<arg>DEVICE_PASSWORD=${device_password}</arg>
<arg>DEVICE_KEY=${device_key}</arg>
<arg>SCHEMA_DIRECTORY=${schema_directory}</arg>
<arg>RESTCONF_ROOT=${RESTCONF_ROOT}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:57:18.878935" elapsed="0.000788"/>
</kw>
<if>
<branch type="IF" condition="'${http_method}'=='post'">
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<arg>folder=${DIRECTORY_WITH_DEVICE_TEMPLATES}${/}${version}${/}${device_type}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.880149" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:18.879821" elapsed="0.000393"/>
</branch>
<branch type="ELSE">
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.911989" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:18.911607" elapsed="0.000410"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:57:18.912857" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:57:18.912511" elapsed="0.000430">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:57:18.913038" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:57:18.912178" elapsed="0.000885"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.913628" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:57:18.913225" elapsed="0.000431"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:57:18.913955" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:57:18.914147" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:57:18.913816" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.914571" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:18.914326" 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-08-22T23:57:18.915570" level="INFO">mapping: {'DEVICE_IP': '10.30.171.196', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tmp/schema', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:18.915312" elapsed="0.000326"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.916056" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:57:18.915794" elapsed="0.000288"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.916906" level="INFO">${value} = 10.30.171.196</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:57:18.916453" elapsed="0.000480"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:57:18.917926" level="INFO">${encoded} = 10.30.171.196</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:57:18.917502" elapsed="0.000543"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:57:18.918318" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:57:18.918480" level="INFO">${encoded_value} = 10.30.171.196</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:57:18.917118" elapsed="0.001387"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:57:18.918681" elapsed="0.000418"/>
</kw>
<var name="${key}">DEVICE_IP</var>
<var name="${value}">10.30.171.196</var>
<status status="PASS" start="2026-08-22T23:57:18.916322" elapsed="0.002819"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.919826" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:57:18.919386" elapsed="0.000467"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:57:18.920910" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:57:18.920419" elapsed="0.000592"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:57:18.921286" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:57:18.921444" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:57:18.920036" elapsed="0.001433"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:57:18.921687" elapsed="0.000420"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:18.919256" elapsed="0.002894"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.922848" level="INFO">${value} = 17830</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:57:18.922395" elapsed="0.000479"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:57:18.923839" level="INFO">${encoded} = 17830</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:57:18.923433" elapsed="0.000504"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:57:18.924209" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:57:18.924366" level="INFO">${encoded_value} = 17830</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:57:18.923056" elapsed="0.001335"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:57:18.924541" elapsed="0.000418"/>
</kw>
<var name="${key}">DEVICE_PORT</var>
<var name="${value}">17830</var>
<status status="PASS" start="2026-08-22T23:57:18.922265" elapsed="0.002737"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.925891" level="INFO">${value} = admin</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:57:18.925243" elapsed="0.000674"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:57:18.926967" level="INFO">${encoded} = admin</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:57:18.926499" elapsed="0.000567"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:57:18.927331" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:57:18.927488" level="INFO">${encoded_value} = admin</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:57:18.926121" elapsed="0.001392"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:57:18.927692" elapsed="0.000392"/>
</kw>
<var name="${key}">DEVICE_USER</var>
<var name="${value}">admin</var>
<status status="PASS" start="2026-08-22T23:57:18.925115" elapsed="0.003012"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.928808" level="INFO">${value} = topsecret</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:57:18.928372" elapsed="0.000462"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:57:18.929812" level="INFO">${encoded} = topsecret</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:57:18.929397" elapsed="0.000513"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:57:18.930213" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:57:18.930373" level="INFO">${encoded_value} = topsecret</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:57:18.929016" elapsed="0.001383"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:57:18.930546" elapsed="0.000417"/>
</kw>
<var name="${key}">DEVICE_PASSWORD</var>
<var name="${value}">topsecret</var>
<status status="PASS" start="2026-08-22T23:57:18.928243" elapsed="0.002763"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.931771" level="INFO">${value} = device-key</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:57:18.931248" elapsed="0.000549"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:57:18.932795" level="INFO">${encoded} = device-key</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:57:18.932356" elapsed="0.000537"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:57:18.933159" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:57:18.933315" level="INFO">${encoded_value} = device-key</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:57:18.931979" elapsed="0.001361"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:57:18.933487" elapsed="0.000430"/>
</kw>
<var name="${key}">DEVICE_KEY</var>
<var name="${value}">device-key</var>
<status status="PASS" start="2026-08-22T23:57:18.931119" elapsed="0.002840"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.934644" level="INFO">${value} = /tmp/schema</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:57:18.934213" elapsed="0.000458"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:57:18.935688" level="INFO">${encoded} = /tmp/schema</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:57:18.935231" elapsed="0.000557"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:57:18.936055" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:57:18.936211" level="INFO">${encoded_value} = /tmp/schema</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:57:18.934852" elapsed="0.001384"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:57:18.936383" elapsed="0.000500"/>
</kw>
<var name="${key}">SCHEMA_DIRECTORY</var>
<var name="${value}">/tmp/schema</var>
<status status="PASS" start="2026-08-22T23:57:18.934084" elapsed="0.002842"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.937605" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:57:18.937166" elapsed="0.000466"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:57:18.938693" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:57:18.938219" elapsed="0.000569"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:57:18.939052" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:57:18.939207" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:57:18.937815" elapsed="0.001417"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:57:18.939377" elapsed="0.000405"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:57:18.937037" elapsed="0.002787"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:57:18.916135" elapsed="0.023724"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:57:18.939902" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:57:18.940062" level="INFO">${mapping_to_use} = {'DEVICE_IP': '10.30.171.196', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/t...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:57:18.914995" elapsed="0.025094"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:18.914699" elapsed="0.025421"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.940291" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:18.940145" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.914681" elapsed="0.025686"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:18.941564" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:18.940865" elapsed="0.000743"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:57:18.941658" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:57:18.910983" elapsed="0.030799"/>
</kw>
<msg time="2026-08-22T23:57:18.941835" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:57:18.898199" elapsed="0.043683"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.954528" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.966674" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.978895" 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-08-22T23:57:18.979130" 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-08-22T23:57:18.979303" 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-08-22T23:57:18.979685" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:18.979524" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:18.979510" 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-08-22T23:57:18.979909" 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-08-22T23:57:18.980073" 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-08-22T23:57:18.980234" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:57:18.979482" elapsed="0.000804"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:57:18.979381" elapsed="0.000931"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:18.980456" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:18.980531" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:57:18.980666" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:57:18.893889" elapsed="0.086803"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.006898" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:19.006506" elapsed="0.000420"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:57:19.007647" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology.titanium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:57:19.007413" elapsed="0.000298">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology.titanium/data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:57:19.007805" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:57:19.007086" elapsed="0.000744"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.008368" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:57:19.007989" elapsed="0.000406"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:57:19.008702" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:57:19.008828" level="INFO">${template} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;$DEVICE_NAME&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;$DEVICE_IP&lt;/host&gt;
    &lt;port&gt;$DEVI...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:57:19.008551" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.009252" level="INFO">&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;$DEVICE_NAME&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;$DEVICE_IP&lt;/host&gt;
    &lt;port&gt;$DEVICE_PORT&lt;/port&gt;
    &lt;login-password-unencrypted&gt;
      &lt;username&gt;$DEVICE_USER&lt;/username&gt;
      &lt;password&gt;$DEVICE_PASSWORD&lt;/password&gt;
    &lt;/login-password-unencrypted&gt;
    &lt;tcp-only&gt;false&lt;/tcp-only&gt;
    &lt;keepalive-delay&gt;0&lt;/keepalive-delay&gt;
  &lt;/netconf-node&gt;
&lt;/node&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:19.009009" elapsed="0.000330"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:57:19.009710" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.009407" elapsed="0.000362"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.010267" level="INFO">${mapping_to_use} = {'DEVICE_IP': '10.30.171.196', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/t...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:19.009936" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:19.009793" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.009389" elapsed="0.000962"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.011189" level="INFO">${final_text} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;10.30.171.196&lt;/host&gt;
    &lt;...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:19.010495" elapsed="0.000724"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:57:19.011269" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:57:19.005886" elapsed="0.005507"/>
</kw>
<msg time="2026-08-22T23:57:19.011448" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:57:18.993348" elapsed="0.018146"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.023951" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.036208" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.048825" 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-08-22T23:57:19.049016" 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-08-22T23:57:19.049189" 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-08-22T23:57:19.049546" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.049407" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:19.049393" 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-08-22T23:57:19.049781" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.049948" 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-08-22T23:57:19.050109" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:57:19.049365" elapsed="0.000796"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:57:19.049263" elapsed="0.000923"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.050401" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:19.050479" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:57:19.050620" level="INFO">${data} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;10.30.171.196&lt;/host&gt;
    &lt;...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:57:18.990739" elapsed="0.059911"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:57:19.051898" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:57:19.051648" elapsed="0.000314">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:57:19.052055" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:57:19.051298" elapsed="0.000782"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.052392" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.052150" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.052956" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:19.052658" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:19.052472" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.052132" elapsed="0.000907"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.055368" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:57:19.053186" elapsed="0.002209"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:57:19.055446" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:57:19.055614" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:57:19.050976" elapsed="0.004664"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.057145" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:19.056899" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.057594" level="INFO">&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;10.30.171.196&lt;/host&gt;
    &lt;port&gt;17830&lt;/port&gt;
    &lt;login-password-unencrypted&gt;
      &lt;username&gt;admin&lt;/username&gt;
      &lt;password&gt;topsecret&lt;/password&gt;
    &lt;/login-password-unencrypted&gt;
    &lt;tcp-only&gt;false&lt;/tcp-only&gt;
    &lt;keepalive-delay&gt;0&lt;/keepalive-delay&gt;
  &lt;/netconf-node&gt;
&lt;/node&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:19.057341" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.058043" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:19.057797" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.058512" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:19.058262" elapsed="0.000293"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:19.059376" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:57:19.059177" elapsed="0.000226"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:57:19.059746" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:57:19.059552" elapsed="0.000220"/>
</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-08-22T23:57:19.059917" elapsed="0.000196"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.060520" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:19.060274" elapsed="0.000291"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:57:19.060623" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:57:19.060817" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:57:19.058772" elapsed="0.002072"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:57:19.084483" level="INFO">PUT Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Content-Length': '452', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
  &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
  &lt;netconf-node xmlns="urn:opendaylight:netconf-node-topology"&gt;
    &lt;host&gt;10.30.171.196&lt;/host&gt;
    &lt;port&gt;17830&lt;/port&gt;
    &lt;login-password-unencrypted&gt;
      &lt;username&gt;admin&lt;/username&gt;
      &lt;password&gt;topsecret&lt;/password&gt;
    &lt;/login-password-unencrypted&gt;
    &lt;tcp-only&gt;false&lt;/tcp-only&gt;
    &lt;keepalive-delay&gt;0&lt;/keepalive-delay&gt;
  &lt;/netconf-node&gt;
&lt;/node&gt; 
 </msg>
<msg time="2026-08-22T23:57:19.084550" level="INFO">PUT Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:19.084704" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:57:19.063147" elapsed="0.021585"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:19.060914" elapsed="0.023866"/>
</branch>
<branch type="ELSE">
<kw name="PUT 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 PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.084985" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.084810" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.060896" elapsed="0.024179"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.088456" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:19.086071" elapsed="0.002428"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:19.085849" elapsed="0.002685"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.085830" elapsed="0.002728"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.091215" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:19.088853" elapsed="0.002409"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:19.088630" elapsed="0.002665"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.088613" elapsed="0.002707"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.091929" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:19.091485" 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-08-22T23:57:19.092266" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.092034" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.092823" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:19.092505" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:19.092346" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.092016" elapsed="0.000889"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.093423" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:19.093062" 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-08-22T23:57:19.093767" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.093519" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.094319" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:19.094007" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:19.093852" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.093501" 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-08-22T23:57:19.094548" elapsed="0.000437"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:57:19.095434" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:19.095148" 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-08-22T23:57:19.095625" elapsed="0.002354"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:57:19.085458" elapsed="0.012584"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:57:19.098257" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-08-22T23:57:19.098149" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.098130" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.098524" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:19.098609" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:57:19.100914" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT 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-08-22T23:57:19.055972" elapsed="0.044969"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:57:19.101007" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:57:19.101160" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-08-22T23:57:18.883177" elapsed="0.218008"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.101516" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.101282" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.101264" elapsed="0.000360"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:57:19.101658" elapsed="0.000025"/>
</return>
<arg>folder=${DIRECTORY_WITH_DEVICE_TEMPLATES}${/}${version}${/}${device_type}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-08-22T23:57:18.880470" elapsed="0.221311"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:18.880240" elapsed="0.221584"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:18.879800" elapsed="0.222045"/>
</if>
<kw name="Set To Dictionary" owner="Collections">
<arg>${NetconfKeywords__mounted_device_types}</arg>
<arg>${device_name}</arg>
<arg>${device_type}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:57:19.101986" elapsed="0.000238"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>device_type=configure-via-topology</arg>
<arg>session=${NODE_CONFIGURER}</arg>
<doc>Tell Netconf about the specified device so it can add it into its configuration.</doc>
<status status="PASS" start="2026-08-22T23:57:18.854947" elapsed="0.247356"/>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.103516" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:19.103111" elapsed="0.000433"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-08-22T23:57:19.103784" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:57:19.103634" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.103615" elapsed="0.000268"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.104061" elapsed="0.000022"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.104234" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.104410" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.104593" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.104760" elapsed="0.000019"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.104922" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.105081" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.105320" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.105162" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:19.105145" elapsed="0.000250"/>
</if>
<arg>5089</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:57:19.102730" elapsed="0.002715"/>
</kw>
<doc>Make request to configure a testtool device on Netconf connector</doc>
<tag>critical</tag>
<status status="PASS" start="2026-08-22T23:57:18.631328" elapsed="0.474162"/>
</test>
<test id="s1-s8-t4" name="Check_Configurer_Has_Netconf_Connector_For_Device" 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-08-22T23:57:19.109305" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:57:19.109042" elapsed="0.000525"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:57:19.110597" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:19.110472" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.110453" 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-08-22T23:57:19.115652" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:19.115500" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.115478" elapsed="0.000241"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.116753" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:57:19.116313" elapsed="0.000467"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.117243" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:57:19.116937" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:57:19.117315" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:57:19.117470" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:57:19.115941" elapsed="0.001554"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:57:19.123040" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:19.122931" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.122908" 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-08-22T23:57:19.124374" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:19.124268" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.124250" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:19.124902" level="INFO">${karaf_connection_index} = 94</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:57:19.124607" elapsed="0.000322"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:19.125310" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:57:19.125083" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:57:19.159503" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:57:19.125863" elapsed="0.033759"/>
</kw>
<msg time="2026-08-22T23:57:19.159800" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:57:19.159856" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:19.125488" elapsed="0.034413"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:57:19.185465" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o "n "n "e "c "t "o "r "_ "F "o "r "_ "D "e "v "i "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:57:19.160421" elapsed="0.025211"/>
</kw>
<msg time="2026-08-22T23:57:19.185809" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:57:19.185857" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:19.160083" elapsed="0.025812"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.186221" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.185982" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.185958" elapsed="0.000343"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.186822" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o "n "n "e "c "t "o "r "_ "F "o "r "_ "D "e "v "i "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:19.186474" 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-08-22T23:57:19.187238" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.187021" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.187001" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:57:19.187349" 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-08-22T23:57:19.189919" elapsed="0.000152"/>
</kw>
<msg time="2026-08-22T23:57:19.190131" 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-08-22T23:57:19.188815" elapsed="0.001447"/>
</kw>
<kw name="Open 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-08-22T23:57:19.190555" elapsed="0.000099"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.190943" 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-08-22T23:57:19.188172" 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-08-22T23:57:19.187636" elapsed="0.003553"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:57:19.123968" elapsed="0.067319"/>
</kw>
<msg time="2026-08-22T23:57:19.191379" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:19.191422" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:19.123256" elapsed="0.068203"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:57:19.191664" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:57:19.191534" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.191515" 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-08-22T23:57:19.192152" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.192483" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:57:19.192553" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:57:19.122544" elapsed="0.070248"/>
</kw>
<msg time="2026-08-22T23:57:19.192908" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:19.192962" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:19.117886" elapsed="0.075116"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.193325" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.193077" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.193060" elapsed="0.000342"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:57:19.117743" elapsed="0.075682"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:57:19.198913" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:19.198783" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.198759" 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-08-22T23:57:19.200121" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:19.200012" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.199994" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:19.200640" level="INFO">${karaf_connection_index} = 95</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:57:19.200329" elapsed="0.000338"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:19.201089" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:57:19.200844" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:57:19.234917" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:57:19.201619" elapsed="0.033402"/>
</kw>
<msg time="2026-08-22T23:57:19.235221" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:57:19.235269" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:19.201270" elapsed="0.034036"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:57:19.257208" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o "n "n "e "c "t "o "r "_ "F "o "r "_ "D "e "v "i "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:57:19.235839" elapsed="0.021482"/>
</kw>
<msg time="2026-08-22T23:57:19.257483" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:57:19.257530" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:19.235475" elapsed="0.022093"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.257888" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.257668" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.257647" elapsed="0.000320"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.258399" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o "n "n "e "c "t "o "r "_ "F "o "r "_ "D "e "v "i "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:19.258105" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.258789" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.258556" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.258538" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:57:19.258902" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<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-08-22T23:57:19.261532" elapsed="0.000171"/>
</kw>
<msg time="2026-08-22T23:57:19.261764" 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-08-22T23:57:19.260306" elapsed="0.001585"/>
</kw>
<kw name="Open 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-08-22T23:57:19.262161" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.262515" 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-08-22T23:57:19.259693" 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-08-22T23:57:19.259150" 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-08-22T23:57:19.199713" elapsed="0.063172"/>
</kw>
<msg time="2026-08-22T23:57:19.262976" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:19.263018" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:19.199128" elapsed="0.063927"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:57:19.263236" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:57:19.263131" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.263113" elapsed="0.000204"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.263728" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.264061" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:57:19.264132" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:57:19.198410" elapsed="0.065828"/>
</kw>
<msg time="2026-08-22T23:57:19.264331" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:19.264374" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:19.193702" elapsed="0.070708"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.264883" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.264521" elapsed="0.000417"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.264503" elapsed="0.000459"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:57:19.193548" elapsed="0.071438"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:57:19.270256" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:19.270147" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.270127" 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-08-22T23:57:19.271484" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:19.271374" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.271356" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:19.272008" level="INFO">${karaf_connection_index} = 96</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:57:19.271716" elapsed="0.000319"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:19.272405" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:57:19.272189" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:57:19.307916" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:57:19.272933" elapsed="0.035091"/>
</kw>
<msg time="2026-08-22T23:57:19.308188" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:57:19.308234" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:19.272603" elapsed="0.035668"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:57:19.344258" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o "n "n "e "c "t "o "r "_ "F "o "r "_ "D "e "v "i "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:57:19.308816" elapsed="0.035738"/>
</kw>
<msg time="2026-08-22T23:57:19.344739" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:57:19.344786" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:19.308446" elapsed="0.036377"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.345161" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.344938" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.344915" elapsed="0.000325"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.345689" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o "n "n "e "c "t "o "r "_ "F "o "r "_ "D "e "v "i "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:19.345376" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.346040" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.345827" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.345809" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:57:19.346152" 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-08-22T23:57:19.348701" elapsed="0.000151"/>
</kw>
<msg time="2026-08-22T23:57:19.348913" 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-08-22T23:57:19.347622" elapsed="0.001419"/>
</kw>
<kw name="Open 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-08-22T23:57:19.349308" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.349656" 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-08-22T23:57:19.346993" elapsed="0.002844"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:57:19.346410" elapsed="0.003490"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:57:19.271074" elapsed="0.078970"/>
</kw>
<msg time="2026-08-22T23:57:19.350135" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:19.350178" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:19.270473" elapsed="0.079742"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:57:19.350397" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:57:19.350291" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.350273" 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-08-22T23:57:19.350897" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.351224" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:57:19.351294" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:57:19.269808" elapsed="0.081594"/>
</kw>
<msg time="2026-08-22T23:57:19.351495" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:19.351538" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "C "o "n "f "i "g "u "r "e "r "_ "H "a "s "_ "N "e "t "c "o "n "f "_ "C "o ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:19.265242" elapsed="0.086436"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.352005" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.351760" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.351742" elapsed="0.000340"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:57:19.265106" elapsed="0.086999"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:57:19.117549" elapsed="0.234585"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:57:19.115106" elapsed="0.237086"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:57:19.110165" elapsed="0.242083"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:19.109740" elapsed="0.242554"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:57:19.106631" elapsed="0.245719"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Instance_Count">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.364302" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:19.362037" elapsed="0.002293"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.364672" elapsed="0.000023"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-22T23:57:19.364506" elapsed="0.000225"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-22T23:57:19.364386" elapsed="0.000370"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.365059" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.364823" elapsed="0.000293"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.365855" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:19.365367" elapsed="0.000515"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:19.365140" elapsed="0.000779"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.366105" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.365943" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.364805" elapsed="0.001377"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:19.366216" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:57:19.366362" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:19.361566" elapsed="0.004821"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:19.366590" elapsed="0.000042"/>
</return>
<msg time="2026-08-22T23:57:19.366753" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:19.361054" elapsed="0.005723"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.373950" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:19.373694" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.374392" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:19.374149" 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-08-22T23:57:19.385276" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:19.385460" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1235'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}},"node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"connection-status":"connecting","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196"}}]}]}} 
 </msg>
<msg time="2026-08-22T23:57:19.385570" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:57:19.376552" elapsed="0.009060"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:19.374503" elapsed="0.011153"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.385871" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.385688" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.374485" 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-08-22T23:57:19.389455" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}},"node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"connection-status":"connecting","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196"}}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:19.387055" elapsed="0.002456"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:19.386837" elapsed="0.002709"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.386818" elapsed="0.002752"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.392181" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:19.389869" elapsed="0.002358"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:19.389645" elapsed="0.002617"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.389628" elapsed="0.002658"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.392873" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:19.392446" 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-08-22T23:57:19.393218" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.392987" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.393773" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:19.393457" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:19.393300" elapsed="0.000577"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.392969" elapsed="0.000931"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.394421" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:19.394057" 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-08-22T23:57:19.394793" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.394518" elapsed="0.000333"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.395328" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:19.395033" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:19.394875" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.394500" 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-08-22T23:57:19.395559" elapsed="0.000370"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:57:19.396382" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:19.396090" 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-08-22T23:57:19.396560" 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-08-22T23:57:19.386352" elapsed="0.012747"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:19.399273" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:19.399168" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.399150" elapsed="0.000190"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:57:19.402516" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "node": [
     {
      "netconf-node-topology:netconf-node": {
       "connection-status": "connecting",
       "host": "10.30.171.19...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:57:19.399483" elapsed="0.003062"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:57:19.402614" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:57:19.402802" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "node": [
     {
      "netconf-node-topology:netconf-node": {
       "connection-status": "connecting",
       "host": "10.30.171.19...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:57:19.369374" elapsed="0.033458"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:57:19.402891" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:57:19.403039" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "node": [
     {
      "netconf-node-topology:netconf-node": {
       "connection-status": "connecting",
       "host": "10.30.171.19...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:57:19.366992" elapsed="0.036074"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.403475" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "node": [
     {
      "netconf-node-topology:netconf-node": {
       "connection-status": "connecting",
       "host": "10.30.171.196",
       "login-password-unencrypted": {
        "password": "topsecret",
        "username": "admin"
       },
       "port": 17830
      },
      "node-id": "netconf-test-device"
     }
    ],
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:19.403224" elapsed="0.000310"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.404118" level="INFO">${actual_count} = 1</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:19.403701" elapsed="0.000444"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-22T23:57:19.404192" elapsed="0.000060"/>
</return>
<msg time="2026-08-22T23:57:19.404381" level="INFO">${count} = 1</msg>
<var>${count}</var>
<arg>${DEVICE_NAME}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-22T23:57:19.353480" elapsed="0.050927"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.404884" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:57:19.404561" elapsed="0.000392"/>
</kw>
<arg>1</arg>
<arg>session=${NODE_CONFIGURER}</arg>
<status status="PASS" start="2026-08-22T23:57:19.353044" elapsed="0.051970"/>
</kw>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Device_Instance_Count</arg>
<arg>1</arg>
<arg>session=${NODE_CONFIGURER}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:57:19.352519" elapsed="0.052542"/>
</kw>
<doc>Get the list of mounts and search for our device there. Fail if not found.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-08-22T23:57:19.105949" elapsed="0.299227"/>
</test>
<test id="s1-s8-t5" name="Wait_For_Device_To_Become_Visible_For_Configurer" 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-08-22T23:57:19.408498" elapsed="0.000229"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:57:19.408237" 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-08-22T23:57:19.409763" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:19.409653" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.409634" 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-08-22T23:57:19.414807" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:19.414696" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.414665" elapsed="0.000212"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.415870" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:57:19.415472" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.416357" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:57:19.416054" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:57:19.416428" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:57:19.416598" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:57:19.415098" elapsed="0.001527"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:57:19.423740" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:19.423630" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.423610" 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-08-22T23:57:19.424963" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:19.424856" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.424837" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:19.425470" level="INFO">${karaf_connection_index} = 94</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:57:19.425174" elapsed="0.000322"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:19.425889" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:57:19.425667" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:57:19.459905" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:57:19.426401" elapsed="0.033606"/>
</kw>
<msg time="2026-08-22T23:57:19.460168" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:57:19.460214" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:19.426072" elapsed="0.034179"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:57:19.485125" level="INFO">"t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:57:19.460776" elapsed="0.024458"/>
</kw>
<msg time="2026-08-22T23:57:19.485391" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:57:19.485436" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:19.460418" elapsed="0.025089"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.485824" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.485605" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.485565" elapsed="0.000339"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.486332" level="INFO"> "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:19.486038" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.486697" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.486469" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.486451" elapsed="0.000341"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:57:19.486826" 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-08-22T23:57:19.489352" elapsed="0.000151"/>
</kw>
<msg time="2026-08-22T23:57:19.489563" 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-08-22T23:57:19.488262" 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-08-22T23:57:19.489983" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.490313" 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-08-22T23:57:19.487617" elapsed="0.002878"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:57:19.487076" elapsed="0.003482"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:57:19.424526" elapsed="0.066151"/>
</kw>
<msg time="2026-08-22T23:57:19.490787" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:19.490835" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:19.423959" elapsed="0.066915"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:57:19.491056" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:57:19.490951" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.490933" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.491525" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.491879" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:57:19.491951" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:57:19.423275" elapsed="0.068784"/>
</kw>
<msg time="2026-08-22T23:57:19.492151" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:19.492195" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:19.417077" elapsed="0.075154"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.492550" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.492306" elapsed="0.000408"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.492289" elapsed="0.000449"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:57:19.416844" elapsed="0.075919"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:57:19.546043" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:19.545897" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.545869" 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-08-22T23:57:19.547499" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:19.547389" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.547371" elapsed="0.000337"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:19.548188" level="INFO">${karaf_connection_index} = 95</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:57:19.547860" elapsed="0.000357"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:19.548628" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:57:19.548379" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:57:19.580445" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:57:19.549146" elapsed="0.031407"/>
</kw>
<msg time="2026-08-22T23:57:19.580743" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:57:19.580789" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:19.548813" elapsed="0.032013"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:57:19.602785" level="INFO">"t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:57:19.581341" elapsed="0.021601"/>
</kw>
<msg time="2026-08-22T23:57:19.603123" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:57:19.603174" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:19.580997" elapsed="0.022214"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.603526" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.603289" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.603269" elapsed="0.000362"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.604094" level="INFO"> "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:19.603776" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.604451" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.604236" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.604217" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:57:19.604568" 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-08-22T23:57:19.607184" elapsed="0.000152"/>
</kw>
<msg time="2026-08-22T23:57:19.607397" 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-08-22T23:57:19.606046" elapsed="0.001486"/>
</kw>
<kw name="Open 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-08-22T23:57:19.607827" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.608159" 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-08-22T23:57:19.605403" 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-08-22T23:57:19.604869" 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-08-22T23:57:19.547080" elapsed="0.061428"/>
</kw>
<msg time="2026-08-22T23:57:19.608627" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:19.608673" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:19.546319" elapsed="0.062392"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:57:19.608896" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:57:19.608789" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.608770" 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-08-22T23:57:19.609372" 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-08-22T23:57:19.609792" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:57:19.609865" 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-08-22T23:57:19.545384" elapsed="0.064591"/>
</kw>
<msg time="2026-08-22T23:57:19.610071" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:19.610115" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:19.493021" elapsed="0.117132"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.610480" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.610229" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.610212" elapsed="0.000346"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:57:19.492886" elapsed="0.117800"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:57:19.616256" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:19.616146" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.616126" 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-08-22T23:57:19.617470" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:19.617363" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.617345" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:19.618000" level="INFO">${karaf_connection_index} = 96</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:57:19.617703" elapsed="0.000324"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:19.618403" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:57:19.618182" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:57:19.654934" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:57:19.618958" elapsed="0.036102"/>
</kw>
<msg time="2026-08-22T23:57:19.655221" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:57:19.655268" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:19.618602" elapsed="0.036703"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:57:19.679113" level="INFO">"t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:57:19.655854" elapsed="0.023370"/>
</kw>
<msg time="2026-08-22T23:57:19.679385" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:57:19.679431" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:19.655473" elapsed="0.023994"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.679788" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.679544" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.679524" elapsed="0.000343"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.680300" level="INFO"> "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:19.680004" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.680670" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.680437" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.680419" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:57:19.680783" 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-08-22T23:57:19.683256" elapsed="0.000150"/>
</kw>
<msg time="2026-08-22T23:57:19.683505" 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-08-22T23:57:19.682208" elapsed="0.001494"/>
</kw>
<kw name="Open 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-08-22T23:57:19.683980" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.684307" 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-08-22T23:57:19.681565" 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-08-22T23:57:19.681035" elapsed="0.003520"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:57:19.617061" elapsed="0.067614"/>
</kw>
<msg time="2026-08-22T23:57:19.684767" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:19.684811" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:19.616478" elapsed="0.068370"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:57:19.685030" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:57:19.684924" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.684906" 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-08-22T23:57:19.685498" 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-08-22T23:57:19.685854" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:57:19.685926" 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-08-22T23:57:19.615799" elapsed="0.070236"/>
</kw>
<msg time="2026-08-22T23:57:19.686129" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:19.686172" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:19.610990" elapsed="0.075219"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.686529" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.686283" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.686266" elapsed="0.000384"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:57:19.610822" elapsed="0.075852"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:57:19.416676" elapsed="0.270028"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:57:19.414310" elapsed="0.272453"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:57:19.409352" elapsed="0.277467"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:19.408935" elapsed="0.277930"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:57:19.406049" elapsed="0.280869"/>
</kw>
<kw name="Wait_Device_Connected" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.699340" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:19.697259" elapsed="0.002108"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.700054" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:19.699723" elapsed="0.000358"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:19.699558" elapsed="0.000559"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.700678" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:19.700342" elapsed="0.000362"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:19.700196" elapsed="0.000543"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:19.699423" elapsed="0.001346"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.701118" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.700874" elapsed="0.000303"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.701923" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:19.701436" elapsed="0.000515"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:19.701202" elapsed="0.000786"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.702179" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.702013" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.700855" elapsed="0.001402"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:19.702291" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:57:19.702439" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:19.696803" elapsed="0.005662"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:19.702511" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:57:19.702672" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:19.696229" elapsed="0.006469"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.710205" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:19.709943" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.710669" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:19.710405" 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-08-22T23:57:19.718266" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:19.718445" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"connection-status":"connecting","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196"}}]} 
 </msg>
<msg time="2026-08-22T23:57:19.718568" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:57:19.712870" elapsed="0.005744"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:19.710784" elapsed="0.007875"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:19.718839" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.718685" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.710765" elapsed="0.008162"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.723705" level="INFO">{"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"connection-status":"connecting","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196"}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:19.720073" elapsed="0.003702"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:19.719766" elapsed="0.004059"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.719747" elapsed="0.004114"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.727493" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:19.724249" elapsed="0.003308"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:19.723940" elapsed="0.003688"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.723916" elapsed="0.003749"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.728264" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:19.727872" 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-08-22T23:57:19.728617" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.728364" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.729209" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:19.728904" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:19.728700" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.728346" elapsed="0.000950"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.729835" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:19.729453" 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-08-22T23:57:19.730165" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:19.729933" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.730718" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:19.730405" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:19.730247" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.729916" 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-08-22T23:57:19.730958" elapsed="0.000363"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:57:19.731816" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:19.731502" 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-08-22T23:57:19.731996" elapsed="0.002299"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:57:19.719321" elapsed="0.015038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:19.734550" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:19.734428" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:19.734410" elapsed="0.000226"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:57:19.737485" level="INFO">${text_normalized} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:57:19.734781" elapsed="0.002733"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:57:19.737567" elapsed="0.000046"/>
</return>
<msg time="2026-08-22T23:57:19.737745" level="INFO">${response_text} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:57:19.705393" elapsed="0.032383"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:57:19.737835" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:57:19.737986" level="INFO">${device_status} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "t...</msg>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:57:19.702921" elapsed="0.035091"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:57:19.738521" level="FAIL">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</msg>
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:57:19.738169" elapsed="0.000451">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</status>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:19.688313" elapsed="0.050434">'{
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "connection-status": "connecting",
    "host": "10.30.171.196",
    "login-password-unencrypted": {
     "password": "topsecret",
     "username": "admin"
    },
    "port": 17830
   },
   "node-id": "netconf-test-device"
  }
 ]
}
' does not contain 'connection-status": "connected"'</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:20.755966" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:20.753541" elapsed="0.002459"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:20.756917" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:20.756571" elapsed="0.000373"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:20.756413" elapsed="0.000569"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:20.757533" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:20.757213" elapsed="0.000346"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:20.757063" elapsed="0.000549"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:20.756214" elapsed="0.001428"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:20.757978" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:20.757715" elapsed="0.000322"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:20.758783" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:20.758295" elapsed="0.000517"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:20.758062" elapsed="0.000788"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:20.759038" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:20.758875" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:20.757694" elapsed="0.001423"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:20.759155" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:57:20.759318" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:20.753058" elapsed="0.006286"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:20.759391" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:57:20.759536" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:20.752427" elapsed="0.007135"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:20.767065" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:20.766802" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:20.767507" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:20.767265" 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-08-22T23:57:20.777650" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:20.777864" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '3689'} 
 body={"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"unavailable-capabilities":{"unavailable-capability":[{"failure-reason":"missing-source","capability":"(urn:ietf:params:xml:ns:netconf:notification:1.0?revision=2008-07-14)notifications"}]},"clustered-connection-status":{"netconf-master-node":"pekko://opendaylight-cluster-data@127.0.0.1:2550"},"negotiated-ssh-transport-parameters":{"encryption-alg":"chacha20-poly1305","host-key-alg":"rsa-sha2-512","mac-alg":"none","key-exchange-alg":"sntrup761x25519-sha512"},"session-id":1,"connection-status":"connected","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196","available-capabilities":{"available-capability":[{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:notification:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:exi:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:candidate:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.1"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.0"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people?revision=2014-08-18)people"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)ietf-yang-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?revision=2010-10-04)ietf-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car?revision=2014-08-18)car"},{"capability-origin":"device-advertised","capability":"(ns:main?revision=2014-01-21)main"},{"capability-origin":"device-advertised","capability":"(ns:augment:main:a?revision=2014-01-21)augment-main-a"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:netconf:monitoring?revision=2022-07-18)odl-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:netconf:base:1.0?revision=2011-06-01)ietf-netconf"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring-extension?revision=2013-12-10)ietf-netconf-monitoring-extension"},{"capability-origin":"device-advertised","capability":"(org:opendaylight:coretutorials:ncmount:example:l2fib?revision=2016-03-07)ncmount-l2fib"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people?revision=2014-08-18)car-people"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-purchase?revision=2014-08-18)car-purchase"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:test:netconf:crud?revision=2014-10-18)test"},{"capability-origin":"device-advertised","capability":"(https://example.com/ns/example-action?revision=2016-07-07)example-action"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2013-07-15)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2010-09-24)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:yang:extension:yang-ext?revision=2013-07-09)yang-ext"}]}}}]} 
 </msg>
<msg time="2026-08-22T23:57:20.778024" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:57:20.769683" elapsed="0.008369"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:20.767635" elapsed="0.010461"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:20.778279" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:20.778124" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:20.767617" elapsed="0.010751"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:20.782454" level="INFO">{"network-topology:node":[{"node-id":"netconf-test-device","netconf-node-topology:netconf-node":{"port":17830,"unavailable-capabilities":{"unavailable-capability":[{"failure-reason":"missing-source","capability":"(urn:ietf:params:xml:ns:netconf:notification:1.0?revision=2008-07-14)notifications"}]},"clustered-connection-status":{"netconf-master-node":"pekko://opendaylight-cluster-data@127.0.0.1:2550"},"negotiated-ssh-transport-parameters":{"encryption-alg":"chacha20-poly1305","host-key-alg":"rsa-sha2-512","mac-alg":"none","key-exchange-alg":"sntrup761x25519-sha512"},"session-id":1,"connection-status":"connected","login-password-unencrypted":{"username":"admin","password":"topsecret"},"host":"10.30.171.196","available-capabilities":{"available-capability":[{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:notification:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:exi:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:capability:candidate:1.0"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.1"},{"capability-origin":"device-advertised","capability":"urn:ietf:params:netconf:base:1.0"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people?revision=2014-08-18)people"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)ietf-yang-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?revision=2010-10-04)ietf-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car?revision=2014-08-18)car"},{"capability-origin":"device-advertised","capability":"(ns:main?revision=2014-01-21)main"},{"capability-origin":"device-advertised","capability":"(ns:augment:main:a?revision=2014-01-21)augment-main-a"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:netconf:monitoring?revision=2022-07-18)odl-netconf-monitoring"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:netconf:base:1.0?revision=2011-06-01)ietf-netconf"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring-extension?revision=2013-12-10)ietf-netconf-monitoring-extension"},{"capability-origin":"device-advertised","capability":"(org:opendaylight:coretutorials:ncmount:example:l2fib?revision=2016-03-07)ncmount-l2fib"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people?revision=2014-08-18)car-people"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-purchase?revision=2014-08-18)car-purchase"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:test:netconf:crud?revision=2014-10-18)test"},{"capability-origin":"device-advertised","capability":"(https://example.com/ns/example-action?revision=2016-07-07)example-action"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2013-07-15)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2010-09-24)ietf-inet-types"},{"capability-origin":"device-advertised","capability":"(urn:opendaylight:yang:extension:yang-ext?revision=2013-07-09)yang-ext"}]}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:20.779410" elapsed="0.003147"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:20.779186" elapsed="0.003442"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:20.779167" elapsed="0.003497"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:20.786347" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:20.783056" elapsed="0.003355"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:20.782743" elapsed="0.003717"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:20.782720" elapsed="0.003777"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:20.787288" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:20.786741" 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-08-22T23:57:20.787775" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:20.787425" elapsed="0.000433"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:20.788598" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:20.788116" elapsed="0.000522"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:20.787892" elapsed="0.000797"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:20.787399" elapsed="0.001320"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:57:20.789302" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:20.788937" 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-08-22T23:57:20.789642" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:20.789397" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:20.790173" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:20.789880" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:20.789723" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:20.789379" 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-08-22T23:57:20.790441" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:57:20.791264" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:57:20.790971" 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-08-22T23:57:20.791442" elapsed="0.002308"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:57:20.778752" elapsed="0.015063"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:20.793991" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:20.793885" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:20.793866" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-22T23:57:20.798089" level="INFO">${text_normalized} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "available-capabilities": {
     "available-capability": [
      {
       "capability": "(https://example.com/ns/exampl...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-22T23:57:20.794199" elapsed="0.003925"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-22T23:57:20.798178" elapsed="0.000031"/>
</return>
<msg time="2026-08-22T23:57:20.798339" level="INFO">${response_text} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "available-capabilities": {
     "available-capability": [
      {
       "capability": "(https://example.com/ns/exampl...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:57:20.762446" elapsed="0.035919"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:57:20.798429" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:57:20.798593" level="INFO">${device_status} = {
 "network-topology:node": [
  {
   "netconf-node-topology:netconf-node": {
    "available-capabilities": {
     "available-capability": [
      {
       "capability": "(https://example.com/ns/exampl...</msg>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-22T23:57:20.759805" elapsed="0.038816"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-08-22T23:57:20.798785" elapsed="0.000312"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="PASS" start="2026-08-22T23:57:20.739638" elapsed="0.059520"/>
</kw>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Connected</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:57:19.687740" elapsed="1.111472"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${NODE_CONFIGURER}</arg>
<doc>Wait for the device to become connected.
It is more readable to use this keyword in a test case than to put the whole WUKS below into it.</doc>
<status status="PASS" start="2026-08-22T23:57:19.687183" elapsed="1.112095"/>
</kw>
<doc>Wait until the device becomes visible on configurer node.</doc>
<status status="PASS" start="2026-08-22T23:57:19.405451" elapsed="1.393955"/>
</test>
<test id="s1-s8-t6" name="Wait_For_Device_To_Become_Visible_For_Checker" line="102">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:57:20.802815" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:57:20.802533" 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-08-22T23:57:20.804068" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:20.803958" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:20.803939" 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-08-22T23:57:20.809143" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:20.809035" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:20.809017" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:57:20.810209" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:57:20.809828" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:57:20.810713" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:57:20.810391" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:57:20.810785" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:57:20.810937" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:57:20.809432" 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-08-22T23:57:20.816462" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:20.816342" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:20.816323" 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-08-22T23:57:20.817728" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:20.817620" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:20.817600" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:20.818242" level="INFO">${karaf_connection_index} = 94</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:57:20.817944" elapsed="0.000325"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:20.818670" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:57:20.818423" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:57:20.851570" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:57:20.819181" elapsed="0.032508"/>
</kw>
<msg time="2026-08-22T23:57:20.851852" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:57:20.851898" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:20.818853" elapsed="0.033080"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:57:20.879918" level="INFO">"t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:57:20.852460" elapsed="0.027567"/>
</kw>
<msg time="2026-08-22T23:57:20.880186" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:57:20.880232" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:20.852100" elapsed="0.028168"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:20.880618" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:20.880346" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:20.880326" elapsed="0.000374"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:20.881138" level="INFO"> "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:20.880842" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:20.881488" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:20.881274" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:20.881256" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:57:20.881615" 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-08-22T23:57:20.884094" elapsed="0.000284"/>
</kw>
<msg time="2026-08-22T23:57:20.884440" 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-08-22T23:57:20.883034" elapsed="0.001586"/>
</kw>
<kw name="Open 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-08-22T23:57:20.884897" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:20.885238" 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-08-22T23:57:20.882396" 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-08-22T23:57:20.881875" 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-08-22T23:57:20.817291" elapsed="0.068316"/>
</kw>
<msg time="2026-08-22T23:57:20.885743" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:20.885787" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:20.816698" elapsed="0.069125"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:57:20.886005" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:57:20.885899" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:20.885881" 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-08-22T23:57:20.886480" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:20.886830" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:57:20.886903" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:57:20.815927" elapsed="0.071083"/>
</kw>
<msg time="2026-08-22T23:57:20.887102" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:20.887146" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:20.811366" elapsed="0.075816"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:20.887502" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:20.887256" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:20.887239" elapsed="0.000419"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:57:20.811227" elapsed="0.076459"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:57:20.893131" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:20.893025" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:20.893006" 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-08-22T23:57:20.894331" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:20.894224" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:20.894206" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:20.894854" level="INFO">${karaf_connection_index} = 95</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:57:20.894538" elapsed="0.000341"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:20.895251" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:57:20.895033" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:57:20.929343" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:57:20.895780" elapsed="0.033667"/>
</kw>
<msg time="2026-08-22T23:57:20.929624" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:57:20.929671" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:20.895430" elapsed="0.034277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:57:20.963621" level="INFO">"t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:57:20.930208" elapsed="0.033519"/>
</kw>
<msg time="2026-08-22T23:57:20.963882" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:57:20.963927" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:20.929873" elapsed="0.034090"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:20.964256" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:20.964039" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:20.964018" elapsed="0.000316"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:20.964808" level="INFO"> "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:20.964474" 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-08-22T23:57:20.965196" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:20.964983" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:20.964965" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:57:20.965306" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<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-08-22T23:57:20.967771" elapsed="0.000152"/>
</kw>
<msg time="2026-08-22T23:57:20.967982" 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-08-22T23:57:20.966730" elapsed="0.001380"/>
</kw>
<kw name="Open 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-08-22T23:57:20.968379" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:20.968759" elapsed="0.000235"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:57:20.966099" elapsed="0.003009"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:57:20.965554" 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-08-22T23:57:20.893926" elapsed="0.075344"/>
</kw>
<msg time="2026-08-22T23:57:20.969361" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:20.969404" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:20.893344" elapsed="0.076096"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:57:20.969655" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:57:20.969516" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:20.969498" 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-08-22T23:57:20.970127" 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-08-22T23:57:20.970456" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:57:20.970527" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:57:20.892687" elapsed="0.077973"/>
</kw>
<msg time="2026-08-22T23:57:20.970754" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:20.970797" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:20.887948" elapsed="0.082885"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:20.971152" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:20.970907" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:20.970890" elapsed="0.000340"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:57:20.887809" elapsed="0.083444"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:57:20.976760" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:20.976651" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:20.976632" 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-08-22T23:57:20.978214" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:20.978109" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:20.978091" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:20.978736" level="INFO">${karaf_connection_index} = 96</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:57:20.978421" elapsed="0.000341"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:20.979134" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:57:20.978916" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:57:21.013846" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:57:20.979669" elapsed="0.034334"/>
</kw>
<msg time="2026-08-22T23:57:21.014173" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:57:21.014221" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:20.979315" elapsed="0.034943"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:57:21.035588" level="INFO">"t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:57:21.014787" elapsed="0.020907"/>
</kw>
<msg time="2026-08-22T23:57:21.035852" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:57:21.035897" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:21.014425" elapsed="0.021508"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:21.036226" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:21.036009" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:21.035990" elapsed="0.000314"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:21.036774" level="INFO"> "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:21.036442" 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-08-22T23:57:21.037120" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:21.036909" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:21.036891" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:57:21.037230" 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-08-22T23:57:21.039668" elapsed="0.000150"/>
</kw>
<msg time="2026-08-22T23:57:21.039878" 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-08-22T23:57:21.038644" elapsed="0.001359"/>
</kw>
<kw name="Open 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-08-22T23:57:21.040270" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:21.040616" 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-08-22T23:57:21.038027" elapsed="0.002796"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:57:21.037490" elapsed="0.003397"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:57:20.977807" elapsed="0.063178"/>
</kw>
<msg time="2026-08-22T23:57:21.041077" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:21.041121" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:20.976976" elapsed="0.064182"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:57:21.041504" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-08-22T23:57:21.041234" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:21.041216" elapsed="0.000408"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:21.042013" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:21.042348" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:57:21.042419" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:57:20.976279" elapsed="0.066249"/>
</kw>
<msg time="2026-08-22T23:57:21.042646" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:21.042692" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:20.971510" elapsed="0.071217"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:21.043085" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:21.042837" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:21.042819" elapsed="0.000344"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:57:20.971374" elapsed="0.071812"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:57:20.811056" elapsed="0.232158"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:57:20.808665" elapsed="0.234604"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:57:20.803663" elapsed="0.239661"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:20.803225" elapsed="0.240144"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:57:20.800303" elapsed="0.243118"/>
</kw>
<kw name="Wait_Device_Connected" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:21.055306" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:21.053243" elapsed="0.002090"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:21.056002" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:21.055677" elapsed="0.000352"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:21.055514" elapsed="0.000551"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:21.056622" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:21.056290" elapsed="0.000359"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:21.056143" elapsed="0.000569"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:21.055385" elapsed="0.001356"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:21.057042" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:21.056805" elapsed="0.000294"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:21.057830" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:21.057348" elapsed="0.000512"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:21.057123" elapsed="0.000777"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:21.058086" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:21.057925" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:21.056788" elapsed="0.001374"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:21.058196" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:57:21.058343" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:21.052796" elapsed="0.005572"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:21.058413" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:57:21.058552" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:21.052220" elapsed="0.006373"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:21.066201" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:21.065952" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:21.066661" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:21.066398" 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-08-22T23:57:21.081476" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:21.081654" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Set-Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Fri, 21-Aug-2026 23:57:21 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:21.081762" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:21.068964" elapsed="0.013218">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:21.066771" elapsed="0.015493">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:21.082451" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:21.082297" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:21.066753" elapsed="0.015786">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:21.082920" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:21.083054" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:21.083017" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:21.083000" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:21.083257" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:21.083326" 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-08-22T23:57:21.061417" elapsed="0.022015">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:21.083500" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:21.058812" elapsed="0.024797">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:21.083775" elapsed="0.000021"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:21.044763" elapsed="0.039119">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:22.101538" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:22.099146" elapsed="0.002427"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:22.102343" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:22.102009" elapsed="0.000362"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:22.101828" elapsed="0.000580"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:22.102982" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:22.102659" elapsed="0.000349"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:22.102491" elapsed="0.000553"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:22.101660" elapsed="0.001414"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:22.103418" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:22.103151" elapsed="0.000326"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:22.104222" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:22.103752" elapsed="0.000603"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:22.103502" elapsed="0.000892"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:22.104600" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:22.104419" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:22.103129" elapsed="0.001550"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:22.104720" elapsed="0.000042"/>
</return>
<msg time="2026-08-22T23:57:22.104911" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:22.098557" elapsed="0.006380"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:22.104984" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:57:22.105127" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:22.097714" elapsed="0.007438"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:22.112451" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:22.112192" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:22.112933" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:22.112665" 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-08-22T23:57:22.122788" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:22.122961" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:22.123082" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:22.115108" elapsed="0.008380">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:22.113043" elapsed="0.010547">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:22.123805" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:22.123630" elapsed="0.000243"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:22.113025" elapsed="0.010872">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:22.124293" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:22.124431" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:22.124392" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:22.124374" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:22.124654" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:22.124727" 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-08-22T23:57:22.107857" elapsed="0.016993">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:22.124925" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:22.105374" elapsed="0.019726">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:22.125313" elapsed="0.000030"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:22.084756" elapsed="0.040698">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:23.144205" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:23.142017" elapsed="0.002222"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:23.145074" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:23.144693" elapsed="0.000408"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:23.144520" elapsed="0.000619"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:23.145706" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:23.145369" elapsed="0.000363"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:23.145220" elapsed="0.000548"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:23.144308" elapsed="0.001489"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:23.146135" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:23.145873" elapsed="0.000320"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:23.146962" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:23.146448" elapsed="0.000543"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:23.146218" elapsed="0.000810"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:23.147215" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:23.147053" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:23.145851" elapsed="0.001441"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:23.147331" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:57:23.147492" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:23.141515" elapsed="0.006003"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:23.147566" elapsed="0.000041"/>
</return>
<msg time="2026-08-22T23:57:23.147725" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:23.140934" elapsed="0.006816"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:23.155194" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:23.154934" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:23.155663" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:23.155394" 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-08-22T23:57:23.164971" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:23.165157" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:23.165308" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:23.157875" elapsed="0.007893">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:23.155775" elapsed="0.010179">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:23.166243" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:23.166005" elapsed="0.000332"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:23.155757" elapsed="0.010614">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:23.167029" elapsed="0.000048"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:23.167252" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:23.167197" elapsed="0.000114"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:23.167172" elapsed="0.000170"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:23.167545" elapsed="0.000050"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:23.167667" 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-08-22T23:57:23.150496" elapsed="0.017320">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:23.167935" elapsed="0.000027"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:23.147997" elapsed="0.020100">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:23.168333" elapsed="0.000030"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:23.126341" elapsed="0.042145">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:24.185082" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:24.182839" elapsed="0.002277"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:24.185843" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:24.185494" elapsed="0.000375"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:24.185340" elapsed="0.000567"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:24.186460" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:24.186140" elapsed="0.000347"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:24.185990" elapsed="0.000538"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:24.185189" elapsed="0.001368"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:24.186923" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:24.186651" elapsed="0.000330"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:24.187722" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:24.187238" elapsed="0.000514"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:24.187006" elapsed="0.000783"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:24.188001" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:24.187813" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:24.186629" elapsed="0.001451"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:24.188119" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:57:24.188547" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:24.182337" elapsed="0.006253"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:24.188654" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:57:24.188801" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:24.181757" elapsed="0.007070"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:24.196327" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:24.196060" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:24.196788" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:24.196527" 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-08-22T23:57:24.206086" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:24.206290" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:24.206435" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:24.198945" elapsed="0.008062">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:24.196901" elapsed="0.010223">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:24.207391" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:24.207172" elapsed="0.000311"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:24.196882" elapsed="0.010635">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:24.208084" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:24.208270" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:24.208219" elapsed="0.000109"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:24.208195" elapsed="0.000163"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:24.208553" elapsed="0.000049"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:24.208678" 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-08-22T23:57:24.191631" elapsed="0.017196">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:24.208923" elapsed="0.000021"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:24.189052" elapsed="0.020002">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:24.209285" elapsed="0.000030"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:24.169282" elapsed="0.040154">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:25.229928" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:25.227011" elapsed="0.002962"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:25.230936" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:25.230476" elapsed="0.000501"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:25.230268" elapsed="0.000760"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:25.231826" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:25.231349" elapsed="0.000516"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:25.231141" elapsed="0.000793"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:25.230067" elapsed="0.001908"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:25.232401" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:25.232085" elapsed="0.000379"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:25.233222" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:25.232744" elapsed="0.000507"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:25.232491" elapsed="0.000798"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:25.233479" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:25.233314" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:25.232054" elapsed="0.001502"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:25.233614" elapsed="0.000040"/>
</return>
<msg time="2026-08-22T23:57:25.233784" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:25.226296" elapsed="0.007514"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:25.233858" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:57:25.234001" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:25.225424" elapsed="0.008603"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:25.241642" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:25.241306" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:25.242115" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:25.241865" 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-08-22T23:57:25.251615" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:25.251810" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:25.251963" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:25.244301" elapsed="0.008239">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:25.242227" elapsed="0.010454">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:25.252973" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:25.252733" elapsed="0.000332"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:25.242208" elapsed="0.010890">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:25.253774" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:25.253972" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:25.253915" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:25.253890" elapsed="0.000176"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:25.254266" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:25.254366" elapsed="0.000020"/>
</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-08-22T23:57:25.236922" elapsed="0.017595">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:25.254637" elapsed="0.000023"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:25.234253" elapsed="0.020522">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:25.255016" elapsed="0.000031"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:25.210490" elapsed="0.044682">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:26.273171" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:26.270987" elapsed="0.002219"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:26.273961" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:26.273630" elapsed="0.000358"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:26.273449" elapsed="0.000577"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:26.274592" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:26.274257" elapsed="0.000363"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:26.274108" elapsed="0.000549"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:26.273283" elapsed="0.001403"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:26.275042" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:26.274766" elapsed="0.000335"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:26.275842" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:26.275359" elapsed="0.000512"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:26.275127" elapsed="0.000780"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:26.276095" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:26.275932" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:26.274744" elapsed="0.001427"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:26.276211" elapsed="0.000038"/>
</return>
<msg time="2026-08-22T23:57:26.276374" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:26.270476" elapsed="0.005924"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:26.276449" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:57:26.276604" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:26.269850" elapsed="0.006781"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:26.284538" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:26.284252" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:26.285027" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:26.284766" 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-08-22T23:57:26.294227" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:26.294400" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:26.294522" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:26.287436" elapsed="0.007518">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:26.285149" elapsed="0.009897">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:26.295249" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:26.295084" elapsed="0.000231"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:26.285125" elapsed="0.010215">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:26.295777" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:26.295924" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:26.295882" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:26.295863" elapsed="0.000128"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:26.296136" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:26.296207" elapsed="0.000014"/>
</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-08-22T23:57:26.279437" elapsed="0.016882">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:26.296392" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:26.276863" elapsed="0.019626">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:26.296696" elapsed="0.000023"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:26.256033" elapsed="0.040775">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:27.314740" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:27.312487" elapsed="0.002287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:27.315479" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:27.315145" elapsed="0.000362"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:27.314988" elapsed="0.000556"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:27.316123" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:27.315799" elapsed="0.000413"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:27.315647" elapsed="0.000604"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:27.314842" elapsed="0.001439"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:27.316633" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:27.316353" elapsed="0.000340"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:27.317423" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:27.316952" elapsed="0.000499"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:27.316718" elapsed="0.000771"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:27.317694" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:27.317514" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:27.316333" elapsed="0.001441"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:27.317811" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:57:27.317971" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:27.312002" elapsed="0.005995"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:27.318045" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:57:27.318189" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:27.311407" elapsed="0.006808"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:27.325515" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:27.325258" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:27.325973" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:27.325730" 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-08-22T23:57:27.335911" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:27.336082" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:27.336207" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:27.328152" elapsed="0.008464">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:27.326082" elapsed="0.010616">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:27.336886" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:27.336731" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:27.326065" elapsed="0.010909">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:27.337342" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:27.337476" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:27.337438" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:27.337421" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:27.337695" elapsed="0.000059"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:27.337808" 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-08-22T23:57:27.320934" elapsed="0.016979">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:27.337989" elapsed="0.000019"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:27.318438" elapsed="0.019703">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:27.338311" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:27.297648" elapsed="0.040772">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:28.357843" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:28.355617" elapsed="0.002256"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:28.358548" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:28.358220" elapsed="0.000355"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:28.358064" elapsed="0.000564"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:28.359179" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:28.358858" elapsed="0.000347"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:28.358709" elapsed="0.000532"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:28.357929" elapsed="0.001342"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:28.359717" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:28.359336" elapsed="0.000443"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:28.360506" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:28.360039" elapsed="0.000495"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:28.359804" elapsed="0.000798"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:28.360794" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:28.360630" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:28.359318" elapsed="0.001552"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:28.360904" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:57:28.361057" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:28.355136" elapsed="0.005949"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:28.361134" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:57:28.361275" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:28.354566" elapsed="0.006735"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:28.368544" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:28.368266" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:28.369011" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:28.368768" 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-08-22T23:57:28.378472" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:28.378672" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:28.378770" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:28.371155" elapsed="0.007966">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:28.369120" elapsed="0.010079">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:28.379386" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:28.379232" elapsed="0.000219"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:28.369102" elapsed="0.010373">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:28.379862" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:28.379999" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:28.379961" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:28.379943" elapsed="0.000130"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:28.380215" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:28.380285" 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-08-22T23:57:28.363968" elapsed="0.016421">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:28.380459" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:28.361520" elapsed="0.019034">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:28.380746" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:28.339031" elapsed="0.041824">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:29.398471" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:29.396047" elapsed="0.002474"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:29.399290" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:29.398954" elapsed="0.000364"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:29.398800" elapsed="0.000555"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:29.399924" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:29.399601" elapsed="0.000350"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:29.399437" elapsed="0.000549"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:29.398642" elapsed="0.001373"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:29.400356" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:29.400091" elapsed="0.000324"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:29.401174" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:29.400688" elapsed="0.000515"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:29.400441" elapsed="0.000996"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:29.401648" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:29.401466" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:29.400069" elapsed="0.001660"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:29.401769" elapsed="0.000038"/>
</return>
<msg time="2026-08-22T23:57:29.401936" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:29.395542" elapsed="0.006420"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:29.402010" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:57:29.402157" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:29.394960" elapsed="0.007223"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:29.409456" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:29.409197" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:29.409914" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:29.409670" 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-08-22T23:57:29.419643" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:29.419804" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:29.419924" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:29.412106" elapsed="0.008335">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:29.410025" elapsed="0.010530">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:29.420843" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:29.420625" elapsed="0.000309"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:29.410007" elapsed="0.010961">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:29.421501" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:29.421713" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:29.421661" elapsed="0.000108"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:29.421635" elapsed="0.000164"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:29.422010" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:29.422114" 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-08-22T23:57:29.404897" elapsed="0.017363">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:29.422356" elapsed="0.000021"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:29.402416" elapsed="0.020070">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:29.422821" elapsed="0.000031"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:29.381793" elapsed="0.041185">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:30.441714" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:30.439593" elapsed="0.002151"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:30.442429" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:30.442102" elapsed="0.000353"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:30.441947" elapsed="0.000545"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:30.443062" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:30.442739" elapsed="0.000350"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:30.442573" elapsed="0.000552"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:30.441806" elapsed="0.001348"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:30.443476" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:30.443225" elapsed="0.000309"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:30.444289" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:30.443823" elapsed="0.000494"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:30.443558" elapsed="0.000795"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:30.444540" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:30.444378" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:30.443205" elapsed="0.001430"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:30.444674" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:57:30.444830" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:30.439108" elapsed="0.005748"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:30.444902" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:57:30.445045" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:30.438525" elapsed="0.006545"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:30.452355" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:30.452097" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:30.452811" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:30.452552" 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-08-22T23:57:30.463250" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:30.463398" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:30.463511" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:30.454961" elapsed="0.009052">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:30.452921" elapsed="0.011234">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:30.464346" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:30.464190" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:30.452903" elapsed="0.011532">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:30.464819" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:30.464959" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:30.464921" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:30.464903" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:30.465190" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:30.465270" 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-08-22T23:57:30.447794" elapsed="0.017581">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:30.465445" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:30.445291" elapsed="0.020251">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:30.465726" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:30.423705" elapsed="0.042130">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:31.483816" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:31.481574" elapsed="0.002279"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:31.484602" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:31.484256" elapsed="0.000374"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:31.484100" elapsed="0.000568"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:31.485224" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:31.484902" elapsed="0.000350"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:31.484753" elapsed="0.000535"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:31.483940" elapsed="0.001377"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:31.485693" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:31.485402" elapsed="0.000351"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:31.486477" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:31.486013" elapsed="0.000492"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:31.485780" elapsed="0.000761"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:31.486746" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:31.486567" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:31.485379" elapsed="0.001443"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:31.486863" elapsed="0.000042"/>
</return>
<msg time="2026-08-22T23:57:31.487035" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:31.481079" elapsed="0.005983"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:31.487111" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:57:31.487335" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:31.480465" elapsed="0.006895"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:31.494637" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:31.494359" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:31.495083" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:31.494838" 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-08-22T23:57:31.506931" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:31.507104" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:31.507220" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:31.497246" elapsed="0.010455">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:31.495199" elapsed="0.012590">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:31.507986" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:31.507824" elapsed="0.000229"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:31.495181" elapsed="0.012897">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:31.508919" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:31.509221" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:31.509137" elapsed="0.000177"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:31.509098" 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-08-22T23:57:31.509711" elapsed="0.000050"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:31.509873" elapsed="0.000033"/>
</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-08-22T23:57:31.490065" elapsed="0.020051">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:31.510293" elapsed="0.000033"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:31.487598" elapsed="0.022903">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:31.510906" elapsed="0.000049"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:31.466568" elapsed="0.044583">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:32.529464" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:32.527320" elapsed="0.002247"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:32.530303" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:32.529961" elapsed="0.000379"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:32.529806" elapsed="0.000580"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:32.531012" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:32.530676" elapsed="0.000363"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:32.530494" elapsed="0.000581"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:32.529655" elapsed="0.001451"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:32.531456" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:32.531187" elapsed="0.000329"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:32.532290" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:32.531808" elapsed="0.000510"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:32.531543" elapsed="0.000812"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:32.532548" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:32.532381" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:32.531165" elapsed="0.001479"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:32.532685" elapsed="0.000039"/>
</return>
<msg time="2026-08-22T23:57:32.532856" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:32.526836" elapsed="0.006046"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:32.532929" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:57:32.533078" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:32.526202" elapsed="0.006903"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:32.540433" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:32.540164" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:32.540923" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:32.540666" 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-08-22T23:57:32.549045" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:32.549220" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:32.549348" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:32.543121" elapsed="0.006822">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:32.541039" elapsed="0.008994">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:32.550273" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:32.550072" elapsed="0.000272"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:32.541021" elapsed="0.009348">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:32.550807" elapsed="0.000088"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:32.551019" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:32.550977" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:32.550956" elapsed="0.000129"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:32.551231" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:32.551305" 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-08-22T23:57:32.535836" elapsed="0.015579">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:32.551487" elapsed="0.000017"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:32.533338" elapsed="0.018261">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:32.551787" elapsed="0.000024"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:32.512059" elapsed="0.039843">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:33.572374" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:33.570213" elapsed="0.002196"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:33.573133" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:33.572806" elapsed="0.000354"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:33.572651" elapsed="0.000549"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:33.573767" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:33.573431" elapsed="0.000362"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:33.573282" elapsed="0.000546"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:33.572481" elapsed="0.001376"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:33.574269" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:33.573934" elapsed="0.000395"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:33.575067" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:33.574600" elapsed="0.000495"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:33.574354" elapsed="0.000777"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:33.575336" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:33.575155" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:33.573913" elapsed="0.001502"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:33.575454" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:57:33.575647" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:33.569727" elapsed="0.005947"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:33.575723" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:57:33.575865" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:33.569137" elapsed="0.006754"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:33.583126" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:33.582869" elapsed="0.000391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:33.583686" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:33.583415" 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-08-22T23:57:33.594940" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:33.595109" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:33.595216" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:33.585956" elapsed="0.009673">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:33.583797" elapsed="0.011915">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:33.595904" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:33.595746" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:33.583779" elapsed="0.012216">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:33.596366" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:33.596500" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:33.596462" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:33.596445" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:33.596722" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:33.596792" 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-08-22T23:57:33.578555" elapsed="0.018342">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:33.596967" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:33.576110" elapsed="0.020952">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:33.597233" elapsed="0.000021"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:33.552778" elapsed="0.044562">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:34.618190" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:34.614615" elapsed="0.003628"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:34.619334" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:34.618846" elapsed="0.000528"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:34.618610" elapsed="0.000819"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:34.620267" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:34.619792" elapsed="0.000514"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:34.619551" elapsed="0.000913"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:34.618356" elapsed="0.002156"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:34.621050" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:34.620657" elapsed="0.000478"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:34.622249" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:34.621513" elapsed="0.000782"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:34.621173" elapsed="0.001203"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:34.622677" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:34.622415" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:34.620622" elapsed="0.002172"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:34.622852" elapsed="0.000057"/>
</return>
<msg time="2026-08-22T23:57:34.623147" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:34.613818" elapsed="0.009370"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:34.623260" elapsed="0.000041"/>
</return>
<msg time="2026-08-22T23:57:34.623473" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:34.612839" elapsed="0.010671"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:34.634329" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:34.634052" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:34.634798" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:34.634534" 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-08-22T23:57:34.644635" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:34.644830" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:34.644969" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:34.636955" elapsed="0.008456">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:34.634912" elapsed="0.010588">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:34.645710" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:34.645537" elapsed="0.000249"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:34.634892" elapsed="0.010920">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:34.646208" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:34.646344" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:34.646306" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:34.646288" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:34.646551" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:34.646638" elapsed="0.000066"/>
</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-08-22T23:57:34.629679" elapsed="0.017125">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:34.646875" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:34.623890" elapsed="0.023082">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:34.647140" elapsed="0.000021"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:34.598231" elapsed="0.049018">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:35.665386" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:35.663013" elapsed="0.002409"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:35.666157" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:35.665829" elapsed="0.000354"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:35.665673" elapsed="0.000548"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:35.666829" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:35.666455" elapsed="0.000400"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:35.666306" elapsed="0.000586"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:35.665499" elapsed="0.001422"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:35.667275" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:35.667004" elapsed="0.000329"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:35.668071" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:35.667606" elapsed="0.000494"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:35.667360" elapsed="0.000777"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:35.668324" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:35.668162" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:35.666982" elapsed="0.001418"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:35.668443" elapsed="0.000039"/>
</return>
<msg time="2026-08-22T23:57:35.668626" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:35.662504" elapsed="0.006149"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:35.668700" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:57:35.668848" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:35.661924" elapsed="0.006949"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:35.676203" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:35.675941" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:35.676665" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:35.676405" 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-08-22T23:57:35.687974" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:35.688223" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:35.688337" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:35.678850" elapsed="0.009924">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:35.676776" elapsed="0.012083">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:35.689050" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:35.688893" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:35.676758" elapsed="0.012383">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:35.689516" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:35.689669" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:35.689631" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:35.689613" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:35.689874" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:35.689945" 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-08-22T23:57:35.671599" elapsed="0.018452">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:35.690120" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:35.669094" elapsed="0.021121">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:35.690412" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:35.648070" elapsed="0.042453">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:36.707997" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:36.705839" elapsed="0.002192"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:36.708780" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:36.708409" elapsed="0.000399"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:36.708254" elapsed="0.000592"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:36.709397" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:36.709077" elapsed="0.000346"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:36.708927" elapsed="0.000532"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:36.708104" elapsed="0.001384"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:36.709848" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:36.709564" elapsed="0.000344"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:36.710659" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:36.710171" elapsed="0.000517"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:36.709939" elapsed="0.000862"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:36.710993" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:36.710828" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:36.709543" elapsed="0.001527"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:36.711111" elapsed="0.000041"/>
</return>
<msg time="2026-08-22T23:57:36.711284" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:36.705327" elapsed="0.005984"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:36.711358" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:57:36.711499" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:36.704748" elapsed="0.006777"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:36.718814" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:36.718538" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:36.719299" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:36.719017" 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-08-22T23:57:36.728928" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:36.729091" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:36.729203" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:36.721801" elapsed="0.007828">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:36.719429" elapsed="0.010284">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:36.729903" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:36.729747" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:36.719409" elapsed="0.010591">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:36.730375" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:36.730509" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:36.730470" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:36.730453" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:36.730730" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:36.730801" 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-08-22T23:57:36.714234" elapsed="0.016672">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:36.730976" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:36.711760" elapsed="0.019309">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:36.731270" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:36.691357" elapsed="0.040023">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:37.748157" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:37.745978" elapsed="0.002212"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:37.748908" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:37.748563" elapsed="0.000373"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:37.748410" elapsed="0.000564"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:37.749530" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:37.749206" elapsed="0.000350"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:37.749057" elapsed="0.000552"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:37.748260" elapsed="0.001380"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:37.749989" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:37.749717" elapsed="0.000331"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:37.750793" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:37.750305" elapsed="0.000518"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:37.750073" elapsed="0.000786"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:37.751049" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:37.750885" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:37.749696" elapsed="0.001432"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:37.751165" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:57:37.751330" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:37.745478" elapsed="0.005879"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:37.751404" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:57:37.751550" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:37.744890" elapsed="0.006701"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:37.758921" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:37.758663" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:37.759363" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:37.759121" 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-08-22T23:57:37.772659" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:37.772859" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:37.773005" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:37.761535" elapsed="0.011981">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:37.759472" elapsed="0.014250">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:37.773995" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:37.773775" elapsed="0.000314"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:37.759453" elapsed="0.014671">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:37.774667" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:37.774859" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:37.774805" elapsed="0.000113"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:37.774781" elapsed="0.000169"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:37.775147" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:37.775247" 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-08-22T23:57:37.754314" elapsed="0.021085">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:37.776240" elapsed="0.000024"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:37.751827" elapsed="0.024557">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:37.776643" elapsed="0.000031"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:37.732263" elapsed="0.044536">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:38.794840" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:38.792687" elapsed="0.002185"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:38.795561" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:38.795233" elapsed="0.000371"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:38.795080" elapsed="0.000562"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:38.796206" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:38.795871" elapsed="0.000362"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:38.795722" elapsed="0.000546"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:38.794936" elapsed="0.001362"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:38.796645" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:38.796369" elapsed="0.000334"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:38.797430" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:38.796959" elapsed="0.000499"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:38.796727" elapsed="0.000766"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:38.797696" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:38.797519" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:38.796350" elapsed="0.001423"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:38.797811" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:57:38.797968" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:38.792192" elapsed="0.005802"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:38.798041" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:57:38.798250" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:38.791475" elapsed="0.006802"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:38.805559" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:38.805300" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:38.806021" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:38.805777" 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-08-22T23:57:38.815795" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:38.815953" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:38.816055" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:38.808203" elapsed="0.008222">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:38.806133" elapsed="0.010373">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:38.816713" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:38.816539" elapsed="0.000246"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:38.806115" elapsed="0.010694">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:38.817179" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:38.817313" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:38.817275" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:38.817258" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:38.817517" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:38.817603" 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-08-22T23:57:38.800990" elapsed="0.016718">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:38.817778" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:38.798498" elapsed="0.019374">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:38.818039" elapsed="0.000021"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:38.777508" elapsed="0.040638">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:39.837232" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:39.835085" elapsed="0.002270"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:39.838084" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:39.837748" elapsed="0.000363"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:39.837591" elapsed="0.000557"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:39.838725" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:39.838381" elapsed="0.000371"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:39.838230" elapsed="0.000559"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:39.837426" elapsed="0.001393"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:39.839155" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:39.838891" elapsed="0.000321"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:39.839958" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:39.839474" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:39.839238" elapsed="0.000785"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:39.840212" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:39.840048" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:39.838872" elapsed="0.001418"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:39.840327" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:57:39.840487" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:39.834607" elapsed="0.005905"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:39.840559" elapsed="0.000040"/>
</return>
<msg time="2026-08-22T23:57:39.840717" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:39.834020" elapsed="0.006722"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:39.848047" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:39.847791" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:39.848488" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:39.848245" 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-08-22T23:57:39.859258" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:39.859413" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:39.859518" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:39.850731" elapsed="0.009190">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:39.848613" elapsed="0.011389">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:39.860191" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:39.860036" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:39.848594" elapsed="0.011687">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:39.860669" elapsed="0.000060"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:39.860843" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:39.860805" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:39.860787" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:39.861074" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:39.861147" 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-08-22T23:57:39.843466" elapsed="0.017786">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:39.861323" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:39.840963" elapsed="0.020455">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:39.861714" elapsed="0.000050"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:39.818970" elapsed="0.042987">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:40.881532" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:40.879403" elapsed="0.002162"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:40.882272" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:40.881943" elapsed="0.000357"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:40.881790" elapsed="0.000548"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:40.882907" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:40.882569" elapsed="0.000364"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:40.882419" elapsed="0.000551"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:40.881645" elapsed="0.001355"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:40.883347" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:40.883069" elapsed="0.000337"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:40.884155" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:40.883683" elapsed="0.000501"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:40.883431" elapsed="0.000790"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:40.884411" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:40.884247" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:40.883050" elapsed="0.001439"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:40.884527" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:57:40.884702" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:40.878910" elapsed="0.005819"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:40.884776" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:57:40.884920" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:40.878313" elapsed="0.006646"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:40.892254" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:40.891998" elapsed="0.000379"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:40.892799" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:40.892532" 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-08-22T23:57:40.905662" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:40.906106" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:40.906328" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:40.894964" elapsed="0.012196">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:40.892912" elapsed="0.014437">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:40.907826" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:40.907438" elapsed="0.000537"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:40.892894" elapsed="0.015135">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:40.908870" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:40.909173" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:40.909089" elapsed="0.000178"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:40.909050" 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-08-22T23:57:40.909660" elapsed="0.000050"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:40.909820" elapsed="0.000034"/>
</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-08-22T23:57:40.887698" elapsed="0.022355">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:40.910211" elapsed="0.000034"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:40.885181" elapsed="0.025244">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:40.910826" elapsed="0.000049"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:40.862879" elapsed="0.048213">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:41.928838" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:41.926546" elapsed="0.002323"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:41.929559" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:41.929228" elapsed="0.000374"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:41.929074" elapsed="0.000567"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:41.930213" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:41.929874" elapsed="0.000366"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:41.929722" elapsed="0.000614"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:41.928933" elapsed="0.001436"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:41.930716" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:41.930441" elapsed="0.000335"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:41.931512" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:41.931036" elapsed="0.000505"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:41.930801" elapsed="0.000792"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:41.931785" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:41.931620" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:41.930422" elapsed="0.001441"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:41.931900" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:57:41.932060" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:41.926070" elapsed="0.006016"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:41.932133" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:57:41.932278" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:41.925479" elapsed="0.006825"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:41.939892" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:41.939635" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:41.940332" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:41.940093" 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-08-22T23:57:41.958153" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:41.958302" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:41.958426" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:41.942512" elapsed="0.016728">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:41.940442" elapsed="0.018977">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:41.959867" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:41.959493" elapsed="0.000520"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:41.940424" elapsed="0.019642">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:41.960915" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:41.961213" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:41.961130" elapsed="0.000174"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:41.961092" 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-08-22T23:57:41.963032" elapsed="0.000175"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:41.963387" elapsed="0.000229"/>
</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-08-22T23:57:41.935031" elapsed="0.028898">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:41.964099" elapsed="0.000036"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:41.932525" elapsed="0.031791">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:41.964766" elapsed="0.000050"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:41.911921" elapsed="0.053094">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<msg time="2026-08-22T23:57:41.965256" level="FAIL">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Connected</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:57:21.044180" elapsed="20.921313">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${NODE_CHECKER}</arg>
<doc>Wait for the device to become connected.
It is more readable to use this keyword in a test case than to put the whole WUKS below into it.</doc>
<status status="FAIL" start="2026-08-22T23:57:21.043711" elapsed="20.922087">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<doc>Wait until the device becomes visible on checker node.</doc>
<status status="FAIL" start="2026-08-22T23:57:20.799744" elapsed="21.166410">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</test>
<test id="s1-s8-t7" name="Wait_For_Device_To_Become_Visible_For_Setter" line="106">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:57:41.972402" elapsed="0.000251"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:57:41.972137" 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-08-22T23:57:41.973747" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:41.973612" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:41.973592" 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-08-22T23:57:41.978669" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:41.978546" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:41.978528" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:57:41.979741" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:57:41.979336" elapsed="0.000433"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:57:41.980238" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:57:41.979930" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:57:41.980310" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:57:41.980468" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:57:41.978957" elapsed="0.001537"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:57:41.985897" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:41.985789" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:41.985770" 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-08-22T23:57:41.987146" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:41.987039" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:41.987021" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:41.987733" level="INFO">${karaf_connection_index} = 94</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:57:41.987359" elapsed="0.000401"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:41.988149" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:57:41.987921" elapsed="0.000254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:57:42.024655" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:57:41.988701" elapsed="0.036189"/>
</kw>
<msg time="2026-08-22T23:57:42.025054" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:57:42.025101" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:41.988330" elapsed="0.036808"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:57:42.052837" level="INFO">"t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "S "e "t "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-08-22T23:57:42.025699" elapsed="0.027244"/>
</kw>
<msg time="2026-08-22T23:57:42.053102" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:57:42.053147" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:42.025309" elapsed="0.027875"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:42.053495" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:42.053261" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:42.053241" elapsed="0.000355"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:42.054037" level="INFO"> "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "S "e "t "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-08-22T23:57:42.053740" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:42.054387" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:42.054173" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:42.054155" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:57:42.054500" 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-08-22T23:57:42.057009" elapsed="0.000151"/>
</kw>
<msg time="2026-08-22T23:57:42.057220" 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-08-22T23:57:42.055947" 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="NOT RUN" start="2026-08-22T23:57:42.057658" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:42.057985" 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-08-22T23:57:42.055309" elapsed="0.002858"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:57:42.054783" elapsed="0.003449"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:57:41.986738" elapsed="0.071591"/>
</kw>
<msg time="2026-08-22T23:57:42.058420" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:42.058463" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:41.986115" elapsed="0.072385"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:57:42.058707" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:57:42.058575" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:42.058557" 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-08-22T23:57:42.059179" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:42.059507" elapsed="0.000057"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:57:42.059636" 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-08-22T23:57:41.985424" elapsed="0.074324"/>
</kw>
<msg time="2026-08-22T23:57:42.059841" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:42.059885" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:41.980877" elapsed="0.079045"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:42.060242" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:42.059996" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:42.059979" elapsed="0.000342"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:57:41.980735" elapsed="0.079610"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:57:42.065869" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:42.065762" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:42.065744" 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-08-22T23:57:42.067205" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:42.067099" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:42.067080" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:42.067883" level="INFO">${karaf_connection_index} = 95</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:57:42.067415" elapsed="0.000494"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:42.068279" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:57:42.068062" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:57:42.100146" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:57:42.068813" elapsed="0.031438"/>
</kw>
<msg time="2026-08-22T23:57:42.100415" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:57:42.100462" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:42.068458" elapsed="0.032040"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:57:42.119801" level="INFO">"t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "S "e "t "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-08-22T23:57:42.101030" elapsed="0.018876"/>
</kw>
<msg time="2026-08-22T23:57:42.120063" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:57:42.120109" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:42.100690" elapsed="0.019456"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:42.120442" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:42.120222" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:42.120203" elapsed="0.000318"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:42.120978" level="INFO"> "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "S "e "t "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-08-22T23:57:42.120683" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:42.121372" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:42.121157" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:42.121140" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:57:42.121482" 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-08-22T23:57:42.123955" elapsed="0.000149"/>
</kw>
<msg time="2026-08-22T23:57:42.124164" 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-08-22T23:57:42.122910" elapsed="0.001420"/>
</kw>
<kw name="Open 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-08-22T23:57:42.124618" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:42.124950" elapsed="0.000087"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:57:42.122279" elapsed="0.002872"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:57:42.121756" 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-08-22T23:57:42.066779" elapsed="0.058533"/>
</kw>
<msg time="2026-08-22T23:57:42.125404" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:42.125447" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:42.066086" elapsed="0.059398"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:57:42.125759" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:57:42.125647" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:42.125623" elapsed="0.000220"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:42.126233" 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-08-22T23:57:42.126563" elapsed="0.000046"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:57:42.126658" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:57:42.065396" elapsed="0.061371"/>
</kw>
<msg time="2026-08-22T23:57:42.126860" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:42.126904" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:42.060706" elapsed="0.066234"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:42.127259" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:42.127014" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:42.126997" elapsed="0.000340"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:57:42.060474" elapsed="0.066887"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:57:42.132768" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:42.132660" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:42.132641" 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-08-22T23:57:42.134036" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:42.133930" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:42.133912" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:57:42.134534" level="INFO">${karaf_connection_index} = 96</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:57:42.134244" elapsed="0.000316"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:57:42.134950" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:57:42.134733" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:57:42.167077" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:57:42.135462" elapsed="0.031714"/>
</kw>
<msg time="2026-08-22T23:57:42.167352" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:57:42.167398" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:42.135129" elapsed="0.032305"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:57:42.198919" level="INFO">"t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "S "e "t "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-08-22T23:57:42.168271" elapsed="0.030812"/>
</kw>
<msg time="2026-08-22T23:57:42.199250" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:57:42.199297" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:42.167768" elapsed="0.031566"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:42.199688" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:42.199422" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:42.199396" elapsed="0.000374"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:42.200221" level="INFO"> "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b "l "e "_ "F "o "r "_ "S "e "t "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-08-22T23:57:42.199911" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:42.200570" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:42.200357" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:42.200339" elapsed="0.000337"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:57:42.200711" 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-08-22T23:57:42.203218" elapsed="0.000159"/>
</kw>
<msg time="2026-08-22T23:57:42.203438" 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-08-22T23:57:42.202155" elapsed="0.001411"/>
</kw>
<kw name="Open 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-08-22T23:57:42.203856" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:42.204183" 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-08-22T23:57:42.201516" elapsed="0.002852"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:57:42.200979" elapsed="0.003456"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:57:42.133629" elapsed="0.070904"/>
</kw>
<msg time="2026-08-22T23:57:42.204666" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:42.204713" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:42.133006" elapsed="0.071745"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:57:42.204938" elapsed="0.000091"/>
</return>
<status status="PASS" start="2026-08-22T23:57:42.204833" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:42.204814" 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 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:42.205485" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:42.205841" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:57:42.205912" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:57:42.132309" elapsed="0.073712"/>
</kw>
<msg time="2026-08-22T23:57:42.206117" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:57:42.206161" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "W "a "i "t "_ "F "o "r "_ "D "e "v "i "c "e "_ "T "o "_ "B "e "c "o "m "e "_ "V "i "s "i "b ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:42.127721" elapsed="0.078477"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:42.206519" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:42.206273" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:42.206256" elapsed="0.000441"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:57:42.127488" elapsed="0.079234"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:57:41.980547" elapsed="0.226206"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:57:41.978187" elapsed="0.228626"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:57:41.973305" elapsed="0.233622"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:57:41.972865" elapsed="0.234112"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:57:41.968302" elapsed="0.238732"/>
</kw>
<kw name="Wait_Device_Connected" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:42.220673" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:42.216748" elapsed="0.003953"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:42.221379" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:42.221051" elapsed="0.000355"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:42.220898" elapsed="0.000545"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:42.222016" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:42.221693" elapsed="0.000350"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:42.221523" elapsed="0.000557"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:42.220761" elapsed="0.001349"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:42.222414" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:42.222174" elapsed="0.000298"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:42.223214" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:42.222744" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:42.222496" elapsed="0.000782"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:42.223467" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:42.223304" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:42.222157" elapsed="0.001389"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:42.223597" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:57:42.223749" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:42.216260" elapsed="0.007516"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:42.223822" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:57:42.224056" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:42.215700" elapsed="0.008382"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:42.231320" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:42.231068" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:42.231783" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:42.231521" 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-08-22T23:57:42.244784" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:42.244939" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Set-Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Fri, 21-Aug-2026 23:57:42 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:42.245048" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:42.233960" elapsed="0.011523">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:42.231896" elapsed="0.013728">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:42.245817" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:42.245659" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:42.231878" elapsed="0.014029">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:42.246282" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:42.246423" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:42.246380" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:42.246362" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:42.246644" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:42.246716" 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-08-22T23:57:42.226770" elapsed="0.020052">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:42.246892" elapsed="0.000017"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:42.224304" elapsed="0.022686">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:42.247158" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:42.208309" elapsed="0.038958">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:43.262445" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:43.260297" elapsed="0.002181"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:43.263189" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:43.262862" elapsed="0.000353"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:43.262707" elapsed="0.000545"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:43.263821" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:43.263483" elapsed="0.000364"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:43.263334" elapsed="0.000550"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:43.262546" elapsed="0.001368"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:43.264262" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:43.263988" elapsed="0.000333"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:43.265077" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:43.264604" elapsed="0.000502"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:43.264346" elapsed="0.000798"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:43.265335" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:43.265169" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:43.263967" elapsed="0.001447"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:43.265456" elapsed="0.000035"/>
</return>
<msg time="2026-08-22T23:57:43.265632" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:43.259803" elapsed="0.005927"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:43.265780" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:57:43.265927" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:43.259025" elapsed="0.006928"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:43.273248" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:43.272991" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:43.273718" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:43.273451" 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-08-22T23:57:43.283542" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:43.283877" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:43.284124" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:43.275877" elapsed="0.009054">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:43.273829" elapsed="0.011285">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:43.285542" elapsed="0.000081"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:43.285192" elapsed="0.000532"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:43.273811" elapsed="0.011969">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:43.286618" elapsed="0.000058"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:43.286919" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:43.286836" elapsed="0.000177"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:43.286799" 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-08-22T23:57:43.287374" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:43.287529" elapsed="0.000032"/>
</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-08-22T23:57:43.268668" elapsed="0.019122">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:43.287942" elapsed="0.000035"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:43.266176" elapsed="0.022000">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:43.288545" elapsed="0.000075"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:43.247846" elapsed="0.040970">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:44.309748" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:44.307439" elapsed="0.002349"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:44.310540" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:44.310199" elapsed="0.000389"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:44.310040" elapsed="0.000590"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:44.311202" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:44.310876" elapsed="0.000353"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:44.310718" elapsed="0.000548"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:44.309875" elapsed="0.001420"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:44.311670" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:44.311379" elapsed="0.000352"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:44.312474" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:44.311993" elapsed="0.000510"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:44.311758" elapsed="0.000782"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:44.312748" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:44.312565" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:44.311356" elapsed="0.001471"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:44.312868" elapsed="0.000042"/>
</return>
<msg time="2026-08-22T23:57:44.313039" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:44.306802" elapsed="0.006264"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:44.313113" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:57:44.313256" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:44.306172" elapsed="0.007111"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:44.320669" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:44.320381" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:44.321122" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:44.320875" 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-08-22T23:57:44.331367" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:44.331543" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:44.331682" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:44.323333" elapsed="0.008821">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:44.321232" elapsed="0.011012">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:44.332437" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:44.332279" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:44.321214" elapsed="0.011314">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:44.332964" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:44.333100" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:44.333062" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:44.333045" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:44.333303" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:44.333372" 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-08-22T23:57:44.315994" elapsed="0.017492">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:44.333554" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:44.313504" elapsed="0.020161">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:44.333834" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:44.289789" elapsed="0.044152">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:45.353688" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:45.350598" elapsed="0.003141"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:45.354749" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:45.354268" elapsed="0.000519"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:45.354050" elapsed="0.000789"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:45.355672" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:45.355183" elapsed="0.000638"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:45.354974" elapsed="0.000901"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:45.353841" elapsed="0.002075"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:45.356404" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:45.356026" elapsed="0.000460"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:45.357544" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:45.356889" elapsed="0.000715"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:45.356523" elapsed="0.001134"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:45.357926" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:45.357694" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:45.355995" elapsed="0.002038"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:45.358090" elapsed="0.000052"/>
</return>
<msg time="2026-08-22T23:57:45.358323" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:45.349557" elapsed="0.008803"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:45.358428" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:57:45.358649" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:45.348739" elapsed="0.009947"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:45.367013" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:45.366749" elapsed="0.000455"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:45.367631" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:45.367362" 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-08-22T23:57:45.375776" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:45.375963" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:45.376083" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:45.369816" elapsed="0.006704">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:45.367745" elapsed="0.008896">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:45.376838" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:45.376679" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:45.367726" elapsed="0.009204">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:45.377310" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:45.377444" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:45.377407" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:45.377390" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:45.377671" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:45.377743" 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-08-22T23:57:45.362290" elapsed="0.015561">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:45.377921" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:45.358999" elapsed="0.019017">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:45.378185" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:45.334823" elapsed="0.043470">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:46.398124" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:46.395025" elapsed="0.003146"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:46.399054" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:46.398702" elapsed="0.000381"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:46.398481" elapsed="0.000642"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:46.399744" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:46.399360" elapsed="0.000412"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:46.399208" elapsed="0.000688"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:46.398272" elapsed="0.001655"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:46.400290" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:46.400011" elapsed="0.000339"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:46.401119" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:46.400638" elapsed="0.000510"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:46.400378" elapsed="0.000808"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:46.401379" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:46.401211" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:46.399988" elapsed="0.001470"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:46.401500" elapsed="0.000058"/>
</return>
<msg time="2026-08-22T23:57:46.401726" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:46.394300" elapsed="0.007455"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:46.401805" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:57:46.401949" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:46.393421" elapsed="0.008554"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:46.409463" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:46.409200" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:46.410035" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:46.409734" 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-08-22T23:57:46.419774" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:46.419952" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:46.420067" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:46.412342" elapsed="0.008146">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:46.410172" elapsed="0.010458">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:46.420903" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:46.420681" elapsed="0.000314"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:46.410149" elapsed="0.010880">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:46.421617" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:46.421813" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:46.421759" elapsed="0.000113"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:46.421735" elapsed="0.000169"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:46.422105" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:46.422255" elapsed="0.000024"/>
</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-08-22T23:57:46.404757" elapsed="0.017669">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:46.422548" elapsed="0.000056"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:46.402202" elapsed="0.020574">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:46.423032" elapsed="0.000032"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:46.379175" elapsed="0.044014">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:47.441670" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:47.439498" elapsed="0.002206"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:47.442407" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:47.442080" elapsed="0.000354"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:47.441925" elapsed="0.000546"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:47.443051" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:47.442716" elapsed="0.000362"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:47.442551" elapsed="0.000563"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:47.441777" elapsed="0.001365"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:47.443482" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:47.443217" elapsed="0.000323"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:47.444282" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:47.443815" elapsed="0.000496"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:47.443566" elapsed="0.000781"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:47.444533" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:47.444372" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:47.443196" elapsed="0.001430"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:47.444666" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:57:47.444829" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:47.439015" elapsed="0.005840"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:47.444902" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:57:47.445044" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:47.438407" elapsed="0.006663"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:47.452325" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:47.452070" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:47.452787" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:47.452525" 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-08-22T23:57:47.462544" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:47.462814" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:47.462926" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:47.454983" elapsed="0.008342">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:47.452897" elapsed="0.010514">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:47.463618" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:47.463446" elapsed="0.000240"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:47.452879" elapsed="0.010833">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:47.464086" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:47.464223" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:47.464185" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:47.464168" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:47.464428" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:47.464502" elapsed="0.000018"/>
</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-08-22T23:57:47.447778" elapsed="0.016848">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:47.464699" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:47.445291" elapsed="0.019505">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:47.464965" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:47.424031" elapsed="0.041044">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:48.483371" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:48.480817" elapsed="0.002589"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:48.484135" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:48.483807" elapsed="0.000355"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:48.483651" elapsed="0.000549"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:48.484787" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:48.484449" elapsed="0.000364"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:48.484281" elapsed="0.000569"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:48.483480" elapsed="0.001398"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:48.485227" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:48.484958" elapsed="0.000327"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:48.486025" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:48.485545" elapsed="0.000508"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:48.485311" elapsed="0.000867"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:48.486368" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:48.486205" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:48.484936" elapsed="0.001510"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:48.486486" elapsed="0.000039"/>
</return>
<msg time="2026-08-22T23:57:48.486702" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:48.480045" elapsed="0.006684"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:48.486778" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:57:48.486920" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:48.479173" elapsed="0.007773"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:48.494329" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:48.494067" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:48.494789" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:48.494529" 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-08-22T23:57:48.503921" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:48.504091" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:48.504210" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:48.496968" elapsed="0.007699">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:48.494903" elapsed="0.009854">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:48.504962" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:48.504793" elapsed="0.000235"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:48.494884" elapsed="0.010169">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:48.505461" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:48.505620" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:48.505562" elapsed="0.000102"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:48.505543" elapsed="0.000143"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:48.505827" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:48.505897" 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-08-22T23:57:48.489706" elapsed="0.016297">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:48.506074" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:48.487173" elapsed="0.018994">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:48.506405" elapsed="0.000023"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:48.465868" elapsed="0.040653">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:49.527057" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:49.524821" elapsed="0.002273"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:49.527819" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:49.527470" elapsed="0.000376"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:49.527318" elapsed="0.000565"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:49.528433" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:49.528114" elapsed="0.000345"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:49.527965" elapsed="0.000531"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:49.527167" elapsed="0.001357"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:49.528903" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:49.528617" elapsed="0.000347"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:49.529710" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:49.529226" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:49.528990" elapsed="0.000786"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:49.529962" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:49.529800" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:49.528594" elapsed="0.001445"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:49.530103" elapsed="0.000045"/>
</return>
<msg time="2026-08-22T23:57:49.530279" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:49.524319" elapsed="0.005986"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:49.530352" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:57:49.530496" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:49.523738" elapsed="0.006783"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:49.537765" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:49.537492" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:49.538222" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:49.537964" 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-08-22T23:57:49.548626" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:49.548789" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:49.548898" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:49.540367" elapsed="0.008924">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:49.538333" elapsed="0.011104">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:49.549650" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:49.549472" elapsed="0.000244"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:49.538314" elapsed="0.011427">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:49.550136" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:49.550271" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:49.550232" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:49.550215" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:49.550475" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:49.550547" 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-08-22T23:57:49.533201" elapsed="0.017468">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:49.550739" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:49.530762" elapsed="0.020073">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:49.551000" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:49.507364" elapsed="0.043746">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:50.570728" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:50.568600" elapsed="0.002163"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:50.571454" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:50.571126" elapsed="0.000355"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:50.570974" elapsed="0.000544"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:50.572101" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:50.571763" elapsed="0.000366"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:50.571614" elapsed="0.000551"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:50.570830" elapsed="0.001364"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:50.572525" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:50.572264" elapsed="0.000342"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:50.573332" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:50.572864" elapsed="0.000500"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:50.572631" elapsed="0.000769"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:50.573610" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:50.573426" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:50.572244" elapsed="0.001445"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:50.573725" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:57:50.573883" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:50.567794" elapsed="0.006115"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:50.573957" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:57:50.574184" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:50.567203" elapsed="0.007007"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:50.581522" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:50.581265" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:50.581983" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:50.581739" 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-08-22T23:57:50.591525" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:50.591704" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:50.591823" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:50.584159" elapsed="0.008063">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:50.582095" elapsed="0.010209">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:50.592493" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:50.592338" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:50.582077" elapsed="0.010530">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:50.592977" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:50.593112" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:50.593075" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:50.593058" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:50.593316" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:50.593386" 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-08-22T23:57:50.576962" elapsed="0.016527">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:50.593562" elapsed="0.000031"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:50.574435" elapsed="0.019240">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:50.593841" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:50.551952" elapsed="0.041998">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:51.611419" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:51.608710" elapsed="0.002803"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:51.612237" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:51.611906" elapsed="0.000359"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:51.611753" elapsed="0.000550"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:51.612870" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:51.612531" elapsed="0.000366"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:51.612382" elapsed="0.000551"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:51.611603" elapsed="0.001360"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:51.613292" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:51.613035" elapsed="0.000316"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:51.614102" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:51.613628" elapsed="0.000504"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:51.613376" elapsed="0.000792"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:51.614380" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:51.614193" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:51.613015" elapsed="0.001448"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:51.614499" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:57:51.614677" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:51.608025" elapsed="0.006680"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:51.614753" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:57:51.614898" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:51.607215" elapsed="0.007709"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:51.622165" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:51.621908" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:51.622655" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:51.622393" 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-08-22T23:57:51.631833" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:51.632035" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:51.632189" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:51.624806" elapsed="0.007922">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:51.622767" elapsed="0.010071">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:51.633101" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:51.632886" elapsed="0.000307"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:51.622749" elapsed="0.010478">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:51.633755" elapsed="0.000081"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:51.633993" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:51.633941" elapsed="0.000110"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:51.633916" elapsed="0.000166"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:51.634302" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:51.634400" 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-08-22T23:57:51.617605" elapsed="0.016941">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:51.634665" elapsed="0.000022"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:51.615146" elapsed="0.019653">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:51.635030" elapsed="0.000030"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:51.594792" elapsed="0.040389">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:52.651057" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:52.648574" elapsed="0.002519"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:52.651827" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:52.651481" elapsed="0.000374"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:52.651325" elapsed="0.000568"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:52.652444" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:52.652126" elapsed="0.000345"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:52.651978" elapsed="0.000529"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:52.651169" elapsed="0.001368"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:52.652915" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:52.652633" elapsed="0.000342"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:52.653719" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:52.653233" elapsed="0.000515"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:52.653001" elapsed="0.000838"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:52.654037" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:52.653871" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:52.652610" elapsed="0.001503"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:52.654154" elapsed="0.000039"/>
</return>
<msg time="2026-08-22T23:57:52.654321" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:52.647895" elapsed="0.006452"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:52.654395" elapsed="0.000025"/>
</return>
<msg time="2026-08-22T23:57:52.654536" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:52.647079" elapsed="0.007483"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:52.661868" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:52.661607" elapsed="0.000379"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:52.662386" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:52.662140" 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-08-22T23:57:52.671054" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:52.671318" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:52.671510" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:52.664543" elapsed="0.007550">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:52.662497" elapsed="0.009713">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:52.672498" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:52.672258" elapsed="0.000359"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:52.662479" elapsed="0.010190">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:52.673211" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:52.673399" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:52.673347" elapsed="0.000110"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:52.673323" elapsed="0.000165"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:52.673705" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:52.673805" 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-08-22T23:57:52.657285" elapsed="0.016666">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:52.674050" elapsed="0.000021"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:52.654806" elapsed="0.019376">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:52.674412" elapsed="0.000030"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:52.635912" elapsed="0.038651">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:53.691510" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:53.689320" elapsed="0.002227"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:53.692315" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:53.691966" elapsed="0.000376"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:53.691809" elapsed="0.000571"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:53.692946" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:53.692627" elapsed="0.000346"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:53.692464" elapsed="0.000627"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:53.691642" elapsed="0.001481"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:53.693476" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:53.693206" elapsed="0.000328"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:53.694314" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:53.693844" elapsed="0.000500"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:53.693561" elapsed="0.000820"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:53.694570" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:53.694406" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:53.693182" elapsed="0.001482"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:53.694704" elapsed="0.000040"/>
</return>
<msg time="2026-08-22T23:57:53.694873" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:53.688830" elapsed="0.006070"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:53.694947" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:57:53.695090" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:53.688208" elapsed="0.006908"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:53.702519" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:53.702213" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:53.702997" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:53.702744" 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-08-22T23:57:53.712385" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:53.712569" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:53.712716" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:53.705184" elapsed="0.007968">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:53.703110" elapsed="0.010127">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:53.713428" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:53.713271" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:53.703092" elapsed="0.010424">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:53.713928" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:53.714064" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:53.714027" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:53.714010" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:53.714268" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:53.714375" elapsed="0.000018"/>
</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-08-22T23:57:53.697829" elapsed="0.016658">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:53.714557" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:53.695361" elapsed="0.019310">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:53.714840" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:53.675535" elapsed="0.039414">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:54.736763" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:54.734556" elapsed="0.002242"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:54.737529" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:54.737202" elapsed="0.000354"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:54.737047" elapsed="0.000562"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:54.738203" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:54.737861" elapsed="0.000368"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:54.737694" elapsed="0.000571"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:54.736888" elapsed="0.001406"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:54.738676" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:54.738375" elapsed="0.000364"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:54.739471" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:54.738998" elapsed="0.000501"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:54.738765" elapsed="0.000772"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:54.739743" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:54.739562" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:54.738352" elapsed="0.001471"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:54.739864" elapsed="0.000039"/>
</return>
<msg time="2026-08-22T23:57:54.740031" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:54.734058" elapsed="0.005999"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:54.740104" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:57:54.740247" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:54.733426" elapsed="0.006847"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:54.747634" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:54.747360" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:54.748111" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:54.747840" 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-08-22T23:57:54.757194" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:54.757413" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:54.757533" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:54.750297" elapsed="0.007675">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:54.748225" elapsed="0.009832">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:54.758263" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:54.758101" elapsed="0.000228"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:54.748206" elapsed="0.010148">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:54.758744" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:54.758877" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:54.758840" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:54.758823" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:54.759079" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:54.759148" 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-08-22T23:57:54.743075" elapsed="0.016178">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:54.759321" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:54.740495" elapsed="0.018921">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:54.759595" elapsed="0.000023"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:54.715788" elapsed="0.043917">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:55.779098" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:55.776930" elapsed="0.002204"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:55.779865" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:55.779519" elapsed="0.000373"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:55.779365" elapsed="0.000565"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:55.780481" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:55.780161" elapsed="0.000347"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:55.780013" elapsed="0.000531"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:55.779210" elapsed="0.001394"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:55.780967" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:55.780685" elapsed="0.000341"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:55.781767" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:55.781282" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:55.781052" elapsed="0.000855"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:55.782096" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:55.781933" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:55.780663" elapsed="0.001510"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:55.782213" elapsed="0.000039"/>
</return>
<msg time="2026-08-22T23:57:55.782382" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:55.776408" elapsed="0.006000"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:55.782455" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:57:55.782616" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:55.775832" elapsed="0.006811"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:55.789989" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:55.789729" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:55.790434" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:55.790189" 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-08-22T23:57:55.800943" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:55.801104" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:55.801225" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:55.792878" elapsed="0.008765">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:55.790545" elapsed="0.011183">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:55.801918" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:55.801761" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:55.790527" elapsed="0.011480">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:55.802385" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:55.802538" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:55.802501" elapsed="0.000091"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:55.802483" elapsed="0.000132"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:55.802757" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:55.802826" 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-08-22T23:57:55.785356" elapsed="0.017576">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:55.803001" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:55.782867" elapsed="0.020228">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:55.803296" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:55.760541" elapsed="0.042865">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:56.820966" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:56.818299" elapsed="0.002702"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:56.821732" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:56.821381" elapsed="0.000378"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:56.821226" elapsed="0.000572"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:56.822348" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:56.822030" elapsed="0.000344"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:56.821879" elapsed="0.000531"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:56.821073" elapsed="0.001366"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:56.822801" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:56.822514" elapsed="0.000345"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:56.823613" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:56.823115" elapsed="0.000527"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:56.822885" elapsed="0.000794"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:56.823866" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:56.823704" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:56.822493" elapsed="0.001449"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:56.823981" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:57:56.824143" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:56.817636" elapsed="0.006532"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:56.824215" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:57:56.824359" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:56.816808" elapsed="0.007576"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:56.831710" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:56.831433" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:56.832156" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:56.831911" 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-08-22T23:57:56.841115" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:56.841275" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:56.841383" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:56.834317" elapsed="0.007507">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:56.832267" elapsed="0.009775">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:56.842309" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:56.842092" elapsed="0.000311"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:56.832249" elapsed="0.010189">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:56.842990" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:56.843180" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:56.843127" elapsed="0.000112"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:56.843103" elapsed="0.000166"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:56.843487" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:56.843606" 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-08-22T23:57:56.827102" elapsed="0.016656">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:56.843857" elapsed="0.000022"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:56.824624" elapsed="0.019366">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:56.844225" elapsed="0.000030"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:56.804237" elapsed="0.040138">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:57.865124" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:57.862953" elapsed="0.002205"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:57.865879" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:57.865529" elapsed="0.000377"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:57.865374" elapsed="0.000569"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:57.866495" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:57.866175" elapsed="0.000348"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:57.866023" elapsed="0.000535"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:57.865228" elapsed="0.001375"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:57.866947" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:57.866680" elapsed="0.000326"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:57.867748" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:57.867265" elapsed="0.000512"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:57.867032" elapsed="0.000782"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:57.868005" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:57.867840" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:57.866659" elapsed="0.001437"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:57.868135" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:57:57.868297" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:57.862444" elapsed="0.005879"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:57.868371" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:57:57.868603" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:57.861865" elapsed="0.006765"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:57.876042" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:57.875768" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:57.876486" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:57.876241" 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-08-22T23:57:57.886515" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:57.886853" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:57.887076" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:57.878679" elapsed="0.009198">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:57.876616" elapsed="0.011466">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:57.888503" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:57.888156" elapsed="0.000522"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:57.876596" elapsed="0.012136">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:57.889544" elapsed="0.000085"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:57.889873" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:57.889789" elapsed="0.000176"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:57.889750" 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-08-22T23:57:57.890322" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:57.890474" elapsed="0.000033"/>
</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-08-22T23:57:57.871306" elapsed="0.019425">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:57.890886" elapsed="0.000034"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:57.868854" elapsed="0.022239">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:57.891455" elapsed="0.000047"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:57.845199" elapsed="0.046522">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:58.910082" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:58.907261" elapsed="0.002935"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:58.910940" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:58.910600" elapsed="0.000368"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:58.910429" elapsed="0.000577"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:58.911564" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:58.911242" elapsed="0.000364"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:58.911090" elapsed="0.000554"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:58.910274" elapsed="0.001400"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:58.912024" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:58.911753" elapsed="0.000330"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:58.912841" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:58.912341" elapsed="0.000529"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:58.912110" elapsed="0.000796"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:58.913095" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:58.912932" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:58.911731" elapsed="0.001441"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:58.913344" elapsed="0.000046"/>
</return>
<msg time="2026-08-22T23:57:58.913523" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:58.906597" elapsed="0.006952"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:58.913616" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:57:58.913761" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:58.905783" elapsed="0.008003"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:58.921171" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:58.920910" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:58.921633" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:58.921372" 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-08-22T23:57:58.930663" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:58.930836" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:58.931009" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:58.923792" elapsed="0.007744">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:58.921744" elapsed="0.009929">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:58.931940" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:58.931721" elapsed="0.000311"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:58.921726" elapsed="0.010339">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:58.932614" elapsed="0.000087"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:58.932861" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:58.932808" elapsed="0.000112"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:58.932782" elapsed="0.000169"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:58.933152" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:58.933252" 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-08-22T23:57:58.916510" elapsed="0.016890">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:58.933499" elapsed="0.000022"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:58.914013" elapsed="0.019641">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:58.933890" elapsed="0.000031"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:58.892675" elapsed="0.041366">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:59.955289" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:59.953037" elapsed="0.002288"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:59.956097" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:59.955741" elapsed="0.000383"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:57:59.955559" elapsed="0.000604"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:59.956747" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:59.956402" elapsed="0.000372"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:57:59.956247" elapsed="0.000565"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:57:59.955402" elapsed="0.001451"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:59.957267" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:59.956944" elapsed="0.000385"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:57:59.958119" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:57:59.957615" elapsed="0.000534"/>
</kw>
<status status="PASS" start="2026-08-22T23:57:59.957356" elapsed="0.000829"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:59.958378" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:59.958210" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-08-22T23:57:59.956921" elapsed="0.001536"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:59.958497" elapsed="0.000040"/>
</return>
<msg time="2026-08-22T23:57:59.958687" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:57:59.952506" elapsed="0.006207"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:57:59.958762" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:57:59.958908" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:57:59.951895" elapsed="0.007038"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:59.966814" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:59.966503" elapsed="0.000456"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:57:59.967367" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:57:59.967117" 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-08-22T23:57:59.976669" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:57:59.976866" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:57:59.977015" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:57:59.969614" elapsed="0.007942">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:57:59.967480" elapsed="0.010212">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:59.977956" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:57:59.977740" elapsed="0.000305"/>
</branch>
<status status="FAIL" start="2026-08-22T23:57:59.967461" elapsed="0.010618">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:59.978620" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:59.978824" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:57:59.978767" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:57:59.978741" elapsed="0.000175"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:59.979115" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:57:59.979219" 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-08-22T23:57:59.961994" elapsed="0.017376">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:57:59.979469" elapsed="0.000023"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:57:59.959186" elapsed="0.020445">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:57:59.979867" elapsed="0.000031"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:57:59.934960" elapsed="0.045055">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:00.997667" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:00.995509" elapsed="0.002192"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:00.998407" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:00.998078" elapsed="0.000356"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:58:00.997914" elapsed="0.000558"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:00.999037" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:00.998718" elapsed="0.000345"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:58:00.998553" elapsed="0.000647"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:58:00.997770" elapsed="0.001462"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:00.999572" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:00.999307" elapsed="0.000340"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:01.000387" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:00.999912" elapsed="0.000504"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:00.999673" elapsed="0.000780"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:01.000658" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:01.000479" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:00.999287" elapsed="0.001450"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:58:01.000775" elapsed="0.000037"/>
</return>
<msg time="2026-08-22T23:58:01.000939" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:58:00.995026" elapsed="0.005939"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:58:01.001013" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:58:01.001159" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:58:00.994432" elapsed="0.006753"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:01.008450" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:01.008195" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:01.008910" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:01.008666" 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-08-22T23:58:01.017551" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:01.017722" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:58:01.017829" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:01.011070" elapsed="0.007275">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:01.009020" elapsed="0.009409">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:01.018636" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:01.018463" elapsed="0.000239"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:01.009003" elapsed="0.009723">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:01.019102" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:01.019236" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:01.019198" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:01.019181" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:01.019438" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:01.019546" elapsed="0.000017"/>
</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-08-22T23:58:01.003882" elapsed="0.015791">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:01.019744" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:01.001407" elapsed="0.018432">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:01.020005" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:58:00.980875" elapsed="0.039239">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:02.038173" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:02.035986" elapsed="0.002243"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:02.038953" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:02.038616" elapsed="0.000365"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:58:02.038447" elapsed="0.000571"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:02.039606" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:02.039266" elapsed="0.000368"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:58:02.039114" elapsed="0.000557"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:58:02.038300" elapsed="0.001400"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:02.040046" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:02.039776" elapsed="0.000334"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:02.040853" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:02.040369" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:02.040137" elapsed="0.000782"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:02.041113" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:02.040946" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:02.039754" elapsed="0.001436"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:58:02.041229" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:58:02.041391" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:58:02.035486" elapsed="0.005931"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:58:02.041464" elapsed="0.000026"/>
</return>
<msg time="2026-08-22T23:58:02.041624" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:58:02.034894" elapsed="0.006757"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:02.048913" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:02.048656" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:02.049361" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:02.049119" 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-08-22T23:58:02.057982" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:02.058202" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:58:02.058309" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:02.051509" elapsed="0.007206">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:02.049471" elapsed="0.009327">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:02.058995" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:02.058832" elapsed="0.000244"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:02.049453" elapsed="0.009648">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:02.059479" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:02.059633" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:02.059593" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:02.059559" elapsed="0.000138"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:02.059839" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:02.059909" 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-08-22T23:58:02.044377" elapsed="0.015637">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:02.060084" elapsed="0.000015"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:02.041874" elapsed="0.018304">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:02.060346" elapsed="0.000021"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:58:02.020902" elapsed="0.039552">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Check_Device_Connected" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:03.081432" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:03.079254" elapsed="0.002211"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:03.082177" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:03.081848" elapsed="0.000357"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-22T23:58:03.081693" elapsed="0.000549"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:03.082839" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:03.082491" elapsed="0.000375"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:58:03.082324" elapsed="0.000582"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-22T23:58:03.081533" elapsed="0.001404"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.083271" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:03.083009" elapsed="0.000321"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:03.084077" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:03.083602" elapsed="0.000504"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:03.083355" elapsed="0.000859"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.084420" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:03.084241" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.082990" elapsed="0.001511"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:58:03.084539" elapsed="0.000049"/>
</return>
<msg time="2026-08-22T23:58:03.084719" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-22T23:58:03.078765" elapsed="0.005981"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-22T23:58:03.084793" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:58:03.084939" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-22T23:58:03.078154" elapsed="0.006811"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:03.092334" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:03.092043" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:03.092842" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:03.092557" 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-08-22T23:58:03.102085" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:03.102248" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-22T23:58:03.102355" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:03.095065" elapsed="0.007713">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:03.092959" elapsed="0.009904">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.103057" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:03.102898" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:03.092940" elapsed="0.010208">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.103545" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:03.103715" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:03.103676" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:03.103657" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.103929" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:03.104001" 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-08-22T23:58:03.087642" elapsed="0.016467">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:03.104180" elapsed="0.000016"/>
</return>
<var>${device_status}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:03.085187" elapsed="0.019115">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${device_status}</arg>
<arg>connection-status": "connected"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.104518" elapsed="0.000024"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device is accessible from Netconf.</doc>
<status status="FAIL" start="2026-08-22T23:58:03.061305" elapsed="0.043348">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<msg time="2026-08-22T23:58:03.104754" level="FAIL">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</msg>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Connected</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:57:42.207738" elapsed="20.897111">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${NODE_SETTER}</arg>
<doc>Wait for the device to become connected.
It is more readable to use this keyword in a test case than to put the whole WUKS below into it.</doc>
<status status="FAIL" start="2026-08-22T23:57:42.207243" elapsed="20.897726">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</kw>
<doc>Wait until the device becomes visible on setter node.</doc>
<status status="FAIL" start="2026-08-22T23:57:41.966984" elapsed="21.138141">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig</status>
</test>
<test id="s1-s8-t8" name="Check_Device_Data_Is_Seen_As_Empty_On_Configurer" 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-08-22T23:58:03.109812" elapsed="0.000305"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:58:03.109394" elapsed="0.000803"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:03.111679" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:03.111494" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.111467" elapsed="0.000311"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:03.118800" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:03.118648" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.118620" elapsed="0.000278"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:58:03.120349" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:58:03.119765" elapsed="0.000627"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:58:03.121056" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:58:03.120658" elapsed="0.000425"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:58:03.121128" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:58:03.121285" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:58:03.119204" elapsed="0.002106"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:03.127159" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:03.127048" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.127028" 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-08-22T23:58:03.128571" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:03.128461" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.128442" elapsed="0.000222"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:58:03.129134" level="INFO">${karaf_connection_index} = 94</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:58:03.128813" elapsed="0.000349"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:58:03.129562" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:58:03.129319" elapsed="0.000290"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:58:03.163979" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:58:03.130105" elapsed="0.033995"/>
</kw>
<msg time="2026-08-22T23:58:03.164320" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:58:03.164368" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:03.129769" elapsed="0.034647"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:58:03.185055" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:58:03.165122" elapsed="0.020041"/>
</kw>
<msg time="2026-08-22T23:58:03.185324" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:58:03.185370" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:03.164633" elapsed="0.020785"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.185758" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:03.185504" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.185484" elapsed="0.000363"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:03.186300" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:03.185990" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.186690" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:03.186455" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.186433" elapsed="0.000337"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:58:03.186803" 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-08-22T23:58:03.189467" elapsed="0.000182"/>
</kw>
<msg time="2026-08-22T23:58:03.189713" 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-08-22T23:58:03.188328" elapsed="0.001525"/>
</kw>
<kw name="Open 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-08-22T23:58:03.190191" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.190552" elapsed="0.000105"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:58:03.187666" elapsed="0.003107"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:58:03.187083" elapsed="0.003757"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:58:03.128118" elapsed="0.062829"/>
</kw>
<msg time="2026-08-22T23:58:03.191039" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:03.191092" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:03.127393" elapsed="0.063737"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:58:03.191324" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:58:03.191207" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.191188" 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-08-22T23:58:03.191847" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.192210" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:58:03.192283" 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-08-22T23:58:03.126524" elapsed="0.065875"/>
</kw>
<msg time="2026-08-22T23:58:03.192498" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:03.192542" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:03.121851" elapsed="0.070744"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.192962" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:03.192709" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.192690" elapsed="0.000350"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:58:03.121711" elapsed="0.071353"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:03.198679" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:03.198547" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.198527" 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-08-22T23:58:03.199919" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:03.199810" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.199791" elapsed="0.000214"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:58:03.200448" level="INFO">${karaf_connection_index} = 95</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:58:03.200147" elapsed="0.000328"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:58:03.200873" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:58:03.200647" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:58:03.231448" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:58:03.201390" elapsed="0.030159"/>
</kw>
<msg time="2026-08-22T23:58:03.231751" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:58:03.231797" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:03.201056" elapsed="0.030779"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:58:03.253850" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:58:03.232544" elapsed="0.021418"/>
</kw>
<msg time="2026-08-22T23:58:03.254124" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:58:03.254173" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:03.232032" elapsed="0.022183"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.254534" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:03.254294" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.254274" elapsed="0.000366"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:03.255086" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:03.254781" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.255465" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:03.255234" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.255215" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:58:03.255601" 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-08-22T23:58:03.258225" elapsed="0.000153"/>
</kw>
<msg time="2026-08-22T23:58:03.258446" 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-08-22T23:58:03.257081" elapsed="0.001514"/>
</kw>
<kw name="Open 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-08-22T23:58:03.258981" elapsed="0.000082"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.259321" 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-08-22T23:58:03.256450" elapsed="0.003068"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:58:03.255899" elapsed="0.003706"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:58:03.199476" elapsed="0.060265"/>
</kw>
<msg time="2026-08-22T23:58:03.259854" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:03.259901" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:03.198895" elapsed="0.061046"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:58:03.260128" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:58:03.260020" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.260001" 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-08-22T23:58:03.260681" 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-08-22T23:58:03.261013" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:58:03.261224" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:58:03.198202" elapsed="0.063131"/>
</kw>
<msg time="2026-08-22T23:58:03.261426" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:03.261470" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:03.193326" elapsed="0.068181"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.261903" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:03.261652" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.261566" elapsed="0.000416"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:58:03.193187" elapsed="0.068819"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:03.267376" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:03.267267" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.267247" 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-08-22T23:58:03.268669" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:03.268535" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.268516" elapsed="0.000220"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:58:03.269177" level="INFO">${karaf_connection_index} = 96</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:58:03.268877" elapsed="0.000328"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:58:03.269612" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:58:03.269357" elapsed="0.000283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:58:03.303318" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:58:03.270130" elapsed="0.033289"/>
</kw>
<msg time="2026-08-22T23:58:03.303616" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:58:03.303665" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:03.269796" elapsed="0.033936"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:58:03.327843" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:58:03.304241" elapsed="0.025529"/>
</kw>
<msg time="2026-08-22T23:58:03.329934" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:58:03.329981" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:03.303903" elapsed="0.026116"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.330317" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:03.330097" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.330077" elapsed="0.000371"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:03.330925" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:03.330623" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.331278" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:03.331065" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.331047" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:58:03.331389" 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-08-22T23:58:03.334075" elapsed="0.000153"/>
</kw>
<msg time="2026-08-22T23:58:03.334289" 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-08-22T23:58:03.333004" 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-08-22T23:58:03.334710" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.335037" 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-08-22T23:58:03.332351" elapsed="0.002868"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:58:03.331677" elapsed="0.003609"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:58:03.268222" elapsed="0.067163"/>
</kw>
<msg time="2026-08-22T23:58:03.335477" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:03.335521" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:03.267625" elapsed="0.067933"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:58:03.335793" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:58:03.335686" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.335667" 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-08-22T23:58:03.336254" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.336598" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:58:03.336672" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:58:03.266930" elapsed="0.069849"/>
</kw>
<msg time="2026-08-22T23:58:03.336871" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:03.336914" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:03.262264" elapsed="0.074687"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.337267" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:03.337025" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.337008" elapsed="0.000337"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:58:03.262127" elapsed="0.075242"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:58:03.121510" elapsed="0.215887"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:58:03.118088" elapsed="0.219363"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:58:03.111067" elapsed="0.226438"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:03.110423" elapsed="0.227127"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:58:03.106378" elapsed="0.231327"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:03.339272" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:03.338875" elapsed="0.000458"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:03.347006" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:03.346738" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:03.347463" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:03.347206" 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-08-22T23:58:03.371892" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:03.372164" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:58:03.372383" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:58:03.349698" elapsed="0.022760"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:03.347630" elapsed="0.024928"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.372995" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:03.372652" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.347566" elapsed="0.025622"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:03.379205" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:03.375563" elapsed="0.003712"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:03.375033" elapsed="0.004291"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.374992" elapsed="0.004367"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:03.383204" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:03.379833" elapsed="0.003435"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:03.379461" elapsed="0.003856"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.379429" elapsed="0.003923"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:58:03.384251" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:03.383643" 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-08-22T23:58:03.384757" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:03.384394" elapsed="0.000446"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:03.385552" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:03.385097" elapsed="0.000536"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:03.384874" elapsed="0.000815"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.384364" elapsed="0.001356"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:58:03.386467" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:03.385939" 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-08-22T23:58:03.386972" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:03.386630" elapsed="0.000422"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:03.387797" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:03.387305" elapsed="0.000529"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:03.387086" elapsed="0.000800"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.386601" elapsed="0.001310"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:58:03.388060" elapsed="0.000361"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:58:03.388915" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:03.388601" 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-08-22T23:58:03.389095" 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-08-22T23:58:03.374028" elapsed="0.017674"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:58:03.391884" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-08-22T23:58:03.391775" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.391755" 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-08-22T23:58:03.392118" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:03.392189" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:58:03.394534" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:58:03.342098" elapsed="0.052466"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:58:03.394641" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:58:03.394797" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:58:03.339567" elapsed="0.055257"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-22T23:58:03.395113" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:03.394898" elapsed="0.000612"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.394878" elapsed="0.000658"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.395819" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:03.395613" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.395595" elapsed="0.000307"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${empty_data}</arg>
<status status="PASS" start="2026-08-22T23:58:03.338464" elapsed="0.057486"/>
</kw>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${NODE_CONFIGURER}</arg>
<arg>${empty_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-22T23:58:03.337868" elapsed="0.058128"/>
</kw>
<doc>Get the device data as seen by configurer and make sure it is empty.</doc>
<status status="PASS" start="2026-08-22T23:58:03.105698" elapsed="0.290409"/>
</test>
<test id="s1-s8-t9" name="Check_Device_Data_Is_Seen_As_Empty_On_Checker" 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-08-22T23:58:03.399513" elapsed="0.000238"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:58:03.399206" elapsed="0.000605"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:03.400821" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:03.400711" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.400692" 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-08-22T23:58:03.405835" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:03.405726" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.405707" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:58:03.406911" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:58:03.406509" elapsed="0.000429"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:58:03.407422" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:58:03.407096" elapsed="0.000368"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:58:03.407511" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:58:03.407689" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:58:03.406125" 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-08-22T23:58:03.413199" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:03.413089" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.413069" 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-08-22T23:58:03.414445" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:03.414326" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.414306" elapsed="0.000217"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:58:03.415020" level="INFO">${karaf_connection_index} = 94</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:58:03.414691" elapsed="0.000394"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:58:03.415546" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:58:03.415281" elapsed="0.000309"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:58:03.447513" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:58:03.416096" elapsed="0.031545"/>
</kw>
<msg time="2026-08-22T23:58:03.447816" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:58:03.447863" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:03.415754" elapsed="0.032147"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:58:03.469048" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:58:03.448435" elapsed="0.020721"/>
</kw>
<msg time="2026-08-22T23:58:03.469318" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:58:03.469365" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:03.448080" elapsed="0.021333"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.469754" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:03.469499" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.469479" elapsed="0.000355"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:03.470275" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:03.469975" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.470657" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:03.470422" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.470402" elapsed="0.000336"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:58:03.470771" 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-08-22T23:58:03.473313" elapsed="0.000157"/>
</kw>
<msg time="2026-08-22T23:58:03.473530" 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-08-22T23:58:03.472268" 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="NOT RUN" start="2026-08-22T23:58:03.473945" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.474273" 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-08-22T23:58:03.471653" elapsed="0.002802"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:58:03.471026" elapsed="0.003494"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:58:03.414012" elapsed="0.060628"/>
</kw>
<msg time="2026-08-22T23:58:03.474733" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:03.474778" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:03.413425" elapsed="0.061391"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:58:03.474998" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:58:03.474892" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.474873" 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-08-22T23:58:03.475524" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.475886" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:58:03.475994" 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-08-22T23:58:03.412738" elapsed="0.063369"/>
</kw>
<msg time="2026-08-22T23:58:03.476201" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:03.476244" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:03.408078" elapsed="0.068203"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.476714" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:03.476356" elapsed="0.000415"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.476338" elapsed="0.000457"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:58:03.407939" elapsed="0.068880"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:03.482121" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:03.482014" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.481994" 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-08-22T23:58:03.483361" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:03.483225" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.483207" elapsed="0.000221"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:58:03.483889" level="INFO">${karaf_connection_index} = 95</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:58:03.483569" elapsed="0.000347"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:58:03.484292" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:58:03.484072" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:58:03.517975" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:58:03.484828" elapsed="0.033245"/>
</kw>
<msg time="2026-08-22T23:58:03.518255" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:58:03.518303" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:03.484475" elapsed="0.033865"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:58:03.541724" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:58:03.518867" elapsed="0.022962"/>
</kw>
<msg time="2026-08-22T23:58:03.541986" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:58:03.542031" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:03.518507" elapsed="0.023560"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.542361" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:03.542144" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.542125" elapsed="0.000314"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:03.543073" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:03.542601" elapsed="0.000571"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.543460" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:03.543242" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.543224" elapsed="0.000316"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:58:03.543573" 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-08-22T23:58:03.546076" elapsed="0.000151"/>
</kw>
<msg time="2026-08-22T23:58:03.546287" 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-08-22T23:58:03.545004" elapsed="0.001448"/>
</kw>
<kw name="Open 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-08-22T23:58:03.546746" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.547086" 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-08-22T23:58:03.544369" elapsed="0.002900"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:58:03.543846" 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="PASS" start="2026-08-22T23:58:03.482919" elapsed="0.064512"/>
</kw>
<msg time="2026-08-22T23:58:03.547523" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:03.547566" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:03.482339" elapsed="0.065290"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:58:03.547813" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:58:03.547706" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.547688" 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-08-22T23:58:03.548282" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.548636" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:58:03.548710" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:58:03.481676" elapsed="0.067142"/>
</kw>
<msg time="2026-08-22T23:58:03.548912" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:03.548955" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:03.477079" elapsed="0.071913"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.549314" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:03.549068" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.549050" elapsed="0.000341"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:58:03.476942" elapsed="0.072473"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:03.554828" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:03.554717" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.554698" 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-08-22T23:58:03.556065" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:03.555956" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.555938" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:58:03.556568" level="INFO">${karaf_connection_index} = 96</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:58:03.556274" elapsed="0.000337"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:58:03.556988" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:58:03.556769" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:58:03.589220" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:58:03.557499" elapsed="0.031835"/>
</kw>
<msg time="2026-08-22T23:58:03.589492" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:58:03.589537" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:03.557171" elapsed="0.032403"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:58:03.611411" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:58:03.590097" elapsed="0.021455"/>
</kw>
<msg time="2026-08-22T23:58:03.611754" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:58:03.611800" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:03.589762" elapsed="0.022076"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.612132" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:03.611915" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.611895" elapsed="0.000315"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:03.612660" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:03.612347" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.613017" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:03.612799" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.612781" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:58:03.613128" 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-08-22T23:58:03.615788" elapsed="0.000152"/>
</kw>
<msg time="2026-08-22T23:58:03.616000" 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-08-22T23:58:03.614729" elapsed="0.001397"/>
</kw>
<kw name="Open 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-08-22T23:58:03.616393" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.616742" 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-08-22T23:58:03.614110" elapsed="0.002812"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:58:03.613378" elapsed="0.003608"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:58:03.555654" elapsed="0.061429"/>
</kw>
<msg time="2026-08-22T23:58:03.617175" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:03.617219" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:03.555044" elapsed="0.062212"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:58:03.617439" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:58:03.617333" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.617315" 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-08-22T23:58:03.617932" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.618262" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:58:03.618334" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:58:03.554364" elapsed="0.064078"/>
</kw>
<msg time="2026-08-22T23:58:03.618536" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:03.618655" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:03.549778" elapsed="0.068918"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.619045" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:03.618773" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:03.618755" elapsed="0.000368"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:58:03.549539" elapsed="0.069608"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:58:03.407767" elapsed="0.211408"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:58:03.405338" elapsed="0.213892"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:58:03.400392" elapsed="0.218932"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:03.399961" elapsed="0.219409"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:58:03.396834" elapsed="0.222588"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:03.620990" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:03.620603" elapsed="0.000414"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:03.628442" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:03.628183" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:03.628899" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:03.628654" 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-08-22T23:58:03.640006" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:03.640138" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:03.640245" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:03.631249" elapsed="0.009397">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:03.629010" elapsed="0.011735">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.640935" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:03.640780" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:03.628992" elapsed="0.012034">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.641394" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:03.641530" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:03.641492" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:03.641475" elapsed="0.000151"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.641769" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:03.641839" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:03.623687" elapsed="0.018259">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:03.642018" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:03.621228" elapsed="0.020882">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.642395" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:03.642250" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:03.642232" elapsed="0.000244"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:03.642685" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:03.642531" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:03.642515" elapsed="0.000251"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:03.620187" elapsed="0.022680">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:04.645514" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:04.644553" elapsed="0.001053"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:04.657177" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:04.656917" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:04.657641" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:04.657378" 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-08-22T23:58:04.669732" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:04.669876" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:04.669989" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:04.659806" elapsed="0.010542">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:04.657759" elapsed="0.012669">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:04.670640" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:04.670469" elapsed="0.000237"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:04.657738" elapsed="0.012993">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:04.671101" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:04.671236" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:04.671197" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:04.671180" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:04.671440" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:04.671509" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:04.651910" elapsed="0.019718">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:04.671750" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:04.646090" elapsed="0.025758">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:04.672078" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:04.671928" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:04.671911" elapsed="0.000246"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:04.672378" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:04.672212" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:04.672196" elapsed="0.000267"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:04.643495" elapsed="0.029046">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:05.675786" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:05.674835" elapsed="0.001017"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:05.687630" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:05.687255" elapsed="0.000444"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:05.688254" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:05.687912" 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-08-22T23:58:05.699331" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:05.699474" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:05.699613" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:05.691294" elapsed="0.008689">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:05.688415" elapsed="0.011649">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:05.700253" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:05.700098" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:05.688386" elapsed="0.011959">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:05.700735" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:05.700875" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:05.700835" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:05.700818" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:05.701083" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:05.701154" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:05.681217" elapsed="0.020041">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:05.701378" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:05.676334" elapsed="0.025141">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:05.701719" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:05.701556" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:05.701539" elapsed="0.000262"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:05.702030" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:05.701856" elapsed="0.000231"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:05.701840" elapsed="0.000271"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:05.673785" elapsed="0.028405">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:06.704118" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:06.703615" elapsed="0.000539"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:06.711798" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:06.711506" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:06.712247" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:06.711999" 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-08-22T23:58:06.722678" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:06.722841" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:06.722973" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:06.714475" elapsed="0.008903">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:06.712370" elapsed="0.011092">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:06.723690" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:06.723500" elapsed="0.000258"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:06.712347" elapsed="0.011437">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:06.724174" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:06.724314" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:06.724273" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:06.724255" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:06.724522" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:06.724671" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:06.707171" elapsed="0.017610">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:06.724852" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:06.704385" elapsed="0.020561">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:06.725176" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:06.725031" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:06.725014" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:06.725449" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:06.725308" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:06.725292" elapsed="0.000234"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:06.702920" elapsed="0.022699">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:07.728661" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:07.727649" elapsed="0.001083"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:07.741701" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:07.741340" elapsed="0.000423"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:07.742176" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:07.741923" 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-08-22T23:58:07.751964" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:07.752129" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:07.752246" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:07.744436" elapsed="0.008242">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:07.742300" elapsed="0.010475">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:07.752971" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:07.752812" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:07.742276" elapsed="0.010786">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:07.753520" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:07.753761" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:07.753717" elapsed="0.000092"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:07.753696" elapsed="0.000135"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:07.753991" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:07.754078" elapsed="0.000019"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:07.734872" elapsed="0.019320">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:07.754262" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:07.729224" elapsed="0.025131">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:07.754591" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:07.754434" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:07.754417" elapsed="0.000256"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:07.754866" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:07.754726" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:07.754711" elapsed="0.000234"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:07.726483" elapsed="0.028540">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:08.758234" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:08.757132" elapsed="0.001175"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:08.769676" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:08.769293" elapsed="0.000451"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:08.770354" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:08.769959" elapsed="0.000457"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:58:08.781634" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:08.781818" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:08.781943" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:08.773200" elapsed="0.009237">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:08.770522" elapsed="0.012032">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:08.782848" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:08.782628" elapsed="0.000315"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:08.770491" elapsed="0.012487">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:08.783634" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:08.783841" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:08.783777" elapsed="0.000127"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:08.783752" elapsed="0.000183"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:08.784172" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:08.784272" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:08.762882" elapsed="0.021538">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:08.784518" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:08.758838" elapsed="0.025833">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:08.784987" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:08.784785" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:08.784762" elapsed="0.000338"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:08.785368" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:08.785175" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:08.785154" elapsed="0.000324"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:08.755964" elapsed="0.029642">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:09.788862" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:09.787820" elapsed="0.001119"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:09.800091" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:09.799725" elapsed="0.000435"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:09.800743" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:09.800375" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:58:09.812959" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:09.813173" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:09.813359" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:09.803419" elapsed="0.010544">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:09.800919" elapsed="0.013167">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:09.814355" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:09.814139" elapsed="0.000394"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:09.800883" elapsed="0.013686">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:09.815125" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:09.815321" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:09.815263" elapsed="0.000122"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:09.815239" elapsed="0.000177"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:09.815635" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:09.815737" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:09.793395" elapsed="0.022494">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:09.815985" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:09.789509" elapsed="0.026606">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:09.816425" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:09.816225" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:09.816203" elapsed="0.000335"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:09.816829" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:09.816634" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:09.816611" elapsed="0.000330"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:09.786560" elapsed="0.030488">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:10.820023" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:10.818935" elapsed="0.001159"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:10.835722" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:10.835426" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:10.836170" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:10.835925" 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-08-22T23:58:10.846724" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:10.846886" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:10.847011" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:10.838361" elapsed="0.009046">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:10.836291" elapsed="0.011308">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:10.847794" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:10.847638" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:10.836268" elapsed="0.011619">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:10.848267" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:10.848405" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:10.848365" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:10.848348" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:10.848631" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:10.848711" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:10.826124" elapsed="0.022692">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:10.848886" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:10.820644" elapsed="0.028337">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:10.849202" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:10.849059" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:10.849043" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:10.849475" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:10.849337" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:10.849321" elapsed="0.000235"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:10.817884" elapsed="0.031764">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:11.852834" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:11.851787" elapsed="0.001124"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:11.864207" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:11.863843" elapsed="0.000433"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:11.864863" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:11.864491" 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-08-22T23:58:11.876259" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:11.876492" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:11.876691" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:11.867829" elapsed="0.009503">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:11.865040" elapsed="0.012413">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:11.877764" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:11.877507" elapsed="0.000351"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:11.865004" elapsed="0.012888">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:11.878423" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:11.878639" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:11.878560" elapsed="0.000144"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:11.878535" elapsed="0.000199"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:11.878932" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:11.879029" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:11.857800" elapsed="0.021384">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:11.879279" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:11.853415" elapsed="0.025994">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:11.879738" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:11.879518" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:11.879495" elapsed="0.000356"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:11.880142" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:11.879926" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:11.879905" elapsed="0.000348"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:11.850549" elapsed="0.029813">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:12.883413" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:12.882395" elapsed="0.001091"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:12.898613" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:12.898335" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:12.899069" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:12.898818" 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-08-22T23:58:12.909138" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:12.909353" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:12.909626" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:12.901488" elapsed="0.008672">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:12.899199" elapsed="0.011105">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:12.910605" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:12.910366" elapsed="0.000336"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:12.899174" elapsed="0.011562">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:12.911258" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:12.911450" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:12.911394" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:12.911370" elapsed="0.000178"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:12.911767" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:12.911867" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:12.889654" elapsed="0.022382">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:12.912137" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:12.884014" elapsed="0.028254">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:12.912576" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:12.912378" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:12.912355" elapsed="0.000356"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:12.912981" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:12.912788" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:12.912766" elapsed="0.000329"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:12.881275" elapsed="0.031936">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:13.916821" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:13.915657" elapsed="0.001246"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:13.928108" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:13.927838" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:13.928567" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:13.928314" 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-08-22T23:58:13.940183" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:13.940383" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:13.940616" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:13.931103" elapsed="0.009942">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:13.928724" elapsed="0.012409">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:13.941341" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:13.941174" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:13.928695" elapsed="0.012740">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:13.941862" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:13.942008" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:13.941965" elapsed="0.000091"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:13.941947" elapsed="0.000130"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:13.942240" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:13.942323" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:13.923445" elapsed="0.019034">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:13.942553" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:13.917486" elapsed="0.025192">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:13.942914" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:13.942764" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:13.942746" elapsed="0.000252"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:13.943230" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:13.943054" elapsed="0.000327"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:13.943038" elapsed="0.000399"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:13.914241" elapsed="0.029421">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<msg time="2026-08-22T23:58:13.943887" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:58:03.619630" elapsed="10.324485">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<doc>Get the device data as seen by checker and make sure it is empty.</doc>
<status status="FAIL" start="2026-08-22T23:58:03.396299" elapsed="10.548192">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</test>
<test id="s1-s8-t10" name="Check_Device_Data_Is_Seen_As_Empty_On_Setter" 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-08-22T23:58:13.952151" elapsed="0.000230"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:58:13.951810" elapsed="0.000632"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:13.953516" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:13.953397" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:13.953377" elapsed="0.000227"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:13.958856" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:13.958744" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:13.958724" elapsed="0.000202"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:58:13.959970" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:58:13.959548" elapsed="0.000450"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:58:13.960490" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:58:13.960162" elapsed="0.000355"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:58:13.960564" elapsed="0.000050"/>
</return>
<msg time="2026-08-22T23:58:13.960748" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:58:13.959156" elapsed="0.001617"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:13.966697" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:13.966559" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:13.966538" 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-08-22T23:58:13.968039" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:13.967928" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:13.967909" elapsed="0.000200"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:58:13.968607" level="INFO">${karaf_connection_index} = 94</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:58:13.968267" elapsed="0.000369"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:58:13.969035" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:58:13.968798" elapsed="0.000263"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:58:14.000296" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:58:13.969601" elapsed="0.030808"/>
</kw>
<msg time="2026-08-22T23:58:14.000616" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:58:14.000667" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:13.969231" elapsed="0.031473"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:58:14.023760" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "S "e "t "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-08-22T23:58:14.001243" elapsed="0.022631"/>
</kw>
<msg time="2026-08-22T23:58:14.024038" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:58:14.024085" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:14.000883" elapsed="0.023239"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:14.024441" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:14.024206" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:14.024184" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:14.025002" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "S "e "t "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-08-22T23:58:14.024694" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:14.025359" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:14.025143" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:14.025125" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:58:14.025471" 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-08-22T23:58:14.028067" elapsed="0.000311"/>
</kw>
<msg time="2026-08-22T23:58:14.028443" 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-08-22T23:58:14.026977" elapsed="0.001664"/>
</kw>
<kw name="Open 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-08-22T23:58:14.028921" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:14.029252" 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-08-22T23:58:14.026332" elapsed="0.003107"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:58:14.025775" elapsed="0.003729"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:58:13.967609" elapsed="0.062022"/>
</kw>
<msg time="2026-08-22T23:58:14.029725" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:14.029770" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:13.966924" elapsed="0.062883"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:58:14.029992" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:58:14.029884" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:14.029865" 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-08-22T23:58:14.030509" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:14.030869" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:58:14.030942" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:58:13.965889" elapsed="0.065163"/>
</kw>
<msg time="2026-08-22T23:58:14.031146" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:14.031190" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:13.961205" elapsed="0.070022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:14.031551" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:14.031303" elapsed="0.000380"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:14.031285" elapsed="0.000424"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:58:13.961022" elapsed="0.070711"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:14.037173" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:14.037065" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:14.037047" 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-08-22T23:58:14.038404" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:14.038295" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:14.038276" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:58:14.038938" level="INFO">${karaf_connection_index} = 95</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:58:14.038638" elapsed="0.000327"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:58:14.039342" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:58:14.039121" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:58:14.073928" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:58:14.039878" elapsed="0.034157"/>
</kw>
<msg time="2026-08-22T23:58:14.074232" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:58:14.074302" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:14.039524" elapsed="0.034817"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:58:14.104155" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "S "e "t "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-08-22T23:58:14.074887" elapsed="0.029428"/>
</kw>
<msg time="2026-08-22T23:58:14.104478" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:58:14.104524" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:14.074514" elapsed="0.030048"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:14.104895" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:14.104670" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:14.104648" elapsed="0.000327"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:14.105431" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "S "e "t "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-08-22T23:58:14.105114" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:14.105810" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:14.105571" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:14.105552" elapsed="0.000337"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:58:14.105924" 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-08-22T23:58:14.108522" elapsed="0.000181"/>
</kw>
<msg time="2026-08-22T23:58:14.108765" 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-08-22T23:58:14.107430" elapsed="0.001462"/>
</kw>
<kw name="Open 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-08-22T23:58:14.109360" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:14.109723" 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-08-22T23:58:14.106796" 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-08-22T23:58:14.106226" elapsed="0.003750"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:58:14.037975" elapsed="0.072101"/>
</kw>
<msg time="2026-08-22T23:58:14.110190" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:14.110236" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:14.037393" elapsed="0.072881"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:58:14.110459" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:58:14.110352" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:14.110333" 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-08-22T23:58:14.110963" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:14.111315" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:58:14.111387" 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-08-22T23:58:14.036725" elapsed="0.074773"/>
</kw>
<msg time="2026-08-22T23:58:14.111702" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:14.111750" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:14.032003" elapsed="0.079784"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:14.112115" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:14.111864" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:14.111846" elapsed="0.000347"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:58:14.031865" elapsed="0.080352"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:14.117664" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:14.117537" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:14.117517" elapsed="0.000254"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:14.118986" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:14.118876" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:14.118857" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:58:14.119507" level="INFO">${karaf_connection_index} = 96</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:58:14.119199" elapsed="0.000335"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:58:14.119932" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:58:14.119710" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:58:14.152879" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:58:14.120473" elapsed="0.032515"/>
</kw>
<msg time="2026-08-22T23:58:14.153154" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:58:14.153202" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:14.120116" elapsed="0.033123"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:58:14.174141" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "S "e "t "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-08-22T23:58:14.153776" elapsed="0.020472"/>
</kw>
<msg time="2026-08-22T23:58:14.174405" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:58:14.174451" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:14.153410" elapsed="0.021077"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:14.174810" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:14.174567" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:14.174546" elapsed="0.000344"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:14.175326" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m "p "t "y "_ "O "n "_ "S "e "t "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-08-22T23:58:14.175032" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:14.175694" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:14.175464" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:14.175446" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:58:14.175806" 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-08-22T23:58:14.178344" elapsed="0.000154"/>
</kw>
<msg time="2026-08-22T23:58:14.178558" 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-08-22T23:58:14.177231" elapsed="0.001478"/>
</kw>
<kw name="Open 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-08-22T23:58:14.178979" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:14.179304" 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-08-22T23:58:14.176620" 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-08-22T23:58:14.176067" elapsed="0.003483"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:58:14.118542" elapsed="0.061128"/>
</kw>
<msg time="2026-08-22T23:58:14.179765" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:14.179809" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:14.117924" elapsed="0.061922"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:58:14.180029" elapsed="0.000218"/>
</return>
<status status="PASS" start="2026-08-22T23:58:14.179923" elapsed="0.000397"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:14.179904" elapsed="0.000443"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:14.180766" 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-08-22T23:58:14.181096" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:58:14.181168" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:58:14.117182" elapsed="0.064094"/>
</kw>
<msg time="2026-08-22T23:58:14.181371" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:14.181415" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "S "e "e "n "_ "A "s "_ "E "m ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:14.112484" elapsed="0.068968"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:14.181886" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:14.181527" elapsed="0.000413"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:14.181510" elapsed="0.000454"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:58:14.112344" elapsed="0.069643"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:58:13.960833" elapsed="0.221202"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:58:13.958297" elapsed="0.223800"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:58:13.953082" elapsed="0.229073"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:13.952620" elapsed="0.229583"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:58:13.946652" elapsed="0.235607"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:14.183834" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:14.183428" elapsed="0.000433"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:14.191101" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:14.190851" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:14.191541" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:14.191296" 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-08-22T23:58:14.212736" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:14.212960" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:14.213114" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:14.193707" elapsed="0.020224">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:14.191669" elapsed="0.022474">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:14.214560" elapsed="0.000083"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:14.214218" elapsed="0.000598"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:14.191650" elapsed="0.023223">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:14.215751" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:14.216051" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:14.215967" elapsed="0.000175"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:14.215929" elapsed="0.000261"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:14.216504" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:14.216701" elapsed="0.000036"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:14.186519" elapsed="0.030417">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:14.217086" elapsed="0.000035"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:14.184072" elapsed="0.033225">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:14.217821" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:14.217473" elapsed="0.000492"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:14.217436" elapsed="0.000585"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:14.218449" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:14.218141" elapsed="0.000428"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:14.218107" elapsed="0.000547"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:14.183039" elapsed="0.035792">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:15.222056" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:15.221036" elapsed="0.001091"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:15.234269" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:15.234006" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:15.234734" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:15.234471" 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-08-22T23:58:15.243414" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:15.243770" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:15.244043" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:15.236942" elapsed="0.007958">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:15.234854" elapsed="0.010332">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:15.245654" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:15.245267" elapsed="0.000534"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:15.234831" elapsed="0.011023">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:15.246729" elapsed="0.000058"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:15.247032" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:15.246944" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:15.246906" 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-08-22T23:58:15.247484" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:15.247667" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:15.228931" elapsed="0.018965">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:15.248048" elapsed="0.000033"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:15.222673" elapsed="0.025584">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:15.248829" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:15.248478" elapsed="0.000475"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:15.248395" elapsed="0.000611"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:15.249344" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:15.249125" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:15.249090" elapsed="0.000371"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:15.219841" elapsed="0.029753">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:16.252876" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:16.251818" elapsed="0.001134"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:16.264785" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:16.264392" elapsed="0.000462"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:16.265421" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:16.265069" 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-08-22T23:58:16.274824" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:16.275022" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:16.275157" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:16.268263" elapsed="0.007426">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:16.265619" elapsed="0.010159">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:16.275973" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:16.275817" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:16.265561" elapsed="0.010502">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:16.276452" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:16.276611" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:16.276551" elapsed="0.000109"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:16.276534" elapsed="0.000147"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:16.276825" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:16.276894" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:16.257819" elapsed="0.019184">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:16.277072" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:16.253497" elapsed="0.023668">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:16.277384" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:16.277243" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:16.277227" elapsed="0.000236"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:16.277669" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:16.277515" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:16.277500" elapsed="0.000249"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:16.250518" elapsed="0.027308">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:17.280872" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:17.279853" elapsed="0.001092"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:17.292267" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:17.291907" elapsed="0.000427"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:17.292918" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:17.292547" 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-08-22T23:58:17.302332" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:17.302503" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:17.302714" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:17.295525" elapsed="0.007596">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:17.293091" elapsed="0.010117">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:17.303403" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:17.303246" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:17.293057" elapsed="0.010437">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:17.303895" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:17.304035" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:17.303995" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:17.303977" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:17.304247" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:17.304317" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:17.285463" elapsed="0.018961">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:17.304495" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:17.281443" elapsed="0.023160">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:17.304827" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:17.304684" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:17.304668" elapsed="0.000238"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:17.305096" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:17.304959" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:17.304944" elapsed="0.000230"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:17.278704" elapsed="0.026547">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:18.308361" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:18.307310" elapsed="0.001124"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:18.321529" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:18.321245" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:18.322013" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:18.321761" 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-08-22T23:58:18.330789" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:18.330968" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:18.331176" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:18.324238" elapsed="0.007374">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:18.322141" elapsed="0.009564">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:18.331920" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:18.331746" elapsed="0.000242"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:18.322116" elapsed="0.009897">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:18.332481" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:18.332652" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:18.332604" elapsed="0.000099"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:18.332569" elapsed="0.000157"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:18.332873" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:18.332944" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:18.315391" elapsed="0.017668">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:18.333130" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:18.308967" elapsed="0.024259">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:18.333451" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:18.333306" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:18.333289" elapsed="0.000242"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:18.333745" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:18.333603" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:18.333569" elapsed="0.000257"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:18.306191" elapsed="0.027715">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:19.337316" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:19.336310" elapsed="0.001088"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:19.351203" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:19.350795" elapsed="0.000484"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:19.351775" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:19.351506" 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-08-22T23:58:19.359883" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:19.360044" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:19.360226" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:19.353972" elapsed="0.006669">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:19.351898" elapsed="0.008825">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:19.360914" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:19.360758" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:19.351875" elapsed="0.009129">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:19.361386" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:19.361525" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:19.361485" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:19.361467" elapsed="0.000140"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:19.361751" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:19.361822" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:19.342211" elapsed="0.019716">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:19.361995" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:19.337926" elapsed="0.024162">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:19.362308" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:19.362166" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:19.362150" elapsed="0.000239"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:19.362594" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:19.362442" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:19.362427" elapsed="0.000255"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:19.335151" elapsed="0.027608">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:20.365438" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:20.364450" elapsed="0.001060"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:20.379068" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:20.378811" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:20.379515" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:20.379268" 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-08-22T23:58:20.388055" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:20.388205" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:20.388395" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:20.381918" elapsed="0.007034">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:20.379658" elapsed="0.009407">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:20.389333" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:20.389112" elapsed="0.000312"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:20.379628" elapsed="0.009829">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:20.390014" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:20.390206" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:20.390152" elapsed="0.000114"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:20.390128" elapsed="0.000167"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:20.390491" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:20.390608" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:20.371523" elapsed="0.019233">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:20.390853" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:20.366082" elapsed="0.024901">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:20.391289" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:20.391090" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:20.391068" elapsed="0.000330"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:20.391695" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:20.391471" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:20.391450" elapsed="0.000356"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:20.363453" elapsed="0.028460">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:21.395062" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:21.394020" elapsed="0.001138"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:21.410825" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:21.410543" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:21.411276" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:21.411029" 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-08-22T23:58:21.419930" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:21.420099" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:21.420288" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:21.413723" elapsed="0.007116">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:21.411408" elapsed="0.009548">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:21.421223" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:21.421006" elapsed="0.000308"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:21.411381" elapsed="0.009966">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:21.421887" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:21.422080" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:21.422025" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:21.422001" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:21.422390" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:21.422488" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:21.401691" elapsed="0.020965">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:21.422753" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:21.395764" elapsed="0.027119">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:21.423189" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:21.422992" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:21.422969" elapsed="0.000328"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:21.423562" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:21.423370" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:21.423349" elapsed="0.000351"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:21.392871" elapsed="0.030936">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:22.427062" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:22.425981" elapsed="0.001155"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:22.442032" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:22.441766" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:22.442482" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:22.442233" 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-08-22T23:58:22.452528" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:22.452805" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:22.453092" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:22.445186" elapsed="0.008506">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:22.442629" elapsed="0.011203">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:22.454141" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:22.453888" elapsed="0.000354"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:22.442601" elapsed="0.011678">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:22.454869" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:22.455076" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:22.455016" elapsed="0.000128"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:22.454990" elapsed="0.000187"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:22.455417" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:22.455522" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:22.433510" elapsed="0.022190">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:22.455804" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:22.427832" elapsed="0.028109">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:22.456268" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:22.456056" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:22.456032" elapsed="0.000357"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:22.456693" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:22.456468" elapsed="0.000310"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:22.456445" elapsed="0.000368"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:22.424775" elapsed="0.032152">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:23.460024" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:23.459046" elapsed="0.001049"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:23.473849" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:23.473587" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:23.474311" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:23.474050" 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-08-22T23:58:23.482744" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:23.482909" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:23.483095" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:23.476742" elapsed="0.006757">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:23.474442" elapsed="0.009159">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:23.483798" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:23.483640" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:23.474415" elapsed="0.009474">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:23.484266" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:23.484407" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:23.484365" elapsed="0.000093"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:23.484347" elapsed="0.000134"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:23.484639" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:23.484711" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:23.466157" elapsed="0.018661">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:23.484888" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:23.460611" elapsed="0.024371">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:23.485206" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:23.485061" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:23.485044" elapsed="0.000242"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:23.485480" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:23.485340" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:23.485325" elapsed="0.000234"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:23.457834" elapsed="0.027819">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:24.488806" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:24.487773" elapsed="0.001105"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:24.501792" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:24.501515" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:24.502240" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:24.501995" 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-08-22T23:58:24.510868" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:24.511032" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:24.511215" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:24.504668" elapsed="0.006999">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:24.502366" elapsed="0.009387">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.511945" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:24.511789" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:24.502342" elapsed="0.009693">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.512417" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:24.512557" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:24.512515" elapsed="0.000108"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:24.512498" elapsed="0.000147"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.512790" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:24.512860" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:24.495149" elapsed="0.017818">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:24.513035" elapsed="0.000014"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:24.489421" elapsed="0.023706">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.513364" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:24.513220" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:24.513203" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.513663" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:24.513497" elapsed="0.000236"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:24.513481" elapsed="0.000281"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:24.486525" elapsed="0.027323">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<msg time="2026-08-22T23:58:24.513943" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:58:14.182436" elapsed="10.331601">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<doc>Get the device data as seen by setter and make sure it is empty.</doc>
<status status="FAIL" start="2026-08-22T23:58:13.945256" elapsed="10.568949">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</test>
<test id="s1-s8-t11" name="Create_Device_Data" 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-08-22T23:58:24.517731" elapsed="0.000309"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:58:24.517427" elapsed="0.000692"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:24.519517" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:24.519363" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.519336" elapsed="0.000297"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:24.526933" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:24.526771" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.526693" elapsed="0.000339"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:58:24.528542" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:58:24.527971" elapsed="0.000644"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:58:24.529300" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:58:24.528842" elapsed="0.000495"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:58:24.529402" elapsed="0.000042"/>
</return>
<msg time="2026-08-22T23:58:24.529572" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:58:24.527362" elapsed="0.002253"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:24.535117" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:24.535007" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.534988" 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-08-22T23:58:24.536396" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:24.536289" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.536271" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:58:24.536937" level="INFO">${karaf_connection_index} = 94</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:58:24.536629" elapsed="0.000335"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:58:24.537366" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:58:24.537137" elapsed="0.000254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:58:24.572173" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:58:24.537901" elapsed="0.034645"/>
</kw>
<msg time="2026-08-22T23:58:24.573126" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:58:24.573247" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:24.537547" elapsed="0.035786"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:58:24.585633" level="INFO">"t "x "t ". "C "R "U "D ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:58:24.574465" elapsed="0.011268"/>
</kw>
<msg time="2026-08-22T23:58:24.585892" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:58:24.585939" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:24.573853" elapsed="0.012123"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.586338" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:24.586078" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.586048" elapsed="0.000374"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:24.586898" level="INFO"> "t "x "t ". "C "R "U "D ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:24.586567" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.587252" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:24.587034" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.587016" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:58:24.587371" 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-08-22T23:58:24.590149" elapsed="0.000392"/>
</kw>
<msg time="2026-08-22T23:58:24.590627" 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-08-22T23:58:24.588979" 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-08-22T23:58:24.591222" elapsed="0.000082"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.591623" 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-08-22T23:58:24.588287" elapsed="0.003529"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:58:24.587715" elapsed="0.004167"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:58:24.535990" elapsed="0.055993"/>
</kw>
<msg time="2026-08-22T23:58:24.592078" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:24.592123" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:24.535334" elapsed="0.056827"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:58:24.592347" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:58:24.592238" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.592219" 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-08-22T23:58:24.592858" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.593209" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:58:24.593282" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:58:24.534669" elapsed="0.058737"/>
</kw>
<msg time="2026-08-22T23:58:24.593503" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:24.593547" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:24.530003" elapsed="0.063654"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.593988" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:24.593737" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.593719" elapsed="0.000346"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:58:24.529861" elapsed="0.064228"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:24.599644" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:24.599519" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.599500" 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-08-22T23:58:24.600846" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:24.600738" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.600720" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:58:24.601394" level="INFO">${karaf_connection_index} = 95</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:58:24.601073" elapsed="0.000349"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:58:24.601821" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:58:24.601596" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:58:24.635602" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:58:24.602341" elapsed="0.033363"/>
</kw>
<msg time="2026-08-22T23:58:24.635877" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:58:24.635924" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:24.602005" elapsed="0.033958"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:58:24.650308" level="INFO">"t "x "t ". "C "R "U "D ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:58:24.636466" elapsed="0.013937"/>
</kw>
<msg time="2026-08-22T23:58:24.650630" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:58:24.650678" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:24.636131" elapsed="0.014585"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.651021" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:24.650796" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.650775" elapsed="0.000325"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:24.651540" level="INFO"> "t "x "t ". "C "R "U "D ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:24.651240" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.651905" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:24.651690" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.651671" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:58:24.652016" 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-08-22T23:58:24.654650" elapsed="0.000331"/>
</kw>
<msg time="2026-08-22T23:58:24.655044" 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-08-22T23:58:24.653478" elapsed="0.001698"/>
</kw>
<kw name="Open 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-08-22T23:58:24.655448" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.655941" 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-08-22T23:58:24.652853" elapsed="0.003275"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:58:24.652294" 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-08-22T23:58:24.600418" elapsed="0.055873"/>
</kw>
<msg time="2026-08-22T23:58:24.656382" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:24.656425" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:24.599859" elapsed="0.056603"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:58:24.656668" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:58:24.656538" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.656520" 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-08-22T23:58:24.657174" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.657508" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:58:24.657684" 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-08-22T23:58:24.599175" elapsed="0.058625"/>
</kw>
<msg time="2026-08-22T23:58:24.657894" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:24.657938" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:24.594365" elapsed="0.063609"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.658296" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:24.658049" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.658032" elapsed="0.000341"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:58:24.594225" elapsed="0.064172"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:24.663866" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:24.663757" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.663737" 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-08-22T23:58:24.665142" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:24.665035" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.665016" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:58:24.665676" level="INFO">${karaf_connection_index} = 96</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:58:24.665350" elapsed="0.000353"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:58:24.666076" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:58:24.665858" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:58:24.699057" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:58:24.666609" elapsed="0.032546"/>
</kw>
<msg time="2026-08-22T23:58:24.699331" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:58:24.699377" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:24.666257" elapsed="0.033158"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:58:24.719115" level="INFO">"t "x "t ". "C "R "U "D ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:58:24.699943" elapsed="0.019268"/>
</kw>
<msg time="2026-08-22T23:58:24.719366" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:58:24.719411" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:24.699604" elapsed="0.019843"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.719761" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:24.719522" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.719503" elapsed="0.000337"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:24.720273" level="INFO"> "t "x "t ". "C "R "U "D ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:24.719980" elapsed="0.000353"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.720628" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:24.720399" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.720382" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:58:24.720739" 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-08-22T23:58:24.723250" elapsed="0.000151"/>
</kw>
<msg time="2026-08-22T23:58:24.723461" 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-08-22T23:58:24.722155" elapsed="0.001461"/>
</kw>
<kw name="Open 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-08-22T23:58:24.723888" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.724337" elapsed="0.000255"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:58:24.721523" elapsed="0.003189"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:58:24.721000" elapsed="0.003776"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:58:24.664717" elapsed="0.060158"/>
</kw>
<msg time="2026-08-22T23:58:24.724980" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:24.725025" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:24.664119" elapsed="0.060942"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:58:24.725246" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:58:24.725139" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.725121" 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-08-22T23:58:24.725748" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.726118" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:58:24.726190" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:58:24.663380" elapsed="0.062919"/>
</kw>
<msg time="2026-08-22T23:58:24.726392" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:24.726435" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "r "e "a "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:24.658684" elapsed="0.067787"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.726896" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:24.726546" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.726529" elapsed="0.000445"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:58:24.658531" elapsed="0.068466"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:58:24.529676" elapsed="0.197350"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:58:24.526127" elapsed="0.200959"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:58:24.518963" elapsed="0.208184"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:24.518331" elapsed="0.208863"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:58:24.515201" elapsed="0.212049"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:58:24.727882" level="INFO">${template_as_string} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${template_as_string}</var>
<arg>DEVICE_NAME=${device_name}</arg>
<arg>RESTCONF_ROOT=${RESTCONF_ROOT}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:58:24.727425" elapsed="0.000484"/>
</kw>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:24.761280" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:24.760903" elapsed="0.000405"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:58:24.762096" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:58:24.761822" elapsed="0.000357">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:58:24.762274" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:58:24.761469" elapsed="0.000830"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:58:24.762864" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:58:24.762460" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:58:24.763185" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:58:24.763354" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:58:24.763050" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:24.763805" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:24.763532" 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-08-22T23:58:24.764821" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:24.764528" elapsed="0.000338"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:58:24.765469" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:58:24.765048" elapsed="0.000447"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:58:24.766176" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:58:24.765875" elapsed="0.000369"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:58:24.767047" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:58:24.766818" elapsed="0.000254"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:58:24.767122" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:58:24.767275" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:58:24.766452" elapsed="0.000847"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:58:24.767449" elapsed="0.000263"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:58:24.765743" elapsed="0.002011"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:58:24.768295" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:58:24.767998" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:58:24.769067" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:58:24.768837" elapsed="0.000255"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:58:24.769141" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:58:24.769291" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:58:24.768504" elapsed="0.000811"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:58:24.769461" elapsed="0.000238"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:58:24.767869" elapsed="0.001870"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:58:24.765549" elapsed="0.004225"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:58:24.769817" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:58:24.769974" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:58:24.764210" elapsed="0.005789"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:24.763916" elapsed="0.006115"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.770201" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:24.770056" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.763898" elapsed="0.006379"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:58:24.771089" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:24.770426" elapsed="0.000691"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:58:24.771166" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:58:24.760264" elapsed="0.011025"/>
</kw>
<msg time="2026-08-22T23:58:24.771343" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:58:24.747678" elapsed="0.023713"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.783655" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.795857" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.808333" 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-08-22T23:58:24.808527" 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-08-22T23:58:24.808906" 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-08-22T23:58:24.809270" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:24.809127" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:24.809113" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.809487" 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-08-22T23:58:24.809668" 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-08-22T23:58:24.809832" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:58:24.809085" elapsed="0.000799"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:58:24.808983" elapsed="0.000926"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.810053" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:24.810128" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:58:24.810261" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:58:24.743477" elapsed="0.066811"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:24.835325" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:24.834949" elapsed="0.000404"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:58:24.836091" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:58:24.835866" elapsed="0.000296">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:58:24.836255" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:58:24.835517" elapsed="0.000762"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:58:24.836862" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:58:24.836439" elapsed="0.000452"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:58:24.837193" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:58:24.837336" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:58:24.837057" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:24.837778" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:24.837513" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:58:24.838186" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:24.837894" elapsed="0.000351"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:24.838772" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:24.838460" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:24.838311" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.837874" elapsed="0.000982"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:58:24.839436" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:24.838999" elapsed="0.000466"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:58:24.839513" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:58:24.834320" elapsed="0.005336"/>
</kw>
<msg time="2026-08-22T23:58:24.839710" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:58:24.821841" elapsed="0.017916"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.851871" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.864129" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.878219" 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-08-22T23:58:24.878413" 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-08-22T23:58:24.878600" 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-08-22T23:58:24.878965" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:24.878824" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:24.878809" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.879179" 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-08-22T23:58:24.879341" 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-08-22T23:58:24.879500" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:58:24.878781" elapsed="0.000771"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:58:24.878678" elapsed="0.000914"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.879738" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:24.879814" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:58:24.879930" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:58:24.820954" elapsed="0.059040"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:58:24.881254" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:58:24.881020" elapsed="0.000297">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:58:24.881409" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:58:24.880668" elapsed="0.000765"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.881763" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:24.881502" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:24.882308" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:24.882016" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:24.881843" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.881484" elapsed="0.000908"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:58:24.884727" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:58:24.882539" elapsed="0.002214"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:58:24.884829" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:58:24.884983" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/dataorig/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:58:24.880330" elapsed="0.004678"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:24.886524" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:24.886276" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:24.886978" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:24.886739" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:24.887415" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:24.887173" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:24.887862" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:24.887620" elapsed="0.000286"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:58:24.888723" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:58:24.888506" elapsed="0.000243"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:58:24.889095" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:58:24.888919" 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-08-22T23:58:24.889265" elapsed="0.000203"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:24.889888" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:24.889640" elapsed="0.000293"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:58:24.889976" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:58:24.890131" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:58:24.888103" elapsed="0.002053"/>
</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-08-22T23:58:24.898840" level="INFO">POST Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Content-Length': '72', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:58:24.899002" level="INFO">POST Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:24.899139" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:24.892433" elapsed="0.007090">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:24.890225" elapsed="0.009400">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.899816" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:24.899661" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:24.890208" elapsed="0.009702">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.900280" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:24.900418" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:24.900381" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:24.900364" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.900637" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:24.900706" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:24.885337" elapsed="0.015493">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:24.900910" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:24.732536" elapsed="0.168467">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.901291" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:24.901115" elapsed="0.000245"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:24.901099" elapsed="0.000286"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:24.901418" elapsed="0.000014"/>
</return>
<arg>${directory_with_template_folders}${/}dataorig</arg>
<arg>${template_as_string}</arg>
<arg>session=${NODE_SETTER}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:58:24.728161" elapsed="0.173351">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</kw>
<doc>Send some sample test data into the device and check that the request went OK.</doc>
<status status="FAIL" start="2026-08-22T23:58:24.514652" elapsed="0.387033">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount</status>
</test>
<test id="s1-s8-t12" name="Check_New_Device_Data_Is_Visible_On_Setter" line="147">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:58:24.905831" elapsed="0.000301"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:58:24.905332" elapsed="0.000881"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:24.907678" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:24.907502" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.907476" 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-08-22T23:58:24.914862" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:24.914673" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.914647" elapsed="0.000309"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:58:24.916347" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:58:24.915818" elapsed="0.000571"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:58:24.917144" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:58:24.916660" elapsed="0.000520"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:58:24.917244" elapsed="0.000040"/>
</return>
<msg time="2026-08-22T23:58:24.917492" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:58:24.915265" elapsed="0.002261"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:24.923482" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:24.923367" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.923347" 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-08-22T23:58:24.924758" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:24.924633" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.924613" elapsed="0.000212"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:58:24.925267" level="INFO">${karaf_connection_index} = 94</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:58:24.924968" elapsed="0.000325"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:58:24.925693" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:58:24.925449" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:58:24.959448" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:58:24.926206" elapsed="0.033347"/>
</kw>
<msg time="2026-08-22T23:58:24.959761" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:58:24.959809" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:24.925875" elapsed="0.033972"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:58:24.978471" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "S "e "t "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-08-22T23:58:24.960369" elapsed="0.018227"/>
</kw>
<msg time="2026-08-22T23:58:24.978762" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:58:24.978808" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:58:24.960019" elapsed="0.018825"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.979145" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:24.978921" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.978901" elapsed="0.000325"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:24.979686" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "S "e "t "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-08-22T23:58:24.979368" 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-08-22T23:58:24.980039" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:24.979824" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.979806" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:58:24.980152" 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-08-22T23:58:24.982804" elapsed="0.000154"/>
</kw>
<msg time="2026-08-22T23:58:24.983020" 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-08-22T23:58:24.981662" 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-08-22T23:58:24.983421" elapsed="0.000082"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.983825" 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-08-22T23:58:24.981030" 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-08-22T23:58:24.980448" elapsed="0.003624"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:58:24.924310" elapsed="0.059860"/>
</kw>
<msg time="2026-08-22T23:58:24.984262" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:24.984306" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:58:24.923718" elapsed="0.060625"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:58:24.984526" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:58:24.984419" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.984401" elapsed="0.000330"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.985134" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.985465" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:58:24.985696" 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-08-22T23:58:24.923024" elapsed="0.062783"/>
</kw>
<msg time="2026-08-22T23:58:24.985899" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:24.985943" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:58:24.917908" elapsed="0.068072"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:24.986303" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:24.986055" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.986038" elapsed="0.000342"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:58:24.917771" elapsed="0.068633"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:24.991930" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:24.991822" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.991802" 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-08-22T23:58:24.993176" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:24.993068" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:24.993050" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:58:24.993694" level="INFO">${karaf_connection_index} = 95</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:58:24.993383" elapsed="0.000337"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:58:24.994092" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:58:24.993874" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:58:25.024437" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:58:24.994628" elapsed="0.030120"/>
</kw>
<msg time="2026-08-22T23:58:25.025113" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:58:25.025216" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:24.994274" elapsed="0.031025"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:58:25.042257" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "S "e "t "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-08-22T23:58:25.026053" elapsed="0.016308"/>
</kw>
<msg time="2026-08-22T23:58:25.042552" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:58:25.042632" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:58:25.025698" elapsed="0.016973"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:25.042980" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:25.042754" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:25.042732" elapsed="0.000329"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:25.043499" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "S "e "t "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-08-22T23:58:25.043202" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:25.043866" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:25.043654" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:25.043635" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:58:25.043978" 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-08-22T23:58:25.046497" elapsed="0.000173"/>
</kw>
<msg time="2026-08-22T23:58:25.046732" 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-08-22T23:58:25.045428" elapsed="0.001432"/>
</kw>
<kw name="Open 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-08-22T23:58:25.047130" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:25.047457" 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-08-22T23:58:25.044812" elapsed="0.002848"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:58:25.044248" elapsed="0.003477"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:58:24.992765" elapsed="0.055057"/>
</kw>
<msg time="2026-08-22T23:58:25.047915" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:25.047959" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:58:24.992147" elapsed="0.055850"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:58:25.048180" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:58:25.048073" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:25.048055" 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-08-22T23:58:25.048705" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:25.049036" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:58:25.049106" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:58:24.991465" elapsed="0.057749"/>
</kw>
<msg time="2026-08-22T23:58:25.049309" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:25.049352" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:58:24.986697" elapsed="0.062692"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:25.049822" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:25.049466" elapsed="0.000411"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:25.049448" elapsed="0.000485"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:58:24.986531" elapsed="0.063429"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:25.055561" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:25.055453" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:25.055433" 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-08-22T23:58:25.056804" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:25.056696" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:25.056678" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:58:25.057308" level="INFO">${karaf_connection_index} = 96</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:58:25.057011" elapsed="0.000323"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:58:25.057725" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:58:25.057487" elapsed="0.000264"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:58:25.089866" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:58:25.058236" elapsed="0.031735"/>
</kw>
<msg time="2026-08-22T23:58:25.090132" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:58:25.090178" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:25.057907" elapsed="0.032308"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:58:25.110538" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "S "e "t "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-08-22T23:58:25.090743" elapsed="0.019918"/>
</kw>
<msg time="2026-08-22T23:58:25.110820" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:58:25.110865" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:58:25.090381" elapsed="0.020521"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:25.111195" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:25.110979" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:25.110959" elapsed="0.000314"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:25.111721" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "S "e "t "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-08-22T23:58:25.111412" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:25.112067" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:25.111856" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:25.111838" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:58:25.112176" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<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-08-22T23:58:25.114719" elapsed="0.000153"/>
</kw>
<msg time="2026-08-22T23:58:25.114933" 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-08-22T23:58:25.113639" 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-08-22T23:58:25.115364" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:25.115713" 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-08-22T23:58:25.112985" elapsed="0.002913"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:58:25.112424" 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-08-22T23:58:25.056360" elapsed="0.059702"/>
</kw>
<msg time="2026-08-22T23:58:25.116154" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:25.116198" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:58:25.055801" elapsed="0.060471"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:58:25.116457" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:58:25.116350" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:25.116332" 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-08-22T23:58:25.116968" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:25.117297" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:58:25.117369" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:58:25.055096" elapsed="0.062381"/>
</kw>
<msg time="2026-08-22T23:58:25.117570" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:25.117722" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:58:25.050226" elapsed="0.067535"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:25.118084" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:25.117838" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:25.117820" elapsed="0.000341"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:58:25.050086" elapsed="0.068099"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:58:24.917596" elapsed="0.200618"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:58:24.914150" elapsed="0.204123"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:58:24.907096" elapsed="0.211235"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:24.906472" elapsed="0.211905"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:58:24.902857" elapsed="0.215575"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:25.120000" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:25.119615" elapsed="0.000412"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:25.127757" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:25.127486" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:25.128205" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:25.127960" 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-08-22T23:58:25.136491" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:25.136688" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:25.136807" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:25.130483" elapsed="0.006719">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:25.128317" elapsed="0.009010">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:25.137530" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:25.137363" elapsed="0.000247"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:25.128299" elapsed="0.009337">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:25.138010" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:25.138145" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:25.138107" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:25.138089" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:25.138350" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:25.138420" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:25.122913" elapsed="0.015617">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:25.138614" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:25.120237" elapsed="0.018473">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:25.138935" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:25.138788" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:25.138771" elapsed="0.000242"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:25.139208" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:25.139066" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:25.139051" elapsed="0.000236"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:25.119208" elapsed="0.020156">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:26.142304" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:26.141299" elapsed="0.001077"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:26.154841" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:26.154455" elapsed="0.000454"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:26.155471" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:26.155123" elapsed="0.000516"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:58:26.164226" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:26.164388" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:26.164510" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:26.158105" elapsed="0.006878">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:26.155759" elapsed="0.009309">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:26.165260" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:26.165105" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:26.155727" elapsed="0.009624">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:26.165750" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:26.165892" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:26.165850" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:26.165832" elapsed="0.000128"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:26.166105" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:26.166176" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:26.147370" elapsed="0.018914">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:26.166353" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:26.142899" elapsed="0.023547">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:26.166686" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:26.166526" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:26.166509" elapsed="0.000258"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:26.166961" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:26.166821" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:26.166806" elapsed="0.000267"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:26.140201" elapsed="0.026952">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:27.170161" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:27.169150" elapsed="0.001083"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:27.181333" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:27.180969" elapsed="0.000432"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:27.181987" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:27.181638" 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-08-22T23:58:27.190638" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:27.190796" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:27.190990" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:27.184637" elapsed="0.006752">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:27.182156" elapsed="0.009332">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:27.191782" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:27.191541" elapsed="0.000335"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:27.182124" elapsed="0.009788">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:27.192442" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:27.192664" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:27.192605" elapsed="0.000123"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:27.192560" elapsed="0.000199"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:27.192962" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:27.193061" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:27.174896" elapsed="0.018312">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:27.193305" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:27.170809" elapsed="0.022627">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:27.193769" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:27.193546" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:27.193524" elapsed="0.000359"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:27.194152" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:27.193958" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:27.193937" elapsed="0.000325"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:27.167987" elapsed="0.026382">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:28.197366" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:28.196374" elapsed="0.001062"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:28.212179" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:28.211918" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:28.212649" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:28.212382" 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-08-22T23:58:28.220606" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:28.220826" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:28.221060" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:28.214857" elapsed="0.006777">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:28.212773" elapsed="0.008988">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:28.222033" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:28.221812" elapsed="0.000314"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:28.212749" elapsed="0.009411">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:28.222771" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:28.222966" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:28.222908" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:28.222884" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:28.223256" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:28.223356" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:28.203948" elapsed="0.019552">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:28.223615" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:28.198013" elapsed="0.025737">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:28.224060" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:28.223861" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:28.223838" elapsed="0.000333"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:28.224440" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:28.224247" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:28.224225" elapsed="0.000324"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:28.195253" elapsed="0.029423">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:29.227527" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:29.226502" elapsed="0.001127"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:29.239087" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:29.238723" elapsed="0.000431"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:29.239754" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:29.239367" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:58:29.247753" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:29.247912" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:29.248086" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:29.241940" elapsed="0.006533">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:29.239875" elapsed="0.008695">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:29.248911" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:29.248650" elapsed="0.000353"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:29.239852" elapsed="0.009186">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:29.249562" elapsed="0.000058"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:29.249780" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:29.249725" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:29.249700" elapsed="0.000172"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:29.250068" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:29.250166" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:29.232426" elapsed="0.017884">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:29.250404" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:29.228123" elapsed="0.022411">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:29.250861" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:29.250664" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:29.250641" elapsed="0.000331"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:29.251236" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:29.251046" elapsed="0.000266"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:29.251024" elapsed="0.000320"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:29.225409" elapsed="0.026040">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:30.254178" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:30.253213" elapsed="0.001033"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:30.265637" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:30.265259" elapsed="0.000447"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:30.266265" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:30.265920" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:58:30.274614" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:30.274772" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:30.274938" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:30.269203" elapsed="0.006109">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:30.266427" elapsed="0.008966">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:30.275603" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:30.275428" elapsed="0.000243"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:30.266399" elapsed="0.009297">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:30.276088" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:30.276225" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:30.276185" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:30.276168" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:30.276432" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:30.276503" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:30.259101" elapsed="0.017520">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:30.276691" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:30.254761" elapsed="0.022024">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:30.277005" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:30.276863" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:30.276846" elapsed="0.000238"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:30.277275" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:30.277137" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:30.277122" elapsed="0.000231"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:30.252183" elapsed="0.025246">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:31.280541" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:31.279524" elapsed="0.001139"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:31.295371" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:31.295002" elapsed="0.000438"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:31.295910" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:31.295663" 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-08-22T23:58:31.305692" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:31.305906" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:31.306137" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:31.298092" elapsed="0.008580">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:31.296033" elapsed="0.010754">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:31.307088" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:31.306837" elapsed="0.000345"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:31.296009" elapsed="0.011206">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:31.307765" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:31.307957" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:31.307901" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:31.307876" elapsed="0.000172"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:31.308246" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:31.308344" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:31.287242" elapsed="0.021246">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:31.308601" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:31.281213" elapsed="0.027521">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:31.309041" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:31.308843" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:31.308820" elapsed="0.000332"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:31.309419" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:31.309226" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:31.309205" elapsed="0.000323"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:31.278282" elapsed="0.031371">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:32.313225" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:32.312217" elapsed="0.001090"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:32.324983" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:32.324717" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:32.325483" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:32.325187" 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-08-22T23:58:32.333935" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:32.334120" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:32.334316" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:32.327736" elapsed="0.007012">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:32.325620" elapsed="0.009212">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:32.335021" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:32.334867" elapsed="0.000219"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:32.325597" elapsed="0.009512">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:32.335475" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:32.335628" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:32.335570" elapsed="0.000103"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:32.335553" elapsed="0.000141"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:32.335836" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:32.335905" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:32.320376" elapsed="0.015632">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:32.336075" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:32.313838" elapsed="0.022328">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:32.336382" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:32.336243" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:32.336227" elapsed="0.000234"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:32.336668" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:32.336514" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:32.336499" elapsed="0.000256"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:32.311016" elapsed="0.025815">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:33.339929" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:33.338890" elapsed="0.001112"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:33.351077" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:33.350808" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:33.351546" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:33.351298" 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-08-22T23:58:33.360878" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:33.361050" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:33.361279" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:33.354071" elapsed="0.007641">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:33.351690" elapsed="0.010109">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:33.361990" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:33.361836" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:33.351664" elapsed="0.010417">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:33.362451" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:33.362605" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:33.362548" elapsed="0.000108"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:33.362531" elapsed="0.000148"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:33.362821" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:33.362893" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:33.346163" elapsed="0.016836">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:33.363068" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:33.340499" elapsed="0.022660">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:33.363379" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:33.363237" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:33.363220" elapsed="0.000239"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:33.363670" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:33.363512" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:33.363497" elapsed="0.000254"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:33.337703" elapsed="0.026125">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:34.366911" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:34.365878" elapsed="0.001104"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:34.378616" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:34.378334" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:34.379073" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:34.378823" 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-08-22T23:58:34.388005" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:34.388174" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:34.388368" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:34.381296" elapsed="0.007514">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:34.379201" elapsed="0.009695">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:34.389090" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:34.388933" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:34.379175" elapsed="0.010004">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:34.389566" elapsed="0.000043"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:34.389722" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:34.389682" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:34.389664" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:34.389932" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:34.390001" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:34.373233" elapsed="0.016873">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:34.390173" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:34.367477" elapsed="0.022788">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:34.390483" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:34.390342" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:34.390326" elapsed="0.000234"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:34.390799" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:34.390633" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:34.390615" elapsed="0.000262"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:34.364715" elapsed="0.026239">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:35.393847" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:35.392868" elapsed="0.001051"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:35.405156" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:35.404898" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:35.405619" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:35.405358" 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-08-22T23:58:35.414311" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:35.414468" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:35.414662" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:35.407888" elapsed="0.007166">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:35.405741" elapsed="0.009394">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:35.415323" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:35.415170" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:35.405718" elapsed="0.009693">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:35.415825" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:35.415963" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:35.415923" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:35.415905" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:35.416172" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:35.416241" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:35.399996" elapsed="0.016351">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:35.416415" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:35.394409" elapsed="0.022098">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:35.416756" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:35.416605" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:35.416568" elapsed="0.000266"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:35.417028" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:35.416888" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:35.416873" elapsed="0.000232"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:35.391794" elapsed="0.025388">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<msg time="2026-08-22T23:58:35.417277" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${NODE_SETTER}</arg>
<arg>${original_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:58:25.118624" elapsed="10.298748">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<doc>Get the device data and make sure it contains the created content.</doc>
<status status="FAIL" start="2026-08-22T23:58:24.902234" elapsed="10.515311">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</test>
<test id="s1-s8-t13" name="Check_New_Device_Data_Is_Visible_On_Checker" line="156">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:58:35.422516" elapsed="0.000319"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:58:35.422145" elapsed="0.000771"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:35.424350" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:35.424193" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:35.424167" elapsed="0.000277"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:35.431642" elapsed="0.000061"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:35.431466" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:35.431439" elapsed="0.000362"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:58:35.433076" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:58:35.432686" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:58:35.433572" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:58:35.433265" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:58:35.433661" elapsed="0.000034"/>
</return>
<msg time="2026-08-22T23:58:35.433839" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:58:35.432136" elapsed="0.001729"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:35.439348" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:35.439240" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:35.439221" 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-08-22T23:58:35.440660" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:35.440527" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:35.440510" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:58:35.441182" level="INFO">${karaf_connection_index} = 94</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:58:35.440875" elapsed="0.000333"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:58:35.441774" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:58:35.441515" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:58:35.476101" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:58:35.442295" elapsed="0.033913"/>
</kw>
<msg time="2026-08-22T23:58:35.476371" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:58:35.476418" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:35.441961" elapsed="0.034494"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:58:35.501320" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:58:35.476983" elapsed="0.024443"/>
</kw>
<msg time="2026-08-22T23:58:35.501605" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:58:35.501654" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:58:35.476642" elapsed="0.025049"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:35.501988" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:35.501767" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:35.501748" elapsed="0.000317"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:35.502501" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:35.502206" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:35.502871" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:35.502658" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:35.502640" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:58:35.502981" 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-08-22T23:58:35.505596" elapsed="0.000293"/>
</kw>
<msg time="2026-08-22T23:58:35.505955" 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-08-22T23:58:35.504459" elapsed="0.001676"/>
</kw>
<kw name="Open 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-08-22T23:58:35.506557" elapsed="0.000104"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:35.506929" 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-08-22T23:58:35.503834" 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-08-22T23:58:35.503252" elapsed="0.003928"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:58:35.440220" elapsed="0.067060"/>
</kw>
<msg time="2026-08-22T23:58:35.507373" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:35.507417" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:58:35.439567" elapsed="0.067889"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:58:35.507685" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:58:35.507532" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:35.507514" 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 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:35.508167" 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-08-22T23:58:35.508492" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:58:35.508563" elapsed="0.000122"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:58:35.438901" elapsed="0.069883"/>
</kw>
<msg time="2026-08-22T23:58:35.508878" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:35.508923" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:58:35.434246" elapsed="0.074714"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:35.509283" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:35.509035" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:35.509017" elapsed="0.000343"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:58:35.434105" elapsed="0.075278"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:35.514748" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:35.514635" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:35.514615" 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-08-22T23:58:35.515974" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:35.515867" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:35.515849" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:58:35.516478" level="INFO">${karaf_connection_index} = 95</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:58:35.516182" elapsed="0.000322"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:58:35.516897" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:58:35.516677" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:58:35.549737" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:58:35.517409" elapsed="0.032430"/>
</kw>
<msg time="2026-08-22T23:58:35.549999" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:58:35.550045" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:35.517078" elapsed="0.033003"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:58:35.567979" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:58:35.550604" elapsed="0.017528"/>
</kw>
<msg time="2026-08-22T23:58:35.568292" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:58:35.568338" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:58:35.550248" elapsed="0.018127"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:35.568691" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:35.568452" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:35.568433" elapsed="0.000340"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:35.569208" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:35.568912" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:35.569557" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:35.569344" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:35.569326" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:58:35.569688" 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-08-22T23:58:35.572224" elapsed="0.000151"/>
</kw>
<msg time="2026-08-22T23:58:35.572435" 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-08-22T23:58:35.571091" elapsed="0.001472"/>
</kw>
<kw name="Open 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-08-22T23:58:35.573110" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:35.573573" 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-08-22T23:58:35.570464" 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-08-22T23:58:35.569942" elapsed="0.003952"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:58:35.515525" elapsed="0.058468"/>
</kw>
<msg time="2026-08-22T23:58:35.574085" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:35.574129" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:58:35.514963" elapsed="0.059204"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:58:35.574352" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:58:35.574244" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:35.574226" 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-08-22T23:58:35.574866" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:35.575196" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:58:35.575268" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:58:35.514284" elapsed="0.061092"/>
</kw>
<msg time="2026-08-22T23:58:35.575469" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:35.575513" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:58:35.509661" elapsed="0.065903"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:35.575927" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:35.575672" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:35.575649" elapsed="0.000355"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:58:35.509507" elapsed="0.066520"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:35.581409" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:35.581300" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:35.581281" 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-08-22T23:58:35.582682" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:35.582547" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:35.582528" elapsed="0.000223"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:58:35.583201" level="INFO">${karaf_connection_index} = 96</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:58:35.582893" elapsed="0.000337"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:58:35.583662" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:58:35.583393" elapsed="0.000296"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:58:35.617205" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:58:35.584211" elapsed="0.033127"/>
</kw>
<msg time="2026-08-22T23:58:35.617504" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:58:35.617551" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:35.583848" elapsed="0.033761"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:58:35.637330" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:58:35.618141" elapsed="0.019298"/>
</kw>
<msg time="2026-08-22T23:58:35.637617" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:58:35.637665" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:58:35.617787" elapsed="0.019915"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:35.638024" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:35.637788" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:35.637765" elapsed="0.000341"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:35.638550" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:35.638248" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:35.638917" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:35.638705" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:35.638687" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:58:35.639032" 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-08-22T23:58:35.641715" elapsed="0.000158"/>
</kw>
<msg time="2026-08-22T23:58:35.641935" 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-08-22T23:58:35.640537" 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-08-22T23:58:35.642338" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:35.642689" 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-08-22T23:58:35.639920" elapsed="0.003136"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:58:35.639314" elapsed="0.003807"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:58:35.582244" elapsed="0.060976"/>
</kw>
<msg time="2026-08-22T23:58:35.643316" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:35.643360" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:58:35.581681" elapsed="0.061716"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:58:35.643636" elapsed="0.000243"/>
</return>
<status status="PASS" start="2026-08-22T23:58:35.643475" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:35.643456" elapsed="0.000601"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:35.644462" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:35.644878" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:58:35.644952" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:58:35.580959" elapsed="0.064102"/>
</kw>
<msg time="2026-08-22T23:58:35.645157" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:35.645200" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:58:35.576288" elapsed="0.068949"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:35.645559" elapsed="0.000073"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:35.645312" elapsed="0.000355"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:35.645294" elapsed="0.000398"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:58:35.576149" elapsed="0.069567"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:58:35.433923" elapsed="0.211825"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:58:35.430889" elapsed="0.214920"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:58:35.423784" elapsed="0.222083"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:35.423130" elapsed="0.222784"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:58:35.418980" elapsed="0.226988"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:35.647520" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:35.647122" elapsed="0.000426"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:35.654789" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:35.654523" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:35.655228" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:35.654985" 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-08-22T23:58:35.664425" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:35.664815" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:35.665069" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:35.657415" elapsed="0.008548">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:35.655336" elapsed="0.010825">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:35.666644" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:35.666241" elapsed="0.000655"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:35.655318" elapsed="0.011642">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:35.668025" elapsed="0.000065"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:35.668350" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:35.668261" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:35.668219" elapsed="0.000280"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:35.668786" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:35.668886" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:35.650213" elapsed="0.018818">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:35.669126" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:35.647773" elapsed="0.021480">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:35.669561" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:35.669361" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:35.669339" elapsed="0.000357"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:35.669963" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:35.669770" elapsed="0.000267"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:35.669748" elapsed="0.000321"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:35.646731" elapsed="0.023444">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:36.673527" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:36.672533" elapsed="0.001097"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:36.684709" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:36.684434" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:36.685164" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:36.684917" 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-08-22T23:58:36.693869" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:36.694042" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:36.694172" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:36.687373" elapsed="0.007198">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:36.685285" elapsed="0.009470">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:36.694984" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:36.694800" elapsed="0.000252"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:36.685262" elapsed="0.009815">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:36.695450" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:36.695606" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:36.695548" elapsed="0.000106"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:36.695531" elapsed="0.000145"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:36.695825" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:36.695897" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:36.680085" elapsed="0.015917">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:36.696072" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:36.674125" elapsed="0.022040">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:36.696386" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:36.696243" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:36.696227" elapsed="0.000238"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:36.696677" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:36.696517" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:36.696502" elapsed="0.000256"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:36.671447" elapsed="0.025388">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:37.700329" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:37.699310" elapsed="0.001105"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:37.712077" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:37.711710" elapsed="0.000436"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:37.712728" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:37.712360" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:58:37.723385" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:37.723546" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:37.723680" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:37.715513" elapsed="0.008792">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:37.712897" elapsed="0.011524">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:37.724712" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:37.724471" elapsed="0.000336"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:37.712864" elapsed="0.011979">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:37.725361" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:37.725555" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:37.725500" elapsed="0.000138"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:37.725475" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:37.725872" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:37.725971" elapsed="0.000042"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:37.705108" elapsed="0.021030">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:37.726234" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:37.700939" elapsed="0.025424">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:37.726691" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:37.726473" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:37.726450" elapsed="0.000354"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:37.727071" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:37.726879" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:37.726857" elapsed="0.000324"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:37.697703" elapsed="0.029586">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:38.730150" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:38.729158" elapsed="0.001062"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:38.741929" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:38.741666" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:38.742397" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:38.742148" 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-08-22T23:58:38.754072" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:38.754394" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:38.754766" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:38.744563" elapsed="0.010988">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:38.742515" elapsed="0.013249">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:38.756202" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:38.755844" elapsed="0.000505"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:38.742494" elapsed="0.013908">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:38.757297" elapsed="0.000069"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:38.757642" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:38.757528" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:38.757489" 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-08-22T23:58:38.758103" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:38.758257" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:38.736182" elapsed="0.022304">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:38.758667" elapsed="0.000035"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:38.730742" elapsed="0.028136">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:38.759365" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:38.759051" elapsed="0.000438"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:38.759015" elapsed="0.000526"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:38.760001" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:38.759691" elapsed="0.000432"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:38.759656" elapsed="0.000518"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:38.728103" elapsed="0.032242">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:39.763120" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:39.762165" elapsed="0.001021"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:39.774407" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:39.774154" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:39.774876" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:39.774629" 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-08-22T23:58:39.786303" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:39.786492" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:39.786746" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:39.777073" elapsed="0.010213">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:39.774988" elapsed="0.012409">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:39.787682" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:39.787444" elapsed="0.000331"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:39.774969" elapsed="0.012840">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:39.788327" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:39.788516" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:39.788462" elapsed="0.000158"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:39.788438" 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-08-22T23:58:39.788857" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:39.788955" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:39.767696" elapsed="0.021403">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:39.789195" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:39.763699" elapsed="0.025627">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:39.789652" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:39.789435" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:39.789412" elapsed="0.000352"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:39.790031" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:39.789839" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:39.789817" elapsed="0.000324"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:39.761089" elapsed="0.029161">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:40.793078" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:40.792100" elapsed="0.001047"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:40.808934" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:40.808644" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:40.809417" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:40.809140" 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-08-22T23:58:40.820100" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:40.820261" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:40.820448" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:40.811632" elapsed="0.009229">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:40.809546" elapsed="0.011400">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:40.821139" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:40.820983" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:40.809520" elapsed="0.011711">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:40.821628" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:40.821770" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:40.821728" elapsed="0.000092"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:40.821711" elapsed="0.000131"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:40.821985" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:40.822055" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:40.800043" elapsed="0.022120">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:40.822232" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:40.793667" elapsed="0.028658">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:40.822543" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:40.822402" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:40.822387" elapsed="0.000252"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:40.822831" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:40.822692" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:40.822677" elapsed="0.000232"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:40.791032" elapsed="0.031954">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:41.825686" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:41.824709" elapsed="0.001045"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:41.836683" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:41.836312" elapsed="0.000439"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:41.837299" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:41.836960" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:58:41.848056" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:41.848209" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:41.848374" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:41.840432" elapsed="0.008344">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:41.837455" elapsed="0.011403">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:41.849051" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:41.848893" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:41.837428" elapsed="0.011715">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:41.849520" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:41.849689" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:41.849650" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:41.849632" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:41.849897" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:41.849967" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:41.830313" elapsed="0.019758">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:41.850139" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:41.826237" elapsed="0.023994">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:41.850449" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:41.850308" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:41.850292" elapsed="0.000234"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:41.850736" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:41.850595" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:41.850563" elapsed="0.000251"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:41.823725" elapsed="0.027166">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:42.853666" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:42.852688" elapsed="0.001047"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:42.864666" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:42.864286" elapsed="0.000448"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:42.865296" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:42.864948" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:58:42.878363" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:42.879119" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:42.879691" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:42.868229" elapsed="0.012903">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:42.865461" elapsed="0.015915">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:42.881957" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:42.881475" elapsed="0.000586"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:42.865433" elapsed="0.016664">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:42.882818" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:42.883040" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:42.882978" elapsed="0.000129"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:42.882946" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:42.883342" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:42.883440" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:42.858051" elapsed="0.025572">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:42.883725" elapsed="0.000024"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:42.854225" elapsed="0.029639">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:42.884186" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:42.883977" elapsed="0.000287"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:42.883954" elapsed="0.000344"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:42.884569" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:42.884373" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:42.884350" elapsed="0.000353"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:42.851660" elapsed="0.033157">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:43.887722" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:43.886715" elapsed="0.001071"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:43.899455" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:43.899094" elapsed="0.000428"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:43.900101" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:43.899756" 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-08-22T23:58:43.909886" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:43.910048" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:43.910212" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:43.903332" elapsed="0.007274">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:43.900265" elapsed="0.010422">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:43.910875" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:43.910721" elapsed="0.000219"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:43.900238" elapsed="0.010726">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:43.911337" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:43.911472" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:43.911434" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:43.911416" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:43.911694" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:43.911764" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:43.892929" elapsed="0.018939">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:43.911940" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:43.888274" elapsed="0.023758">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:43.912250" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:43.912110" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:43.912093" elapsed="0.000236"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:43.912518" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:43.912382" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:43.912367" elapsed="0.000244"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:43.885571" elapsed="0.027118">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:44.915354" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:44.914417" elapsed="0.001003"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:44.926791" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:44.926414" elapsed="0.000443"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:44.927416" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:44.927075" 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-08-22T23:58:44.936662" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:44.936808" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:44.937009" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:44.930364" elapsed="0.007151">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:44.927597" elapsed="0.010051">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:44.937911" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:44.937697" elapsed="0.000305"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:44.927550" elapsed="0.010485">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:44.938547" elapsed="0.000055"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:44.938760" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:44.938705" elapsed="0.000115"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:44.938681" elapsed="0.000170"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:44.939092" elapsed="0.000037"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:44.939201" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:44.920211" elapsed="0.019135">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:44.939441" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:44.915938" elapsed="0.023634">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:44.939910" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:44.939710" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:44.939686" elapsed="0.000334"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:44.940285" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:44.940094" elapsed="0.000267"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:44.940073" elapsed="0.000319"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:44.913410" elapsed="0.027091">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:45.943029" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:45.942108" elapsed="0.000986"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:45.953897" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:45.953524" elapsed="0.000439"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:45.954518" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:45.954181" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:58:45.964078" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:45.964204" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:45.964464" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:45.957542" elapsed="0.007291">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:45.954698" elapsed="0.010215">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:45.965108" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:45.964953" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:45.954672" elapsed="0.010533">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:45.965571" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:45.965726" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:45.965687" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:45.965669" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:45.965934" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:45.966005" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:45.947493" elapsed="0.018617">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:45.966179" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:45.943564" elapsed="0.022708">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:45.966492" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:45.966349" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:45.966333" elapsed="0.000238"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:45.966779" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:45.966642" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:45.966626" elapsed="0.000231"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:45.941160" elapsed="0.025775">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<msg time="2026-08-22T23:58:45.967026" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${NODE_CHECKER}</arg>
<arg>${original_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:58:35.646138" elapsed="10.320982">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<doc>Check that the created device data make their way into the checker node.</doc>
<status status="FAIL" start="2026-08-22T23:58:35.418298" elapsed="10.548994">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</test>
<test id="s1-s8-t14" name="Check_New_Device_Data_Is_Visible_On_Configurer" line="165">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:58:45.972401" elapsed="0.000341"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:58:45.972033" elapsed="0.000788"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:45.974253" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:45.974098" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:45.974072" elapsed="0.000275"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:45.981367" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:45.981259" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:45.981240" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:58:45.982435" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:58:45.982047" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:58:45.982944" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:58:45.982638" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:58:45.983017" elapsed="0.000032"/>
</return>
<msg time="2026-08-22T23:58:45.983177" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:58:45.981671" elapsed="0.001531"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:45.988697" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:45.988556" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:45.988537" 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-08-22T23:58:45.989942" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:45.989833" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:45.989815" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:58:45.990461" level="INFO">${karaf_connection_index} = 94</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:58:45.990155" elapsed="0.000333"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:58:45.990892" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:58:45.990663" elapsed="0.000255"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:58:46.021914" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:58:45.991404" elapsed="0.030624"/>
</kw>
<msg time="2026-08-22T23:58:46.022190" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:58:46.022237" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:45.991073" elapsed="0.031201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:58:46.043485" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:58:46.022804" elapsed="0.020993"/>
</kw>
<msg time="2026-08-22T23:58:46.044102" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:58:46.044168" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:58:46.022439" elapsed="0.021782"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:46.044855" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:46.044379" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:46.044334" elapsed="0.000641"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:46.045705" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:46.045178" elapsed="0.000631"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:46.046207" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:46.045905" elapsed="0.000379"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:46.045879" elapsed="0.000439"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:58:46.046370" 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-08-22T23:58:46.050066" elapsed="0.000542"/>
</kw>
<msg time="2026-08-22T23:58:46.050697" 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-08-22T23:58:46.048523" elapsed="0.002439"/>
</kw>
<kw name="Open 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-08-22T23:58:46.051345" elapsed="0.000108"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:46.051834" elapsed="0.000106"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:58:46.047623" elapsed="0.004471"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:58:46.046813" elapsed="0.005371"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:58:45.989510" elapsed="0.062812"/>
</kw>
<msg time="2026-08-22T23:58:46.052454" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:46.052550" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:58:45.988915" elapsed="0.063718"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:58:46.052894" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-22T23:58:46.052744" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:46.052717" 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 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:46.053611" elapsed="0.000047"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:46.054004" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:58:46.054075" 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-08-22T23:58:45.988209" elapsed="0.065977"/>
</kw>
<msg time="2026-08-22T23:58:46.054286" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:46.054333" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:58:45.983603" elapsed="0.070768"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:46.054716" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:46.054446" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:46.054429" elapsed="0.000366"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:58:45.983444" elapsed="0.071375"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:46.060402" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:46.060296" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:46.060276" 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-08-22T23:58:46.061711" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:46.061556" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:46.061537" elapsed="0.000242"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:58:46.062226" level="INFO">${karaf_connection_index} = 95</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:58:46.061923" elapsed="0.000329"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:58:46.062638" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:58:46.062404" elapsed="0.000260"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:58:46.093246" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:58:46.063191" elapsed="0.030152"/>
</kw>
<msg time="2026-08-22T23:58:46.093519" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:58:46.093567" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:46.062819" elapsed="0.030806"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:58:46.113633" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:58:46.094174" elapsed="0.019596"/>
</kw>
<msg time="2026-08-22T23:58:46.113936" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:58:46.113993" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:58:46.093794" elapsed="0.020245"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:46.114380" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:46.114160" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:46.114137" elapsed="0.000323"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:46.114911" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:46.114615" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:46.115261" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:46.115049" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:46.115031" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:58:46.115372" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<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-08-22T23:58:46.117802" elapsed="0.000302"/>
</kw>
<msg time="2026-08-22T23:58:46.118166" 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-08-22T23:58:46.116802" elapsed="0.001494"/>
</kw>
<kw name="Open 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-08-22T23:58:46.118569" elapsed="0.000101"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:46.118931" 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-08-22T23:58:46.116160" 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-08-22T23:58:46.115637" elapsed="0.003542"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:58:46.061255" elapsed="0.058023"/>
</kw>
<msg time="2026-08-22T23:58:46.119370" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:46.119414" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:58:46.060656" elapsed="0.058795"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:58:46.119679" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:58:46.119526" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:46.119508" elapsed="0.000254"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:46.120146" 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-08-22T23:58:46.120495" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:58:46.120567" elapsed="0.000095"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:58:46.059952" elapsed="0.060806"/>
</kw>
<msg time="2026-08-22T23:58:46.120849" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:46.120891" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:58:46.055139" elapsed="0.065789"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:46.121246" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:46.121001" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:46.120984" elapsed="0.000339"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:58:46.054973" elapsed="0.066373"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:46.126688" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:46.126564" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:46.126545" 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-08-22T23:58:46.127944" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:46.127837" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:46.127819" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:58:46.128458" level="INFO">${karaf_connection_index} = 96</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:58:46.128150" elapsed="0.000335"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:58:46.128874" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:58:46.128656" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:58:46.161458" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:58:46.129387" elapsed="0.032167"/>
</kw>
<msg time="2026-08-22T23:58:46.161786" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:58:46.161837" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:46.129055" elapsed="0.032819"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:58:46.185915" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:58:46.162377" elapsed="0.023701"/>
</kw>
<msg time="2026-08-22T23:58:46.186280" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:58:46.186327" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:58:46.162043" elapsed="0.024323"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:46.186778" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:46.186472" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:46.186438" elapsed="0.000428"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:46.187366" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:46.187014" 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-08-22T23:58:46.187739" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:46.187508" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:46.187489" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:58:46.187852" 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-08-22T23:58:46.190426" elapsed="0.000175"/>
</kw>
<msg time="2026-08-22T23:58:46.190664" 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-08-22T23:58:46.189397" 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-08-22T23:58:46.191071" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:46.191405" 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-08-22T23:58:46.188755" 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-08-22T23:58:46.188162" elapsed="0.003848"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:58:46.127511" elapsed="0.064598"/>
</kw>
<msg time="2026-08-22T23:58:46.192203" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:46.192247" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:58:46.126955" elapsed="0.065342"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:58:46.192501" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:58:46.192378" elapsed="0.000447"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:46.192359" elapsed="0.000501"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:46.193261" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:46.193615" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:58:46.193688" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:58:46.126228" elapsed="0.067569"/>
</kw>
<msg time="2026-08-22T23:58:46.193894" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:46.193938" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "N "e "w "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "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-08-22T23:58:46.121637" elapsed="0.072338"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:46.194298" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:46.194050" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:46.194033" elapsed="0.000344"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:58:46.121466" elapsed="0.072935"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:58:45.983262" elapsed="0.211173"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:58:45.980753" elapsed="0.213748"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:58:45.973693" elapsed="0.220867"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:45.973070" elapsed="0.221563"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:58:45.968512" elapsed="0.226177"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:46.196218" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:46.195835" elapsed="0.000411"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:46.203730" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:46.203458" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:46.204169" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:46.203927" 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-08-22T23:58:46.224136" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:46.224268" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:58:46.224385" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:58:46.206345" elapsed="0.018068"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:46.204279" elapsed="0.020177"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:46.224664" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:46.224483" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:46.204261" elapsed="0.020492"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:46.232785" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:46.226861" elapsed="0.006041"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:46.226335" elapsed="0.006656"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:46.226294" elapsed="0.006748"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:46.235830" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:46.233363" elapsed="0.002514"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:46.233136" elapsed="0.002776"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:46.233118" elapsed="0.002820"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:58:46.236544" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:46.236113" 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-08-22T23:58:46.236909" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:46.236666" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:46.237456" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:46.237154" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:46.236993" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:46.236645" elapsed="0.000895"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:58:46.238078" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:46.237714" 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-08-22T23:58:46.238405" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:46.238175" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:46.238959" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:46.238662" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:46.238487" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:46.238157" elapsed="0.000886"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:58:46.239190" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:58:46.240017" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:46.239712" 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-08-22T23:58:46.240197" elapsed="0.002409"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:58:46.225356" elapsed="0.017314"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:58:46.242846" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-22T23:58:46.242739" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:46.242721" 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-08-22T23:58:46.243077" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:46.243149" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:58:46.245543" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:58:46.199087" elapsed="0.046485"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:58:46.245648" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:58:46.245800" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:58:46.196473" elapsed="0.049354"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:58:46.246468" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:58:46.246110" elapsed="0.000432">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:46.245897" elapsed="0.000731">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:58:46.245880" elapsed="0.000784">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:46.246948" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:46.246800" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:46.246782" elapsed="0.000248"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:46.195427" elapsed="0.051686">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:47.250359" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:47.249309" elapsed="0.001125"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:47.262741" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:47.262354" elapsed="0.000455"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:47.263368" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:47.263024" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:58:47.284112" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:47.284389" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:58:47.284653" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:58:47.265860" elapsed="0.018856"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:47.263539" elapsed="0.021274"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:47.285217" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:47.284875" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:47.263503" elapsed="0.021907"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:47.292712" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:47.287768" elapsed="0.004993"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:47.287225" elapsed="0.005571"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:47.287183" elapsed="0.005637"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:47.295480" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:47.293101" elapsed="0.002432"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:47.292877" elapsed="0.002696"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:47.292860" elapsed="0.002785"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:58:47.296353" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:47.295880" elapsed="0.000500"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:47.296708" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:47.296451" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:47.297289" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:47.296963" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:47.296798" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:47.296433" elapsed="0.000946"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:58:47.297923" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:47.297539" 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-08-22T23:58:47.298249" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:47.298020" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:47.298800" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:47.298487" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:47.298329" elapsed="0.000604"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:47.298001" 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-08-22T23:58:47.299114" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:58:47.299978" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:47.299651" 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-08-22T23:58:47.300349" elapsed="0.002300"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:58:47.286244" elapsed="0.016472"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:58:47.302899" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-22T23:58:47.302787" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:47.302769" 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-08-22T23:58:47.303149" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:47.303220" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:58:47.305537" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:58:47.256064" elapsed="0.049502"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:58:47.305645" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:58:47.305798" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:58:47.250974" elapsed="0.054850"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:58:47.306470" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:58:47.306102" elapsed="0.000454">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:47.305894" elapsed="0.000766">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:58:47.305877" elapsed="0.000818">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:47.306912" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:47.306766" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:47.306749" elapsed="0.000242"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:47.248081" elapsed="0.058995">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:48.310217" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:48.309210" elapsed="0.001079"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:48.323677" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:48.323396" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:48.324128" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:48.323880" 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-08-22T23:58:48.344850" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:48.345259" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:58:48.345505" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:58:48.326333" elapsed="0.019232"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:48.324254" elapsed="0.021444"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:48.346106" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:48.345762" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:48.324228" elapsed="0.022073"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:48.354305" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:48.348741" elapsed="0.005674"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:48.348185" elapsed="0.006309"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:48.348142" elapsed="0.006407"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:48.358048" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:48.355262" elapsed="0.002833"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:48.354711" elapsed="0.003419"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:48.354672" elapsed="0.003483"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:58:48.358817" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:48.358340" 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-08-22T23:58:48.359178" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:48.358917" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:48.359739" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:48.359421" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:48.359262" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:48.358899" elapsed="0.000925"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:58:48.360342" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:48.359981" 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-08-22T23:58:48.360700" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:48.360454" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:48.361308" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:48.361002" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:48.360786" elapsed="0.000584"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:48.360436" 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-08-22T23:58:48.361542" elapsed="0.000370"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:58:48.362391" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:48.362080" 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-08-22T23:58:48.362568" elapsed="0.002340"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:58:48.347168" elapsed="0.017805"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:58:48.365155" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:58:48.365044" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:48.365025" 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-08-22T23:58:48.365399" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:48.365470" elapsed="0.000014"/>
</return>
<msg time="2026-08-22T23:58:48.421106" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:58:48.318910" elapsed="0.102247"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:58:48.421427" elapsed="0.000055"/>
</return>
<msg time="2026-08-22T23:58:48.421656" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:58:48.310821" elapsed="0.110863"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:58:48.422539" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:58:48.422054" elapsed="0.000595">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:48.421776" elapsed="0.000953">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:58:48.421753" elapsed="0.001013">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:48.422987" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:48.422838" elapsed="0.000236"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:48.422821" elapsed="0.000279"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:48.307986" elapsed="0.115202">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:49.425995" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:49.425017" elapsed="0.001049"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:49.436793" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:49.436414" elapsed="0.000446"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:49.437411" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:49.437071" 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-08-22T23:58:49.458308" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:49.458476" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:58:49.458598" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:58:49.440082" elapsed="0.018545"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:49.437595" elapsed="0.021081"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:49.458858" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:49.458704" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:49.437547" elapsed="0.021397"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:49.466983" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:49.461197" elapsed="0.005842"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:49.460706" elapsed="0.006368"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:49.460663" elapsed="0.006437"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:49.469782" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:49.467378" elapsed="0.002451"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:49.467157" elapsed="0.002707"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:49.467140" elapsed="0.002748"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:58:49.470484" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:49.470065" 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-08-22T23:58:49.470898" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:49.470600" elapsed="0.000358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:49.471447" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:49.471144" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:49.470982" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:49.470565" elapsed="0.000967"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:58:49.472069" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:49.471705" 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-08-22T23:58:49.472395" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:49.472166" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:49.472943" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:49.472648" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:49.472475" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:49.472148" 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-08-22T23:58:49.473178" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:58:49.474011" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:49.473710" 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-08-22T23:58:49.474188" 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-08-22T23:58:49.459724" elapsed="0.016834"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:58:49.476753" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:58:49.476643" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:49.476624" 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-08-22T23:58:49.476992" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:49.477063" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:58:49.479389" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:58:49.430361" elapsed="0.049057"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:58:49.479479" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:58:49.479647" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:58:49.426638" elapsed="0.053036"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:58:49.480311" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:58:49.479953" elapsed="0.000435">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:49.479746" elapsed="0.000713">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:58:49.479729" elapsed="0.000765">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:49.480726" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:49.480564" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:49.480547" elapsed="0.000260"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:49.423942" elapsed="0.056949">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:50.483560" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:50.482669" elapsed="0.000988"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:50.494973" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:50.494612" elapsed="0.000430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:50.495622" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:50.495256" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:58:50.515416" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:50.515540" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:58:50.515661" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:58:50.498493" elapsed="0.017195"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:50.495786" elapsed="0.019945"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:50.515909" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:50.515757" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:50.495759" elapsed="0.020237"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:50.524124" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:50.518382" elapsed="0.005854"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:50.517889" elapsed="0.006427"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:50.517846" elapsed="0.006526"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:50.527929" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:50.525030" elapsed="0.002946"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:50.524499" elapsed="0.003512"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:50.524462" elapsed="0.003574"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:58:50.528593" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:50.528198" 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-08-22T23:58:50.528932" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:50.528700" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:50.529474" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:50.529176" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:50.529014" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:50.528678" elapsed="0.000880"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:58:50.530107" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:50.529729" 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-08-22T23:58:50.530431" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:50.530204" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:50.530977" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:50.530683" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:50.530512" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:50.530186" 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-08-22T23:58:50.531206" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:58:50.532091" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:50.531803" 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-08-22T23:58:50.532331" elapsed="0.002325"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:58:50.516880" elapsed="0.017841"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:58:50.534898" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-08-22T23:58:50.534790" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:50.534772" 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-08-22T23:58:50.535134" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:50.535205" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:58:50.537570" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:58:50.488248" elapsed="0.049367"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:58:50.537684" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:58:50.537861" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:58:50.484145" elapsed="0.053744"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:58:50.538520" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:58:50.538169" elapsed="0.000437">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:50.537960" elapsed="0.000715">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:58:50.537942" elapsed="0.000769">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:50.538927" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:50.538781" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:50.538764" elapsed="0.000243"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:50.481559" elapsed="0.057533">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:51.542251" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:51.541180" elapsed="0.001146"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:51.554053" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:51.553681" elapsed="0.000456"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:51.554592" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:51.554331" 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-08-22T23:58:51.574886" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:51.575092" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:58:51.575231" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:58:51.556793" elapsed="0.018474"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:51.554723" elapsed="0.020607"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:51.575694" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:51.575451" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:51.554696" elapsed="0.021124"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:51.580729" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:51.577290" elapsed="0.003509"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:51.576954" elapsed="0.003896"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:51.576928" elapsed="0.003958"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:51.584615" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:51.581315" elapsed="0.003367"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:51.580965" elapsed="0.003766"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:51.580942" elapsed="0.003824"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:58:51.585571" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:51.585004" 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-08-22T23:58:51.586071" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:51.585731" elapsed="0.000439"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:51.586881" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:51.586441" elapsed="0.000478"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:51.586212" elapsed="0.000758"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:51.585705" elapsed="0.001295"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:58:51.587790" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:51.587259" 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-08-22T23:58:51.588244" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:51.587925" elapsed="0.000398"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:51.589009" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:51.588575" elapsed="0.000470"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:51.588358" elapsed="0.000737"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:51.587900" 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-08-22T23:58:51.589368" elapsed="0.000511"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:58:51.590566" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:51.590124" elapsed="0.000500"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-08-22T23:58:51.590837" elapsed="0.003398"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:58:51.576331" elapsed="0.017972"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:58:51.594487" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-22T23:58:51.594374" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:51.594355" 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-08-22T23:58:51.594752" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:51.594822" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:58:51.597135" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:58:51.547642" elapsed="0.049762"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:58:51.597470" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:58:51.597664" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:58:51.542858" elapsed="0.054834"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:58:51.598340" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:58:51.597971" elapsed="0.000509">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:51.597763" elapsed="0.000792">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:58:51.597746" elapsed="0.000859">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:51.598824" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:51.598678" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:51.598661" elapsed="0.000243"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:51.540016" elapsed="0.058970">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:52.600945" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:52.600428" elapsed="0.000554"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:52.608266" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:52.608008" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:52.608746" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:52.608469" 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-08-22T23:58:52.628997" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:52.629148" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:58:52.629248" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:58:52.610950" elapsed="0.018324"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:52.608870" elapsed="0.020447"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:52.629499" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:52.629344" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:52.608847" 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-08-22T23:58:52.633324" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:52.630662" elapsed="0.002712"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:52.630424" elapsed="0.002986"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:52.630406" elapsed="0.003030"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:52.636050" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:52.633731" elapsed="0.002365"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:52.633493" elapsed="0.002640"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:52.633476" elapsed="0.002682"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:58:52.637030" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:52.636479" 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-08-22T23:58:52.637365" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:52.637129" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:52.637921" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:52.637621" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:52.637446" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:52.637111" elapsed="0.000893"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:58:52.638602" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:52.638162" 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-08-22T23:58:52.638932" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:52.638701" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:52.639462" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:52.639170" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:52.639013" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:52.638684" elapsed="0.000861"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:58:52.639709" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:58:52.640509" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:52.640216" 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-08-22T23:58:52.640747" elapsed="0.002301"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:58:52.629970" elapsed="0.013142"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:58:52.643289" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-22T23:58:52.643181" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:52.643163" 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-08-22T23:58:52.643524" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:52.643609" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:58:52.645940" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:58:52.603718" elapsed="0.042251"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:58:52.646028" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:58:52.646176" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:58:52.601220" elapsed="0.044982"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:58:52.646854" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:58:52.646476" elapsed="0.000456">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:52.646271" elapsed="0.000734">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:58:52.646255" elapsed="0.000783">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:52.647253" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:52.647108" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:52.647091" elapsed="0.000241"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:52.599753" elapsed="0.047660">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:53.650631" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:53.649606" elapsed="0.001105"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:53.663184" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:53.662811" elapsed="0.000442"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:53.663932" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:53.663558" 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-08-22T23:58:53.687386" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:53.687735" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:58:53.687960" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:58:53.666621" elapsed="0.021430"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:53.664145" elapsed="0.024003"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:53.688560" elapsed="0.000081"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:53.688213" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:53.664109" elapsed="0.024680"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:53.696636" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:53.691095" elapsed="0.005655"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:53.690567" elapsed="0.006266"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:53.690526" elapsed="0.006363"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:53.699773" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:53.697385" elapsed="0.002435"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:53.697025" elapsed="0.002830"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:53.696987" elapsed="0.002893"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:58:53.700500" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:53.700078" 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-08-22T23:58:53.700855" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:53.700615" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:53.701399" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:53.701099" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:53.700938" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:53.700595" elapsed="0.000890"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:58:53.702027" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:53.701658" 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-08-22T23:58:53.702356" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:53.702124" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:53.702910" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:53.702613" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:53.702438" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:53.702106" 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-08-22T23:58:53.703148" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:58:53.704036" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:53.703705" 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-08-22T23:58:53.704218" 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-08-22T23:58:53.689617" elapsed="0.017056"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:58:53.706857" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-08-22T23:58:53.706744" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:53.706725" 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-08-22T23:58:53.707153" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:53.707227" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:58:53.709629" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:58:53.656363" elapsed="0.053296"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:58:53.709721" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:58:53.709873" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:58:53.651219" elapsed="0.058681"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:58:53.710548" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:58:53.710178" elapsed="0.000473">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:53.709970" elapsed="0.000759">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:58:53.709953" elapsed="0.000811">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:53.710982" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:53.710835" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:53.710818" elapsed="0.000245"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:53.648392" elapsed="0.062756">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:54.714478" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:54.713396" elapsed="0.001160"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:54.725598" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:54.725320" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:54.726048" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:54.725803" 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-08-22T23:58:54.748108" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:54.748440" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:58:54.748722" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:58:54.728286" elapsed="0.020502"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:54.726176" elapsed="0.022720"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:54.749344" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:54.748966" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:54.726148" elapsed="0.023408"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:54.755641" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:54.752148" elapsed="0.003564"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:54.751605" elapsed="0.004246"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:54.751533" elapsed="0.004356"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:54.759569" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:54.756285" elapsed="0.003371"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:54.755970" elapsed="0.003736"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:54.755946" elapsed="0.003796"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:58:54.760596" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:54.759997" 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-08-22T23:58:54.761075" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:54.760740" elapsed="0.000418"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:54.761941" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:54.761464" elapsed="0.000517"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:54.761193" elapsed="0.000840"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:54.760714" elapsed="0.001408"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:58:54.763002" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:54.762355" 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-08-22T23:58:54.763512" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:54.763144" elapsed="0.000472"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:54.764325" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:54.763876" elapsed="0.000478"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:54.763653" elapsed="0.000737"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:54.763118" 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-08-22T23:58:54.764573" elapsed="0.000369"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:58:54.765423" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:54.765106" 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-08-22T23:58:54.765617" 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-08-22T23:58:54.750459" elapsed="0.017766"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:58:54.768411" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-08-22T23:58:54.768298" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:54.768279" 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-08-22T23:58:54.768681" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:54.768754" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:58:54.771092" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:58:54.720987" elapsed="0.050134"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:58:54.771184" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:58:54.771340" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:58:54.715126" elapsed="0.056257"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:58:54.772064" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:58:54.771683" elapsed="0.000470">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:54.771456" elapsed="0.000773">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:58:54.771439" elapsed="0.000886">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:54.772552" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:54.772401" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:54.772384" elapsed="0.000267"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:54.712151" elapsed="0.060591">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:55.776162" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:55.775055" elapsed="0.001188"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:55.790663" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:55.790148" elapsed="0.000612"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:55.791499" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:55.791062" elapsed="0.000551"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:58:55.813681" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:55.814015" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:58:55.814260" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:58:55.795936" elapsed="0.018386"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:55.791780" elapsed="0.022655"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:55.814945" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:55.814512" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:55.791729" elapsed="0.023392"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:55.822466" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:55.817216" elapsed="0.005344"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:55.816785" elapsed="0.005867"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:55.816746" elapsed="0.005957"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:55.827680" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:55.823285" elapsed="0.004482"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:55.822859" elapsed="0.004971"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:55.822821" elapsed="0.005057"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:58:55.828997" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:55.828221" elapsed="0.000827"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:55.829643" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:55.829178" elapsed="0.000573"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:55.830675" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:55.830098" elapsed="0.000629"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:55.829797" elapsed="0.001035"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:55.829144" elapsed="0.001732"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:58:55.831775" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:55.831174" 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-08-22T23:58:55.832232" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:55.831900" elapsed="0.000425"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:55.833132" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:55.832686" elapsed="0.000486"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:55.832358" elapsed="0.000868"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:55.831877" elapsed="0.001383"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:58:55.833492" elapsed="0.000579"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:58:55.834730" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:55.834296" 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-08-22T23:58:55.835013" elapsed="0.003137"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:58:55.815914" elapsed="0.022345"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:58:55.838537" elapsed="0.000081"/>
</return>
<status status="PASS" start="2026-08-22T23:58:55.838376" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:55.838346" elapsed="0.000432"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:55.838981" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:55.839076" elapsed="0.000020"/>
</return>
<msg time="2026-08-22T23:58:55.842206" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:58:55.783058" elapsed="0.059187"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:58:55.842324" elapsed="0.000036"/>
</return>
<msg time="2026-08-22T23:58:55.842520" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:58:55.776823" elapsed="0.065731"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:58:55.843762" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:58:55.842960" elapsed="0.000917">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:55.842670" elapsed="0.001306">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:58:55.842647" elapsed="0.001377">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:55.844330" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:55.844123" elapsed="0.000284"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:55.844100" elapsed="0.000339"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:55.773727" elapsed="0.070827">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:56.846518" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:56.845927" elapsed="0.000630"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:56.858252" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:56.857902" elapsed="0.000409"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:56.858830" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:56.858488" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:58:56.878910" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:56.879189" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:58:56.879328" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:58:56.861206" elapsed="0.018149"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:56.858979" elapsed="0.020435"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:56.879684" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:56.879451" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:56.858949" elapsed="0.020830"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:56.883564" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:56.881002" elapsed="0.002628"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:56.880756" elapsed="0.002910"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:56.880734" elapsed="0.002958"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:56.886267" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:56.883974" elapsed="0.002341"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:56.883750" elapsed="0.002601"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:56.883733" elapsed="0.002643"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:58:56.887005" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:56.886561" 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-08-22T23:58:56.887350" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:56.887105" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:56.887918" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:56.887611" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:56.887433" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:56.887086" elapsed="0.000920"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:58:56.888530" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:56.888162" 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-08-22T23:58:56.888879" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:56.888645" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:56.889415" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:56.889117" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:56.888961" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:56.888626" 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-08-22T23:58:56.889670" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:58:56.890604" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:56.890202" 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-08-22T23:58:56.890790" elapsed="0.002339"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:58:56.880236" elapsed="0.013076"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:58:56.893663" elapsed="0.000054"/>
</return>
<status status="PASS" start="2026-08-22T23:58:56.893451" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:56.893419" elapsed="0.000393"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:56.894040" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:56.894146" elapsed="0.000023"/>
</return>
<msg time="2026-08-22T23:58:56.897685" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:58:56.849508" elapsed="0.048224"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:58:56.897913" elapsed="0.000044"/>
</return>
<msg time="2026-08-22T23:58:56.898150" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:58:56.846848" elapsed="0.051371"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:58:56.899301" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:58:56.898684" elapsed="0.000784">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:56.898339" elapsed="0.001319">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:58:56.898312" elapsed="0.001425">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:56.900221" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:56.899894" elapsed="0.000452"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:56.899856" elapsed="0.000543"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:56.845235" elapsed="0.055379">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<msg time="2026-08-22T23:58:56.900821" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${DEVICE_CHECK_TIMEOUT}</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${NODE_CONFIGURER}</arg>
<arg>${original_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:58:46.194856" elapsed="10.706181">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<doc>Check that the created device data make their way into the configurer node.</doc>
<status status="FAIL" start="2026-08-22T23:58:45.967802" elapsed="10.933587">Keyword 'Check_Config_Data' failed after retrying for 10 seconds. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</test>
<test id="s1-s8-t15" name="Modify_Device_Data" line="174">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:58:56.907234" elapsed="0.000215"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:58:56.906839" elapsed="0.000668"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:56.908542" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:56.908429" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:56.908410" 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-08-22T23:58:56.913628" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:56.913493" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:56.913474" elapsed="0.000228"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:58:56.914734" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:58:56.914330" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:58:56.915228" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:58:56.914919" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:58:56.915298" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:58:56.915452" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:58:56.913936" elapsed="0.001541"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:56.920937" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:56.920808" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:56.920789" 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-08-22T23:58:56.922302" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:56.922138" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:56.922120" elapsed="0.000254"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:58:56.922849" level="INFO">${karaf_connection_index} = 94</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:58:56.922521" elapsed="0.000355"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:58:56.923274" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:58:56.923038" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:58:56.952947" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:58:56.923825" elapsed="0.031042"/>
</kw>
<msg time="2026-08-22T23:58:56.955035" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:58:56.955083" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:56.923456" elapsed="0.031663"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:58:56.965462" level="INFO">"t "x "t ". "C "R "U "D ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:58:56.955647" elapsed="0.009909"/>
</kw>
<msg time="2026-08-22T23:58:56.965748" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:58:56.965793" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:56.955289" elapsed="0.010540"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:56.966131" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:56.965907" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:56.965887" elapsed="0.000341"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:56.966692" level="INFO"> "t "x "t ". "C "R "U "D ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:56.966374" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:56.967035" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:56.966820" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:56.966802" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:58:56.967148" 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-08-22T23:58:56.969698" elapsed="0.000155"/>
</kw>
<msg time="2026-08-22T23:58:56.969916" 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-08-22T23:58:56.968601" elapsed="0.001446"/>
</kw>
<kw name="Open 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-08-22T23:58:56.970338" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:56.970689" 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-08-22T23:58:56.967973" elapsed="0.002900"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:58:56.967422" elapsed="0.003515"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:58:56.921824" elapsed="0.049211"/>
</kw>
<msg time="2026-08-22T23:58:56.971127" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:56.971171" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:56.921158" elapsed="0.050049"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:58:56.971391" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:58:56.971284" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:56.971266" 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-08-22T23:58:56.971884" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:56.972258" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:58:56.972331" 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-08-22T23:58:56.920455" elapsed="0.051987"/>
</kw>
<msg time="2026-08-22T23:58:56.972534" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:56.972607" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:56.915873" elapsed="0.056773"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:56.972974" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:56.972723" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:56.972705" elapsed="0.000347"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:58:56.915731" elapsed="0.057345"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:56.978642" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:56.978517" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:56.978499" 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-08-22T23:58:56.979869" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:56.979761" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:56.979743" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:58:56.980377" level="INFO">${karaf_connection_index} = 95</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:58:56.980079" elapsed="0.000325"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:58:56.980797" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:58:56.980559" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:58:57.016794" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:58:56.981320" elapsed="0.035578"/>
</kw>
<msg time="2026-08-22T23:58:57.017077" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:58:57.017125" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:56.980981" elapsed="0.036180"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:58:57.029402" level="INFO">"t "x "t ". "C "R "U "D ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:58:57.017722" elapsed="0.011776"/>
</kw>
<msg time="2026-08-22T23:58:57.029686" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:58:57.029733" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:57.017335" elapsed="0.012435"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.030085" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.029855" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.029832" elapsed="0.000373"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.030679" level="INFO"> "t "x "t ". "C "R "U "D ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:57.030355" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.031027" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.030809" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.030791" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:58:57.031140" 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">
<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-08-22T23:58:57.033691" elapsed="0.000156"/>
</kw>
<msg time="2026-08-22T23:58:57.033955" 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-08-22T23:58:57.032607" 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-08-22T23:58:57.034392" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.034762" 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-08-22T23:58:57.031974" 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-08-22T23:58:57.031417" elapsed="0.003599"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:58:56.979432" elapsed="0.055684"/>
</kw>
<msg time="2026-08-22T23:58:57.035210" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:57.035259" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:56.978861" elapsed="0.056435"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:58:57.035483" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:58:57.035374" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.035356" 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-08-22T23:58:57.035989" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.036327" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:58:57.036400" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:58:56.978171" elapsed="0.058339"/>
</kw>
<msg time="2026-08-22T23:58:57.036627" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:57.036674" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:56.973338" elapsed="0.063374"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.037040" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.036789" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.036771" elapsed="0.000348"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:58:56.973201" elapsed="0.063943"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:57.042771" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:57.042661" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.042642" 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-08-22T23:58:57.043982" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:57.043874" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.043856" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:58:57.044493" level="INFO">${karaf_connection_index} = 96</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:58:57.044191" elapsed="0.000328"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:58:57.044912" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:58:57.044691" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:58:57.076791" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:58:57.045425" elapsed="0.031483"/>
</kw>
<msg time="2026-08-22T23:58:57.077075" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:58:57.077122" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:57.045093" elapsed="0.032066"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:58:57.101405" level="INFO">"t "x "t ". "C "R "U "D ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:58:57.077703" elapsed="0.023861"/>
</kw>
<msg time="2026-08-22T23:58:57.101762" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:58:57.101809" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:57.077329" elapsed="0.024517"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.102178" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.101925" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.101905" elapsed="0.000374"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.102745" level="INFO"> "t "x "t ". "C "R "U "D ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:57.102426" 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-08-22T23:58:57.103305" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.103078" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.102858" elapsed="0.000530"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:58:57.103423" 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-08-22T23:58:57.105956" elapsed="0.000183"/>
</kw>
<msg time="2026-08-22T23:58:57.106202" 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-08-22T23:58:57.104885" elapsed="0.001448"/>
</kw>
<kw name="Open 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-08-22T23:58:57.106627" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.106960" 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-08-22T23:58:57.104252" 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-08-22T23:58:57.103706" elapsed="0.003503"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:58:57.043547" elapsed="0.063760"/>
</kw>
<msg time="2026-08-22T23:58:57.107400" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:57.107444" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:57.042986" elapsed="0.064494"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:58:57.107703" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:58:57.107556" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.107537" 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 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.108180" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.108515" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:58:57.108659" 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-08-22T23:58:57.042290" elapsed="0.066482"/>
</kw>
<msg time="2026-08-22T23:58:57.108867" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:57.108911" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "M "o "d "i "f "y "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:57.037412" elapsed="0.071535"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.109271" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.109022" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.109004" elapsed="0.000345"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:58:57.037272" elapsed="0.072101"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:58:56.915536" elapsed="0.193867"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:58:56.913106" elapsed="0.196357"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:58:56.908131" elapsed="0.201477"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:56.907676" elapsed="0.201984"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:58:56.903106" elapsed="0.206611"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.110353" level="INFO">${template_as_string} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${template_as_string}</var>
<arg>DEVICE_NAME=${device_name}</arg>
<arg>RESTCONF_ROOT=${RESTCONF_ROOT}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:58:57.109895" elapsed="0.000485"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.144127" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:57.143741" elapsed="0.000415"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:58:57.144937" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:58:57.144670" elapsed="0.000348">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-22T23:58:57.145113" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:58:57.144320" elapsed="0.000817"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.145699" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:58:57.145301" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:58:57.146025" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:58:57.146216" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:58:57.145887" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.146660" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:57.146397" 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-08-22T23:58:57.147661" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:57.147385" elapsed="0.000321"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.148123" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-22T23:58:57.147863" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.148817" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:58:57.148502" elapsed="0.000340"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:58:57.149564" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:58:57.149342" elapsed="0.000262"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:58:57.149656" elapsed="0.000030"/>
</return>
<msg time="2026-08-22T23:58:57.149808" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:58:57.149027" elapsed="0.000806"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:58:57.149982" elapsed="0.000267"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-22T23:58:57.148371" elapsed="0.001920"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.150847" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-22T23:58:57.150532" elapsed="0.000341"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-22T23:58:57.151598" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-22T23:58:57.151366" elapsed="0.000260"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-22T23:58:57.151676" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:58:57.151825" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-22T23:58:57.151053" elapsed="0.000842"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-22T23:58:57.152049" elapsed="0.000259"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-22T23:58:57.150403" elapsed="0.001955"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-22T23:58:57.148200" elapsed="0.004195"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-22T23:58:57.152438" elapsed="0.000027"/>
</return>
<msg time="2026-08-22T23:58:57.152614" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-22T23:58:57.147063" elapsed="0.005578"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:57.146771" elapsed="0.005904"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.152845" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.152699" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.146753" elapsed="0.006171"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.153695" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:57.153065" elapsed="0.000660"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:58:57.153775" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:58:57.143085" elapsed="0.010816"/>
</kw>
<msg time="2026-08-22T23:58:57.153955" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:58:57.130273" elapsed="0.023730"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.167098" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.179638" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.192143" 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-08-22T23:58:57.192368" 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-08-22T23:58:57.192539" 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-08-22T23:58:57.192920" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.192778" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:57.192763" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.193139" 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-08-22T23:58:57.193305" 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-08-22T23:58:57.193508" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:58:57.192735" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:58:57.192633" elapsed="0.000970"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.193753" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:57.193830" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:58:57.193950" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:58:57.125881" elapsed="0.068096"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.220468" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:57.220045" elapsed="0.000451"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:58:57.221209" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:58:57.221001" elapsed="0.000276">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</status>
</kw>
<msg time="2026-08-22T23:58:57.221371" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:58:57.220671" elapsed="0.000724"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.221953" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:58:57.221554" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-22T23:58:57.222298" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-08-22T23:58:57.222423" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-22T23:58:57.222154" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.222866" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:57.222620" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-08-22T23:58:57.223268" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.222980" elapsed="0.000347"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.223813" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:57.223494" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:57.223351" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.222962" elapsed="0.000936"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.224482" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:57.224041" elapsed="0.000469"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-22T23:58:57.224559" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-22T23:58:57.219421" elapsed="0.005281"/>
</kw>
<msg time="2026-08-22T23:58:57.224754" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-22T23:58:57.206829" elapsed="0.017971"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.237380" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.249715" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.262035" 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-08-22T23:58:57.262230" 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-08-22T23:58:57.262554" 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-08-22T23:58:57.262937" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.262795" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:57.262780" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.263179" 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-08-22T23:58:57.263346" 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-08-22T23:58:57.263506" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-22T23:58:57.262752" elapsed="0.000806"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-22T23:58:57.262648" 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-08-22T23:58:57.263745" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:57.263820" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:58:57.263938" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-22T23:58:57.204082" elapsed="0.059884"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-22T23:58:57.265225" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-22T23:58:57.264977" elapsed="0.000313">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-08-22T23:58:57.265382" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:58:57.264638" elapsed="0.000769"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.265738" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.265475" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.266746" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:57.266427" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:57.266246" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.265458" elapsed="0.001373"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.269162" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:58:57.266982" elapsed="0.002207"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-08-22T23:58:57.269243" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:58:57.269413" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-08-22T23:58:57.264298" elapsed="0.005141"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.270880" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:57.270626" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.271320" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:57.271080" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.271782" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:57.271516" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.272217" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:57.271975" elapsed="0.000285"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-08-22T23:58:57.273078" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-08-22T23:58:57.272881" elapsed="0.000223"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-08-22T23:58:57.273427" level="INFO">${items_to_add} = ['Accept', 'application/xml']</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-08-22T23:58:57.273254" 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-08-22T23:58:57.273612" elapsed="0.000199"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.274228" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:57.273980" elapsed="0.000292"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-08-22T23:58:57.274314" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:58:57.274570" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</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-08-22T23:58:57.272461" elapsed="0.002151"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:58:57.289295" level="INFO">PUT Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Content-Length': '81', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Modified Content&lt;/l&gt;
&lt;/cont&gt; 
 </msg>
<msg time="2026-08-22T23:58:57.289665" level="INFO">PUT Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:57.289922" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:57.276925" elapsed="0.013875">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:57.274685" elapsed="0.016306">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</branch>
<branch type="ELSE">
<kw name="PUT 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 PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.291411" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.291065" elapsed="0.000495"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:57.274668" elapsed="0.016981">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.292573" elapsed="0.000091"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:57.292905" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:57.292821" elapsed="0.000175"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:57.292781" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.293364" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:57.293513" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:57.269790" elapsed="0.023987">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:57.293944" elapsed="0.000064"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:57.115056" elapsed="0.179139">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.294867" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.294439" elapsed="0.000579"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:57.294402" elapsed="0.000669"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:57.295145" elapsed="0.000031"/>
</return>
<arg>${directory_with_template_folders}${/}datamod1</arg>
<arg>${template_as_string}</arg>
<arg>session=${NODE_SETTER}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-08-22T23:58:57.110656" elapsed="0.184699">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.298173" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:57.297135" elapsed="0.001081"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-08-22T23:58:57.298522" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:57.298321" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.298296" elapsed="0.000337"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:58:57.298856" elapsed="0.000297"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.300362" level="FAIL">'4968' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:58:57.299889" elapsed="0.000557">'4968' does not contain '-'</status>
</kw>
<msg time="2026-08-22T23:58:57.300593" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:58:57.299375" elapsed="0.001255"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.301323" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:58:57.300859" elapsed="0.000501"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.302034" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:57.301599" elapsed="0.000472"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.302714" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:57.302284" elapsed="0.000467"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.303466" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968

HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-08-22T23:58:57.302960" elapsed="0.000572"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.304106" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:57.303770" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.305150" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=4968'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-08-22T23:58:57.304669" elapsed="0.000547"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:57.304315" elapsed="0.000949"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.304290" elapsed="0.001009"/>
</if>
<arg>4968</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:58:57.296309" elapsed="0.009054"/>
</kw>
<doc>Send a request to change the sample test data and check that the request went OK.</doc>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=4968</tag>
<status status="FAIL" start="2026-08-22T23:58:56.901903" elapsed="0.403521">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968

HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</test>
<test id="s1-s8-t16" name="Check_Device_Data_Is_Modified" 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-08-22T23:58:57.310398" elapsed="0.000224"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:58:57.310087" 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-08-22T23:58:57.311665" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:57.311535" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.311516" 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-08-22T23:58:57.316620" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:57.316498" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.316480" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.317684" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:58:57.317287" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.318215" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:58:57.317870" elapsed="0.000371"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:58:57.318286" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:58:57.318442" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:58:57.316909" 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-08-22T23:58:57.323857" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:57.323748" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.323729" 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-08-22T23:58:57.325079" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:57.324972" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.324954" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:58:57.325599" level="INFO">${karaf_connection_index} = 94</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:58:57.325289" elapsed="0.000339"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:58:57.326023" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:58:57.325782" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:58:57.356001" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:58:57.326538" elapsed="0.029562"/>
</kw>
<msg time="2026-08-22T23:58:57.356287" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:58:57.356336" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:57.326207" elapsed="0.030166"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:58:57.371093" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:58:57.356903" elapsed="0.014290"/>
</kw>
<msg time="2026-08-22T23:58:57.371402" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:58:57.371450" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:57.356539" elapsed="0.014949"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.371815" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.371566" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.371547" elapsed="0.000348"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.372329" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:57.372034" elapsed="0.000360"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.372692" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.372460" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.372442" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:58:57.372804" 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-08-22T23:58:57.375328" elapsed="0.000150"/>
</kw>
<msg time="2026-08-22T23:58:57.375538" 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-08-22T23:58:57.374242" elapsed="0.001458"/>
</kw>
<kw name="Open 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-08-22T23:58:57.375971" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.376302" 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-08-22T23:58:57.373599" 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-08-22T23:58:57.373060" elapsed="0.003488"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:58:57.324668" elapsed="0.052004"/>
</kw>
<msg time="2026-08-22T23:58:57.376764" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:57.376809" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:57.324074" elapsed="0.052773"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:58:57.377028" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:58:57.376922" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.376904" 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-08-22T23:58:57.377495" 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-08-22T23:58:57.377843" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:58:57.377924" 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-08-22T23:58:57.323395" elapsed="0.054639"/>
</kw>
<msg time="2026-08-22T23:58:57.378127" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:57.378171" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:57.318844" elapsed="0.059364"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.378528" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.378282" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.378265" elapsed="0.000359"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:58:57.318705" elapsed="0.059943"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:57.384079" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:57.383970" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.383952" 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-08-22T23:58:57.385379" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:57.385269" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.385250" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:58:57.385923" level="INFO">${karaf_connection_index} = 95</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:58:57.385612" elapsed="0.000339"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:58:57.386329" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:58:57.386111" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:58:57.419025" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:58:57.386860" elapsed="0.032268"/>
</kw>
<msg time="2026-08-22T23:58:57.419289" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:58:57.419336" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:57.386510" elapsed="0.032862"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:58:57.435427" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:58:57.419907" elapsed="0.015619"/>
</kw>
<msg time="2026-08-22T23:58:57.435704" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:58:57.435749" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:57.419542" elapsed="0.016244"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.436084" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.435863" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.435843" elapsed="0.000320"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.436622" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:57.436301" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.436968" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.436756" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.436737" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:58:57.437079" 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-08-22T23:58:57.439544" elapsed="0.000170"/>
</kw>
<msg time="2026-08-22T23:58:57.439775" 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-08-22T23:58:57.438503" 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-08-22T23:58:57.440171" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.440500" 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-08-22T23:58:57.437871" elapsed="0.002842"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:58:57.437331" elapsed="0.003445"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:58:57.384966" elapsed="0.055908"/>
</kw>
<msg time="2026-08-22T23:58:57.440968" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:57.441013" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:57.384345" elapsed="0.056705"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:58:57.441237" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:58:57.441126" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.441108" 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-08-22T23:58:57.441736" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.442128" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:58:57.442200" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:58:57.383632" elapsed="0.058676"/>
</kw>
<msg time="2026-08-22T23:58:57.442400" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:57.442443" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:57.378906" elapsed="0.063575"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.442828" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.442555" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.442538" elapsed="0.000367"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:58:57.378770" elapsed="0.064158"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:57.448333" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:57.448226" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.448207" 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-08-22T23:58:57.449533" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:57.449427" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.449409" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:58:57.450085" level="INFO">${karaf_connection_index} = 96</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:58:57.449770" elapsed="0.000341"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:58:57.450481" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:58:57.450265" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:58:57.485179" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:58:57.451020" elapsed="0.034259"/>
</kw>
<msg time="2026-08-22T23:58:57.485439" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:58:57.485485" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:57.450680" elapsed="0.034841"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:58:57.504336" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:58:57.486068" elapsed="0.018550"/>
</kw>
<msg time="2026-08-22T23:58:57.504779" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:58:57.504825" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:57.485710" elapsed="0.019153"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.505158" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.504940" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.504920" elapsed="0.000322"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.505707" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:57.505379" 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-08-22T23:58:57.506093" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.505867" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.505821" elapsed="0.000352"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:58:57.506207" 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-08-22T23:58:57.508706" elapsed="0.000153"/>
</kw>
<msg time="2026-08-22T23:58:57.508919" 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-08-22T23:58:57.507675" elapsed="0.001369"/>
</kw>
<kw name="Open 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-08-22T23:58:57.509315" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.509672" 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-08-22T23:58:57.507055" elapsed="0.002815"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:58:57.506461" elapsed="0.003475"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:58:57.449126" elapsed="0.060910"/>
</kw>
<msg time="2026-08-22T23:58:57.510127" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:57.510170" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:57.448552" elapsed="0.061655"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:58:57.510389" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-22T23:58:57.510284" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.510266" elapsed="0.000204"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.510878" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.511207" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:58:57.511280" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:58:57.447881" elapsed="0.063506"/>
</kw>
<msg time="2026-08-22T23:58:57.511479" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:57.511523" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "M "o "d "i "f "i "e "d "[K"
...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:57.443186" elapsed="0.068375"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.511901" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.511654" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.511636" elapsed="0.000341"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:58:57.443048" elapsed="0.068952"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:58:57.318518" elapsed="0.193509"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:58:57.316136" elapsed="0.195946"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:58:57.311245" elapsed="0.200892"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:57.310824" elapsed="0.201358"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:58:57.306764" elapsed="0.205470"/>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.513239" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:57.512853" elapsed="0.000413"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.520824" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:57.520554" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.521273" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:57.521026" 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-08-22T23:58:57.529242" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:57.529475" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:57.529648" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:57.523463" elapsed="0.006691">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:57.521384" elapsed="0.008887">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.530533" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.530318" elapsed="0.000331"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:57.521366" elapsed="0.009318">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.531192" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:57.531388" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:57.531335" elapsed="0.000112"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:57.531311" elapsed="0.000167"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.531697" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:57.531799" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:57.516032" elapsed="0.015911">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:57.532040" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:57.513476" elapsed="0.018695">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.532481" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.532280" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:57.532256" elapsed="0.000357"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.532884" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.532690" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:57.532669" elapsed="0.000327"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:57.512447" elapsed="0.020657">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.534794" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:57.534197" elapsed="0.000636"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-08-22T23:58:57.535134" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:57.534938" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.534912" elapsed="0.000309"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:58:57.535443" elapsed="0.000322"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.537055" level="FAIL">'4968' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:58:57.536558" elapsed="0.000583">'4968' does not contain '-'</status>
</kw>
<msg time="2026-08-22T23:58:57.537271" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:58:57.536051" elapsed="0.001254"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.538068" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:58:57.537534" elapsed="0.000571"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.538604" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:57.538294" elapsed="0.000338"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.539078" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:58:57.538787" elapsed="0.000317"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.539642" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968

HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-08-22T23:58:57.539259" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.540086" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:57.539844" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.540791" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=4968'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-08-22T23:58:57.540435" elapsed="0.000404"/>
</kw>
<status status="PASS" start="2026-08-22T23:58:57.540199" elapsed="0.000674"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.540181" elapsed="0.000717"/>
</if>
<arg>4968</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:58:57.533682" elapsed="0.007323"/>
</kw>
<doc>Get the device data and make sure it contains the modified content.</doc>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=4968</tag>
<status status="FAIL" start="2026-08-22T23:58:57.305901" elapsed="0.235156">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968

HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</test>
<test id="s1-s8-t17" name="Check_Modified_Device_Data_Is_Visible_On_Checker" line="190">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:58:57.545906" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:58:57.545622" 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-08-22T23:58:57.547168" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:57.547057" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.547038" 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-08-22T23:58:57.552221" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:57.552114" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.552096" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.553280" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:58:57.552901" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.553784" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:58:57.553463" elapsed="0.000363"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:58:57.553873" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:58:57.554039" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:58:57.552510" elapsed="0.001554"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:57.559511" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:57.559403" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.559384" 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-08-22T23:58:57.560785" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:57.560633" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.560613" elapsed="0.000244"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:58:57.561296" level="INFO">${karaf_connection_index} = 94</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:58:57.561000" elapsed="0.000324"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:58:57.561720" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:58:57.561479" elapsed="0.000267"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:58:57.591678" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:58:57.562267" elapsed="0.029581"/>
</kw>
<msg time="2026-08-22T23:58:57.592070" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:58:57.592131" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:57.561931" elapsed="0.030254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:58:57.615060" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:58:57.592799" elapsed="0.022507"/>
</kw>
<msg time="2026-08-22T23:58:57.615721" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:58:57.615828" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:57.592387" elapsed="0.023524"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.616657" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.616093" elapsed="0.000692"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.616045" elapsed="0.000795"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.617905" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:57.617156" elapsed="0.000911"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.618728" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.618220" elapsed="0.000632"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.618177" elapsed="0.000728"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:58:57.618981" 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-08-22T23:58:57.624682" elapsed="0.000334"/>
</kw>
<msg time="2026-08-22T23:58:57.625149" 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-08-22T23:58:57.622264" elapsed="0.003164"/>
</kw>
<kw name="Open 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-08-22T23:58:57.626143" elapsed="0.000106"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.626501" 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-08-22T23:58:57.620836" elapsed="0.005912"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:58:57.619560" elapsed="0.007251"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:58:57.560305" elapsed="0.066603"/>
</kw>
<msg time="2026-08-22T23:58:57.627002" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:57.627046" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:57.559744" elapsed="0.067338"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:58:57.627265" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:58:57.627159" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.627141" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.627760" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.628146" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:58:57.628220" 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-08-22T23:58:57.559065" elapsed="0.069267"/>
</kw>
<msg time="2026-08-22T23:58:57.628426" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:57.628470" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:57.554422" elapsed="0.074084"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.628848" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.628596" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.628564" elapsed="0.000361"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:58:57.554285" elapsed="0.074664"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:57.634416" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:57.634307" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.634288" 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-08-22T23:58:57.635687" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:57.635551" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.635533" elapsed="0.000222"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:58:57.636194" level="INFO">${karaf_connection_index} = 95</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:58:57.635898" elapsed="0.000322"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:58:57.636609" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:58:57.636374" elapsed="0.000261"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:58:57.669988" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:58:57.637119" elapsed="0.032973"/>
</kw>
<msg time="2026-08-22T23:58:57.670253" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:58:57.670299" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:57.636789" elapsed="0.033546"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:58:57.690954" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:58:57.670869" elapsed="0.020191"/>
</kw>
<msg time="2026-08-22T23:58:57.691217" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:58:57.691262" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:57.670503" elapsed="0.020795"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.691621" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.691374" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.691355" elapsed="0.000347"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.692307" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:57.691842" 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-08-22T23:58:57.692684" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.692448" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.692429" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:58:57.692797" 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-08-22T23:58:57.695269" elapsed="0.000154"/>
</kw>
<msg time="2026-08-22T23:58:57.695519" 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-08-22T23:58:57.694237" elapsed="0.001433"/>
</kw>
<kw name="Open 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-08-22T23:58:57.695943" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.696269" 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-08-22T23:58:57.693575" elapsed="0.002877"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:58:57.693051" elapsed="0.003464"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:58:57.635248" elapsed="0.061395"/>
</kw>
<msg time="2026-08-22T23:58:57.696736" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:57.696780" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:57.634678" elapsed="0.062138"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:58:57.696998" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:58:57.696893" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.696874" 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-08-22T23:58:57.697475" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.697844" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:58:57.697916" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:58:57.633957" elapsed="0.064068"/>
</kw>
<msg time="2026-08-22T23:58:57.698118" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:57.698161" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:57.629212" elapsed="0.068986"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.698520" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.698272" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.698255" elapsed="0.000361"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:58:57.629076" elapsed="0.069564"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:58:57.704057" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:57.703949" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.703930" 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-08-22T23:58:57.705258" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:57.705151" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.705133" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:58:57.705819" level="INFO">${karaf_connection_index} = 96</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:58:57.705468" elapsed="0.000378"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:58:57.706222" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:58:57.706002" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:58:57.738398" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:58:57.706751" elapsed="0.031748"/>
</kw>
<msg time="2026-08-22T23:58:57.738681" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:58:57.738727" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:57.706402" elapsed="0.032361"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:58:57.760293" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:58:57.739262" elapsed="0.021191"/>
</kw>
<msg time="2026-08-22T23:58:57.760639" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:58:57.760686" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:57.738929" elapsed="0.021795"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.761022" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.760801" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.760782" elapsed="0.000319"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.761537" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:57.761242" 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-08-22T23:58:57.761941" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.761694" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.761676" elapsed="0.000345"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:58:57.762053" 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-08-22T23:58:57.764940" elapsed="0.000151"/>
</kw>
<msg time="2026-08-22T23:58:57.765152" 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-08-22T23:58:57.763744" 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-08-22T23:58:57.765549" elapsed="0.000096"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.765915" 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-08-22T23:58:57.763100" 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-08-22T23:58:57.762303" elapsed="0.003862"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:58:57.704849" elapsed="0.061414"/>
</kw>
<msg time="2026-08-22T23:58:57.766354" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:57.766397" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:57.704273" elapsed="0.062160"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:58:57.766661" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:58:57.766537" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.766518" 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-08-22T23:58:57.767145" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.767478" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:58:57.767549" 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-08-22T23:58:57.703573" elapsed="0.064170"/>
</kw>
<msg time="2026-08-22T23:58:57.767836" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:58:57.767879" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:57.698900" elapsed="0.069016"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.768243" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.767990" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-08-22T23:58:57.767973" elapsed="0.000346"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:58:57.698763" elapsed="0.069579"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:58:57.554116" elapsed="0.214255"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:58:57.551751" elapsed="0.216678"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:58:57.546760" elapsed="0.221771"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:58:57.546322" elapsed="0.222291"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:58:57.541975" elapsed="0.226700"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.770205" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:57.769819" elapsed="0.000413"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.778709" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:57.778437" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:57.779158" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:57.778911" 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-08-22T23:58:57.793732" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:57.794039" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:57.794296" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:57.781502" elapsed="0.013611">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:57.779271" elapsed="0.016025">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.795746" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.795370" elapsed="0.000524"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:57.779252" elapsed="0.016696">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.796798" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:57.797095" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:57.797013" elapsed="0.000172"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:57.796976" 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-08-22T23:58:57.797548" elapsed="0.000077"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:57.797756" elapsed="0.000036"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:57.773890" elapsed="0.024101">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:57.798143" elapsed="0.000034"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:57.770442" elapsed="0.027907">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.798957" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.798628" elapsed="0.000454"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:57.798558" elapsed="0.000577"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:57.799571" elapsed="0.000079"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:57.799257" elapsed="0.000472"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:57.799221" elapsed="0.000561"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:57.769388" elapsed="0.030569">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:58.802925" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:58.801948" elapsed="0.001045"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:58.816615" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:58.816334" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:58.817068" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:58.816819" 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-08-22T23:58:58.826043" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:58.826207" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:58.826325" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:58.819327" elapsed="0.007422">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:58.817209" elapsed="0.009626">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:58.827029" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:58.826872" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:58.817186" elapsed="0.009934">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:58.827498" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:58.827653" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:58.827612" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:58.827594" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:58.827862" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:58.827932" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:58.809089" elapsed="0.018948">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:58.828183" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:58.803479" elapsed="0.024808">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:58.828512" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:58.828366" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:58.828350" elapsed="0.000256"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:58.828804" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:58.828662" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:58.828646" elapsed="0.000236"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:58.800806" elapsed="0.028154">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:58:59.832113" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:58:59.831168" elapsed="0.001011"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:59.844629" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:59.844345" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:58:59.845088" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:58:59.844839" 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-08-22T23:58:59.853763" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:58:59.853922" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:58:59.854050" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:58:59.847288" elapsed="0.007151">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:58:59.845204" elapsed="0.009321">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:59.854742" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:59.854560" elapsed="0.000250"/>
</branch>
<status status="FAIL" start="2026-08-22T23:58:59.845185" elapsed="0.009649">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:59.855222" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:59.855366" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:58:59.855326" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:59.855306" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:59.855573" elapsed="0.000036"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:58:59.855659" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:58:59.838255" elapsed="0.017511">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:58:59.855898" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:58:59.832716" elapsed="0.023279">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:59.856220" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:59.856075" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:59.856059" elapsed="0.000245"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:58:59.856499" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:58:59.856360" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:58:59.856345" elapsed="0.000277"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:58:59.829643" elapsed="0.027063">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:00.859820" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:00.858802" elapsed="0.001108"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:00.871596" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:00.871178" elapsed="0.000472"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:00.872073" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:00.871808" 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-08-22T23:59:00.881545" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:00.881814" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:00.882013" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:00.874357" elapsed="0.008287">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:00.872203" elapsed="0.010563">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:00.883073" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:00.882821" elapsed="0.000347"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:00.872179" elapsed="0.011025">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:00.883808" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:00.884028" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:00.883971" elapsed="0.000124"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:00.883944" elapsed="0.000182"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:00.884329" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:00.884632" elapsed="0.000036"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:00.864938" elapsed="0.019865">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:00.884902" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:00.860497" elapsed="0.024537">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:00.885351" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:00.885145" elapsed="0.000285"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:00.885122" elapsed="0.000341"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:00.885767" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:00.885539" elapsed="0.000307"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:00.885516" elapsed="0.000363"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:00.857569" elapsed="0.028417">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:01.889120" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:01.888083" elapsed="0.001110"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:01.900686" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:01.900402" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:01.901142" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:01.900892" 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-08-22T23:59:01.910199" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:01.910404" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:01.910557" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:01.903462" elapsed="0.007678">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:01.901270" elapsed="0.009981">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:01.911522" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:01.911303" elapsed="0.000345"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:01.901244" elapsed="0.010443">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:01.912135" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:01.912371" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:01.912319" elapsed="0.000104"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:01.912297" elapsed="0.000149"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:01.912616" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:01.912692" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:01.894206" elapsed="0.018597">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:01.912876" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:01.889766" elapsed="0.023209">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:01.913207" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:01.913058" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:01.913040" elapsed="0.000249"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:01.913494" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:01.913349" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:01.913332" elapsed="0.000244"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:01.886942" elapsed="0.026735">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:02.916990" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:02.915779" elapsed="0.001287"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:02.929352" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:02.928978" elapsed="0.000424"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:02.929834" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:02.929559" 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-08-22T23:59:02.937714" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:02.937886" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:02.938009" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:02.932086" elapsed="0.006360">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:02.929962" elapsed="0.008605">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:02.938873" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:02.938646" elapsed="0.000324"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:02.929938" elapsed="0.009068">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:02.939665" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:02.939866" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:02.939809" elapsed="0.000122"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:02.939783" elapsed="0.000180"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:02.940172" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:02.940285" elapsed="0.000024"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:02.922540" elapsed="0.017902">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:02.940573" elapsed="0.000044"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:02.917608" elapsed="0.023129">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:02.941067" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:02.940857" elapsed="0.000292"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:02.940832" elapsed="0.000352"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:02.941466" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:02.941261" elapsed="0.000284"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:02.941239" elapsed="0.000363"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:02.914501" elapsed="0.027229">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:03.944818" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:03.943816" elapsed="0.001075"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:03.955698" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:03.955417" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:03.956157" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:03.955908" 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-08-22T23:59:03.968187" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:03.968519" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:03.968818" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:03.958391" elapsed="0.011306">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:03.956280" elapsed="0.013616">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:03.970412" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:03.969982" elapsed="0.000761"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:03.956256" elapsed="0.014546">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:03.971724" elapsed="0.000060"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:03.972045" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:03.971958" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:03.971916" elapsed="0.000275"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:03.972510" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:03.972701" elapsed="0.000036"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:03.949337" elapsed="0.023600">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:03.973092" elapsed="0.000033"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:03.945387" elapsed="0.027909">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:03.973822" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:03.973470" elapsed="0.000478"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:03.973434" elapsed="0.000566"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:03.974430" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:03.974172" elapsed="0.000336"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:03.974135" elapsed="0.000405"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:03.942668" elapsed="0.032009">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:04.977805" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:04.976798" elapsed="0.001082"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:04.989139" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:04.988871" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:04.989612" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:04.989343" 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-08-22T23:59:04.998868" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:04.999088" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:04.999294" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:04.991831" elapsed="0.008091">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:04.989738" elapsed="0.010402">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:05.000436" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:05.000197" elapsed="0.000334"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:04.989714" elapsed="0.010852">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:05.001144" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:05.001341" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:05.001284" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:05.001259" elapsed="0.000176"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:05.001666" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:05.001769" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:04.982559" elapsed="0.019360">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:05.002019" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:04.978374" elapsed="0.023778">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:05.002466" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:05.002263" elapsed="0.000282"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:05.002239" elapsed="0.000361"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:05.002876" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:05.002679" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:05.002657" elapsed="0.000332"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:04.975635" elapsed="0.027461">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:06.006023" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:06.005012" elapsed="0.001081"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:06.017333" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:06.017073" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:06.017801" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:06.017537" 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-08-22T23:59:06.027247" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:06.027496" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:06.027679" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:06.020103" elapsed="0.008198">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:06.017922" elapsed="0.010498">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:06.028708" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:06.028468" elapsed="0.000337"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:06.017900" elapsed="0.010940">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:06.029360" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:06.029552" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:06.029497" elapsed="0.000139"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:06.029473" 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-08-22T23:59:06.029869" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:06.029968" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:06.010989" elapsed="0.019123">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:06.030208" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:06.006613" elapsed="0.023724">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:06.030667" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:06.030446" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:06.030423" elapsed="0.000360"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:06.031049" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:06.030858" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:06.030836" elapsed="0.000324"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:06.003885" elapsed="0.027382">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:07.034509" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:07.033453" elapsed="0.001175"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:07.047742" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:07.047457" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:07.048198" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:07.047949" 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-08-22T23:59:07.056947" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:07.057141" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:07.057384" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:07.050406" elapsed="0.007426">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:07.048323" elapsed="0.009600">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:07.058168" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:07.057965" elapsed="0.000271"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:07.048298" elapsed="0.009961">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:07.058719" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:07.058865" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:07.058823" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:07.058804" elapsed="0.000129"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:07.059076" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:07.059146" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:07.039550" elapsed="0.019705">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:07.059325" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:07.035138" elapsed="0.024283">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:07.059661" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:07.059500" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:07.059483" elapsed="0.000259"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:07.059935" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:07.059795" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:07.059780" elapsed="0.000233"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:07.032230" elapsed="0.027860">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:08.063348" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:08.062235" elapsed="0.001188"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:08.074394" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:08.074129" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:08.074902" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:08.074644" 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-08-22T23:59:08.083788" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:08.083970" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:08.084183" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:08.077347" elapsed="0.007276">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:08.075031" elapsed="0.009684">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:08.084978" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:08.084756" elapsed="0.000292"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:08.075005" elapsed="0.010068">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:08.085507" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:08.085671" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:08.085629" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:08.085609" elapsed="0.000132"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:08.085885" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:08.085955" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:08.068135" elapsed="0.017929">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:08.086132" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:08.063984" elapsed="0.022244">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:08.086447" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:08.086304" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:08.086288" elapsed="0.000237"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:08.086736" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:08.086594" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:08.086563" elapsed="0.000253"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:08.061057" elapsed="0.025838">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:09.089913" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:09.088903" elapsed="0.001081"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:09.101922" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:09.101656" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:09.102372" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:09.102124" 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-08-22T23:59:09.111990" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:09.112152" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:09.112332" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:09.104798" elapsed="0.007950">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:09.102499" elapsed="0.010333">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:09.113061" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:09.112870" elapsed="0.000261"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:09.102476" elapsed="0.010680">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:09.113647" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:09.113841" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:09.113786" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:09.113762" elapsed="0.000172"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:09.114134" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:09.114234" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:09.096127" elapsed="0.018253">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:09.114479" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:09.090478" elapsed="0.024158">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:09.114950" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:09.114752" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:09.114728" elapsed="0.000337"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:09.115336" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:09.115141" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:09.115119" elapsed="0.000330"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:09.087783" elapsed="0.027775">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:10.118627" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:10.117645" elapsed="0.001056"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:10.130217" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:10.129953" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:10.130704" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:10.130419" 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-08-22T23:59:10.140519" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:10.140783" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:10.141025" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:10.133266" elapsed="0.008292">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:10.130830" elapsed="0.010898">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:10.141996" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:10.141780" elapsed="0.000309"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:10.130806" elapsed="0.011317">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:10.142671" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:10.142866" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:10.142810" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:10.142786" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:10.143160" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:10.143260" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:10.123682" elapsed="0.019726">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:10.143506" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:10.119198" elapsed="0.024469">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:10.143979" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:10.143779" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:10.143755" elapsed="0.000337"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:10.144362" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:10.144168" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:10.144146" elapsed="0.000329"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:10.116448" elapsed="0.028163">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:11.147628" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:11.146637" elapsed="0.001066"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:11.157847" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:11.157571" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:11.158296" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:11.158049" 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-08-22T23:59:11.167642" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:11.167863" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:11.168099" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:11.160739" elapsed="0.007916">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:11.158419" elapsed="0.010353">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:11.169042" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:11.168823" elapsed="0.000314"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:11.158396" elapsed="0.010775">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:11.169724" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:11.169918" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:11.169862" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:11.169837" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:11.170209" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:11.170309" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:11.151897" elapsed="0.018559">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:11.170554" elapsed="0.000041"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:11.148195" elapsed="0.022515">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:11.171022" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:11.170822" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:11.170798" elapsed="0.000337"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:11.171404" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:11.171212" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:11.171190" elapsed="0.000326"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:11.145480" elapsed="0.026172">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:12.175083" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:12.174048" elapsed="0.001107"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:12.185992" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:12.185468" elapsed="0.000576"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:12.186450" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:12.186198" 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-08-22T23:59:12.195795" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:12.195969" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:12.196187" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:12.188917" elapsed="0.007735">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:12.186574" elapsed="0.010353">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:12.197152" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:12.196968" elapsed="0.000266"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:12.186551" elapsed="0.010713">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:12.197763" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:12.197916" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:12.197875" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:12.197855" elapsed="0.000132"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:12.198136" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:12.198247" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:12.179678" elapsed="0.018710">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:12.198469" elapsed="0.000018"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:12.175821" elapsed="0.022796">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:12.198899" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:12.198724" elapsed="0.000237"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:12.198703" elapsed="0.000284"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:12.199225" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:12.199051" elapsed="0.000236"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:12.199033" elapsed="0.000280"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:12.172858" elapsed="0.026547">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:13.202544" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:13.201458" elapsed="0.001195"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:13.213134" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:13.212868" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:13.213616" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:13.213346" 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-08-22T23:59:13.225472" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:13.225729" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:13.225986" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:13.217375" elapsed="0.009163">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:13.213749" elapsed="0.012937">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:13.227005" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:13.226741" elapsed="0.000365"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:13.213723" elapsed="0.013420">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:13.227760" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:13.227970" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:13.227910" elapsed="0.000126"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:13.227883" 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-08-22T23:59:13.228280" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:13.228386" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:13.208325" elapsed="0.020219">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:13.228672" elapsed="0.000024"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:13.203199" elapsed="0.025616">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:13.229145" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:13.228933" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:13.228908" elapsed="0.000356"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:13.229547" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:13.229343" elapsed="0.000308"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:13.229320" elapsed="0.000366"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:13.200310" elapsed="0.029492">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:14.232841" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:14.231838" elapsed="0.001074"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:14.243715" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:14.243424" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:14.244167" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:14.243917" 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-08-22T23:59:14.253455" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:14.253641" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:14.253832" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:14.246708" elapsed="0.007519">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:14.244298" elapsed="0.010013">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:14.254503" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:14.254347" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:14.244276" elapsed="0.010339">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:14.255003" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:14.255144" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:14.255103" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:14.255086" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:14.255353" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:14.255425" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:14.239055" elapsed="0.016476">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:14.255627" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:14.233411" elapsed="0.022313">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:14.255948" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:14.255804" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:14.255787" elapsed="0.000243"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:14.256222" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:14.256084" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:14.256068" elapsed="0.000235"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:14.230705" elapsed="0.025677">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:15.258010" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:15.257526" elapsed="0.000520"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:15.265595" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:15.265311" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:15.266045" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:15.265800" 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-08-22T23:59:15.274446" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:15.274635" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:15.274840" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:15.268237" elapsed="0.006997">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:15.266167" elapsed="0.009150">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:15.275510" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:15.275352" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:15.266144" elapsed="0.009476">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:15.276019" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:15.276159" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:15.276118" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:15.276101" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:15.276369" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:15.276440" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:15.260806" elapsed="0.015788">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:15.276672" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:15.258280" elapsed="0.018488">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:15.276990" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:15.276847" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:15.276831" elapsed="0.000239"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:15.277262" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:15.277122" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:15.277107" elapsed="0.000233"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:15.256956" elapsed="0.020461">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:16.280417" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:16.279409" elapsed="0.001079"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:16.292138" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:16.291875" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:16.292602" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:16.292340" 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-08-22T23:59:16.301451" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:16.301642" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:16.301846" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:16.294790" elapsed="0.007449">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:16.292736" elapsed="0.009588">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:16.302526" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:16.302362" elapsed="0.000248"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:16.292710" elapsed="0.009925">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:16.303024" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:16.303207" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:16.303127" elapsed="0.000128"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:16.303109" elapsed="0.000168"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:16.303421" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:16.303492" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:16.286508" elapsed="0.017107">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:16.303719" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:16.281015" elapsed="0.022843">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:16.304185" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:16.303973" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:16.303950" elapsed="0.000353"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:16.304605" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:16.304382" elapsed="0.000307"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:16.304360" elapsed="0.000364"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:16.278258" elapsed="0.026579">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:17.307908" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:17.306919" elapsed="0.001060"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:17.319315" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:17.319049" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:17.319785" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:17.319516" 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-08-22T23:59:17.329223" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:17.329386" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:17.329571" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:17.322023" elapsed="0.008042">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:17.319909" elapsed="0.010243">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:17.330344" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:17.330188" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:17.319885" elapsed="0.010550">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:17.330898" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:17.331090" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:17.331034" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:17.331010" elapsed="0.000172"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:17.331381" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:17.331480" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:17.314175" elapsed="0.017474">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:17.331749" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:17.308478" elapsed="0.023402">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:17.332187" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:17.331989" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:17.331967" elapsed="0.000331"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:17.332561" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:17.332371" elapsed="0.000288"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:17.332350" elapsed="0.000342"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:17.305796" elapsed="0.027003">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:18.335831" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:18.334833" elapsed="0.001069"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:18.346155" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:18.345889" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:18.346624" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:18.346359" 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-08-22T23:59:18.355805" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:18.356009" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:18.356197" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:18.348903" elapsed="0.007706">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:18.346747" elapsed="0.009948">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:18.356967" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:18.356744" elapsed="0.000330"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:18.346725" elapsed="0.010392">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:18.357676" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:18.357870" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:18.357816" elapsed="0.000114"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:18.357791" elapsed="0.000170"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:18.358160" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:18.358260" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:18.341316" elapsed="0.017091">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:18.358504" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:18.336429" elapsed="0.022229">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:18.358970" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:18.358771" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:18.358748" elapsed="0.000334"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:18.359350" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:18.359156" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:18.359135" elapsed="0.000326"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:18.333693" elapsed="0.025875">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:19.362722" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:19.361679" elapsed="0.001118"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:19.376704" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:19.376417" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:19.377161" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:19.376911" 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-08-22T23:59:19.386046" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:19.386239" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:19.386443" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:19.379382" elapsed="0.007536">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:19.377283" elapsed="0.009749">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:19.387295" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:19.387079" elapsed="0.000306"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:19.377260" elapsed="0.010158">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:19.387956" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:19.388147" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:19.388091" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:19.388067" elapsed="0.000170"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:19.388434" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:19.388531" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:19.368861" elapsed="0.019834">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:19.388797" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:19.363295" elapsed="0.025632">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:19.389230" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:19.389034" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:19.389012" elapsed="0.000327"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:19.389620" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:19.389411" elapsed="0.000288"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:19.389390" elapsed="0.000340"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:19.360522" elapsed="0.029313">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:20.392904" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:20.391840" elapsed="0.001135"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:20.404615" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:20.404336" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:20.405069" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:20.404823" 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-08-22T23:59:20.414222" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:20.414383" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:20.414555" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:20.407472" elapsed="0.007499">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:20.405189" elapsed="0.009864">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:20.415246" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:20.415089" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:20.405166" elapsed="0.010172">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:20.415735" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:20.415872" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:20.415833" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:20.415816" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:20.416080" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:20.416152" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:20.399029" elapsed="0.017256">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:20.416358" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:20.393468" elapsed="0.022987">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:20.416692" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:20.416534" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:20.416518" elapsed="0.000262"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:20.417050" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:20.416857" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:20.416833" elapsed="0.000327"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:20.390720" elapsed="0.026548">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:21.420269" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:21.419283" elapsed="0.001057"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:21.431266" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:21.431006" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:21.431730" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:21.431467" 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-08-22T23:59:21.441165" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:21.441328" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:21.441507" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:21.434156" elapsed="0.007766">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:21.431857" elapsed="0.010149">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:21.442230" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:21.442042" elapsed="0.000266"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:21.431834" elapsed="0.010501">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:21.442737" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:21.442924" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:21.442869" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:21.442845" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:21.443214" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:21.443315" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:21.426451" elapsed="0.017011">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:21.443561" elapsed="0.000041"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:21.420867" elapsed="0.022850">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:21.444028" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:21.443829" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:21.443806" elapsed="0.000335"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:21.444409" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:21.444216" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:21.444195" elapsed="0.000326"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:21.418146" elapsed="0.026505">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:22.447636" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:22.446652" elapsed="0.001057"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:22.460183" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:22.459906" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:22.460665" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:22.460385" 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-08-22T23:59:22.469140" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:22.469310" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:22.469495" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:22.463131" elapsed="0.006787">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:22.460800" elapsed="0.009205">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:22.470210" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:22.470041" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:22.460773" elapsed="0.009528">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:22.470718" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:22.470859" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:22.470818" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:22.470800" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:22.471073" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:22.471145" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:22.453817" elapsed="0.017435">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:22.471322" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:22.448251" elapsed="0.023166">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:22.471655" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:22.471495" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:22.471479" elapsed="0.000258"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:22.471931" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:22.471791" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:22.471775" elapsed="0.000235"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:22.445484" elapsed="0.026640">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:23.474937" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:23.473943" elapsed="0.001064"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:23.486799" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:23.486524" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:23.487255" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:23.487003" 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-08-22T23:59:23.496067" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:23.496223" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:23.496390" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:23.489642" elapsed="0.007145">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:23.487373" elapsed="0.009495">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:23.497057" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:23.496902" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:23.487353" elapsed="0.009794">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:23.497529" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:23.497683" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:23.497644" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:23.497626" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:23.497922" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:23.497994" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:23.481057" elapsed="0.017044">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:23.498171" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:23.475491" elapsed="0.022774">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:23.498488" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:23.498344" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:23.498328" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:23.498779" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:23.498640" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:23.498624" elapsed="0.000236"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:23.472879" elapsed="0.026097">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:24.501938" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:24.500953" elapsed="0.001053"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:24.512876" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:24.512612" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:24.513322" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:24.513076" 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-08-22T23:59:24.522750" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:24.522951" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:24.523211" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:24.515741" elapsed="0.008030">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:24.513448" elapsed="0.010440">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:24.524172" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:24.523940" elapsed="0.000326"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:24.513424" elapsed="0.010877">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:24.524876" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:24.525073" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:24.525017" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:24.524991" 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-08-22T23:59:24.525368" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:24.525467" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:24.506690" elapsed="0.018947">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:24.525737" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:24.502499" elapsed="0.023373">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:24.526185" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:24.525983" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:24.525960" elapsed="0.000338"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:24.526568" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:24.526373" elapsed="0.000293"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:24.526351" elapsed="0.000348"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:24.499857" elapsed="0.026951">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:25.530020" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:25.528940" elapsed="0.001155"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:25.541848" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:25.541566" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:25.542297" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:25.542051" 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-08-22T23:59:25.550663" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:25.550873" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:25.551122" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:25.544809" elapsed="0.006755">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:25.542427" elapsed="0.009271">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:25.551982" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:25.551746" elapsed="0.000306"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:25.542400" elapsed="0.009677">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:25.552533" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:25.552704" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:25.552659" elapsed="0.000093"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:25.552637" elapsed="0.000137"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:25.552921" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:25.552991" elapsed="0.000055"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:25.536290" elapsed="0.016867">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:25.553229" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:25.530631" elapsed="0.022696">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:25.553557" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:25.553407" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:25.553390" elapsed="0.000264"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:25.553852" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:25.553708" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:25.553692" elapsed="0.000273"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:25.527782" elapsed="0.026294">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:26.557363" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:26.556352" elapsed="0.001081"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:26.568081" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:26.567817" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:26.568526" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:26.568281" 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-08-22T23:59:26.578038" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:26.578263" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:26.578530" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:26.570975" elapsed="0.008120">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:26.568668" elapsed="0.010546">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:26.579492" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:26.579267" elapsed="0.000340"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:26.568643" elapsed="0.011000">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:26.580182" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:26.580378" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:26.580321" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:26.580296" elapsed="0.000175"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:26.580691" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:26.580793" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:26.561922" elapsed="0.019021">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:26.581042" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:26.557965" elapsed="0.023210">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:26.581483" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:26.581284" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:26.581262" elapsed="0.000355"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:26.581891" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:26.581694" elapsed="0.000282"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:26.581672" elapsed="0.000337"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:26.555160" elapsed="0.026958">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:27.585221" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:27.584192" elapsed="0.001105"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:27.597080" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:27.596810" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:27.597538" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:27.597283" 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-08-22T23:59:27.606732" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:27.606895" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:27.607075" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:27.600001" elapsed="0.007459">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:27.597687" elapsed="0.009854">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:27.607751" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:27.607592" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:27.597664" elapsed="0.010180">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:27.608277" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:27.608417" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:27.608377" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:27.608359" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:27.608645" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:27.608717" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:27.591519" elapsed="0.017305">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:27.608894" elapsed="0.000019"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:27.585840" elapsed="0.023176">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:27.609358" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:27.609153" elapsed="0.000284"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:27.609124" elapsed="0.000346"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:27.609768" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:27.609547" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:27.609524" elapsed="0.000356"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:27.583013" elapsed="0.026980">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:28.612874" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:28.611887" elapsed="0.001057"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:28.623385" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:28.623128" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:28.623843" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:28.623598" 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-08-22T23:59:28.632906" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:28.633068" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:28.633272" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:28.626227" elapsed="0.007455">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:28.623973" elapsed="0.009793">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:28.633959" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:28.633803" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:28.623942" elapsed="0.010110">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:28.634432" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:28.634572" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:28.634531" elapsed="0.000103"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:28.634513" elapsed="0.000143"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:28.634801" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:28.634873" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:28.617166" elapsed="0.017814">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:28.635051" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:28.613494" elapsed="0.021653">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:28.635369" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:28.635226" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:28.635210" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:28.635660" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:28.635505" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:28.635489" elapsed="0.000253"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:28.610816" elapsed="0.025004">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:29.639631" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:29.638539" elapsed="0.001158"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:29.651095" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:29.650761" elapsed="0.000400"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:29.651573" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:29.651327" 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-08-22T23:59:29.661530" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:29.661744" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:29.661961" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:29.654050" elapsed="0.008338">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:29.651731" elapsed="0.010787">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:29.662746" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:29.662567" elapsed="0.000246"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:29.651700" elapsed="0.011137">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:29.663371" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:29.663566" elapsed="0.000045"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:29.663509" elapsed="0.000145"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:29.663484" elapsed="0.000200"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:29.663887" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:29.663985" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:29.644833" elapsed="0.019302">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:29.664231" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:29.640150" elapsed="0.024218">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:29.664701" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:29.664478" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:29.664455" elapsed="0.000360"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:29.665083" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:29.664889" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:29.664867" elapsed="0.000326"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:29.636987" elapsed="0.028314">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:30.668656" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:30.667488" elapsed="0.001245"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:30.680501" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:30.680210" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:30.680972" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:30.680722" 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-08-22T23:59:30.690780" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:30.690958" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:30.691138" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:30.683415" elapsed="0.008130">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:30.681106" elapsed="0.010546">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:30.691902" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:30.691722" elapsed="0.000261"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:30.681078" elapsed="0.010935">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:30.692440" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:30.692679" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:30.692620" elapsed="0.000123"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:30.692574" elapsed="0.000199"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:30.692973" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:30.693070" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:30.675058" elapsed="0.018162">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:30.693316" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:30.669280" elapsed="0.024164">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:30.693772" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:30.693552" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:30.693529" elapsed="0.000353"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:30.694147" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:30.693956" elapsed="0.000267"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:30.693934" elapsed="0.000321"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:30.666204" elapsed="0.028157">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:31.697641" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:31.696551" elapsed="0.001168"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:31.711776" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:31.711491" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:31.712236" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:31.711980" 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-08-22T23:59:31.721571" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:31.721782" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:31.722000" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:31.714478" elapsed="0.007938">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:31.712368" elapsed="0.010137">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:31.722719" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:31.722544" elapsed="0.000243"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:31.712339" elapsed="0.010473">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:31.723197" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:31.723339" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:31.723297" elapsed="0.000091"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:31.723280" elapsed="0.000130"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:31.723553" elapsed="0.000035"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:31.723640" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:31.703841" elapsed="0.019909">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:31.723820" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:31.698224" elapsed="0.025690">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:31.724140" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:31.723992" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:31.723976" elapsed="0.000244"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:31.724410" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:31.724272" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:31.724257" elapsed="0.000232"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:31.695352" elapsed="0.029213">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:32.728385" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:32.727133" elapsed="0.001337"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:32.742163" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:32.741853" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:32.742666" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:32.742377" 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-08-22T23:59:32.753113" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:32.753335" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:32.753614" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:32.745187" elapsed="0.008905">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:32.742805" elapsed="0.011388">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:32.754469" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:32.754238" elapsed="0.000309"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:32.742775" elapsed="0.011797">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:32.755061" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:32.755275" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:32.755215" elapsed="0.000125"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:32.755185" elapsed="0.000185"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:32.755571" elapsed="0.000051"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:32.755692" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:32.735163" elapsed="0.020685">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:32.755950" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:32.729068" elapsed="0.027015">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:32.756398" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:32.756195" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:32.756170" elapsed="0.000339"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:32.756805" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:32.756602" elapsed="0.000282"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:32.756561" elapsed="0.000356"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:32.725733" elapsed="0.031292">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:33.760133" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:33.759122" elapsed="0.001083"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:33.771980" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:33.771716" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:33.772429" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:33.772182" 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-08-22T23:59:33.782000" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:33.782214" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:33.782448" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:33.774966" elapsed="0.008065">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:33.772558" elapsed="0.010589">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:33.783412" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:33.783196" elapsed="0.000309"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:33.772533" elapsed="0.011006">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:33.784084" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:33.784276" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:33.784221" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:33.784197" elapsed="0.000170"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:33.784566" elapsed="0.000051"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:33.784688" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:33.765277" elapsed="0.019559">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:33.784932" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:33.760739" elapsed="0.024323">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:33.785367" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:33.785171" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:33.785148" elapsed="0.000329"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:33.785764" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:33.785550" elapsed="0.000291"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:33.785529" elapsed="0.000344"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:33.757925" elapsed="0.028054">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:34.789103" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:34.788113" elapsed="0.001062"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:34.800760" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:34.800477" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:34.801210" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:34.800963" 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-08-22T23:59:34.810463" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:34.810808" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:34.811147" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:34.803628" elapsed="0.008353">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:34.801341" elapsed="0.010828">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:34.812639" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:34.812255" elapsed="0.000537"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:34.801317" elapsed="0.011529">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:34.813729" elapsed="0.000057"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:34.814032" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:34.813945" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:34.813907" 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-08-22T23:59:34.814520" elapsed="0.000049"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:34.814710" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:34.795373" elapsed="0.019573">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:34.815103" elapsed="0.000036"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:34.789706" elapsed="0.025623">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:34.815851" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:34.815505" elapsed="0.000492"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:34.815468" elapsed="0.000584"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:34.816516" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:34.816173" elapsed="0.000510"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:34.816138" elapsed="0.000600"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:34.786923" elapsed="0.029993">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:35.819793" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:35.818802" elapsed="0.001059"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:35.832516" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:35.832261" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:35.833003" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:35.832731" 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-08-22T23:59:35.842455" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:35.842631" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:35.842816" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:35.835388" elapsed="0.007827">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:35.833127" elapsed="0.010172">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:35.843495" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:35.843336" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:35.833105" elapsed="0.010497">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:35.844000" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:35.844144" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:35.844099" elapsed="0.000099"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:35.844081" elapsed="0.000144"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:35.844393" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:35.844464" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:35.825942" elapsed="0.018627">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:35.844656" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:35.820344" elapsed="0.024409">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:35.845011" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:35.844865" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:35.844847" elapsed="0.000250"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:35.845291" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:35.845151" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:35.845136" elapsed="0.000248"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:35.817740" elapsed="0.027754">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:36.848150" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:36.847202" elapsed="0.001011"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:36.858992" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:36.858738" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:36.859440" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:36.859193" 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-08-22T23:59:36.868165" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:36.868377" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:36.868643" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:36.861794" elapsed="0.007362">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:36.859555" elapsed="0.009724">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:36.869565" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:36.869330" elapsed="0.000354"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:36.859535" elapsed="0.010213">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:36.870294" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:36.870488" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:36.870433" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:36.870409" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:36.870805" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:36.870905" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:36.852801" elapsed="0.018254">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:36.871157" elapsed="0.000024"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:36.848755" elapsed="0.022538">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:36.871625" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:36.871405" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:36.871382" elapsed="0.000359"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:36.872011" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:36.871817" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:36.871795" elapsed="0.000329"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:36.846198" elapsed="0.026035">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:37.874948" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:37.873960" elapsed="0.001054"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:37.887212" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:37.886844" elapsed="0.000449"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:37.887728" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:37.887464" 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-08-22T23:59:37.896901" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:37.897047" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:37.897216" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:37.890062" elapsed="0.007688">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:37.887843" elapsed="0.010019">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:37.898124" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:37.897910" elapsed="0.000327"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:37.887822" elapsed="0.010455">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:37.898877" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:37.899067" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:37.899014" elapsed="0.000112"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:37.898989" elapsed="0.000166"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:37.899360" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:37.899457" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:37.880466" elapsed="0.019154">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:37.899720" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:37.875495" elapsed="0.024355">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:37.900157" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:37.899959" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:37.899936" elapsed="0.000331"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:37.900535" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:37.900342" elapsed="0.000290"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:37.900320" elapsed="0.000346"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:37.872962" elapsed="0.027811">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:38.903742" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:38.902695" elapsed="0.001118"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:38.916013" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:38.915753" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:38.916465" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:38.916214" 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-08-22T23:59:38.925773" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:38.925934" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:38.926109" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:38.918850" elapsed="0.007637">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:38.916600" elapsed="0.009969">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:38.926778" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:38.926621" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:38.916564" elapsed="0.010303">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:38.927239" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:38.927410" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:38.927335" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:38.927318" elapsed="0.000160"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:38.927638" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:38.927710" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:38.909977" elapsed="0.017839">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:38.927886" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:38.904304" elapsed="0.023676">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:38.928205" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:38.928058" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:38.928041" elapsed="0.000282"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:38.928615" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:38.928399" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:38.928377" elapsed="0.000351"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:38.901574" elapsed="0.027261">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:39.932262" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:39.931194" elapsed="0.001155"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:39.942335" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:39.942053" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:39.942824" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:39.942559" 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-08-22T23:59:39.952354" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:39.952530" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:39.952829" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:39.945346" elapsed="0.008022">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:39.942951" elapsed="0.010536">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:39.953776" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:39.953538" elapsed="0.000333"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:39.942927" elapsed="0.010979">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:39.954450" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:39.954712" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:39.954646" elapsed="0.000128"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:39.954615" elapsed="0.000189"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:39.955005" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:39.955105" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:39.936535" elapsed="0.018716">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:39.955354" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:39.932887" elapsed="0.022599">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:39.955819" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:39.955617" elapsed="0.000284"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:39.955574" elapsed="0.000360"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:39.956222" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:39.956010" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:39.955989" elapsed="0.000352"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:39.929991" elapsed="0.026459">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:40.959508" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:40.958512" elapsed="0.001094"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:40.970300" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:40.970041" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:40.970768" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:40.970504" 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-08-22T23:59:40.980250" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:40.980461" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:40.980728" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:40.973159" elapsed="0.008105">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:40.970893" elapsed="0.010493">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:40.981679" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:40.981437" elapsed="0.000339"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:40.970869" elapsed="0.010942">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:40.982339" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:40.982534" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:40.982477" elapsed="0.000138"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:40.982453" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:40.982851" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:40.982952" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:40.964150" elapsed="0.018948">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:40.983197" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:40.960113" elapsed="0.023216">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:40.983660" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:40.983439" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:40.983416" elapsed="0.000360"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:40.984045" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:40.983852" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:40.983830" elapsed="0.000327"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:40.957367" elapsed="0.026899">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:41.987140" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:41.986089" elapsed="0.001117"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:41.998842" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:41.998569" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:41.999286" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:41.999042" 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-08-22T23:59:42.008677" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:42.008826" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:42.008986" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:42.001638" elapsed="0.007706">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:41.999403" elapsed="0.010026">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:42.009683" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:42.009463" elapsed="0.000290"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:41.999383" elapsed="0.010394">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:42.010151" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:42.010294" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:42.010249" elapsed="0.000099"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:42.010231" elapsed="0.000153"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:42.010632" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:42.010731" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:41.993255" elapsed="0.017619">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:42.010968" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:41.987718" elapsed="0.023380">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:42.011409" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:42.011207" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:42.011184" elapsed="0.000334"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:42.011806" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:42.011612" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:42.011570" elapsed="0.000345"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:41.984993" elapsed="0.027029">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:43.015261" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:43.014154" elapsed="0.001182"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:43.027665" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:43.027285" elapsed="0.000431"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:43.028128" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:43.027871" 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-08-22T23:59:43.037660" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:43.037891" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:43.038147" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:43.030669" elapsed="0.008107">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:43.028258" elapsed="0.010638">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:43.039166" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:43.038945" elapsed="0.000314"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:43.028234" elapsed="0.011065">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:43.039927" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:43.040126" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:43.040070" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:43.040045" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:43.040429" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:43.040531" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:43.020712" elapsed="0.020000">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:43.040814" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:43.015916" elapsed="0.025033">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:43.041265" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:43.041063" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:43.041038" elapsed="0.000352"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:43.041698" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:43.041465" elapsed="0.000317"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:43.041443" elapsed="0.000372"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:43.012977" elapsed="0.028948">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:44.045025" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:44.043995" elapsed="0.001104"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:44.060297" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:44.060029" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:44.060767" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:44.060501" 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-08-22T23:59:44.069085" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:44.069294" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:44.069612" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:44.062994" elapsed="0.007166">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:44.060890" elapsed="0.009386">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:44.070545" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:44.070325" elapsed="0.000336"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:44.060866" elapsed="0.009828">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:44.071233" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:44.071453" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:44.071385" elapsed="0.000150"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:44.071355" 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-08-22T23:59:44.071834" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:44.071936" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:44.051173" elapsed="0.020913">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:44.072183" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:44.045648" elapsed="0.026669">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:44.072667" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:44.072429" elapsed="0.000324"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:44.072405" elapsed="0.000382"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:44.073062" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:44.072864" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:44.072842" elapsed="0.000333"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:44.042825" elapsed="0.030461">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:45.076460" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:45.075361" elapsed="0.001171"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:45.088398" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:45.088137" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:45.088875" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:45.088614" 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-08-22T23:59:45.097866" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:45.098031" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:45.098210" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:45.091292" elapsed="0.007319">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:45.088998" elapsed="0.009696">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:45.098887" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:45.098730" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:45.088975" elapsed="0.010003">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:45.099356" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:45.099497" elapsed="0.000046"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:45.099455" elapsed="0.000133"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:45.099437" elapsed="0.000176"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:45.099760" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:45.099835" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:45.082779" elapsed="0.017163">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:45.100013" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:45.077068" elapsed="0.023041">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:45.100339" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:45.100190" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:45.100173" elapsed="0.000270"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:45.100769" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:45.100537" elapsed="0.000313"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:45.100510" elapsed="0.000374"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:45.074212" elapsed="0.026781">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:46.104118" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:46.103090" elapsed="0.001102"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:46.115804" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:46.115526" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:46.116268" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:46.116007" 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-08-22T23:59:46.124211" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:46.124376" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:46.124556" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:46.118674" elapsed="0.006312">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:46.116394" elapsed="0.008675">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:46.125262" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:46.125105" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:46.116371" elapsed="0.008981">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:46.125773" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:46.125915" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:46.125874" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:46.125857" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:46.126127" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:46.126198" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:46.110336" elapsed="0.015967">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:46.126372" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:46.104745" elapsed="0.021725">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:46.126709" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:46.126548" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:46.126532" elapsed="0.000258"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:46.126983" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:46.126843" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:46.126828" elapsed="0.000236"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:46.101935" elapsed="0.025206">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:47.130286" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:47.129285" elapsed="0.001073"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:47.141902" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:47.141637" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:47.142354" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:47.142106" 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-08-22T23:59:47.150760" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:47.150926" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:47.151111" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:47.144764" elapsed="0.006731">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:47.142481" elapsed="0.009113">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:47.151788" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:47.151632" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:47.142457" elapsed="0.009421">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:47.152261" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:47.152400" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:47.152359" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:47.152342" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:47.152626" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:47.152728" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:47.136513" elapsed="0.016323">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:47.152907" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:47.130892" elapsed="0.022110">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:47.153226" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:47.153082" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:47.153065" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:47.153503" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:47.153359" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:47.153343" elapsed="0.000254"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:47.128083" elapsed="0.025595">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:48.156705" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:48.155712" elapsed="0.001066"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:48.167642" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:48.167258" elapsed="0.000454"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:48.168270" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:48.167927" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-22T23:59:48.178307" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:48.178489" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:48.178790" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:48.171327" elapsed="0.007986">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:48.168442" elapsed="0.010985">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:48.179718" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:48.179479" elapsed="0.000333"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:48.168411" elapsed="0.011435">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:48.180371" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:48.180563" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:48.180508" elapsed="0.000139"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:48.180483" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:48.180877" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:48.180975" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:48.161142" elapsed="0.019980">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:48.181219" elapsed="0.000046"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:48.157547" elapsed="0.023831">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:48.181722" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:48.181489" elapsed="0.000314"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:48.181466" elapsed="0.000371"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:48.182104" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:48.181912" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:48.181890" elapsed="0.000325"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:48.154527" elapsed="0.027795">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:49.185360" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:49.184356" elapsed="0.001076"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:49.197954" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:49.197646" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:49.198411" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:49.198162" 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-08-22T23:59:49.207487" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:49.207676" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:49.207870" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:49.200846" elapsed="0.007415">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:49.198540" elapsed="0.009807">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:49.208548" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:49.208384" elapsed="0.000249"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:49.198512" elapsed="0.010147">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:49.209058" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:49.209202" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:49.209161" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:49.209143" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:49.209414" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:49.209486" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:49.191529" elapsed="0.018079">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:49.209681" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:49.185999" elapsed="0.023806">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:49.210034" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:49.209889" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:49.209872" elapsed="0.000243"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:49.210309" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:49.210169" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:49.210154" elapsed="0.000236"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:49.183236" elapsed="0.027239">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:50.213475" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:50.212485" elapsed="0.001062"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:50.223954" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:50.223692" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:50.224402" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:50.224155" 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-08-22T23:59:50.234421" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:50.234689" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:50.234955" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:50.227091" elapsed="0.008403">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:50.224526" elapsed="0.011104">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:50.235903" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:50.235682" elapsed="0.000315"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:50.224503" elapsed="0.011527">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:50.236555" elapsed="0.000057"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:50.236770" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:50.236715" elapsed="0.000115"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:50.236690" elapsed="0.000170"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:50.237060" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:50.237159" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:50.217868" elapsed="0.019452">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:50.237417" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:50.214074" elapsed="0.023474">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:50.238034" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:50.237833" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:50.237809" elapsed="0.000336"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:50.238434" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:50.238220" elapsed="0.000292"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:50.238198" elapsed="0.000346"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:50.211331" elapsed="0.027341">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:51.242273" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:51.241131" elapsed="0.001245"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:51.255399" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:51.254952" elapsed="0.000525"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:51.256005" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:51.255740" 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-08-22T23:59:51.265986" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:51.266201" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:51.266472" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:51.258604" elapsed="0.008571">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:51.256155" elapsed="0.011147">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:51.267651" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:51.267357" elapsed="0.000399"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:51.256123" elapsed="0.011677">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:51.268349" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:51.268611" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:51.268521" elapsed="0.000163"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:51.268482" 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-08-22T23:59:51.268923" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:51.269021" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:51.248568" elapsed="0.020607">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:51.269271" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:51.243077" elapsed="0.026325">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:51.269738" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:51.269511" elapsed="0.000306"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:51.269488" elapsed="0.000362"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:51.270117" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:51.269923" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:51.269902" elapsed="0.000323"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:51.239763" elapsed="0.030570">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:52.273547" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:52.272518" elapsed="0.001133"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:52.286336" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:52.285976" elapsed="0.000427"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:52.286981" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:52.286634" 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-08-22T23:59:52.296014" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:52.296187" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:52.296389" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:52.289630" elapsed="0.007303">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:52.287158" elapsed="0.009893">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:52.297321" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:52.297103" elapsed="0.000312"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:52.287122" elapsed="0.010327">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:52.298006" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:52.298201" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:52.298144" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:52.298120" 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-08-22T23:59:52.298495" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:52.298611" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:52.279850" elapsed="0.018914">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:52.298860" elapsed="0.000025"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:52.274156" elapsed="0.024865">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:52.299385" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:52.299141" elapsed="0.000331"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:52.299114" elapsed="0.000391"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:52.299829" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:52.299619" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:52.299571" elapsed="0.000376"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:52.271301" elapsed="0.028763">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:53.303102" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:53.302121" elapsed="0.001051"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:53.315680" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:53.315297" elapsed="0.000483"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:53.316346" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:53.315999" 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-08-22T23:59:53.325249" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:53.325420" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:53.325700" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:53.318817" elapsed="0.007426">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:53.316514" elapsed="0.009847">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:53.326671" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:53.326412" elapsed="0.000360"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:53.316484" elapsed="0.010322">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:53.327355" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:53.327550" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:53.327493" elapsed="0.000140"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:53.327467" elapsed="0.000198"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:53.327892" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:53.327992" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:53.309271" elapsed="0.018871">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:53.328239" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:53.303699" elapsed="0.024674">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:53.328707" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:53.328484" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:53.328461" elapsed="0.000360"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:53.329091" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:53.328897" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:53.328875" elapsed="0.000325"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:53.300979" elapsed="0.028330">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:54.332319" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:54.331301" elapsed="0.001089"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:54.344282" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:54.344004" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:54.344754" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:54.344482" 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-08-22T23:59:54.353787" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:54.353945" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:54.354126" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:54.347140" elapsed="0.007383">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:54.344877" elapsed="0.009746">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:54.354820" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:54.354665" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:54.344854" elapsed="0.010058">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:54.355292" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:54.355431" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:54.355391" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:54.355373" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:54.355659" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:54.355733" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:54.339057" elapsed="0.016782">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:54.355910" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:54.333102" elapsed="0.022904">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:54.356263" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:54.356086" elapsed="0.000240"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:54.356069" elapsed="0.000280"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:54.356543" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:54.356403" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:54.356387" elapsed="0.000275"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:54.330205" elapsed="0.026592">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:55.360084" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:55.358932" elapsed="0.001228"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:55.373227" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:55.372957" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:55.373697" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:55.373431" 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-08-22T23:59:55.382338" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:55.382521" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:55.382787" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:55.376129" elapsed="0.007060">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:55.373822" elapsed="0.009457">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:55.383515" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:55.383320" elapsed="0.000280"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:55.373798" elapsed="0.009831">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:55.384081" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:55.384226" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:55.384185" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:55.384166" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:55.384437" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:55.384508" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:55.367293" elapsed="0.017339">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:55.384723" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:55.360968" elapsed="0.023852">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:55.385045" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:55.384900" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:55.384883" elapsed="0.000244"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:55.385364" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:55.385218" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:55.385200" elapsed="0.000245"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:55.357754" elapsed="0.027770">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:56.388627" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:56.387631" elapsed="0.001070"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:56.403432" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:56.403163" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:56.403900" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:56.403652" 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-08-22T23:59:56.412794" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:56.412960" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:56.413189" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:56.406152" elapsed="0.007447">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:56.404024" elapsed="0.009660">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:56.413881" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:56.413720" elapsed="0.000228"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:56.403999" elapsed="0.009973">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:56.414363" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:56.414505" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:56.414463" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:56.414445" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:56.414734" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:56.414810" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:56.394771" elapsed="0.020144">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:56.414986" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:56.389257" elapsed="0.025824">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:56.415304" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:56.415160" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:56.415143" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:56.415597" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:56.415439" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:56.415424" elapsed="0.000254"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:56.386393" elapsed="0.029364">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:57.418847" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:57.417850" elapsed="0.001069"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:57.433090" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:57.432828" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:57.433565" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:57.433292" 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-08-22T23:59:57.443366" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:57.443798" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:57.444277" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:57.436025" elapsed="0.009367">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:57.433714" elapsed="0.012014">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:57.446303" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:57.445836" elapsed="0.000658"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:57.433689" elapsed="0.012874">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:57.447382" elapsed="0.000051"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:57.447680" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:57.447598" elapsed="0.000168"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:57.447539" 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-08-22T23:59:57.448093" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:57.448232" elapsed="0.000029"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:57.425279" elapsed="0.023155">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:57.448570" elapsed="0.000055"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:57.419434" elapsed="0.029352">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:57.449198" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:57.448930" elapsed="0.000370"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:57.448901" elapsed="0.000442"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:57.449777" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:57.449441" elapsed="0.000444"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:57.449412" elapsed="0.000516"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:57.416662" elapsed="0.033475">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:58.453115" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:58.452101" elapsed="0.001085"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:58.464056" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:58.463793" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:58.464505" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:58.464257" 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-08-22T23:59:58.473404" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:58.473599" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-22T23:59:58.473835" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-22T23:59:58.466956" elapsed="0.007364">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:58.464647" elapsed="0.009767">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:58.474695" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:58.474455" elapsed="0.000311"/>
</branch>
<status status="FAIL" start="2026-08-22T23:59:58.464623" elapsed="0.010168">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:58.475222" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:58.475369" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:58.475327" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:58.475307" elapsed="0.000130"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:58.475632" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:58.475710" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-22T23:59:58.457943" elapsed="0.017883">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-22T23:59:58.475897" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-22T23:59:58.453725" elapsed="0.022267">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:58.476221" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:58.476073" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:58.476055" elapsed="0.000247"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:58.476499" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:58.476356" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:58.476340" elapsed="0.000253"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:58.451023" elapsed="0.025651">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<msg time="2026-08-22T23:59:58.476774" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>60s</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${NODE_CHECKER}</arg>
<arg>${modified_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:58:57.768846" elapsed="60.708027">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:59:58.478250" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:59:58.477734" elapsed="0.000544"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-08-22T23:59:58.478496" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:58.478352" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:58.478334" elapsed="0.000226"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-22T23:59:58.478789" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-22T23:59:58.480463" level="FAIL">'4968' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-22T23:59:58.479974" elapsed="0.000576">'4968' does not contain '-'</status>
</kw>
<msg time="2026-08-22T23:59:58.480705" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-22T23:59:58.479440" elapsed="0.001388"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:59:58.481537" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:59:58.481068" elapsed="0.000526"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:58.482255" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:58.481820" elapsed="0.000472"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:59:58.482935" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:59:58.482506" elapsed="0.000465"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-08-22T23:59:58.483715" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968

Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-08-22T23:59:58.483182" elapsed="0.000603"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:58.484337" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:58.484000" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-08-22T23:59:58.485310" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=4968'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-08-22T23:59:58.484841" elapsed="0.000535"/>
</kw>
<status status="PASS" start="2026-08-22T23:59:58.484492" elapsed="0.000932"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:58.484467" elapsed="0.000992"/>
</if>
<arg>4968</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-22T23:59:58.477331" elapsed="0.008192"/>
</kw>
<doc>Check that the modified device data make their way into the checker node.</doc>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=4968</tag>
<status status="FAIL" start="2026-08-22T23:58:57.541352" elapsed="60.944252">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968

Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</test>
<test id="s1-s8-t18" name="Check_Modified_Device_Data_Is_Visible_On_Configurer" line="195">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-22T23:59:58.489668" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-22T23:59:58.489389" 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-08-22T23:59:58.490947" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:58.490838" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:58.490819" 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-08-22T23:59:58.495990" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:58.495882" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:58.495863" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-22T23:59:58.497059" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-22T23:59:58.496676" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-22T23:59:58.497548" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-22T23:59:58.497242" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-22T23:59:58.497635" elapsed="0.000033"/>
</return>
<msg time="2026-08-22T23:59:58.497799" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-22T23:59:58.496284" 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-08-22T23:59:58.503228" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:58.503120" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:58.503102" 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-08-22T23:59:58.504475" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:58.504368" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:58.504350" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:59:58.505089" level="INFO">${karaf_connection_index} = 94</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:59:58.504765" elapsed="0.000352"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:59:58.505512" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:59:58.505277" elapsed="0.000261"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:59:58.537601" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:59:58.506083" elapsed="0.031673"/>
</kw>
<msg time="2026-08-22T23:59:58.538029" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:59:58.538099" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:59:58.505725" elapsed="0.032428"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:59:58.570743" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:59:58.538943" elapsed="0.031915"/>
</kw>
<msg time="2026-08-22T23:59:58.571021" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:59:58.571068" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:59:58.538399" elapsed="0.032708"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:58.571423" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:58.571189" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:58.571168" elapsed="0.000336"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:58.571979" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:58.571672" 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-08-22T23:59:58.572353" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:58.572137" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:58.572118" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:59:58.572466" 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-08-22T23:59:58.575008" elapsed="0.000154"/>
</kw>
<msg time="2026-08-22T23:59:58.575223" 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-08-22T23:59:58.573942" elapsed="0.001414"/>
</kw>
<kw name="Open 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-08-22T23:59:58.575659" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:58.575990" 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-08-22T23:59:58.573295" elapsed="0.002877"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:59:58.572759" 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="PASS" start="2026-08-22T23:59:58.504066" elapsed="0.072279"/>
</kw>
<msg time="2026-08-22T23:59:58.576439" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:59:58.576483" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:59:58.503446" elapsed="0.073075"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:59:58.576732" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:59:58.576624" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:58.576604" 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-08-22T23:59:58.577216" 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-08-22T23:59:58.577670" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:59:58.577748" 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-08-22T23:59:58.502782" elapsed="0.075078"/>
</kw>
<msg time="2026-08-22T23:59:58.577966" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:59:58.578012" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:59:58.498213" elapsed="0.079837"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:58.578376" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:58.578127" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:58.578109" elapsed="0.000347"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-22T23:59:58.498073" elapsed="0.080407"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:59:58.584032" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:58.583924" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:58.583904" 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-08-22T23:59:58.585367" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:58.585260" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:58.585240" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:59:58.585911" level="INFO">${karaf_connection_index} = 95</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:59:58.585595" elapsed="0.000343"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:59:58.586330" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:59:58.586109" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:59:58.618167" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:59:58.586882" elapsed="0.031395"/>
</kw>
<msg time="2026-08-22T23:59:58.618469" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:59:58.618518" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:59:58.586512" elapsed="0.032043"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:59:58.644152" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:59:58.619112" elapsed="0.025156"/>
</kw>
<msg time="2026-08-22T23:59:58.644427" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:59:58.644472" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:59:58.618758" elapsed="0.025750"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:58.644877" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:58.644624" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:58.644576" elapsed="0.000385"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:58.645743" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:58.645105" elapsed="0.000713"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:58.646130" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:58.645887" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:58.645868" elapsed="0.000343"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:59:58.646247" 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-08-22T23:59:58.648807" elapsed="0.000154"/>
</kw>
<msg time="2026-08-22T23:59:58.649128" 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-08-22T23:59:58.647792" elapsed="0.001473"/>
</kw>
<kw name="Open 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-08-22T23:59:58.649540" elapsed="0.000094"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:58.649925" elapsed="0.000174"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-22T23:59:58.647143" 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-08-22T23:59:58.646551" 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-08-22T23:59:58.584829" elapsed="0.065552"/>
</kw>
<msg time="2026-08-22T23:59:58.650474" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:59:58.650519" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:59:58.584249" elapsed="0.066307"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:59:58.650764" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:59:58.650656" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:58.650636" 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-08-22T23:59:58.651246" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:58.651597" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:59:58.651671" 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-08-22T23:59:58.583561" elapsed="0.068220"/>
</kw>
<msg time="2026-08-22T23:59:58.651878" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:59:58.651923" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:59:58.578850" elapsed="0.073110"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:58.652283" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:58.652035" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:58.652018" elapsed="0.000343"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-22T23:59:58.578709" elapsed="0.073676"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:59:58.657940" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:58.657817" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:58.657797" elapsed="0.000236"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-22T23:59:58.659175" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-22T23:59:58.659068" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:58.659050" elapsed="0.000206"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-22T23:59:58.659717" level="INFO">${karaf_connection_index} = 96</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-22T23:59:58.659398" elapsed="0.000346"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-22T23:59:58.660117" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-22T23:59:58.659897" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-22T23:59:58.691559" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-22T23:59:58.660670" elapsed="0.031004"/>
</kw>
<msg time="2026-08-22T23:59:58.691834" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-22T23:59:58.691881" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:59:58.660298" elapsed="0.031620"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-22T23:59:58.724075" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-22T23:59:58.692425" elapsed="0.031865"/>
</kw>
<msg time="2026-08-22T23:59:58.724462" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-22T23:59:58.724509" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:59:58.692086" elapsed="0.032461"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:58.724920" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:58.724667" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:58.724639" elapsed="0.000366"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:58.725472" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:58.725147" 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-08-22T23:59:58.725851" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:58.725637" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:58.725617" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-22T23:59:58.725967" 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-08-22T23:59:58.728751" elapsed="0.000154"/>
</kw>
<msg time="2026-08-22T23:59:58.728966" 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-08-22T23:59:58.727740" elapsed="0.001360"/>
</kw>
<kw name="Open 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-08-22T23:59:58.729372" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:58.729722" 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-08-22T23:59:58.727102" elapsed="0.002806"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-22T23:59:58.726274" elapsed="0.003700"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-22T23:59:58.658765" elapsed="0.071334"/>
</kw>
<msg time="2026-08-22T23:59:58.730193" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:59:58.730238" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:59:58.658184" elapsed="0.072092"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-22T23:59:58.730458" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-22T23:59:58.730352" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:58.730334" 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-08-22T23:59:58.730966" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:58.731305" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-22T23:59:58.731376" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-22T23:59:58.657407" elapsed="0.074078"/>
</kw>
<msg time="2026-08-22T23:59:58.731600" level="INFO">${status} = PASS</msg>
<msg time="2026-08-22T23:59:58.731648" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "M "o "d "i "f "i "e "d "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:59:58.652756" elapsed="0.078930"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:58.732010" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:58.731761" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:58.731744" elapsed="0.000344"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-22T23:59:58.652514" elapsed="0.079598"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-22T23:59:58.497880" elapsed="0.234265"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-22T23:59:58.495461" elapsed="0.236746"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-22T23:59:58.490525" elapsed="0.241782"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-22T23:59:58.490100" elapsed="0.242254"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-22T23:59:58.486988" elapsed="0.245422"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:58.733942" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:58.733539" elapsed="0.000430"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:58.741415" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:58.741165" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:58.741877" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:58.741625" 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-08-22T23:59:58.776313" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:58.776669" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:59:58.776912" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:59:58.744261" elapsed="0.032714"/>
</kw>
<status status="PASS" start="2026-08-22T23:59:58.741989" elapsed="0.035092"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:58.777520" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:58.777146" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:58.741970" elapsed="0.035795"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:58.785663" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:58.780186" elapsed="0.005587"/>
</kw>
<status status="PASS" start="2026-08-22T23:59:58.779693" elapsed="0.006158"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:58.779650" elapsed="0.006257"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:58.788989" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:58.786635" elapsed="0.002401"/>
</kw>
<status status="PASS" start="2026-08-22T23:59:58.786078" elapsed="0.002992"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:58.785994" elapsed="0.003101"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:59:58.789692" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:59:58.789270" 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-08-22T23:59:58.790027" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:58.789790" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:58.790758" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:58.790283" elapsed="0.000503"/>
</kw>
<status status="PASS" start="2026-08-22T23:59:58.790123" elapsed="0.000699"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:58.789772" elapsed="0.001072"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:59:58.791367" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:59:58.790999" 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-08-22T23:59:58.791713" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:58.791464" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:58.792248" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:58.791952" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-22T23:59:58.791795" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:58.791445" 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-08-22T23:59:58.792530" elapsed="0.000373"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:59:58.793373" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:59:58.793068" 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-08-22T23:59:58.793552" elapsed="0.002354"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:59:58.778705" elapsed="0.017265"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:59:58.796146" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-08-22T23:59:58.796039" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:58.796020" 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-08-22T23:59:58.796380" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:58.796450" elapsed="0.000015"/>
</return>
<msg time="2026-08-22T23:59:58.798802" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:59:58.736772" elapsed="0.062059"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:59:58.798891" elapsed="0.000028"/>
</return>
<msg time="2026-08-22T23:59:58.799042" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:59:58.734205" elapsed="0.064862"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:59:58.799726" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:59:58.799346" elapsed="0.000461">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:58.799136" elapsed="0.000745">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:59:58.799119" elapsed="0.000796">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:58.800134" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:58.799986" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:58.799969" elapsed="0.000244"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:58.733143" elapsed="0.067153">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:59.803308" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:59.802297" elapsed="0.001081"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:59.815326" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:59.815062" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:59.815793" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:59.815528" 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-08-22T23:59:59.838504" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-22T23:59:59.838941" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-22T23:59:59.839167" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-22T23:59:59.817998" elapsed="0.021228"/>
</kw>
<status status="PASS" start="2026-08-22T23:59:59.815915" elapsed="0.023411"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:59.839771" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:59.839389" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:59.815891" elapsed="0.024082"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:59.846043" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:59.842294" elapsed="0.003819"/>
</kw>
<status status="PASS" start="2026-08-22T23:59:59.841799" elapsed="0.004365"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:59.841758" elapsed="0.004442"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-22T23:59:59.849915" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-22T23:59:59.846625" elapsed="0.003355"/>
</kw>
<status status="PASS" start="2026-08-22T23:59:59.846279" elapsed="0.003750"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:59.846256" elapsed="0.003808"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:59:59.850948" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:59:59.850301" 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-08-22T23:59:59.851303" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:59.851066" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:59.851874" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:59.851546" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-08-22T23:59:59.851385" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:59.851048" elapsed="0.000912"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-22T23:59:59.852480" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:59:59.852119" 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-08-22T23:59:59.852827" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:59.852592" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-22T23:59:59.853363" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-22T23:59:59.853066" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-22T23:59:59.852909" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:59.852559" 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-08-22T23:59:59.853613" elapsed="0.000437"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-22T23:59:59.854525" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-22T23:59:59.854213" 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-08-22T23:59:59.854721" elapsed="0.002458"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-22T23:59:59.840806" elapsed="0.016438"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-22T23:59:59.857422" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-22T23:59:59.857312" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-22T23:59:59.857294" 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-08-22T23:59:59.857678" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-22T23:59:59.857749" elapsed="0.000016"/>
</return>
<msg time="2026-08-22T23:59:59.860109" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-22T23:59:59.809935" elapsed="0.050204"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-22T23:59:59.860236" elapsed="0.000029"/>
</return>
<msg time="2026-08-22T23:59:59.860391" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-22T23:59:59.803910" elapsed="0.056508"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-22T23:59:59.861083" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-22T23:59:59.860712" elapsed="0.000450">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-22T23:59:59.860489" elapsed="0.000744">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-22T23:59:59.860471" elapsed="0.000797">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-22T23:59:59.861487" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-22T23:59:59.861340" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-22T23:59:59.861323" elapsed="0.000245"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-22T23:59:59.801200" elapsed="0.060467">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:00.864657" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:00.863689" elapsed="0.001042"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:00.875941" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:00.875671" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:00.876393" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:00.876145" 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-08-23T00:00:00.894135" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:00.894287" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:00.894387" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:00.878685" elapsed="0.015749"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:00.876517" elapsed="0.017961"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:00.894679" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:00.894505" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:00.876494" elapsed="0.018275"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:00.903109" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:00.897103" elapsed="0.006121"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:00.896609" elapsed="0.006694"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:00.896539" elapsed="0.006821"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:00.906363" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:00.903905" elapsed="0.002507"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:00.903486" elapsed="0.002963"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:00.903447" elapsed="0.003028"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:00.907097" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:00.906674" 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-08-23T00:00:00.907501" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:00.907196" elapsed="0.000365"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:00.908080" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:00.907773" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:00.907602" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:00.907178" elapsed="0.000988"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:00.908707" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:00.908324" 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-08-23T00:00:00.909038" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:00.908806" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:00.909592" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:00.909279" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:00.909121" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:00.908788" 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-08-23T00:00:00.909834" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:00.910663" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:00.910349" 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-08-23T00:00:00.910856" elapsed="0.002312"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:00.895636" elapsed="0.017600"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:00.913417" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-23T00:00:00.913307" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:00.913288" 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-08-23T00:00:00.913679" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:00.913752" elapsed="0.000015"/>
</return>
<msg time="2026-08-23T00:00:00.916111" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:00.871079" elapsed="0.045062"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:00.916201" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:00.916354" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:00.865426" elapsed="0.050954"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:00.917048" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:00.916682" elapsed="0.000449">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:00.916450" elapsed="0.000756">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:00.916433" elapsed="0.000806">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:00.917454" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:00.917307" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:00.917290" elapsed="0.000244"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:00.862507" elapsed="0.055126">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:01.920651" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:01.919103" elapsed="0.001600"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:01.930423" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:01.930082" elapsed="0.000402"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:01.930974" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:01.930700" 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-08-23T00:00:01.950669" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:01.950889" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:01.951075" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:01.933282" elapsed="0.017834"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:01.931104" elapsed="0.020098"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:01.951613" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:01.951299" elapsed="0.000422"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:01.931078" elapsed="0.020677"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:01.957332" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:01.953489" elapsed="0.003919"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:01.953120" elapsed="0.004342"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:01.953090" elapsed="0.004410"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:01.960907" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:01.957947" elapsed="0.003007"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:01.957611" elapsed="0.003379"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:01.957558" elapsed="0.003457"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:01.961646" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:01.961196" 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-08-23T00:00:01.961989" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:01.961747" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:01.962572" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:01.962249" elapsed="0.000367"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:01.962073" elapsed="0.000581"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:01.961729" elapsed="0.000947"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:01.963208" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:01.962839" 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-08-23T00:00:01.963734" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:01.963473" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:01.964283" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:01.963977" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:01.963818" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:01.963451" 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-08-23T00:00:01.964531" elapsed="0.000376"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:01.965384" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:01.965070" 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-08-23T00:00:01.965656" elapsed="0.002370"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:01.952395" elapsed="0.015700"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:01.968278" elapsed="0.000052"/>
</return>
<status status="PASS" start="2026-08-23T00:00:01.968166" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:01.968147" 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-08-23T00:00:01.968554" elapsed="0.000038"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:01.968645" elapsed="0.000017"/>
</return>
<msg time="2026-08-23T00:00:01.970950" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:01.924513" elapsed="0.046467"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:01.971043" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:01.971200" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:01.921033" elapsed="0.050228"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:01.971944" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:01.971550" elapsed="0.000474">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:01.971338" elapsed="0.000761">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:01.971320" elapsed="0.000815">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:01.972356" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:01.972207" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:01.972189" elapsed="0.000251"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:01.918383" elapsed="0.054209">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:02.975694" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:02.974676" elapsed="0.001095"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:02.989467" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:02.989202" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:02.989939" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:02.989686" 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-08-23T00:00:03.008097" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:03.008389" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:03.008686" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:02.992163" elapsed="0.016596"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:02.990061" 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-08-23T00:00:03.009391" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:03.009038" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:02.990038" elapsed="0.019587"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:03.015416" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:03.011932" elapsed="0.003554"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:03.011417" elapsed="0.004119"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:03.011376" elapsed="0.004195"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:03.019223" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:03.016008" elapsed="0.003280"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:03.015692" elapsed="0.003646"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:03.015668" elapsed="0.003705"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:03.020214" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:03.019656" 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-08-23T00:00:03.020548" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:03.020313" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:03.021115" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:03.020810" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:03.020648" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:03.020295" elapsed="0.000906"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:03.021741" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:03.021358" 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-08-23T00:00:03.022075" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:03.021843" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:03.022630" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:03.022314" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:03.022157" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:03.021822" 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-08-23T00:00:03.022866" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:03.023701" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:03.023379" 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-08-23T00:00:03.023881" elapsed="0.002303"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:03.010423" elapsed="0.015826"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:03.026429" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-23T00:00:03.026319" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:03.026300" 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-08-23T00:00:03.026685" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:03.026759" elapsed="0.000015"/>
</return>
<msg time="2026-08-23T00:00:03.029238" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:02.984626" elapsed="0.044642"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:03.029329" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:03.029484" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:02.976266" elapsed="0.053245"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:03.030168" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:03.029806" elapsed="0.000479">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:03.029596" elapsed="0.000763">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:03.029564" elapsed="0.000829">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:03.030625" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:03.030462" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:03.030445" elapsed="0.000263"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:02.973485" elapsed="0.057305">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:04.033875" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:04.032894" elapsed="0.001052"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:04.045281" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:04.045017" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:04.045757" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:04.045487" 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-08-23T00:00:04.065668" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:04.065958" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:04.066178" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:04.047994" elapsed="0.018243"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:04.045889" elapsed="0.020447"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:04.066774" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:04.066396" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:04.045867" elapsed="0.021107"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:04.072941" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:04.069189" elapsed="0.003826"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:04.068876" elapsed="0.004191"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:04.068849" elapsed="0.004254"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:04.076903" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:04.073500" elapsed="0.003464"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:04.073185" elapsed="0.003822"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:04.073161" elapsed="0.003871"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:04.077623" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:04.077210" 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-08-23T00:00:04.077966" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:04.077723" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:04.078505" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:04.078205" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:04.078048" elapsed="0.000604"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:04.077705" elapsed="0.000971"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:04.079207" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:04.078835" 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-08-23T00:00:04.079559" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:04.079304" elapsed="0.000336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:04.080155" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:04.079832" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:04.079666" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:04.079286" 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-08-23T00:00:04.080398" elapsed="0.000396"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:04.081264" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:04.080964" 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-08-23T00:00:04.081448" elapsed="0.002319"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:04.067849" elapsed="0.015987"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:04.084031" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-23T00:00:04.083908" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:04.083890" 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-08-23T00:00:04.084276" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:04.084349" elapsed="0.000015"/>
</return>
<msg time="2026-08-23T00:00:04.086706" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:04.040064" elapsed="0.046672"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:04.086796" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:04.086949" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:04.034444" elapsed="0.052532"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:04.087631" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:04.087256" elapsed="0.000452">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:04.087046" elapsed="0.000734">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:04.087029" elapsed="0.000786">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:04.088057" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:04.087886" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:04.087868" elapsed="0.000272"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:04.031690" elapsed="0.056533">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:05.091039" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:05.090042" elapsed="0.001067"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:05.102035" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:05.101771" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:05.102493" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:05.102240" 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-08-23T00:00:05.122649" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:05.122931" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:05.123152" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:05.104730" elapsed="0.018480"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:05.102628" elapsed="0.020681"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:05.123748" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:05.123369" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:05.102606" elapsed="0.021342"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:05.130829" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:05.126296" elapsed="0.004608"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:05.125800" elapsed="0.005155"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:05.125758" elapsed="0.005232"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:05.134618" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:05.131379" elapsed="0.003307"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:05.131068" elapsed="0.003668"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:05.131045" elapsed="0.003726"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:05.135546" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:05.135009" 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-08-23T00:00:05.136036" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:05.135707" elapsed="0.000411"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:05.136860" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:05.136377" elapsed="0.000523"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:05.136153" elapsed="0.000799"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:05.135681" elapsed="0.001301"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:05.137542" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:05.137180" 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-08-23T00:00:05.137887" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:05.137655" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:05.138422" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:05.138126" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:05.137969" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:05.137637" 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-08-23T00:00:05.138671" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:05.139479" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:05.139190" 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-08-23T00:00:05.139673" elapsed="0.002319"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:05.124813" elapsed="0.017253"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:05.142286" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-23T00:00:05.142177" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:05.142157" 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-08-23T00:00:05.142525" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:05.142615" elapsed="0.000017"/>
</return>
<msg time="2026-08-23T00:00:05.144978" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:05.097179" elapsed="0.047828"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:05.145070" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:05.145224" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:05.091674" elapsed="0.053578"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:05.145906" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:05.145531" elapsed="0.000450">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:05.145322" elapsed="0.000730">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:05.145305" elapsed="0.000781">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:05.146304" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:05.146157" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:05.146140" elapsed="0.000244"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:05.089023" elapsed="0.057442">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:06.149329" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:06.148354" elapsed="0.001046"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:06.160279" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:06.160019" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:06.160756" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:06.160482" 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-08-23T00:00:06.181003" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:06.181347" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:06.181696" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:06.162958" elapsed="0.018807"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:06.160878" elapsed="0.021034"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:06.182423" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:06.181988" elapsed="0.000616"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:06.160855" elapsed="0.021803"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:06.190955" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:06.185308" elapsed="0.005699"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:06.184666" elapsed="0.006378"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:06.184622" elapsed="0.006448"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:06.193703" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:06.191352" elapsed="0.002399"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:06.191127" elapsed="0.002661"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:06.191110" elapsed="0.002703"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:06.194436" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:06.194009" 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-08-23T00:00:06.194794" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:06.194537" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:06.195356" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:06.195049" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:06.194880" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:06.194518" elapsed="0.000927"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:06.196000" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:06.195632" 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-08-23T00:00:06.196330" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:06.196097" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:06.196888" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:06.196572" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:06.196413" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:06.196080" 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-08-23T00:00:06.197132" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:06.197989" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:06.197659" 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-08-23T00:00:06.198171" 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-08-23T00:00:06.183615" elapsed="0.017183"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:06.200980" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-23T00:00:06.200868" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:06.200849" 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-08-23T00:00:06.201226" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:06.201298" elapsed="0.000016"/>
</return>
<msg time="2026-08-23T00:00:06.203683" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:06.154271" elapsed="0.049442"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:06.203775" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:06.203930" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:06.149981" elapsed="0.053977"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:06.204626" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:06.204239" elapsed="0.000472">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:06.204030" elapsed="0.000757">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:06.204013" elapsed="0.000856">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:06.205097" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:06.204946" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:06.204928" elapsed="0.000251"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:06.147261" elapsed="0.058005">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:07.208191" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:07.207155" elapsed="0.001108"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:07.219952" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:07.219691" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:07.220401" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:07.220155" 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-08-23T00:00:07.239316" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:07.239654" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:07.239878" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:07.222622" elapsed="0.017314"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:07.220527" elapsed="0.019507"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:07.240439" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:07.240098" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:07.220503" elapsed="0.020174"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:07.247044" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:07.242981" elapsed="0.004133"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:07.242451" elapsed="0.004713"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:07.242410" elapsed="0.004790"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:07.250879" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:07.247626" elapsed="0.003317"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:07.247295" elapsed="0.003699"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:07.247271" elapsed="0.003758"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:07.251880" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:07.251304" 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-08-23T00:00:07.252227" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:07.251988" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:07.252799" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:07.252473" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:07.252311" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:07.251969" elapsed="0.000916"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:07.253404" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:07.253041" 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-08-23T00:00:07.253749" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:07.253500" elapsed="0.000371"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:07.254358" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:07.254060" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:07.253898" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:07.253482" 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-08-23T00:00:07.254619" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:07.255469" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:07.255138" 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-08-23T00:00:07.255665" 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-08-23T00:00:07.241473" elapsed="0.016612"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:07.258267" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-23T00:00:07.258156" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:07.258137" 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-08-23T00:00:07.258512" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:07.258599" elapsed="0.000016"/>
</return>
<msg time="2026-08-23T00:00:07.261032" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:07.214617" elapsed="0.046447"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:07.261126" elapsed="0.000029"/>
</return>
<msg time="2026-08-23T00:00:07.261278" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:07.208789" elapsed="0.052517"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:07.261967" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:07.261601" elapsed="0.000446">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:07.261375" elapsed="0.000746">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:07.261359" elapsed="0.000798">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:07.262374" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:07.262227" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:07.262211" elapsed="0.000244"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:07.206089" elapsed="0.056449">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:08.265611" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:08.264620" elapsed="0.001067"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:08.277695" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:08.277414" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:08.278144" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:08.277897" 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-08-23T00:00:08.294563" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:08.294896" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:08.295116" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:08.280403" elapsed="0.014771"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:08.278272" elapsed="0.016999"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:08.295710" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:08.295332" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:08.278245" elapsed="0.017661"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:08.303662" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:08.298241" elapsed="0.005532"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:08.297749" elapsed="0.006104"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:08.297707" elapsed="0.006201"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:08.307294" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:08.304521" elapsed="0.002818"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:08.304031" elapsed="0.003344"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:08.303994" elapsed="0.003405"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:08.307986" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:08.307573" 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-08-23T00:00:08.308316" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:08.308082" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:08.309113" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:08.308554" elapsed="0.000587"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:08.308397" elapsed="0.000781"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:08.308064" elapsed="0.001136"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:08.309742" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:08.309356" 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-08-23T00:00:08.310067" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:08.309838" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:08.310612" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:08.310301" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:08.310147" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:08.309821" elapsed="0.000875"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-23T00:00:08.310845" elapsed="0.000477"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:08.311797" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:08.311480" 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-08-23T00:00:08.311973" elapsed="0.002335"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:08.296777" elapsed="0.017598"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:08.314561" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-08-23T00:00:08.314445" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:08.314427" 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-08-23T00:00:08.314818" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:08.314929" elapsed="0.000017"/>
</return>
<msg time="2026-08-23T00:00:08.317291" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:08.271737" elapsed="0.045584"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:08.317380" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:08.317531" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:08.266181" elapsed="0.051377"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:08.318223" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:08.317862" elapsed="0.000440">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:08.317653" elapsed="0.000721">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:08.317635" elapsed="0.000773">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:08.318636" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:08.318477" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:08.318460" elapsed="0.000257"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:08.263414" elapsed="0.055385">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:09.321862" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:09.320848" elapsed="0.001089"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:09.335103" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:09.334837" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:09.335548" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:09.335303" 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-08-23T00:00:09.354245" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:09.354531" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:09.354787" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:09.337899" elapsed="0.016948"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:09.335685" elapsed="0.019260"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:09.355342" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:09.355005" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:09.335663" elapsed="0.019875"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:09.361695" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:09.357896" elapsed="0.003870"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:09.357333" elapsed="0.004483"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:09.357293" elapsed="0.004574"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:09.365524" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:09.362256" elapsed="0.003351"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:09.361948" elapsed="0.003784"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:09.361925" elapsed="0.003845"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:09.366613" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:09.366044" 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-08-23T00:00:09.367119" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:09.366757" elapsed="0.000431"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:09.367694" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:09.367374" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:09.367214" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:09.366731" elapsed="0.001052"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:09.368303" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:09.367940" 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-08-23T00:00:09.368647" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:09.368401" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:09.369184" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:09.368888" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:09.368730" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:09.368383" 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-08-23T00:00:09.369420" elapsed="0.000365"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:09.370257" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:09.369961" 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-08-23T00:00:09.370435" 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-08-23T00:00:09.356363" elapsed="0.016582"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:09.373129" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-23T00:00:09.373019" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:09.372998" 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-08-23T00:00:09.373369" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:09.373442" elapsed="0.000015"/>
</return>
<msg time="2026-08-23T00:00:09.375851" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:09.328508" elapsed="0.047373"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:09.375943" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:09.376096" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:09.322435" elapsed="0.053689"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:09.376863" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:09.376478" elapsed="0.000464">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:09.376194" elapsed="0.000819">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:09.376176" elapsed="0.000873">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:09.377267" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:09.377120" elapsed="0.000240"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:09.377103" elapsed="0.000282"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:09.319717" elapsed="0.057751">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:10.380064" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:10.379140" elapsed="0.000990"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:10.391844" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:10.391576" elapsed="0.000420"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:10.392423" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:10.392158" 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-08-23T00:00:10.411383" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:10.411501" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:10.411620" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:10.394598" elapsed="0.017050"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:10.392536" elapsed="0.019155"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:10.411868" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:10.411717" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:10.392518" elapsed="0.019439"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:10.420273" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:10.414219" elapsed="0.006105"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:10.413728" elapsed="0.006631"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:10.413686" elapsed="0.006699"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:10.423010" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:10.420679" elapsed="0.002377"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:10.420442" elapsed="0.002654"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:10.420424" elapsed="0.002713"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:10.423914" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:10.423299" 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-08-23T00:00:10.424250" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:10.424016" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:10.424813" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:10.424491" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:10.424333" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:10.423997" elapsed="0.000902"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:10.425421" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:10.425057" 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-08-23T00:00:10.425776" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:10.425518" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:10.426309" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:10.426015" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:10.425858" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:10.425500" 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-08-23T00:00:10.426593" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:10.427418" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:10.427109" 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-08-23T00:00:10.427610" elapsed="0.002342"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:10.412710" elapsed="0.017306"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:10.430196" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-23T00:00:10.430090" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:10.430070" 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-08-23T00:00:10.430425" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:10.430497" elapsed="0.000014"/>
</return>
<msg time="2026-08-23T00:00:10.432874" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:10.386091" elapsed="0.046812"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:10.432963" elapsed="0.000027"/>
</return>
<msg time="2026-08-23T00:00:10.433119" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:10.380637" elapsed="0.052508"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:10.433801" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:10.433420" elapsed="0.000562">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:10.433214" elapsed="0.000843">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:10.433197" elapsed="0.000895">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:10.434309" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:10.434162" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:10.434145" elapsed="0.000245"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:10.378136" elapsed="0.056335">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:11.437300" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:11.436239" elapsed="0.001128"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:11.449199" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:11.448944" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:11.449661" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:11.449401" 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-08-23T00:00:11.468291" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:11.468499" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:11.468621" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:11.451845" elapsed="0.016804"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:11.449779" elapsed="0.018916"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:11.468877" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:11.468723" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:11.449758" elapsed="0.019209"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:11.476810" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:11.471218" elapsed="0.005705"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:11.470729" elapsed="0.006275"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:11.470688" elapsed="0.006366"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:11.479680" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:11.477334" elapsed="0.002394"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:11.477112" elapsed="0.002651"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:11.477096" elapsed="0.002693"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:11.480365" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:11.479960" 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-08-23T00:00:11.480712" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:11.480463" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:11.481257" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:11.480955" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:11.480795" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:11.480445" elapsed="0.000898"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:11.481880" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:11.481499" 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-08-23T00:00:11.482206" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:11.481976" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:11.482758" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:11.482444" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:11.482287" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:11.481958" 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-08-23T00:00:11.482991" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:11.483800" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:11.483501" 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-08-23T00:00:11.483979" elapsed="0.002314"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:11.469744" elapsed="0.016614"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:11.486535" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-08-23T00:00:11.486427" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:11.486409" 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-08-23T00:00:11.486792" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:11.486863" elapsed="0.000016"/>
</return>
<msg time="2026-08-23T00:00:11.489185" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:11.443655" elapsed="0.045560"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:11.489320" elapsed="0.000029"/>
</return>
<msg time="2026-08-23T00:00:11.489475" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:11.437882" elapsed="0.051620"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:11.490151" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:11.489797" elapsed="0.000427">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:11.489572" elapsed="0.000721">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:11.489555" elapsed="0.000772">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:11.490541" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:11.490396" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:11.490379" elapsed="0.000261"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:11.435187" elapsed="0.055535">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:12.493336" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:12.492400" elapsed="0.001003"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:12.507298" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:12.507037" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:12.507776" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:12.507502" 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-08-23T00:00:12.529510" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:12.529845" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:12.530090" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:12.510057" elapsed="0.020094"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:12.507895" elapsed="0.022357"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:12.530688" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:12.530313" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:12.507874" elapsed="0.023016"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:12.538467" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:12.533203" elapsed="0.005315"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:12.532708" elapsed="0.005846"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:12.532665" elapsed="0.005931"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:12.541210" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:12.538877" elapsed="0.002381"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:12.538655" elapsed="0.002640"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:12.538638" elapsed="0.002683"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:12.541914" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:12.541492" 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-08-23T00:00:12.542305" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:12.542015" elapsed="0.000351"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:12.542878" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:12.542553" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:12.542391" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:12.541997" elapsed="0.000970"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:12.543499" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:12.543132" 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-08-23T00:00:12.543864" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:12.543614" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:12.544417" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:12.544113" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:12.543951" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:12.543595" 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-08-23T00:00:12.544688" elapsed="0.000359"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:12.545500" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:12.545209" 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-08-23T00:00:12.545721" elapsed="0.002380"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:12.531712" elapsed="0.016455"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:12.548348" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-08-23T00:00:12.548238" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:12.548219" 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-08-23T00:00:12.548601" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:12.548675" elapsed="0.000016"/>
</return>
<msg time="2026-08-23T00:00:12.551363" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:12.502567" elapsed="0.048826"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:12.551455" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:12.551624" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:12.493971" elapsed="0.057681"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:12.552299" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:12.551933" elapsed="0.000440">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:12.551725" elapsed="0.000719">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:12.551707" elapsed="0.000772">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:12.552712" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:12.552549" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:12.552532" elapsed="0.000263"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:12.491413" elapsed="0.061465">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:13.556012" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:13.555004" elapsed="0.001081"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:13.567827" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:13.567429" elapsed="0.000468"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:13.568465" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:13.568112" 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-08-23T00:00:13.590090" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:13.590269" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:13.590405" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:13.571521" elapsed="0.018929"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:13.568664" elapsed="0.021863"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:13.590837" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:13.590568" elapsed="0.000368"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:13.568632" elapsed="0.022337"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:13.596216" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:13.592425" elapsed="0.003861"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:13.592107" elapsed="0.004231"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:13.592082" elapsed="0.004291"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:13.599926" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:13.596786" elapsed="0.003187"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:13.596451" elapsed="0.003558"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:13.596428" elapsed="0.003605"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:13.600648" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:13.600222" 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-08-23T00:00:13.600985" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:13.600747" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:13.601528" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:13.601229" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:13.601068" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:13.600729" elapsed="0.000902"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:13.602154" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:13.601789" 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-08-23T00:00:13.602483" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:13.602251" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:13.603063" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:13.602765" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:13.602566" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:13.602233" 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-08-23T00:00:13.603309" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:13.604146" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:13.603841" 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-08-23T00:00:13.604387" 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-08-23T00:00:13.591488" elapsed="0.015486"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:13.607160" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-08-23T00:00:13.607045" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:13.607026" 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-08-23T00:00:13.607414" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:13.607486" elapsed="0.000015"/>
</return>
<msg time="2026-08-23T00:00:13.609871" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:13.561355" elapsed="0.048545"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:13.609960" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:13.610111" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:13.556611" elapsed="0.053526"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:13.610821" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:13.610415" elapsed="0.000499">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:13.610207" elapsed="0.000785">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:13.610190" elapsed="0.000837">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:13.611245" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:13.611096" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:13.611080" elapsed="0.000244"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:13.553848" elapsed="0.057559">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:14.613206" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:14.612756" elapsed="0.000484"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:14.622690" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:14.622306" elapsed="0.000452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:14.623321" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:14.622973" 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-08-23T00:00:14.645819" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:14.646012" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:14.646154" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:14.625808" elapsed="0.020408"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:14.623485" elapsed="0.022921"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:14.646856" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:14.646475" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:14.623456" elapsed="0.023599"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:14.654867" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:14.649384" elapsed="0.005593"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:14.648894" elapsed="0.006161"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:14.648852" elapsed="0.006259"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:14.658535" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:14.655764" elapsed="0.002833"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:14.655237" elapsed="0.003398"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:14.655200" elapsed="0.003460"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:14.659227" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:14.658833" 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-08-23T00:00:14.659557" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:14.659324" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:14.660144" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:14.659817" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:14.659658" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:14.659306" elapsed="0.000923"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:14.660763" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:14.660383" 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-08-23T00:00:14.661089" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:14.660860" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:14.661640" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:14.661328" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:14.661171" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:14.660842" 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-08-23T00:00:14.661872" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:14.662691" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:14.662378" 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-08-23T00:00:14.662868" elapsed="0.002337"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:14.647909" elapsed="0.017359"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:14.665446" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-23T00:00:14.665338" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:14.665320" 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-08-23T00:00:14.665700" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:14.665773" elapsed="0.000015"/>
</return>
<msg time="2026-08-23T00:00:14.668146" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:14.616017" elapsed="0.052159"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:14.668234" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:14.668385" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:14.613466" elapsed="0.054945"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:14.669066" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:14.668703" elapsed="0.000482">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:14.668479" elapsed="0.000781">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:14.668463" elapsed="0.000832">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:14.669510" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:14.669364" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:14.669347" elapsed="0.000260"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:14.612147" elapsed="0.057544">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:15.671514" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:15.670940" elapsed="0.000617"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:15.682323" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:15.681967" elapsed="0.000406"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:15.682791" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:15.682526" 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-08-23T00:00:15.702134" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:15.702337" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:15.702477" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:15.685029" elapsed="0.017488"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:15.682910" elapsed="0.019695"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:15.702868" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:15.702647" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:15.682888" elapsed="0.020103"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:15.708014" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:15.704476" elapsed="0.003608"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:15.704165" elapsed="0.003968"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:15.704139" elapsed="0.004029"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:15.711974" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:15.708556" elapsed="0.003484"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:15.708246" elapsed="0.003843"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:15.708222" elapsed="0.003901"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:15.712920" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:15.712354" 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-08-23T00:00:15.713433" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:15.713095" elapsed="0.000420"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:15.714250" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:15.713794" elapsed="0.000494"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:15.713549" elapsed="0.000846"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:15.713068" elapsed="0.001351"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:15.715097" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:15.714596" elapsed="0.000535"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:15.715472" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:15.715218" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:15.716031" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:15.715732" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:15.715555" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:15.715196" elapsed="0.000920"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-23T00:00:15.716273" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:15.717118" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:15.716804" 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-08-23T00:00:15.717298" 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-08-23T00:00:15.703548" elapsed="0.016316"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:15.720043" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-23T00:00:15.719934" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:15.719915" 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-08-23T00:00:15.720282" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:15.720355" elapsed="0.000015"/>
</return>
<msg time="2026-08-23T00:00:15.722795" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:15.675723" elapsed="0.047101"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:15.722885" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:15.723036" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:15.671921" elapsed="0.051142"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:15.723771" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:15.723386" elapsed="0.000466">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:15.723142" elapsed="0.000783">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:15.723121" elapsed="0.000839">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:15.724175" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:15.724029" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:15.724012" elapsed="0.000243"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:15.670303" elapsed="0.054036">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:16.727381" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:16.726367" elapsed="0.001085"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:16.745761" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:16.745069" elapsed="0.000818"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:16.746855" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:16.746272" elapsed="0.000684"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-23T00:00:16.774988" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:16.775280" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:16.775507" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:16.751804" elapsed="0.023761"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:16.747125" elapsed="0.028574"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:16.776110" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:16.775761" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:16.747074" elapsed="0.029230"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:16.784048" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:16.778661" elapsed="0.005461"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:16.778140" elapsed="0.006037"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:16.778075" elapsed="0.006139"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:16.788144" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:16.784648" elapsed="0.003565"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:16.784297" elapsed="0.003970"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:16.784272" elapsed="0.004033"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:16.789193" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:16.788567" 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-08-23T00:00:16.789714" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:16.789341" elapsed="0.000462"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:16.790565" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:16.790078" elapsed="0.000549"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:16.789840" elapsed="0.000842"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:16.789313" elapsed="0.001403"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:16.791378" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:16.790951" elapsed="0.000454"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:16.791725" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:16.791475" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:16.792265" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:16.791967" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:16.791809" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:16.791457" 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-08-23T00:00:16.792512" elapsed="0.000377"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:16.793364" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:16.793054" 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-08-23T00:00:16.793544" 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-08-23T00:00:16.777142" elapsed="0.018865"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:16.796253" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-08-23T00:00:16.796139" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:16.796120" 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-08-23T00:00:16.796505" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:16.796592" elapsed="0.000017"/>
</return>
<msg time="2026-08-23T00:00:16.798990" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:16.734330" elapsed="0.064690"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:16.799083" elapsed="0.000027"/>
</return>
<msg time="2026-08-23T00:00:16.799237" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:16.727993" elapsed="0.071271"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:16.799932" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:16.799542" elapsed="0.000478">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:16.799335" elapsed="0.000763">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:16.799318" elapsed="0.000815">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:16.800349" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:16.800203" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:16.800186" elapsed="0.000243"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:16.725170" elapsed="0.075345">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:17.804002" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:17.802962" elapsed="0.001126"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:17.816150" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:17.815888" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:17.816632" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:17.816355" 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-08-23T00:00:17.835483" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:17.835686" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:17.835791" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:17.818842" elapsed="0.016976"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:17.816761" elapsed="0.019101"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:17.836048" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:17.835893" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:17.816736" elapsed="0.019400"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:17.844281" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:17.838662" elapsed="0.005669"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:17.837950" elapsed="0.006418"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:17.837909" elapsed="0.006484"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:17.847052" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:17.844695" elapsed="0.002403"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:17.844451" elapsed="0.002684"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:17.844433" elapsed="0.002727"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:17.847805" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:17.847360" 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-08-23T00:00:17.848144" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:17.847905" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:17.848710" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:17.848391" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:17.848232" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:17.847886" elapsed="0.000911"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:17.849499" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:17.848956" 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-08-23T00:00:17.849846" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:17.849614" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:17.850381" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:17.850085" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:17.849927" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:17.849595" 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-08-23T00:00:17.850633" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:17.851491" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:17.851147" 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-08-23T00:00:17.851686" elapsed="0.002286"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:17.836962" elapsed="0.017073"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:17.854216" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-23T00:00:17.854105" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:17.854087" 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-08-23T00:00:17.854466" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:17.854536" elapsed="0.000015"/>
</return>
<msg time="2026-08-23T00:00:17.856867" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:17.810219" elapsed="0.046677"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:17.856956" elapsed="0.000027"/>
</return>
<msg time="2026-08-23T00:00:17.857105" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:17.804614" elapsed="0.052518"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:17.857789" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:17.857408" elapsed="0.000467">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:17.857200" elapsed="0.000750">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:17.857184" elapsed="0.000864">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:17.858275" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:17.858124" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:17.858107" elapsed="0.000248"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:17.801798" elapsed="0.056640">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:18.861641" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:18.860538" elapsed="0.001181"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:18.876008" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:18.875745" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:18.876486" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:18.876217" 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-08-23T00:00:18.894072" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:18.894294" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:18.894542" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:18.878685" elapsed="0.015960"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:18.876626" elapsed="0.018124"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:18.895168" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:18.894811" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:18.876600" elapsed="0.018766"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:18.903423" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:18.897994" elapsed="0.005538"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:18.897443" elapsed="0.006200"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:18.897391" elapsed="0.006310"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:18.907192" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:18.904366" elapsed="0.002876"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:18.903825" elapsed="0.003452"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:18.903787" elapsed="0.003514"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:18.907914" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:18.907478" 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-08-23T00:00:18.908247" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:18.908011" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:18.908817" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:18.908500" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:18.908340" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:18.907993" elapsed="0.000908"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:18.909417" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:18.909056" 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-08-23T00:00:18.909759" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:18.909512" elapsed="0.000356"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:18.910351" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:18.910054" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:18.909893" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:18.909495" 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-08-23T00:00:18.910602" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:18.911423" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:18.911115" 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-08-23T00:00:18.911616" 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-08-23T00:00:18.896204" elapsed="0.017873"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:18.914257" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-23T00:00:18.914146" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:18.914129" 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-08-23T00:00:18.914510" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:18.914596" elapsed="0.000017"/>
</return>
<msg time="2026-08-23T00:00:18.916926" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:18.868638" elapsed="0.048316"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:18.917014" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:18.917164" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:18.862224" elapsed="0.054965"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:18.917848" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:18.917464" elapsed="0.000467">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:18.917257" elapsed="0.000747">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:18.917241" elapsed="0.000797">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:18.918253" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:18.918107" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:18.918090" elapsed="0.000242"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:18.859272" elapsed="0.059143">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:19.920977" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:19.920056" elapsed="0.000987"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:19.933418" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:19.933146" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:19.933880" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:19.933634" 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-08-23T00:00:19.952084" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:19.952219" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:19.952432" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:19.936090" elapsed="0.016410"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:19.933993" elapsed="0.018645"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:19.953038" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:19.952701" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:19.933974" elapsed="0.019285"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:19.961661" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:19.955609" elapsed="0.006168"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:19.955095" elapsed="0.006762"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:19.955056" elapsed="0.006859"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:19.964775" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:19.962457" elapsed="0.002365"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:19.962040" elapsed="0.002817"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:19.962002" elapsed="0.002880"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:19.965437" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:19.965046" 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-08-23T00:00:19.965787" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:19.965535" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:19.966333" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:19.966027" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:19.965869" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:19.965517" elapsed="0.000900"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:19.966951" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:19.966573" 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-08-23T00:00:19.967277" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:19.967047" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:19.967827" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:19.967514" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:19.967358" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:19.967029" 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-08-23T00:00:19.968056" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:19.968859" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:19.968559" 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-08-23T00:00:19.969052" elapsed="0.002320"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:19.954124" elapsed="0.017311"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:19.971627" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-08-23T00:00:19.971504" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:19.971486" 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-08-23T00:00:19.971861" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:19.971973" elapsed="0.000017"/>
</return>
<msg time="2026-08-23T00:00:19.974314" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:19.927028" elapsed="0.047315"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:19.974403" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:19.974553" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:19.921602" elapsed="0.052994"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:19.975304" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:19.974947" elapsed="0.000430">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:19.974668" elapsed="0.000777">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:19.974651" elapsed="0.000828">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:19.975715" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:19.975547" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:19.975530" elapsed="0.000266"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:19.919087" elapsed="0.056791">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:20.979186" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:20.978115" elapsed="0.001146"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:20.994086" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:20.993760" elapsed="0.000390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:20.994611" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:20.994343" 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-08-23T00:00:21.012038" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:21.012183" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:21.012351" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:20.996819" elapsed="0.015590"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:20.994736" elapsed="0.017770"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:21.012960" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:21.012567" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:20.994713" elapsed="0.018439"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:21.021253" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:21.015520" elapsed="0.005842"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:21.015009" elapsed="0.006431"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:21.014969" elapsed="0.006526"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:21.025080" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:21.022142" elapsed="0.002985"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:21.021650" elapsed="0.003572"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:21.021610" elapsed="0.003639"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:21.025845" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:21.025424" 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-08-23T00:00:21.026202" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:21.025948" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:21.026809" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:21.026477" elapsed="0.000360"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:21.026294" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:21.025925" elapsed="0.000970"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:21.027464" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:21.027054" 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-08-23T00:00:21.027816" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:21.027563" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:21.028363" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:21.028060" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:21.027900" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:21.027544" 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-08-23T00:00:21.028615" elapsed="0.000371"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:21.029465" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:21.029160" 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-08-23T00:00:21.029663" 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-08-23T00:00:21.013969" elapsed="0.018150"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:21.032303" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-23T00:00:21.032189" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:21.032171" 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-08-23T00:00:21.032543" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:21.032632" elapsed="0.000015"/>
</return>
<msg time="2026-08-23T00:00:21.034939" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:20.986067" elapsed="0.048900"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:21.035027" elapsed="0.000027"/>
</return>
<msg time="2026-08-23T00:00:21.035177" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:20.979795" elapsed="0.055409"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:21.035898" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:21.035518" elapsed="0.000461">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:21.035289" elapsed="0.000762">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:21.035269" elapsed="0.000815">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:21.036300" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:21.036152" elapsed="0.000247"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:21.036136" elapsed="0.000287"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:20.976853" elapsed="0.059655">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:22.039091" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:22.038179" elapsed="0.000977"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:22.053555" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:22.053259" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:22.054019" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:22.053774" 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-08-23T00:00:22.072822" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:22.073085" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:22.073328" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:22.056207" elapsed="0.017188"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:22.054133" 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-08-23T00:00:22.073951" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:22.073605" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:22.054114" elapsed="0.020035"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:22.081128" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:22.076502" elapsed="0.004676"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:22.075992" elapsed="0.005223"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:22.075951" elapsed="0.005290"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:22.083918" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:22.081561" elapsed="0.002404"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:22.081308" elapsed="0.002693"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:22.081288" elapsed="0.002738"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:22.084573" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:22.084192" 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-08-23T00:00:22.084923" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:22.084688" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:22.085467" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:22.085167" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:22.085007" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:22.084669" elapsed="0.000885"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:22.086091" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:22.085729" 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-08-23T00:00:22.086419" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:22.086188" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:22.086974" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:22.086674" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:22.086500" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:22.086170" 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-08-23T00:00:22.087266" elapsed="0.000404"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:22.088116" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:22.087833" 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-08-23T00:00:22.088300" elapsed="0.002570"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:22.074978" elapsed="0.015962"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:22.091130" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-08-23T00:00:22.091014" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:22.090995" 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-08-23T00:00:22.091403" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:22.091479" elapsed="0.000016"/>
</return>
<msg time="2026-08-23T00:00:22.094059" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:22.048741" elapsed="0.045348"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:22.094151" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:22.094308" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:22.039743" elapsed="0.054593"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:22.094988" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:22.094628" elapsed="0.000433">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:22.094405" elapsed="0.000728">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:22.094388" elapsed="0.000779">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:22.095433" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:22.095236" elapsed="0.000258"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:22.095219" elapsed="0.000300"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:22.037183" elapsed="0.058436">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:23.098232" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:23.097292" elapsed="0.001006"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:23.109753" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:23.109459" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:23.110202" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:23.109953" 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-08-23T00:00:23.128634" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:23.128994" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:23.129213" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:23.112410" elapsed="0.016866"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:23.110320" elapsed="0.019068"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:23.129840" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:23.129459" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:23.110299" elapsed="0.019738"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:23.137809" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:23.132379" elapsed="0.005480"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:23.131872" elapsed="0.006023"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:23.131831" elapsed="0.006090"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:23.140501" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:23.138197" elapsed="0.002351"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:23.137977" elapsed="0.002620"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:23.137960" elapsed="0.002664"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:23.141179" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:23.140794" 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-08-23T00:00:23.141510" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:23.141277" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:23.142068" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:23.141768" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:23.141608" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:23.141259" elapsed="0.000894"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:23.142685" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:23.142308" 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-08-23T00:00:23.143011" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:23.142782" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:23.143539" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:23.143248" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:23.143091" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:23.142764" 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-08-23T00:00:23.143789" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:23.144640" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:23.144334" 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-08-23T00:00:23.144819" 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-08-23T00:00:23.130892" elapsed="0.016328"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:23.147401" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-08-23T00:00:23.147289" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:23.147271" 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-08-23T00:00:23.147654" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:23.147726" elapsed="0.000015"/>
</return>
<msg time="2026-08-23T00:00:23.150045" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:23.103298" elapsed="0.046777"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:23.150184" elapsed="0.000029"/>
</return>
<msg time="2026-08-23T00:00:23.150338" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:23.098811" elapsed="0.051553"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:23.151019" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:23.150661" elapsed="0.000432">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:23.150435" elapsed="0.000727">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:23.150417" elapsed="0.000779">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:23.151410" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:23.151265" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:23.151248" elapsed="0.000241"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:23.096292" elapsed="0.055279">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:24.154173" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:24.153252" elapsed="0.000988"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:24.166311" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:24.166054" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:24.166793" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:24.166512" 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-08-23T00:00:24.183313" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:24.183560" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:24.183833" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:24.168982" elapsed="0.014910"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:24.166907" elapsed="0.017083"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:24.184404" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:24.184050" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:24.166889" elapsed="0.017757"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:24.192659" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:24.187062" elapsed="0.005710"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:24.186534" elapsed="0.006319"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:24.186493" elapsed="0.006417"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:24.196521" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:24.193608" elapsed="0.002960"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:24.193035" elapsed="0.003584"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:24.192998" elapsed="0.003646"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:24.197179" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:24.196803" 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-08-23T00:00:24.197632" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:24.197293" elapsed="0.000401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:24.198180" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:24.197878" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:24.197719" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:24.197275" elapsed="0.000990"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:24.198801" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:24.198420" 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-08-23T00:00:24.199129" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:24.198897" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:24.199681" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:24.199368" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:24.199211" elapsed="0.000639"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:24.198879" 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-08-23T00:00:24.200027" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:24.200830" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:24.200534" 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-08-23T00:00:24.201007" 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-08-23T00:00:24.185520" elapsed="0.017874"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:24.203570" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-08-23T00:00:24.203463" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:24.203444" 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-08-23T00:00:24.203819" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:24.203892" elapsed="0.000016"/>
</return>
<msg time="2026-08-23T00:00:24.206339" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:24.160224" elapsed="0.046144"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:24.206428" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:24.206594" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:24.154752" elapsed="0.051870"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:24.207245" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:24.206898" elapsed="0.000414">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:24.206692" elapsed="0.000686">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:24.206675" elapsed="0.000737">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:24.207641" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:24.207480" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:24.207464" elapsed="0.000259"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:24.152248" elapsed="0.055555">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:25.209463" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:25.208994" elapsed="0.000505"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:25.217289" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:25.217025" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:25.217760" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:25.217492" 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-08-23T00:00:25.234814" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:25.234968" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:25.235067" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:25.220015" elapsed="0.015077"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:25.217882" elapsed="0.017255"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:25.235320" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:25.235165" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:25.217859" elapsed="0.017547"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:25.238865" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:25.236425" elapsed="0.002490"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:25.236205" elapsed="0.002746"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:25.236186" elapsed="0.002790"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:25.241553" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:25.239253" elapsed="0.002362"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:25.239032" elapsed="0.002618"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:25.239016" elapsed="0.002659"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:25.242256" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:25.241849" 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-08-23T00:00:25.242609" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:25.242358" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:25.243155" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:25.242853" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:25.242693" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:25.242340" elapsed="0.000900"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:25.243775" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:25.243397" 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-08-23T00:00:25.244105" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:25.243873" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:25.244659" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:25.244343" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:25.244186" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:25.243855" 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-08-23T00:00:25.244893" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:25.245711" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:25.245402" 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-08-23T00:00:25.245954" 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-08-23T00:00:25.235781" elapsed="0.012657"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:25.248635" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-23T00:00:25.248508" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:25.248489" 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-08-23T00:00:25.248879" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:25.248951" elapsed="0.000015"/>
</return>
<msg time="2026-08-23T00:00:25.251319" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:25.212539" elapsed="0.038810"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:25.251411" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:25.251565" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:25.209748" elapsed="0.041860"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:25.252247" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:25.251887" elapsed="0.000439">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:25.251680" elapsed="0.000719">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:25.251663" elapsed="0.000771">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:25.252665" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:25.252504" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:25.252487" elapsed="0.000260"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:25.208393" elapsed="0.044436">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:26.255471" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:26.254482" elapsed="0.001058"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:26.267359" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:26.267104" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:26.267824" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:26.267557" 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-08-23T00:00:26.285184" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:26.285319" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:26.285451" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:26.270097" elapsed="0.015422"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:26.267956" elapsed="0.017819"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:26.286192" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:26.285843" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:26.267920" elapsed="0.018468"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:26.294549" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:26.288800" elapsed="0.005894"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:26.288277" elapsed="0.006499"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:26.288235" elapsed="0.006598"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:26.297946" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:26.295504" elapsed="0.002488"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:26.294960" elapsed="0.003067"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:26.294922" elapsed="0.003130"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:26.298616" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:26.298219" 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-08-23T00:00:26.298950" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:26.298716" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:26.299519" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:26.299218" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:26.299032" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:26.298697" elapsed="0.000926"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:26.300149" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:26.299786" 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-08-23T00:00:26.300473" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:26.300245" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:26.301025" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:26.300731" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:26.300553" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:26.300227" 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-08-23T00:00:26.301258" elapsed="0.000364"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:26.302072" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:26.301784" 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-08-23T00:00:26.302248" elapsed="0.002434"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:26.287302" elapsed="0.017447"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:26.304929" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-08-23T00:00:26.304819" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:26.304800" 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-08-23T00:00:26.305161" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:26.305232" elapsed="0.000015"/>
</return>
<msg time="2026-08-23T00:00:26.307609" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:26.261507" elapsed="0.046133"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:26.307700" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:26.307852" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:26.256060" elapsed="0.051818"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:26.308515" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:26.308161" elapsed="0.000489">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:26.307947" elapsed="0.000775">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:26.307930" elapsed="0.000826">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:26.308970" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:26.308826" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:26.308809" elapsed="0.000242"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:26.253472" elapsed="0.055698">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:27.312284" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:27.311207" elapsed="0.001149"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:27.324947" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:27.324678" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:27.325403" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:27.325153" 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-08-23T00:00:27.348400" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:27.348556" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:27.348678" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:27.327611" elapsed="0.021093"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:27.325530" elapsed="0.023220"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:27.348936" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:27.348780" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:27.325507" elapsed="0.023519"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:27.352565" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:27.350062" elapsed="0.002569"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:27.349839" elapsed="0.002829"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:27.349820" elapsed="0.002874"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:27.355252" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:27.352972" elapsed="0.002327"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:27.352750" elapsed="0.002584"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:27.352733" elapsed="0.002626"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:27.355954" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:27.355533" 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-08-23T00:00:27.356289" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:27.356054" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:27.356853" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:27.356532" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:27.356372" elapsed="0.000606"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:27.356036" elapsed="0.000965"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:27.357533" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:27.357160" 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-08-23T00:00:27.357883" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:27.357648" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:27.358445" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:27.358123" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:27.357965" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:27.357629" 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-08-23T00:00:27.358702" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:27.359516" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:27.359223" 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-08-23T00:00:27.359722" elapsed="0.002307"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:27.349393" elapsed="0.012700"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:27.362272" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-23T00:00:27.362163" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:27.362144" 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-08-23T00:00:27.362512" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:27.362599" elapsed="0.000016"/>
</return>
<msg time="2026-08-23T00:00:27.364911" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:27.318790" elapsed="0.046151"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:27.365002" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:27.365153" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:27.312892" elapsed="0.052288"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:27.365829" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:27.365455" elapsed="0.000452">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:27.365250" elapsed="0.000727">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:27.365233" elapsed="0.000777">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:27.366224" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:27.366079" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:27.366062" elapsed="0.000241"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:27.310053" elapsed="0.056331">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:28.369367" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:28.368332" elapsed="0.001107"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:28.381869" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:28.381602" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:28.382317" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:28.382071" 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-08-23T00:00:28.403876" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:28.404166" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:28.404386" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:28.384492" elapsed="0.019952"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:28.382440" elapsed="0.022103"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:28.405028" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:28.404637" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:28.382416" elapsed="0.022814"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:28.413222" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:28.407533" elapsed="0.005800"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:28.407029" elapsed="0.006389"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:28.406988" elapsed="0.006497"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:28.416137" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:28.413828" elapsed="0.002355"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:28.413597" elapsed="0.002621"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:28.413560" elapsed="0.002683"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:28.416838" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:28.416417" 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-08-23T00:00:28.417174" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:28.416939" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:28.417736" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:28.417415" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:28.417257" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:28.416921" elapsed="0.000901"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:28.418339" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:28.417978" 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-08-23T00:00:28.418681" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:28.418435" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:28.419229" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:28.418936" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:28.418779" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:28.418418" 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-08-23T00:00:28.419462" elapsed="0.000376"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:28.420296" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:28.420001" 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-08-23T00:00:28.420473" 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-08-23T00:00:28.406049" elapsed="0.016977"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:28.423261" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-23T00:00:28.423148" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:28.423129" 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-08-23T00:00:28.423509" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:28.423609" elapsed="0.000016"/>
</return>
<msg time="2026-08-23T00:00:28.426150" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:28.376123" elapsed="0.050057"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:28.426241" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:28.426394" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:28.369962" elapsed="0.056459"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:28.427126" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:28.426732" elapsed="0.000478">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:28.426506" elapsed="0.000780">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:28.426474" elapsed="0.000846">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:28.427544" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:28.427390" elapsed="0.000249"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:28.427373" elapsed="0.000291"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:28.367221" elapsed="0.060528">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:29.430825" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:29.429773" elapsed="0.001124"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:29.442502" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:29.442242" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:29.442973" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:29.442726" 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-08-23T00:00:29.467620" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:29.467919" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:29.468137" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:29.445191" elapsed="0.023003"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:29.443097" elapsed="0.025194"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:29.468735" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:29.468350" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:29.443074" elapsed="0.025855"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:29.477169" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:29.471378" elapsed="0.005902"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:29.470775" elapsed="0.006586"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:29.470734" elapsed="0.006683"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:29.480731" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:29.478123" elapsed="0.002656"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:29.477542" elapsed="0.003273"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:29.477504" elapsed="0.003337"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:29.481413" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:29.481017" 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-08-23T00:00:29.481781" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:29.481511" elapsed="0.000329"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:29.482330" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:29.482027" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:29.481865" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:29.481493" elapsed="0.000922"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:29.482960" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:29.482593" 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-08-23T00:00:29.483289" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:29.483057" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:29.483841" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:29.483528" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:29.483370" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:29.483039" 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-08-23T00:00:29.484073" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:29.484889" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:29.484597" 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-08-23T00:00:29.485235" 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-08-23T00:00:29.469796" elapsed="0.017865"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:29.487848" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-23T00:00:29.487730" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:29.487712" 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-08-23T00:00:29.488087" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:29.488158" elapsed="0.000015"/>
</return>
<msg time="2026-08-23T00:00:29.490514" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:29.437085" elapsed="0.053458"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:29.490620" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:29.490773" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:29.431388" elapsed="0.059412"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:29.491435" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:29.491077" elapsed="0.000435">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:29.490868" elapsed="0.000739">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:29.490851" elapsed="0.000880">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:29.491958" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:29.491809" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:29.491791" elapsed="0.000249"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:29.428647" elapsed="0.063475">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:30.495134" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:30.494014" elapsed="0.001199"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:30.508289" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:30.508014" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:30.508795" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:30.508503" 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-08-23T00:00:30.529742" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:30.530063" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:30.530304" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:30.511175" elapsed="0.019190"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:30.508918" elapsed="0.021557"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:30.530986" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:30.530569" elapsed="0.000602"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:30.508896" elapsed="0.022329"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:30.539691" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:30.533702" elapsed="0.006054"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:30.533129" elapsed="0.006670"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:30.533087" elapsed="0.006746"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:30.543076" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:30.540176" elapsed="0.002961"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:30.539902" elapsed="0.003279"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:30.539882" elapsed="0.003331"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:30.543954" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:30.543439" 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-08-23T00:00:30.544382" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:30.544078" elapsed="0.000377"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:30.545054" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:30.544713" elapsed="0.000368"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:30.544487" elapsed="0.000630"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:30.544055" elapsed="0.001084"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:30.545703" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:30.545296" 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-08-23T00:00:30.546033" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:30.545800" elapsed="0.000356"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:30.546734" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:30.546346" elapsed="0.000423"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:30.546182" elapsed="0.000633"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:30.545783" 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-08-23T00:00:30.546994" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:30.547844" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:30.547513" 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-08-23T00:00:30.548030" elapsed="0.002328"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:30.532074" elapsed="0.018351"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:30.550644" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-23T00:00:30.550494" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:30.550476" 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-08-23T00:00:30.550904" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:30.550981" elapsed="0.000015"/>
</return>
<msg time="2026-08-23T00:00:30.553308" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:30.501169" elapsed="0.052168"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:30.553399" elapsed="0.000029"/>
</return>
<msg time="2026-08-23T00:00:30.553553" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:30.495757" elapsed="0.057839"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:30.554264" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:30.553886" elapsed="0.000459">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:30.553670" elapsed="0.000754">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:30.553653" elapsed="0.000808">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:30.554767" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:30.554530" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:30.554514" elapsed="0.000340"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:30.492957" elapsed="0.061981">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:31.557951" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:31.556983" elapsed="0.001040"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:31.570850" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:31.570547" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:31.571312" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:31.571059" 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-08-23T00:00:31.593931" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:31.594236" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:31.594497" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:31.573651" elapsed="0.020906"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:31.571476" elapsed="0.023214"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:31.595110" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:31.594753" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:31.571447" elapsed="0.023855"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:31.603639" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:31.597724" elapsed="0.006039"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:31.597192" elapsed="0.006671"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:31.597150" elapsed="0.006774"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:31.607003" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:31.604521" elapsed="0.002529"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:31.604050" elapsed="0.003036"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:31.604013" elapsed="0.003098"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:31.607863" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:31.607356" elapsed="0.000536"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:31.608207" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:31.607965" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:31.608801" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:31.608455" elapsed="0.000376"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:31.608292" elapsed="0.000576"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:31.607946" elapsed="0.000944"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:31.609417" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:31.609048" 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-08-23T00:00:31.609774" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:31.609515" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:31.610319" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:31.610017" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:31.609859" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:31.609497" 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-08-23T00:00:31.610555" elapsed="0.000386"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:31.611429" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:31.611105" 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-08-23T00:00:31.611634" elapsed="0.002337"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:31.596181" elapsed="0.017863"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:31.614235" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-23T00:00:31.614117" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:31.614098" 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-08-23T00:00:31.614484" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:31.614648" elapsed="0.000018"/>
</return>
<msg time="2026-08-23T00:00:31.664949" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:31.565242" elapsed="0.099753"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:31.665084" elapsed="0.000049"/>
</return>
<msg time="2026-08-23T00:00:31.665276" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:31.558634" elapsed="0.106669"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:31.666134" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:31.665678" elapsed="0.000535">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:31.665390" elapsed="0.000897">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:31.665367" elapsed="0.000957">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:31.666547" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:31.666395" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:31.666377" elapsed="0.000269"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:31.555864" elapsed="0.110866">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:32.669671" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:32.668697" elapsed="0.001046"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:32.680921" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:32.680634" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:32.681387" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:32.681134" 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-08-23T00:00:32.701946" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:32.702303" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:32.702633" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:32.683621" elapsed="0.019078"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:32.681514" elapsed="0.021301"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:32.703312" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:32.702895" elapsed="0.000569"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:32.681491" elapsed="0.022023"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:32.713175" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:32.706116" elapsed="0.007272"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:32.705562" elapsed="0.007877"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:32.705518" elapsed="0.007952"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:32.716883" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:32.713843" elapsed="0.003099"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:32.713540" elapsed="0.003551"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:32.713520" elapsed="0.003611"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:32.717768" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:32.717333" 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-08-23T00:00:32.718116" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:32.717870" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:32.718694" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:32.718361" elapsed="0.000362"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:32.718199" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:32.717851" elapsed="0.000932"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:32.719327" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:32.718945" 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-08-23T00:00:32.719683" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:32.719427" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:32.720275" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:32.719932" elapsed="0.000372"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:32.719769" elapsed="0.000572"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:32.719407" 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-08-23T00:00:32.720527" elapsed="0.000376"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:32.721369" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:32.721067" 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-08-23T00:00:32.721552" 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-08-23T00:00:32.704495" elapsed="0.019588"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:32.724287" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-23T00:00:32.724157" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:32.724138" 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-08-23T00:00:32.724533" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:32.724622" elapsed="0.000016"/>
</return>
<msg time="2026-08-23T00:00:32.726999" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:32.675828" elapsed="0.051200"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:32.727090" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:32.727245" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:32.670235" elapsed="0.057037"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:32.727939" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:32.727552" elapsed="0.000468">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:32.727343" elapsed="0.000749">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:32.727326" elapsed="0.000801">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:32.728371" elapsed="0.000093"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:32.728197" elapsed="0.000306"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:32.728180" elapsed="0.000347"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:32.667549" elapsed="0.061088">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:33.731748" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:33.730692" elapsed="0.001141"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:33.748068" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:33.747636" elapsed="0.000518"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:33.748819" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:33.748394" elapsed="0.000496"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-23T00:00:33.770179" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:33.770477" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:33.770773" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:33.752259" elapsed="0.018581"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:33.749006" elapsed="0.021942"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:33.771385" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:33.771015" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:33.748972" elapsed="0.022653"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:33.777954" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:33.774068" elapsed="0.003965"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:33.773701" elapsed="0.004386"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:33.773668" elapsed="0.004456"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:33.781969" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:33.778542" elapsed="0.003476"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:33.778209" elapsed="0.003846"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:33.778184" elapsed="0.003897"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:33.782714" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:33.782271" 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-08-23T00:00:33.783055" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:33.782815" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:33.783631" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:33.783303" elapsed="0.000359"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:33.783139" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:33.782797" elapsed="0.000925"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:33.784254" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:33.783881" 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-08-23T00:00:33.784610" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:33.784354" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:33.785186" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:33.784856" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:33.784696" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:33.784336" 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-08-23T00:00:33.785511" elapsed="0.000385"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:33.786372" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:33.786061" 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-08-23T00:00:33.786556" elapsed="0.002346"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:33.772566" elapsed="0.016409"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:33.789191" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-08-23T00:00:33.789066" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:33.789029" 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-08-23T00:00:33.789448" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:33.789521" elapsed="0.000016"/>
</return>
<msg time="2026-08-23T00:00:33.791868" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:33.738195" elapsed="0.053703"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:33.791960" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:33.792120" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:33.732339" elapsed="0.059808"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:33.792858" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:33.792458" elapsed="0.000484">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:33.792219" elapsed="0.000798">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:33.792202" elapsed="0.000901">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:33.793330" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:33.793179" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:33.793162" elapsed="0.000250"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:33.729519" elapsed="0.063978">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:34.796716" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:34.795654" elapsed="0.001139"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:34.808035" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:34.807751" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:34.808500" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:34.808250" 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-08-23T00:00:34.826292" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:34.826548" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:34.826840" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:34.810751" elapsed="0.016154"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:34.808642" elapsed="0.018375"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:34.827477" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:34.827087" elapsed="0.000582"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:34.808617" elapsed="0.019108"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:34.835390" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:34.830312" elapsed="0.005128"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:34.829751" elapsed="0.005725"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:34.829706" elapsed="0.005795"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:34.838113" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:34.835800" elapsed="0.002359"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:34.835557" elapsed="0.002638"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:34.835540" elapsed="0.002679"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:34.838851" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:34.838403" 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-08-23T00:00:34.839185" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:34.838949" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:34.839747" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:34.839428" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:34.839267" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:34.838931" elapsed="0.000902"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:34.840351" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:34.839989" 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-08-23T00:00:34.840693" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:34.840447" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:34.841233" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:34.840938" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:34.840774" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:34.840429" elapsed="0.000886"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-23T00:00:34.841469" elapsed="0.000402"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:34.842340" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:34.842039" 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-08-23T00:00:34.842517" 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-08-23T00:00:34.828658" elapsed="0.016385"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:34.845225" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-23T00:00:34.845114" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:34.845095" 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-08-23T00:00:34.845473" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:34.845544" elapsed="0.000015"/>
</return>
<msg time="2026-08-23T00:00:34.847918" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:34.801931" elapsed="0.046016"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:34.848055" elapsed="0.000030"/>
</return>
<msg time="2026-08-23T00:00:34.848214" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:34.797322" elapsed="0.050919"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:34.848915" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:34.848528" elapsed="0.000470">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:34.848314" elapsed="0.000759">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:34.848296" elapsed="0.000811">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:34.849326" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:34.849177" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:34.849161" elapsed="0.000244"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:34.794404" elapsed="0.055087">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:35.852633" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:35.851634" elapsed="0.001074"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:35.863952" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:35.863673" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:35.864418" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:35.864168" 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-08-23T00:00:35.886278" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:35.886452" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:35.886572" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:35.866681" elapsed="0.019956"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:35.864545" elapsed="0.022144"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:35.886908" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:35.886722" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:35.864519" elapsed="0.022479"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:35.890917" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:35.888162" elapsed="0.002807"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:35.887925" elapsed="0.003080"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:35.887904" elapsed="0.003126"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:35.893635" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:35.891315" elapsed="0.002368"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:35.891087" elapsed="0.002632"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:35.891070" elapsed="0.002673"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:35.894345" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:35.893932" 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-08-23T00:00:35.894795" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:35.894444" elapsed="0.000413"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:35.895359" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:35.895049" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:35.894883" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:35.894426" elapsed="0.001019"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:35.895997" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:35.895622" 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-08-23T00:00:35.896331" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:35.896096" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:35.896886" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:35.896570" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:35.896413" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:35.896078" 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-08-23T00:00:35.897123" elapsed="0.000357"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:35.898150" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:35.897664" 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-08-23T00:00:35.898331" 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-08-23T00:00:35.887429" elapsed="0.013325"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:35.900942" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-23T00:00:35.900827" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:35.900808" 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-08-23T00:00:35.901189" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:35.901261" elapsed="0.000015"/>
</return>
<msg time="2026-08-23T00:00:35.903887" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:35.858946" elapsed="0.044972"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:35.903981" elapsed="0.000036"/>
</return>
<msg time="2026-08-23T00:00:35.904152" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:35.853207" elapsed="0.050972"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:35.904877" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:35.904473" elapsed="0.000490">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:35.904251" elapsed="0.000787">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:35.904233" elapsed="0.000840">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:35.905293" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:35.905143" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:35.905126" elapsed="0.000248"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:35.850395" elapsed="0.055065">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:36.908826" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:36.907792" elapsed="0.001107"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:36.920508" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:36.920241" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:36.920997" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:36.920728" 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-08-23T00:00:36.940954" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:36.941103" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:36.941204" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:36.923269" elapsed="0.017961"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:36.921152" elapsed="0.020123"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:36.941457" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:36.941303" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:36.921126" elapsed="0.020421"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:36.949693" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:36.944033" elapsed="0.005772"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:36.943501" elapsed="0.006386"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:36.943456" elapsed="0.006486"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:36.953648" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:36.950555" elapsed="0.003144"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:36.950064" elapsed="0.003671"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:36.950028" elapsed="0.003732"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:36.954354" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:36.953936" 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-08-23T00:00:36.954706" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:36.954451" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:36.955247" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:36.954946" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:36.954789" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:36.954433" elapsed="0.000898"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:36.955889" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:36.955504" 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-08-23T00:00:36.956219" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:36.955986" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:36.956808" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:36.956459" elapsed="0.000376"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:36.956302" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:36.955969" 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-08-23T00:00:36.957047" elapsed="0.000386"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:36.957951" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:36.957616" 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-08-23T00:00:36.958201" elapsed="0.002313"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:36.942340" elapsed="0.018255"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:36.960786" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-23T00:00:36.960672" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:36.960651" 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-08-23T00:00:36.961027" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:36.961101" elapsed="0.000015"/>
</return>
<msg time="2026-08-23T00:00:36.963431" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:36.915280" elapsed="0.048181"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:36.963523" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:36.963693" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:36.909401" elapsed="0.054319"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:36.964368" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:36.964002" elapsed="0.000445">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:36.963792" elapsed="0.000729">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:36.963775" elapsed="0.000781">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:36.964793" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:36.964645" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:36.964626" elapsed="0.000250"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:36.906441" elapsed="0.058517">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:37.967920" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:37.966937" elapsed="0.001054"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:37.980854" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:37.980429" elapsed="0.000482"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:37.981402" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:37.981157" 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-08-23T00:00:38.000313" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:38.000512" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:38.000687" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:37.983656" elapsed="0.017074"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:37.981525" elapsed="0.019417"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:38.001356" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:38.001009" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:37.981501" elapsed="0.020051"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:38.009067" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:38.003876" elapsed="0.005241"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:38.003353" elapsed="0.005799"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:38.003312" elapsed="0.005865"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:38.011748" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:38.009454" elapsed="0.002340"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:38.009234" elapsed="0.002595"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:38.009217" elapsed="0.002637"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:38.012441" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:38.012029" 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-08-23T00:00:38.012790" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:38.012539" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:38.013336" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:38.013034" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:38.012873" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:38.012521" elapsed="0.000901"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:38.013964" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:38.013593" 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-08-23T00:00:38.014289" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:38.014060" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:38.014842" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:38.014528" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:38.014371" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:38.014042" 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-08-23T00:00:38.015077" elapsed="0.000381"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:38.015934" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:38.015634" 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-08-23T00:00:38.016112" elapsed="0.002424"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:38.002372" elapsed="0.016243"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:38.018796" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-23T00:00:38.018686" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:38.018668" 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-08-23T00:00:38.019041" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:38.019111" elapsed="0.000016"/>
</return>
<msg time="2026-08-23T00:00:38.021592" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:37.974038" elapsed="0.047585"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:38.021683" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:38.021835" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:37.968665" elapsed="0.053196"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:38.022497" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:38.022136" elapsed="0.000493">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:38.021930" elapsed="0.000774">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:38.021913" elapsed="0.000826">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:38.022956" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:38.022809" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:38.022792" elapsed="0.000243"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:37.965822" elapsed="0.057294">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:39.026134" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:39.025135" elapsed="0.001072"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:39.039885" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:39.039439" elapsed="0.000526"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:39.040614" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:39.040229" elapsed="0.000453"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-23T00:00:39.060997" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:39.061298" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:39.061531" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:39.043190" elapsed="0.018431"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:39.040801" elapsed="0.020929"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:39.062165" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:39.061795" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:39.040765" elapsed="0.021599"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:39.070195" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:39.064811" elapsed="0.005436"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:39.064265" elapsed="0.006019"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:39.064224" elapsed="0.006086"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:39.072909" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:39.070606" elapsed="0.002350"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:39.070368" elapsed="0.002624"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:39.070350" elapsed="0.002667"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:39.073647" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:39.073210" 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-08-23T00:00:39.073985" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:39.073746" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:39.074528" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:39.074228" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:39.074067" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:39.073728" elapsed="0.000971"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:39.075225" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:39.074857" 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-08-23T00:00:39.075556" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:39.075323" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:39.076111" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:39.075814" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:39.075655" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:39.075305" 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-08-23T00:00:39.076347" elapsed="0.000370"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:39.077215" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:39.076905" 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-08-23T00:00:39.077394" elapsed="0.002334"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:39.063240" elapsed="0.016556"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:39.079977" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-23T00:00:39.079866" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:39.079848" 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-08-23T00:00:39.080221" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:39.080292" elapsed="0.000015"/>
</return>
<msg time="2026-08-23T00:00:39.082635" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:39.032361" elapsed="0.050305"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:39.082727" elapsed="0.000027"/>
</return>
<msg time="2026-08-23T00:00:39.082878" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:39.026740" elapsed="0.056165"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:39.083548" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:39.083185" elapsed="0.000461">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:39.082976" elapsed="0.000743">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:39.082959" elapsed="0.000795">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:39.084158" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:39.084010" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:39.083993" elapsed="0.000246"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:39.023972" elapsed="0.060348">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:40.087351" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:40.086335" elapsed="0.001089"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:40.101773" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:40.101472" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:40.102238" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:40.101988" 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-08-23T00:00:40.119644" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:40.119854" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:40.120093" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:40.104453" elapsed="0.015701"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:40.102362" elapsed="0.017892"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:40.120695" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:40.120316" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:40.102337" elapsed="0.018561"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:40.128773" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:40.123204" elapsed="0.005680"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:40.122712" elapsed="0.006254"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:40.122667" elapsed="0.006355"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:40.132228" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:40.129828" elapsed="0.002447"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:40.129146" elapsed="0.003165"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:40.129109" elapsed="0.003227"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:40.132951" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:40.132519" 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-08-23T00:00:40.133285" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:40.133049" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:40.133861" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:40.133527" elapsed="0.000362"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:40.133368" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:40.133031" elapsed="0.000917"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:40.134470" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:40.134105" 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-08-23T00:00:40.134815" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:40.134567" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:40.135348" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:40.135054" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:40.134898" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:40.134549" 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-08-23T00:00:40.135596" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:40.136411" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:40.136109" 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-08-23T00:00:40.136603" 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-08-23T00:00:40.121737" elapsed="0.017320"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:40.139305" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-23T00:00:40.139191" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:40.139171" 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-08-23T00:00:40.139551" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:40.139642" elapsed="0.000024"/>
</return>
<msg time="2026-08-23T00:00:40.142049" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:40.093958" elapsed="0.048121"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:40.142141" elapsed="0.000027"/>
</return>
<msg time="2026-08-23T00:00:40.142292" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:40.087953" elapsed="0.054366"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:40.143087" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:40.142720" elapsed="0.000448">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:40.142389" elapsed="0.000854">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:40.142373" elapsed="0.000905">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:40.143497" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:40.143349" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:40.143333" elapsed="0.000260"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:40.085202" elapsed="0.058477">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:41.147106" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:41.145918" elapsed="0.001286"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:41.159410" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:41.159149" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:41.159876" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:41.159629" 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-08-23T00:00:41.178180" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:41.178540" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:41.178803" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:41.162075" elapsed="0.016787"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:41.160001" elapsed="0.018958"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:41.179365" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:41.179019" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:41.159976" elapsed="0.019580"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:41.185790" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:41.181980" elapsed="0.003878"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:41.181348" elapsed="0.004559"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:41.181307" elapsed="0.004635"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:41.189506" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:41.186342" elapsed="0.003229"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:41.186019" elapsed="0.003622"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:41.185996" elapsed="0.003680"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:41.190565" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:41.189920" elapsed="0.000721"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:41.191124" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:41.190760" elapsed="0.000422"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:41.191714" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:41.191368" elapsed="0.000374"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:41.191207" elapsed="0.000572"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:41.190733" elapsed="0.001067"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:41.192322" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:41.191957" 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-08-23T00:00:41.192663" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:41.192418" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:41.193196" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:41.192901" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:41.192745" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:41.192400" 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-08-23T00:00:41.193432" elapsed="0.000369"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:41.194271" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:41.193965" 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-08-23T00:00:41.194471" elapsed="0.004419"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:41.180374" elapsed="0.018584"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:41.199139" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-23T00:00:41.199027" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:41.199009" 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-08-23T00:00:41.199382" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:41.199458" elapsed="0.000016"/>
</return>
<msg time="2026-08-23T00:00:41.202011" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:41.154711" elapsed="0.047331"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:41.202102" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:41.202254" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:41.147818" elapsed="0.054462"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:41.202971" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:41.202599" elapsed="0.000451">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:41.202367" elapsed="0.000756">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:41.202349" elapsed="0.000882">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:41.203453" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:41.203306" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:41.203289" elapsed="0.000243"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:41.144643" elapsed="0.058986">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:42.206574" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:42.205562" elapsed="0.001117"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:42.216968" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:42.216695" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:42.217421" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:42.217175" 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-08-23T00:00:42.235942" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:42.236254" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:42.236504" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:42.219649" elapsed="0.016920"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:42.217548" elapsed="0.019169"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:42.237184" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:42.236785" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:42.217523" elapsed="0.019872"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:42.246425" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:42.240021" elapsed="0.006515"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:42.239443" elapsed="0.007205"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:42.239398" elapsed="0.007309"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:42.249905" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:42.247375" elapsed="0.002576"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:42.246832" elapsed="0.003155"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:42.246795" elapsed="0.003216"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:42.250620" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:42.250192" 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-08-23T00:00:42.250957" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:42.250720" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:42.251519" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:42.251216" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:42.251056" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:42.250701" elapsed="0.000922"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:42.252164" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:42.251783" 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-08-23T00:00:42.252492" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:42.252261" elapsed="0.000432"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:42.253186" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:42.252885" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:42.252721" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:42.252243" 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-08-23T00:00:42.253421" elapsed="0.000372"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:42.254253" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:42.253958" 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-08-23T00:00:42.254433" elapsed="0.002323"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:42.238322" elapsed="0.018505"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:42.257007" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-23T00:00:42.256896" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:42.256878" 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-08-23T00:00:42.257245" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:42.257316" elapsed="0.000015"/>
</return>
<msg time="2026-08-23T00:00:42.259797" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:42.212371" elapsed="0.047456"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:42.259887" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:42.260040" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:42.207208" elapsed="0.052858"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:42.260724" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:42.260343" elapsed="0.000464">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:42.260136" elapsed="0.000745">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:42.260119" elapsed="0.000796">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:42.261134" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:42.260985" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:42.260968" elapsed="0.000246"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:42.204437" elapsed="0.056859">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:43.264488" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:43.263348" elapsed="0.001217"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:43.277240" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:43.276945" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:43.277728" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:43.277455" 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-08-23T00:00:43.295406" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:43.295651" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:43.295829" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:43.280134" elapsed="0.015758"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:43.277857" elapsed="0.018149"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:43.296472" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:43.296076" elapsed="0.000612"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:43.277830" elapsed="0.018916"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:43.305078" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:43.299364" elapsed="0.005769"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:43.298800" elapsed="0.006370"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:43.298749" elapsed="0.006447"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:43.308279" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:43.305707" elapsed="0.002640"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:43.305256" elapsed="0.003139"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:43.305238" elapsed="0.003190"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:43.309276" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:43.308714" 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-08-23T00:00:43.309777" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:43.309416" elapsed="0.000450"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:43.310569" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:43.310142" elapsed="0.000488"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:43.309903" elapsed="0.000779"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:43.309388" elapsed="0.001328"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:43.311462" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:43.310945" 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-08-23T00:00:43.311983" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:43.311622" elapsed="0.000442"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:43.312784" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:43.312321" elapsed="0.000504"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:43.312099" elapsed="0.000778"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:43.311592" 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-08-23T00:00:43.313142" elapsed="0.000567"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:43.314278" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:43.313952" 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-08-23T00:00:43.314463" 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-08-23T00:00:43.297662" elapsed="0.019606"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:43.317473" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-08-23T00:00:43.317351" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:43.317329" 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-08-23T00:00:43.317743" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:43.317940" elapsed="0.000018"/>
</return>
<msg time="2026-08-23T00:00:43.320339" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:43.271242" elapsed="0.049127"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:43.320432" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:43.320604" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:43.265198" elapsed="0.055434"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:43.321284" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:43.320916" elapsed="0.000449">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:43.320705" elapsed="0.000734">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:43.320687" elapsed="0.000786">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:43.321709" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:43.321543" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:43.321526" elapsed="0.000265"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:43.262157" elapsed="0.059718">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:44.325123" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:44.324047" elapsed="0.001150"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:44.337342" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:44.336968" elapsed="0.000444"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:44.338064" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:44.337668" elapsed="0.000461"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-23T00:00:44.356179" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:44.356562" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:44.356827" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:44.341197" elapsed="0.015688"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:44.338237" elapsed="0.018749"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:44.357401" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:44.357053" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:44.338205" elapsed="0.019458"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:44.365530" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:44.360060" elapsed="0.005560"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:44.359521" elapsed="0.006152"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:44.359480" elapsed="0.006228"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:44.369452" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:44.366101" elapsed="0.003416"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:44.365788" elapsed="0.003882"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:44.365764" elapsed="0.003944"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:44.370522" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:44.369957" 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-08-23T00:00:44.371012" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:44.370683" elapsed="0.000411"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:44.371801" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:44.371356" elapsed="0.000483"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:44.371128" elapsed="0.000764"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:44.370656" elapsed="0.001265"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:44.372696" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:44.372144" 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-08-23T00:00:44.373157" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:44.372834" elapsed="0.000403"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:44.373927" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:44.373490" elapsed="0.000474"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:44.373270" elapsed="0.000743"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:44.372809" 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-08-23T00:00:44.374255" elapsed="0.000513"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:44.375406" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:44.374994" 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-08-23T00:00:44.375675" elapsed="0.002852"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:44.358526" elapsed="0.020084"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:44.378796" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-23T00:00:44.378683" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:44.378664" 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-08-23T00:00:44.379049" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:44.379120" elapsed="0.000015"/>
</return>
<msg time="2026-08-23T00:00:44.381447" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:44.330829" elapsed="0.050647"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:44.381537" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:44.381706" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:44.325730" elapsed="0.056003"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:44.382385" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:44.382017" elapsed="0.000453">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:44.381803" elapsed="0.000742">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:44.381786" elapsed="0.000807">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:44.382820" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:44.382671" elapsed="0.000247"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:44.382651" elapsed="0.000292"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:44.322827" elapsed="0.060201">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:45.385302" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:45.384643" elapsed="0.000707"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:45.395170" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:45.394908" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:45.395636" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:45.395374" 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-08-23T00:00:45.412812" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:45.413012" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:45.413171" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:45.397842" elapsed="0.015365"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:45.395759" elapsed="0.017508"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:45.413521" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:45.413307" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:45.395737" elapsed="0.017928"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:45.418728" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:45.415088" elapsed="0.003712"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:45.414778" elapsed="0.004073"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:45.414751" elapsed="0.004137"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:45.422625" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:45.419276" elapsed="0.003418"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:45.418967" elapsed="0.003778"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:45.418943" elapsed="0.003838"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:45.423565" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:45.423022" 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-08-23T00:00:45.424057" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:45.423726" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:45.424834" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:45.424392" elapsed="0.000479"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:45.424172" elapsed="0.000750"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:45.423701" elapsed="0.001251"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:45.425714" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:45.425186" 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-08-23T00:00:45.426173" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:45.425849" elapsed="0.000405"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:45.427021" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:45.426508" elapsed="0.000551"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:45.426288" elapsed="0.000823"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:45.425824" elapsed="0.001390"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-23T00:00:45.427434" elapsed="0.000529"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:45.428626" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:45.428195" 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-08-23T00:00:45.428881" elapsed="0.002662"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:45.414165" elapsed="0.017460"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:45.431806" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-08-23T00:00:45.431696" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:45.431678" 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-08-23T00:00:45.432052" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:45.432125" elapsed="0.000015"/>
</return>
<msg time="2026-08-23T00:00:45.434509" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:45.389155" elapsed="0.045384"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:45.434615" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:45.434771" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:45.385687" elapsed="0.049112"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:45.435441" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:45.435080" elapsed="0.000439">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:45.434870" elapsed="0.000736">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:45.434852" elapsed="0.000792">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:45.435866" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:45.435716" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:45.435699" elapsed="0.000254"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:45.383843" elapsed="0.052193">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:46.439112" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:46.438108" elapsed="0.001078"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:46.451070" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:46.450807" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:46.451523" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:46.451274" 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-08-23T00:00:46.470064" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:46.470457" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:46.470720" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:46.453859" elapsed="0.016924"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:46.451660" elapsed="0.019224"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:46.471298" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:46.470948" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:46.451637" elapsed="0.019863"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:46.479179" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:46.473886" elapsed="0.005344"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:46.473336" elapsed="0.005931"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:46.473296" elapsed="0.005997"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:46.481944" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:46.479574" elapsed="0.002417"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:46.479351" elapsed="0.002677"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:46.479334" elapsed="0.002719"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:46.482643" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:46.482229" 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-08-23T00:00:46.482978" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:46.482742" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:46.483520" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:46.483220" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:46.483062" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:46.482724" elapsed="0.000899"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:46.484143" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:46.483780" 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-08-23T00:00:46.484470" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:46.484239" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:46.485022" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:46.484725" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:46.484552" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:46.484222" 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-08-23T00:00:46.485258" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:46.486096" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:46.485800" 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-08-23T00:00:46.486275" elapsed="0.002367"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:46.472336" elapsed="0.016371"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:46.488888" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-23T00:00:46.488777" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:46.488759" 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-08-23T00:00:46.489135" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:46.489207" elapsed="0.000014"/>
</return>
<msg time="2026-08-23T00:00:46.491601" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:46.445297" elapsed="0.046335"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:46.491729" elapsed="0.000030"/>
</return>
<msg time="2026-08-23T00:00:46.491885" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:46.439716" elapsed="0.052197"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:46.492552" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:46.492192" elapsed="0.000457">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:46.491983" elapsed="0.000741">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:46.491966" elapsed="0.000793">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:46.492977" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:46.492830" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:46.492813" elapsed="0.000246"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:46.436938" elapsed="0.056204">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:47.496202" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:47.495190" elapsed="0.001086"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:47.508093" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:47.507726" elapsed="0.000437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:47.508747" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:47.508378" 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-08-23T00:00:47.526892" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:47.527168" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:47.527394" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:47.511688" elapsed="0.015766"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:47.508915" elapsed="0.018639"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:47.528000" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:47.527651" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:47.508885" elapsed="0.019317"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:47.536165" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:47.530603" elapsed="0.005672"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:47.530029" elapsed="0.006325"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:47.529987" elapsed="0.006513"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:47.539474" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:47.537125" elapsed="0.002396"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:47.536668" elapsed="0.002888"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:47.536624" elapsed="0.002972"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:47.540168" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:47.539774" 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-08-23T00:00:47.540590" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:47.540267" elapsed="0.000386"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:47.541150" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:47.540843" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:47.540679" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:47.540249" elapsed="0.000989"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:47.541782" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:47.541398" 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-08-23T00:00:47.542119" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:47.541881" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:47.542698" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:47.542363" elapsed="0.000362"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:47.542203" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:47.541862" 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-08-23T00:00:47.542938" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:47.543769" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:47.543456" 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-08-23T00:00:47.543950" 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-08-23T00:00:47.529041" elapsed="0.017488"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:47.546738" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-23T00:00:47.546618" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:47.546598" 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-08-23T00:00:47.546983" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:47.547056" elapsed="0.000015"/>
</return>
<msg time="2026-08-23T00:00:47.549412" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:47.501480" elapsed="0.047962"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:47.549503" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:47.549671" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:47.496809" elapsed="0.052889"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:47.550340" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:47.549978" elapsed="0.000452">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:47.549769" elapsed="0.000733">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:47.549752" elapsed="0.000785">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:47.550770" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:47.550624" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:47.550606" elapsed="0.000246"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:47.494037" elapsed="0.056897">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:48.553954" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:48.552982" elapsed="0.001041"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:48.567099" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:48.566794" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:48.567564" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:48.567309" 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-08-23T00:00:48.584634" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:48.584941" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:48.585164" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:48.569843" elapsed="0.015381"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:48.567719" elapsed="0.017606"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:48.585765" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:48.585387" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:48.567696" elapsed="0.018271"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:48.593397" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:48.588309" elapsed="0.005158"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:48.587812" elapsed="0.005707"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:48.587771" elapsed="0.005783"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:48.597258" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:48.593970" elapsed="0.003353"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:48.593655" elapsed="0.003718"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:48.593631" elapsed="0.003777"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:48.598211" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:48.597667" 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-08-23T00:00:48.598753" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:48.598381" elapsed="0.000458"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:48.599537" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:48.599115" elapsed="0.000461"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:48.598873" elapsed="0.000777"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:48.598353" elapsed="0.001327"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:48.600409" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:48.599901" 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-08-23T00:00:48.600892" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:48.600544" elapsed="0.000434"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:48.601666" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:48.601232" elapsed="0.000471"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:48.601012" elapsed="0.000743"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:48.600519" 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-08-23T00:00:48.601995" elapsed="0.000486"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:48.603182" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:48.602729" 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-08-23T00:00:48.603625" elapsed="0.002529"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:48.586789" elapsed="0.019431"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:48.606408" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-23T00:00:48.606293" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:48.606272" 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-08-23T00:00:48.606665" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:48.606738" elapsed="0.000016"/>
</return>
<msg time="2026-08-23T00:00:48.609216" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:48.560289" elapsed="0.048958"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:48.609307" elapsed="0.000029"/>
</return>
<msg time="2026-08-23T00:00:48.609461" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:48.554516" elapsed="0.054971"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:48.610161" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:48.609793" elapsed="0.000453">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:48.609556" elapsed="0.000763">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:48.609539" elapsed="0.000814">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:48.610567" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:48.610421" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:48.610404" elapsed="0.000259"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:48.551937" elapsed="0.058810">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:49.613380" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:49.612451" elapsed="0.000994"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:49.624772" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:49.624489" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:49.625219" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:49.624974" 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-08-23T00:00:49.642413" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:49.642543" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:49.642663" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:49.627531" elapsed="0.015165"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:49.625335" elapsed="0.017454"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:49.642980" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:49.642820" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:49.625315" elapsed="0.017864"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:49.650972" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:49.645529" elapsed="0.005553"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:49.645035" elapsed="0.006127"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:49.644994" elapsed="0.006225"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:49.654331" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:49.651926" elapsed="0.002452"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:49.651345" elapsed="0.003068"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:49.651308" elapsed="0.003129"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:49.655007" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:49.654621" 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-08-23T00:00:49.655338" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:49.655104" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:49.655918" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:49.655593" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:49.655420" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:49.655087" elapsed="0.000916"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:49.656518" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:49.656158" 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-08-23T00:00:49.656863" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:49.656632" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:49.657399" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:49.657102" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:49.656945" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:49.656613" 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-08-23T00:00:49.657648" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:49.658445" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:49.658158" 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-08-23T00:00:49.658637" elapsed="0.002300"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:49.644028" elapsed="0.016971"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:49.661177" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-08-23T00:00:49.661068" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:49.661050" 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-08-23T00:00:49.661412" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:49.661484" elapsed="0.000014"/>
</return>
<msg time="2026-08-23T00:00:49.663830" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:49.618143" elapsed="0.045716"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:49.663918" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:49.664086" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:49.613954" elapsed="0.050158"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:49.664762" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:49.664389" elapsed="0.000572">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:49.664182" elapsed="0.000852">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:49.664165" elapsed="0.000903">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:49.665284" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:49.665137" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:49.665121" elapsed="0.000243"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:49.611440" elapsed="0.054005">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:50.668012" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:50.667087" elapsed="0.000992"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:50.680471" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:50.680204" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:50.680931" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:50.680686" 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-08-23T00:00:50.697923" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:50.698152" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:50.698371" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:50.683279" elapsed="0.015150"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:50.681050" elapsed="0.017477"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:50.698970" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:50.698623" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:50.681031" elapsed="0.018138"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:50.707092" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:50.701522" elapsed="0.005681"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:50.701024" elapsed="0.006258"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:50.700982" elapsed="0.006356"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:50.710863" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:50.707984" elapsed="0.002925"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:50.707458" elapsed="0.003486"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:50.707422" elapsed="0.003547"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:50.711509" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:50.711130" 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-08-23T00:00:50.711856" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:50.711622" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:50.712407" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:50.712095" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:50.711938" elapsed="0.000569"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:50.711604" elapsed="0.000926"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:50.713071" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:50.712702" 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-08-23T00:00:50.713399" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:50.713167" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:50.713972" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:50.713672" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:50.713481" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:50.713149" 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-08-23T00:00:50.714206" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:50.715009" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:50.714729" 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-08-23T00:00:50.715184" elapsed="0.004042"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:50.699976" elapsed="0.019314"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:50.719468" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-08-23T00:00:50.719360" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:50.719341" 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-08-23T00:00:50.719719" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:50.719791" elapsed="0.000015"/>
</return>
<msg time="2026-08-23T00:00:50.722132" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:50.674513" elapsed="0.047648"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:50.722221" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:50.722372" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:50.668647" elapsed="0.053752"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:50.723057" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:50.722692" elapsed="0.000438">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:50.722468" elapsed="0.000730">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:50.722451" elapsed="0.000780">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:50.723449" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:50.723302" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:50.723285" elapsed="0.000246"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:50.666118" elapsed="0.057511">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:51.726668" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:51.725681" elapsed="0.001062"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:51.738452" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:51.738087" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:51.739196" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:51.738823" elapsed="0.000423"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-23T00:00:51.758330" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:51.758675" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:51.758914" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:51.741423" elapsed="0.017552"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:51.739325" elapsed="0.019751"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:51.759489" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:51.759138" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:51.739302" elapsed="0.020421"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:51.768122" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:51.762102" elapsed="0.006136"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:51.761558" elapsed="0.006764"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:51.761515" elapsed="0.006864"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:51.772006" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:51.769101" elapsed="0.002955"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:51.768508" elapsed="0.003585"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:51.768470" elapsed="0.003648"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:51.772709" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:51.772293" 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-08-23T00:00:51.773082" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:51.772810" elapsed="0.000333"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:51.773692" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:51.773358" elapsed="0.000362"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:51.773169" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:51.772792" elapsed="0.000986"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:51.774319" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:51.773937" 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-08-23T00:00:51.774672" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:51.774415" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:51.775218" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:51.774917" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:51.774758" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:51.774397" 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-08-23T00:00:51.775454" elapsed="0.000384"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:51.776302" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:51.776002" 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-08-23T00:00:51.776479" 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-08-23T00:00:51.760529" elapsed="0.018442"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:51.779205" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-23T00:00:51.779092" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:51.779073" 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-08-23T00:00:51.779446" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:51.779518" elapsed="0.000015"/>
</return>
<msg time="2026-08-23T00:00:51.782046" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:51.731940" elapsed="0.050143"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:51.782154" elapsed="0.000027"/>
</return>
<msg time="2026-08-23T00:00:51.782306" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:51.727241" elapsed="0.055092"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:51.783001" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:51.782637" elapsed="0.000439">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:51.782403" elapsed="0.000745">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:51.782386" elapsed="0.000797">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:51.783401" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:51.783253" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:51.783236" elapsed="0.000246"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:51.724491" elapsed="0.059073">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:52.785162" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:52.784696" elapsed="0.000502"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:52.793025" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:52.792758" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:52.793483" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:52.793229" 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-08-23T00:00:52.811139" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:52.811296" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:52.811397" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:52.795752" elapsed="0.015671"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:52.793658" elapsed="0.017810"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:52.811675" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:52.811498" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:52.793633" elapsed="0.018133"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:52.815352" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:52.812864" elapsed="0.002538"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:52.812557" elapsed="0.002881"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:52.812539" elapsed="0.002925"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:52.818145" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:52.815764" elapsed="0.002428"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:52.815521" elapsed="0.002707"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:52.815504" elapsed="0.002750"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:52.818849" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:52.818431" 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-08-23T00:00:52.819186" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:52.818950" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:52.819751" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:52.819431" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:52.819271" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:52.818931" elapsed="0.000908"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:52.820406" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:52.820000" 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-08-23T00:00:52.820752" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:52.820504" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:52.821286" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:52.820991" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:52.820835" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:52.820486" 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-08-23T00:00:52.821548" elapsed="0.000369"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:52.822377" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:52.822079" 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-08-23T00:00:52.822556" elapsed="0.002370"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:52.812131" elapsed="0.012860"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:52.825173" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-23T00:00:52.825062" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:52.825043" 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-08-23T00:00:52.825416" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:52.825489" elapsed="0.000016"/>
</return>
<msg time="2026-08-23T00:00:52.827878" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:52.788030" elapsed="0.039878"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:52.827969" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:52.828122" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:52.785432" elapsed="0.042717"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:52.828804" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:52.828426" elapsed="0.000457">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:52.828219" elapsed="0.000737">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:52.828202" elapsed="0.000865">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:52.829292" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:52.829144" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:52.829127" elapsed="0.000247"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:52.784105" elapsed="0.045352">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:53.832678" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:53.831625" elapsed="0.001132"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:53.844070" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:53.843807" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:53.844523" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:53.844275" 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-08-23T00:00:53.862902" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:53.863079" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:53.863304" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:53.846774" elapsed="0.016591"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:53.844664" elapsed="0.018801"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:53.863912" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:53.863528" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:53.844640" elapsed="0.019479"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:53.872070" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:53.866478" elapsed="0.005702"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:53.865950" elapsed="0.006309"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:53.865909" elapsed="0.006409"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:53.876493" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:53.872969" elapsed="0.003571"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:53.872444" elapsed="0.004144"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:53.872407" elapsed="0.004208"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:53.877191" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:53.876790" 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-08-23T00:00:53.877524" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:53.877289" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:53.878088" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:53.877787" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:53.877625" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:53.877271" elapsed="0.000922"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:53.878730" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:53.878351" 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-08-23T00:00:53.879057" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:53.878825" elapsed="0.000370"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:53.879701" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:53.879383" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:53.879222" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:53.878807" 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-08-23T00:00:53.879940" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:53.880780" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:53.880461" 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-08-23T00:00:53.880960" 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-08-23T00:00:53.864957" elapsed="0.018513"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:53.883667" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-08-23T00:00:53.883540" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:53.883522" 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-08-23T00:00:53.883910" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:53.883981" elapsed="0.000016"/>
</return>
<msg time="2026-08-23T00:00:53.886337" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:53.837849" elapsed="0.048517"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:53.886427" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:53.886610" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:53.833281" elapsed="0.053359"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:53.887274" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:53.886917" elapsed="0.000435">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:53.886710" elapsed="0.000713">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:53.886693" elapsed="0.000764">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:53.887687" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:53.887526" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:53.887510" elapsed="0.000258"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:53.830385" elapsed="0.057466">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:54.891058" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:54.889949" elapsed="0.001197"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:54.903368" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:54.903104" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:54.903837" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:54.903571" 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-08-23T00:00:54.922252" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:54.922544" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:54.922835" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:54.906184" elapsed="0.016712"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:54.903967" elapsed="0.019030"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:54.923401" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:54.923060" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:54.903942" elapsed="0.019685"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:54.931397" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:54.925948" elapsed="0.005500"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:54.925420" elapsed="0.006065"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:54.925379" elapsed="0.006132"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:54.934695" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:54.931864" elapsed="0.002905"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:54.931567" elapsed="0.003239"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:54.931550" elapsed="0.003281"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:54.935418" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:54.935010" 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-08-23T00:00:54.935769" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:54.935515" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:54.936315" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:54.936008" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:54.935851" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:54.935497" elapsed="0.000902"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:54.936936" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:54.936554" 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-08-23T00:00:54.937292" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:54.937036" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:54.937867" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:54.937548" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:54.937375" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:54.937015" elapsed="0.000936"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-23T00:00:54.938104" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:54.939023" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:54.938651" 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-08-23T00:00:54.939230" 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-08-23T00:00:54.924440" elapsed="0.017385"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:54.942008" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-23T00:00:54.941895" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:54.941877" 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-08-23T00:00:54.942255" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:54.942379" elapsed="0.000017"/>
</return>
<msg time="2026-08-23T00:00:54.944778" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:54.897813" elapsed="0.046995"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:54.944868" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:54.945021" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:54.891722" elapsed="0.053325"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:54.945757" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:54.945366" elapsed="0.000475">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:54.945151" elapsed="0.000766">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:54.945101" elapsed="0.000850">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:54.946171" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:54.946023" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:54.946005" elapsed="0.000247"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:54.888756" elapsed="0.057581">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:55.949424" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:55.948431" elapsed="0.001065"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:55.961396" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:55.961029" elapsed="0.000435"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:55.962047" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:55.961698" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-23T00:00:55.980458" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:55.980683" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:55.980825" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:55.964891" elapsed="0.015971"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:55.962213" elapsed="0.018712"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:55.981178" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:55.980964" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:55.962183" elapsed="0.019118"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:55.986176" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:55.982755" elapsed="0.003492"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:55.982424" elapsed="0.003874"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:55.982400" elapsed="0.003934"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:55.990041" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:55.986746" elapsed="0.003362"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:55.986415" elapsed="0.003859"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:55.986391" elapsed="0.003921"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:55.991133" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:55.990553" 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-08-23T00:00:55.991659" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:55.991272" elapsed="0.000472"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:55.992345" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:55.992006" elapsed="0.000366"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:55.991779" elapsed="0.000631"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:55.991247" elapsed="0.001185"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:55.992972" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:55.992605" 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-08-23T00:00:55.993302" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:55.993070" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:55.993858" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:55.993544" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:55.993386" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:55.993052" 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-08-23T00:00:55.994098" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:55.994926" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:55.994629" 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-08-23T00:00:55.995107" elapsed="0.002350"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:55.981829" elapsed="0.015693"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:55.997720" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-08-23T00:00:55.997607" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:55.997573" 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-08-23T00:00:55.997965" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:55.998038" elapsed="0.000015"/>
</return>
<msg time="2026-08-23T00:00:56.000436" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:55.954423" elapsed="0.046042"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:56.000528" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:56.000697" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:55.950033" elapsed="0.050691"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:56.001363" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:56.001003" elapsed="0.000440">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:56.000795" elapsed="0.000720">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:56.000778" elapsed="0.000772">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:56.001784" elapsed="0.000071"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:56.001636" elapsed="0.000260"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:56.001619" elapsed="0.000302"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:55.947242" elapsed="0.054763">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:57.004965" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:57.003930" elapsed="0.001107"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:57.016867" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:57.016605" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:57.017319" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:57.017068" 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-08-23T00:00:57.034725" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:57.034874" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:57.034974" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:57.019506" elapsed="0.015494"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:57.017439" elapsed="0.017605"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:57.035310" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:57.035072" elapsed="0.000383"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:57.017417" elapsed="0.018085"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:57.043294" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:57.037893" elapsed="0.005514"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:57.037369" elapsed="0.006117"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:57.037328" elapsed="0.006213"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:57.046706" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:57.044274" elapsed="0.002480"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:57.043702" elapsed="0.003088"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:57.043663" elapsed="0.003155"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:57.047384" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:57.046990" 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-08-23T00:00:57.047733" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:57.047482" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:57.048291" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:57.047986" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:57.047815" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:57.047464" elapsed="0.000911"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:57.048912" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:57.048532" 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-08-23T00:00:57.049237" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:57.049008" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:57.049790" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:57.049472" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:57.049317" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:57.048991" 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-08-23T00:00:57.050087" elapsed="0.000359"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:57.050934" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:57.050636" 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-08-23T00:00:57.051115" 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-08-23T00:00:57.036392" elapsed="0.017233"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:57.053806" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-08-23T00:00:57.053696" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:57.053678" 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-08-23T00:00:57.054044" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:57.054116" elapsed="0.000016"/>
</return>
<msg time="2026-08-23T00:00:57.056464" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:57.011754" elapsed="0.044740"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:57.056555" elapsed="0.000045"/>
</return>
<msg time="2026-08-23T00:00:57.056727" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:57.005532" elapsed="0.051222"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:57.057393" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:57.057033" elapsed="0.000437">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:57.056825" elapsed="0.000717">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:57.056807" elapsed="0.000783">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:57.057811" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:57.057663" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:57.057646" elapsed="0.000245"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:57.002817" elapsed="0.055155">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:58.060998" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:58.059959" elapsed="0.001112"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:58.073039" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:58.072779" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:58.073483" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:58.073240" 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-08-23T00:00:58.091525" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:58.091989" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:58.092218" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:58.075672" elapsed="0.016606"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:58.073622" elapsed="0.018755"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:58.092847" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:58.092439" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:58.073597" elapsed="0.019452"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:58.101211" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:58.095389" elapsed="0.005873"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:58.094889" elapsed="0.006410"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:58.094847" elapsed="0.006478"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:58.103900" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:58.101621" elapsed="0.002324"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:58.101383" elapsed="0.002597"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:58.101366" elapsed="0.002639"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:58.104614" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:58.104182" 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-08-23T00:00:58.104948" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:58.104713" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:58.105486" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:58.105186" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:58.105030" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:58.104695" elapsed="0.000875"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:58.106103" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:58.105742" 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-08-23T00:00:58.106428" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:58.106199" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:58.106979" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:58.106683" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:58.106509" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:58.106181" 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-08-23T00:00:58.107212" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:58.108034" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:58.107736" 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-08-23T00:00:58.108212" elapsed="0.002320"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:58.093895" elapsed="0.016715"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:58.110792" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-08-23T00:00:58.110681" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:58.110663" 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-08-23T00:00:58.111030" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:58.111101" elapsed="0.000014"/>
</return>
<msg time="2026-08-23T00:00:58.113433" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:58.067530" elapsed="0.045932"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:58.113599" elapsed="0.000030"/>
</return>
<msg time="2026-08-23T00:00:58.113755" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:58.061566" elapsed="0.052216"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:58.114422" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:58.114059" elapsed="0.000443">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:58.113851" elapsed="0.000737">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:58.113834" elapsed="0.000792">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:58.114840" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:58.114695" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:58.114678" elapsed="0.000243"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:58.058863" elapsed="0.056140">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.118260" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:59.117191" elapsed="0.001147"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.130151" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:59.129866" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.130631" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:59.130358" 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-08-23T00:00:59.149408" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:59.149756" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:00:59.149995" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:00:59.132873" elapsed="0.017183"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:59.130761" elapsed="0.019398"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.150484" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.150232" elapsed="0.000365"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.130735" elapsed="0.019897"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.155626" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:59.152120" elapsed="0.003578"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:59.151803" elapsed="0.003946"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.151776" elapsed="0.004009"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.159181" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:59.156173" elapsed="0.003056"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:59.155862" elapsed="0.003403"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.155839" elapsed="0.003450"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.159887" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:59.159468" 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-08-23T00:00:59.160305" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.159985" elapsed="0.000381"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.160877" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:59.160553" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:59.160391" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.159968" elapsed="0.000995"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.161514" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:59.161142" 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-08-23T00:00:59.161861" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.161629" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.162404" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:59.162102" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:59.161944" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.161610" 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-08-23T00:00:59.162662" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:00:59.163482" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:59.163178" 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-08-23T00:00:59.163678" elapsed="0.002351"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:00:59.151162" elapsed="0.014932"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:00:59.166281" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-23T00:00:59.166164" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.166146" 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-08-23T00:00:59.166526" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:59.166616" elapsed="0.000016"/>
</return>
<msg time="2026-08-23T00:00:59.169007" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:00:59.124263" elapsed="0.044809"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:00:59.169149" elapsed="0.000029"/>
</return>
<msg time="2026-08-23T00:00:59.169309" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:00:59.118905" elapsed="0.050432"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.170008" level="FAIL">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-08-23T00:00:59.169639" elapsed="0.000453">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:59.169409" elapsed="0.000758">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</branch>
<status status="FAIL" start="2026-08-23T00:00:59.169392" elapsed="0.000814">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.170424" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.170276" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:59.170259" elapsed="0.000244"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:59.115954" elapsed="0.054670">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<msg time="2026-08-23T00:00:59.170767" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>60s</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${NODE_CONFIGURER}</arg>
<arg>${modified_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-22T23:59:58.732598" elapsed="60.438275">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.172126" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:59.171707" elapsed="0.000446"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-08-23T00:00:59.172369" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:00:59.172226" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.172208" elapsed="0.000224"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-23T00:00:59.172609" elapsed="0.000216"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.174119" level="FAIL">'4968' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-23T00:00:59.173615" elapsed="0.000572">'4968' does not contain '-'</status>
</kw>
<msg time="2026-08-23T00:00:59.174284" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-23T00:00:59.173018" elapsed="0.001291"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.174835" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-23T00:00:59.174478" elapsed="0.000383"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.175309" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:59.175019" elapsed="0.000316"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.175805" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:59.175487" elapsed="0.000345"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.176350" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968

Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-08-23T00:00:59.175984" elapsed="0.000423"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.176862" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:59.176557" elapsed="0.000350"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.177608" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=4968'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-08-23T00:00:59.177244" elapsed="0.000413"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:59.176973" elapsed="0.000718"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.176955" elapsed="0.000761"/>
</if>
<arg>4968</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-23T00:00:59.171336" elapsed="0.006425"/>
</kw>
<doc>Check that the modified device data make their way into the configurer node.</doc>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=4968</tag>
<status status="FAIL" start="2026-08-22T23:59:58.486135" elapsed="60.691673">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968

Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; != &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</status>
</test>
<test id="s1-s8-t19" name="Delete_Device_Data" line="200">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-23T00:00:59.182911" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-23T00:00:59.182645" 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-08-23T00:00:59.186311" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:00:59.186189" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.186167" elapsed="0.000215"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-23T00:00:59.192163" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:00:59.192040" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.192013" elapsed="0.000284"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.193396" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-23T00:00:59.192944" elapsed="0.000482"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.193919" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-23T00:00:59.193604" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-23T00:00:59.193990" elapsed="0.000035"/>
</return>
<msg time="2026-08-23T00:00:59.194152" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-23T00:00:59.192538" elapsed="0.001639"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-23T00:00:59.201882" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:00:59.201769" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.201749" 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-08-23T00:00:59.203154" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:00:59.203046" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.203028" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-23T00:00:59.203697" level="INFO">${karaf_connection_index} = 94</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-23T00:00:59.203366" elapsed="0.000358"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-23T00:00:59.204114" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-23T00:00:59.203882" elapsed="0.000258"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-23T00:00:59.236722" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-23T00:00:59.204658" elapsed="0.032180"/>
</kw>
<msg time="2026-08-23T00:00:59.237012" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-23T00:00:59.237060" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.204301" elapsed="0.032825"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-23T00:00:59.251961" level="INFO">"t "x "t ". "C "R "U "D ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-23T00:00:59.237690" elapsed="0.014367"/>
</kw>
<msg time="2026-08-23T00:00:59.252218" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-23T00:00:59.252267" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.237304" elapsed="0.014999"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.252641" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.252384" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.252362" elapsed="0.000363"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.253188" level="INFO"> "t "x "t ". "C "R "U "D ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:59.252867" 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-08-23T00:00:59.253534" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.253321" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.253303" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-23T00:00:59.253666" 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-08-23T00:00:59.256208" elapsed="0.000151"/>
</kw>
<msg time="2026-08-23T00:00:59.256419" 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-08-23T00:00:59.255138" 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-08-23T00:00:59.256852" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.257270" 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-08-23T00:00:59.254495" 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-08-23T00:00:59.253950" elapsed="0.003570"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-23T00:00:59.202742" elapsed="0.054907"/>
</kw>
<msg time="2026-08-23T00:00:59.257743" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:00:59.257787" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.202104" elapsed="0.055721"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-23T00:00:59.258009" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-23T00:00:59.257902" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.257883" 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-08-23T00:00:59.258501" 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-08-23T00:00:59.258863" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-23T00:00:59.258936" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-23T00:00:59.201397" elapsed="0.057649"/>
</kw>
<msg time="2026-08-23T00:00:59.259141" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:00:59.259186" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.194565" elapsed="0.064656"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.259546" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.259299" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.259281" elapsed="0.000360"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-23T00:00:59.194423" elapsed="0.065243"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-23T00:00:59.265352" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:00:59.265244" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.265224" 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-08-23T00:00:59.266565" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:00:59.266458" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.266440" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-23T00:00:59.267100" level="INFO">${karaf_connection_index} = 95</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-23T00:00:59.266802" elapsed="0.000325"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-23T00:00:59.267499" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-23T00:00:59.267281" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-23T00:00:59.300085" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-23T00:00:59.268032" elapsed="0.032165"/>
</kw>
<msg time="2026-08-23T00:00:59.300359" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-23T00:00:59.300405" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.267699" elapsed="0.032743"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-23T00:00:59.325867" level="INFO">"t "x "t ". "C "R "U "D ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-23T00:00:59.300983" elapsed="0.024983"/>
</kw>
<msg time="2026-08-23T00:00:59.326137" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-23T00:00:59.326184" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.300639" elapsed="0.025625"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.326567" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.326345" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.326324" elapsed="0.000359"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.327146" level="INFO"> "t "x "t ". "C "R "U "D ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:59.326824" 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-08-23T00:00:59.327506" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.327293" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.327274" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-23T00:00:59.327641" 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-08-23T00:00:59.330216" elapsed="0.000151"/>
</kw>
<msg time="2026-08-23T00:00:59.330439" 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-08-23T00:00:59.329156" 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-08-23T00:00:59.330875" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.331206" 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-08-23T00:00:59.328485" elapsed="0.002907"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-23T00:00:59.327901" elapsed="0.003556"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-23T00:00:59.266157" elapsed="0.065412"/>
</kw>
<msg time="2026-08-23T00:00:59.331691" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:00:59.331736" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.265571" elapsed="0.066202"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-23T00:00:59.331957" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-23T00:00:59.331851" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.331833" 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-08-23T00:00:59.332432" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.332797" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-23T00:00:59.332872" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-23T00:00:59.264873" elapsed="0.068110"/>
</kw>
<msg time="2026-08-23T00:00:59.333076" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:00:59.333135" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.259939" elapsed="0.073311"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.333599" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.333331" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.333314" elapsed="0.000370"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-23T00:00:59.259800" elapsed="0.073911"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-23T00:00:59.339504" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:00:59.339394" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.339374" 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-08-23T00:00:59.340829" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:00:59.340652" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.340634" elapsed="0.000312"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-23T00:00:59.341428" level="INFO">${karaf_connection_index} = 96</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-23T00:00:59.341094" elapsed="0.000362"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-23T00:00:59.341863" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-23T00:00:59.341636" elapsed="0.000254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-23T00:00:59.377902" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-23T00:00:59.342387" elapsed="0.035785"/>
</kw>
<msg time="2026-08-23T00:00:59.378554" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-23T00:00:59.378701" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.342050" elapsed="0.036736"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-23T00:00:59.394290" level="INFO">"t "x "t ". "C "R "U "D ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-23T00:00:59.380024" elapsed="0.014409"/>
</kw>
<msg time="2026-08-23T00:00:59.394711" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-23T00:00:59.394779" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.379195" elapsed="0.015636"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.395290" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.394957" elapsed="0.000412"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.394922" elapsed="0.000484"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.396080" level="INFO"> "t "x "t ". "C "R "U "D ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:59.395648" 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-08-23T00:00:59.396567" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.396265" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.396238" elapsed="0.000480"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-23T00:00:59.396774" 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-08-23T00:00:59.399956" elapsed="0.000161"/>
</kw>
<msg time="2026-08-23T00:00:59.400179" 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-08-23T00:00:59.398884" elapsed="0.001430"/>
</kw>
<kw name="Open 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-08-23T00:00:59.400612" elapsed="0.000081"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.400953" 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-08-23T00:00:59.398089" 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-08-23T00:00:59.397229" elapsed="0.004006"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-23T00:00:59.340322" elapsed="0.061139"/>
</kw>
<msg time="2026-08-23T00:00:59.401564" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:00:59.401637" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.339743" elapsed="0.061936"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-23T00:00:59.401873" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-23T00:00:59.401762" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.401742" 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-08-23T00:00:59.402417" 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-08-23T00:00:59.402850" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-23T00:00:59.402925" 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-08-23T00:00:59.339036" elapsed="0.064003"/>
</kw>
<msg time="2026-08-23T00:00:59.403143" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:00:59.403193" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "D "e "l "e "t "e "_ "D "e "v "i "c "e "_ "D "a "t "a "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                       ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.333976" elapsed="0.069257"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.403565" elapsed="0.000120"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.403313" elapsed="0.000408"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.403295" elapsed="0.000451"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-23T00:00:59.333838" elapsed="0.069933"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-23T00:00:59.194237" elapsed="0.209568"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-23T00:00:59.191233" elapsed="0.212636"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-23T00:00:59.185833" elapsed="0.218095"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.183327" elapsed="0.220650"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-23T00:00:59.178630" elapsed="0.225402"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.404683" level="INFO">${template_as_string} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${template_as_string}</var>
<arg>DEVICE_NAME=${device_name}</arg>
<arg>RESTCONF_ROOT=${RESTCONF_ROOT}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-23T00:00:59.404213" elapsed="0.000499"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.448778" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:59.448346" elapsed="0.000466"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-23T00:00:59.449724" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-23T00:00:59.449374" elapsed="0.000435">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-23T00:00:59.449907" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-23T00:00:59.448984" elapsed="0.000947"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.450495" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-23T00:00:59.450098" elapsed="0.000424"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-23T00:00:59.450847" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-23T00:00:59.451015" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-23T00:00:59.450702" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.451452" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/test:cont
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:59.451199" 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-08-23T00:00:59.452515" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:59.452253" elapsed="0.000306"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.453005" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-23T00:00:59.452734" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.453736" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-23T00:00:59.453418" elapsed="0.000344"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-23T00:00:59.454604" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-23T00:00:59.454358" elapsed="0.000274"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-23T00:00:59.454684" elapsed="0.000035"/>
</return>
<msg time="2026-08-23T00:00:59.454847" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-23T00:00:59.454033" elapsed="0.000840"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-23T00:00:59.455026" elapsed="0.000246"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-23T00:00:59.453283" elapsed="0.002030"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.455876" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-23T00:00:59.455558" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-23T00:00:59.456632" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-23T00:00:59.456401" elapsed="0.000257"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-23T00:00:59.456708" elapsed="0.000029"/>
</return>
<msg time="2026-08-23T00:00:59.456860" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-23T00:00:59.456086" elapsed="0.000798"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-23T00:00:59.457032" elapsed="0.000452"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-23T00:00:59.455429" elapsed="0.002098"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-23T00:00:59.453085" elapsed="0.004477"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-23T00:00:59.457626" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:00:59.457788" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-23T00:00:59.451932" elapsed="0.005882"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:59.451596" elapsed="0.006250"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.458022" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.457872" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.451552" elapsed="0.006548"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.458838" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:59.458243" elapsed="0.000623"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-23T00:00:59.458916" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-08-23T00:00:59.447596" elapsed="0.011444"/>
</kw>
<msg time="2026-08-23T00:00:59.459094" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-23T00:00:59.434014" elapsed="0.025127"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.471472" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.483913" 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/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.496370" 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-08-23T00:00:59.496707" 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-08-23T00:00:59.496886" 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-08-23T00:00:59.497306" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.497137" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:59.497120" 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-08-23T00:00:59.497530" 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-08-23T00:00:59.497712" 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-08-23T00:00:59.497875" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-23T00:00:59.497088" elapsed="0.000839"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-23T00:00:59.496970" 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-08-23T00:00:59.498101" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-23T00:00:59.498178" elapsed="0.000017"/>
</return>
<msg time="2026-08-23T00:00:59.498323" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-23T00:00:59.429708" elapsed="0.068643"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.499598" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:59.499297" elapsed="0.000353"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-08-23T00:00:59.510073" level="INFO">DELETE Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:59.510324" level="INFO">DELETE Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/yang-data+xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:00:59.510671" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:00:59.501795" elapsed="0.009848">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:59.499717" elapsed="0.012125">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.512328" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.511928" elapsed="0.000550"/>
</branch>
<status status="FAIL" start="2026-08-23T00:00:59.499700" elapsed="0.012836">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.513702" elapsed="0.000065"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:00:59.513887" elapsed="0.000042"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="FAIL" start="2026-08-23T00:00:59.498689" elapsed="0.015457">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:00:59.514296" elapsed="0.000036"/>
</return>
<arg>${directory_with_template_folders}${/}datamod1</arg>
<arg>${template_as_string}</arg>
<arg>session=${NODE_SETTER}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-08-23T00:00:59.404937" elapsed="0.109582">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.517666" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:59.516507" elapsed="0.001228"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-08-23T00:00:59.518267" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:00:59.517921" elapsed="0.000445"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.517875" elapsed="0.000544"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-23T00:00:59.518861" elapsed="0.000514"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.521720" level="FAIL">'4968' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-23T00:00:59.520694" elapsed="0.001189">'4968' does not contain '-'</status>
</kw>
<msg time="2026-08-23T00:00:59.522113" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-23T00:00:59.519795" elapsed="0.002381"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.522768" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-23T00:00:59.522409" elapsed="0.000386"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.523251" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:59.522956" elapsed="0.000321"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.524074" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:59.523431" elapsed="0.000670"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.524648" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968

HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-08-23T00:00:59.524255" elapsed="0.000444"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.525097" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:59.524852" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.525847" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=4968'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-08-23T00:00:59.525485" elapsed="0.000410"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:59.525210" elapsed="0.000719"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.525191" elapsed="0.000763"/>
</if>
<arg>4968</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-23T00:00:59.515611" elapsed="0.010391"/>
</kw>
<doc>Send a request to delete the sample test data on the device and check that the request went OK.</doc>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=4968</tag>
<status status="FAIL" start="2026-08-23T00:00:59.178057" elapsed="0.347997">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968

HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont</status>
</test>
<test id="s1-s8-t20" name="Check_Device_Data_Is_Deleted" line="211">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-23T00:00:59.529720" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-23T00:00:59.529441" elapsed="0.000544"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-23T00:00:59.530988" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:00:59.530877" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.530859" elapsed="0.000338"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-23T00:00:59.536151" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:00:59.536043" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.536025" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.537217" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-23T00:00:59.536835" elapsed="0.000438"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.537767" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-23T00:00:59.537442" elapsed="0.000351"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-23T00:00:59.537839" elapsed="0.000032"/>
</return>
<msg time="2026-08-23T00:00:59.537998" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-23T00:00:59.536443" elapsed="0.001580"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-23T00:00:59.543685" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:00:59.543560" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.543541" 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-08-23T00:00:59.545064" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:00:59.544956" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.544937" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-23T00:00:59.545638" level="INFO">${karaf_connection_index} = 94</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-23T00:00:59.545297" elapsed="0.000370"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-23T00:00:59.546057" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-23T00:00:59.545825" elapsed="0.000258"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-23T00:00:59.576870" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-23T00:00:59.546570" elapsed="0.030410"/>
</kw>
<msg time="2026-08-23T00:00:59.577150" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-23T00:00:59.577197" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.546240" elapsed="0.030993"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-23T00:00:59.591840" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-23T00:00:59.577816" elapsed="0.014126"/>
</kw>
<msg time="2026-08-23T00:00:59.592101" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-23T00:00:59.592146" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.577444" elapsed="0.014739"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.592507" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.592272" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.592250" elapsed="0.000362"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.593061" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:59.592761" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.593437" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.593194" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.593175" elapsed="0.000340"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-23T00:00:59.593550" 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-08-23T00:00:59.596155" elapsed="0.000155"/>
</kw>
<msg time="2026-08-23T00:00:59.596428" 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-08-23T00:00:59.595064" 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-08-23T00:00:59.596873" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.597208" 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-08-23T00:00:59.594410" elapsed="0.003003"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-23T00:00:59.593864" elapsed="0.003616"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-23T00:00:59.544651" elapsed="0.052952"/>
</kw>
<msg time="2026-08-23T00:00:59.597701" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:00:59.597746" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.543903" elapsed="0.053882"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-23T00:00:59.598075" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-23T00:00:59.597864" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.597845" 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-08-23T00:00:59.598566" elapsed="0.000048"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.598926" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-23T00:00:59.598999" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-23T00:00:59.543221" elapsed="0.055889"/>
</kw>
<msg time="2026-08-23T00:00:59.599206" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:00:59.599250" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.538403" elapsed="0.060885"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.599715" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.599363" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.599346" elapsed="0.000450"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-23T00:00:59.538263" elapsed="0.061557"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-23T00:00:59.605574" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:00:59.605465" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.605445" 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-08-23T00:00:59.606804" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:00:59.606697" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.606679" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-23T00:00:59.607314" level="INFO">${karaf_connection_index} = 95</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-23T00:00:59.607012" elapsed="0.000329"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-23T00:00:59.607733" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-23T00:00:59.607493" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-23T00:00:59.638914" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-23T00:00:59.608246" elapsed="0.030771"/>
</kw>
<msg time="2026-08-23T00:00:59.639180" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-23T00:00:59.639226" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.607914" elapsed="0.031350"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-23T00:00:59.654164" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-23T00:00:59.639790" elapsed="0.014522"/>
</kw>
<msg time="2026-08-23T00:00:59.654473" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-23T00:00:59.654519" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.639430" elapsed="0.015128"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.654881" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.654660" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.654639" elapsed="0.000322"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.655398" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:59.655098" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.655760" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.655530" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.655512" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-23T00:00:59.655873" 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-08-23T00:00:59.658434" elapsed="0.000178"/>
</kw>
<msg time="2026-08-23T00:00:59.658675" 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-08-23T00:00:59.657352" elapsed="0.001455"/>
</kw>
<kw name="Open 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-08-23T00:00:59.659085" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.659419" 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-08-23T00:00:59.656674" 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-08-23T00:00:59.656128" elapsed="0.003565"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-23T00:00:59.606373" elapsed="0.053419"/>
</kw>
<msg time="2026-08-23T00:00:59.659886" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:00:59.659931" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.605811" elapsed="0.054160"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-23T00:00:59.660157" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-23T00:00:59.660049" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.660030" 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-08-23T00:00:59.660660" 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-08-23T00:00:59.661021" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-23T00:00:59.661096" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-23T00:00:59.605100" elapsed="0.056112"/>
</kw>
<msg time="2026-08-23T00:00:59.661320" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:00:59.661367" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.600090" elapsed="0.061316"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.661845" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.661481" elapsed="0.000425"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.661464" elapsed="0.000475"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-23T00:00:59.599951" elapsed="0.062018"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-23T00:00:59.667753" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:00:59.667641" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.667620" 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-08-23T00:00:59.669012" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:00:59.668903" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.668885" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-23T00:00:59.669547" level="INFO">${karaf_connection_index} = 96</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-23T00:00:59.669222" elapsed="0.000352"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-23T00:00:59.669965" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-23T00:00:59.669747" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-23T00:00:59.701073" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-23T00:00:59.670475" elapsed="0.030836"/>
</kw>
<msg time="2026-08-23T00:00:59.701570" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-23T00:00:59.701643" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.670146" elapsed="0.031537"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-23T00:00:59.717162" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-23T00:00:59.702402" elapsed="0.014875"/>
</kw>
<msg time="2026-08-23T00:00:59.717456" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-23T00:00:59.717504" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.701944" elapsed="0.015599"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.717932" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.717668" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.717638" elapsed="0.000380"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.718476" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:59.718166" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.718845" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.718630" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.718610" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-23T00:00:59.718962" 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-08-23T00:00:59.722149" elapsed="0.000395"/>
</kw>
<msg time="2026-08-23T00:00:59.722729" 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-08-23T00:00:59.720613" elapsed="0.002575"/>
</kw>
<kw name="Open 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-08-23T00:00:59.723854" elapsed="0.000165"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.724757" elapsed="0.000168"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-23T00:00:59.719906" elapsed="0.005264"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-23T00:00:59.719288" elapsed="0.006023"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-23T00:00:59.668599" elapsed="0.057110"/>
</kw>
<msg time="2026-08-23T00:00:59.725931" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:00:59.726033" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.668013" elapsed="0.058109"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-23T00:00:59.726552" elapsed="0.000128"/>
</return>
<status status="PASS" start="2026-08-23T00:00:59.726309" elapsed="0.000448"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.726266" elapsed="0.000547"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.727757" elapsed="0.000157"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.728735" elapsed="0.000058"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-23T00:00:59.728901" elapsed="0.000036"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-23T00:00:59.667278" elapsed="0.061873"/>
</kw>
<msg time="2026-08-23T00:00:59.729390" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:00:59.729492" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "I "s "_ "D "e "l "e "t "e "d "[K"
[?1l...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.662238" elapsed="0.067364"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.730333" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.729776" elapsed="0.000677"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.729737" elapsed="0.000769"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-23T00:00:59.662098" elapsed="0.068462"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-23T00:00:59.538080" elapsed="0.192583"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-23T00:00:59.535680" elapsed="0.195116"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-23T00:00:59.530559" elapsed="0.200365"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.530133" elapsed="0.200894"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-23T00:00:59.527003" elapsed="0.204149"/>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.733482" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:59.732528" elapsed="0.001016"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.741603" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:59.741321" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.742053" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:59.741804" 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-08-23T00:00:59.750604" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:00:59.750776" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:00:59.750892" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:00:59.744234" elapsed="0.007057">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:59.742164" elapsed="0.009211">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.751562" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.751409" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-08-23T00:00:59.742146" elapsed="0.009556">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.752089" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:00:59.752224" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:00:59.752186" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:59.752169" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.752428" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:00:59.752498" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:00:59.736987" elapsed="0.015635">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:00:59.752694" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:00:59.734042" elapsed="0.018746">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.753009" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.752866" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:59.752850" elapsed="0.000238"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.753277" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.753139" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:00:59.753125" elapsed="0.000257"/>
</if>
<arg>${NODE_SETTER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:59.731657" elapsed="0.021808">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.754918" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:59.754278" elapsed="0.000680"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-08-23T00:00:59.755276" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:00:59.755066" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.755040" elapsed="0.000329"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-23T00:00:59.755629" elapsed="0.000312"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.757235" level="FAIL">'4968' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-23T00:00:59.756719" elapsed="0.000606">'4968' does not contain '-'</status>
</kw>
<msg time="2026-08-23T00:00:59.757482" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-23T00:00:59.756177" elapsed="0.001341"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.758349" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-23T00:00:59.757783" elapsed="0.000608"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.759081" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:59.758650" elapsed="0.000470"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.759793" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:00:59.759343" elapsed="0.000489"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.760614" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968

HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-08-23T00:00:59.760052" elapsed="0.000635"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.761266" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:59.760911" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.762539" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=4968'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-08-23T00:00:59.761967" elapsed="0.000638"/>
</kw>
<status status="PASS" start="2026-08-23T00:00:59.761528" elapsed="0.001114"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.761495" elapsed="0.001172"/>
</if>
<arg>4968</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-23T00:00:59.753903" elapsed="0.008813"/>
</kw>
<doc>Get the device data and make sure it is empty again.</doc>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=4968</tag>
<status status="FAIL" start="2026-08-23T00:00:59.526308" elapsed="0.236454">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968

HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</test>
<test id="s1-s8-t21" name="Check_Device_Data_Deletion_Is_Visible_On_Checker" 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-08-23T00:00:59.766010" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-23T00:00:59.765747" elapsed="0.000526"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-23T00:00:59.767261" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:00:59.767146" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.767128" 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-08-23T00:00:59.772445" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:00:59.772336" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.772319" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.773547" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-23T00:00:59.773126" elapsed="0.000448"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.774092" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-23T00:00:59.773751" elapsed="0.000368"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-23T00:00:59.774165" elapsed="0.000029"/>
</return>
<msg time="2026-08-23T00:00:59.774320" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-23T00:00:59.772752" 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-08-23T00:00:59.779899" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:00:59.779789" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.779770" 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-08-23T00:00:59.781107" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:00:59.781001" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.780982" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-23T00:00:59.781664" level="INFO">${karaf_connection_index} = 94</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-23T00:00:59.781315" elapsed="0.000375"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-23T00:00:59.782070" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-23T00:00:59.781846" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-23T00:00:59.812760" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-23T00:00:59.782602" elapsed="0.030261"/>
</kw>
<msg time="2026-08-23T00:00:59.813026" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-23T00:00:59.813072" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.782251" elapsed="0.030858"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-23T00:00:59.834351" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-23T00:00:59.813672" elapsed="0.020783"/>
</kw>
<msg time="2026-08-23T00:00:59.834633" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-23T00:00:59.834680" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.813276" elapsed="0.021479"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.835058" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.834836" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.834815" elapsed="0.000323"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.835570" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:59.835275" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.835941" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.835728" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.835709" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-23T00:00:59.836052" 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-08-23T00:00:59.838508" elapsed="0.000171"/>
</kw>
<msg time="2026-08-23T00:00:59.838740" 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-08-23T00:00:59.837478" elapsed="0.001391"/>
</kw>
<kw name="Open 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-08-23T00:00:59.839140" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.839473" 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-08-23T00:00:59.836852" elapsed="0.002829"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-23T00:00:59.836307" elapsed="0.003438"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-23T00:00:59.780699" elapsed="0.059143"/>
</kw>
<msg time="2026-08-23T00:00:59.839934" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:00:59.839977" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.780116" elapsed="0.059898"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-23T00:00:59.840194" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-23T00:00:59.840090" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.840071" 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-08-23T00:00:59.840690" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.841022" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-23T00:00:59.841093" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-23T00:00:59.779433" elapsed="0.061767"/>
</kw>
<msg time="2026-08-23T00:00:59.841294" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:00:59.841338" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.774737" elapsed="0.066637"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.841837" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.841475" elapsed="0.000416"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.841457" elapsed="0.000457"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-23T00:00:59.774594" elapsed="0.067344"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-23T00:00:59.849205" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:00:59.849095" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.849076" 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-08-23T00:00:59.850491" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:00:59.850381" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.850363" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-23T00:00:59.851023" level="INFO">${karaf_connection_index} = 95</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-23T00:00:59.850723" elapsed="0.000327"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-23T00:00:59.851552" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-23T00:00:59.851204" elapsed="0.000390"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-23T00:00:59.884061" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-23T00:00:59.852086" elapsed="0.032079"/>
</kw>
<msg time="2026-08-23T00:00:59.884326" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-23T00:00:59.884374" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.851754" elapsed="0.032657"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-23T00:00:59.905483" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-23T00:00:59.884932" elapsed="0.020681"/>
</kw>
<msg time="2026-08-23T00:00:59.905774" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-23T00:00:59.905819" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.884594" elapsed="0.021262"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.906147" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.905932" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.905912" elapsed="0.000312"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.906677" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:59.906366" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.907025" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.906814" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.906796" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-23T00:00:59.907142" 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-08-23T00:00:59.909571" elapsed="0.000172"/>
</kw>
<msg time="2026-08-23T00:00:59.909804" 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-08-23T00:00:59.908550" 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-08-23T00:00:59.910199" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.910528" 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-08-23T00:00:59.907941" elapsed="0.002793"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-23T00:00:59.907395" elapsed="0.003401"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-23T00:00:59.850027" elapsed="0.060867"/>
</kw>
<msg time="2026-08-23T00:00:59.910985" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:00:59.911031" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.849448" elapsed="0.061620"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-23T00:00:59.911354" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-23T00:00:59.911241" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.911220" 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-08-23T00:00:59.911862" 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-08-23T00:00:59.912231" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-23T00:00:59.912303" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-23T00:00:59.848752" elapsed="0.063659"/>
</kw>
<msg time="2026-08-23T00:00:59.912504" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:00:59.912547" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.842196" elapsed="0.070491"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.913016" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.912766" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.912748" elapsed="0.000346"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-23T00:00:59.842060" elapsed="0.071058"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-23T00:00:59.918718" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:00:59.918609" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.918588" 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-08-23T00:00:59.919934" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:00:59.919827" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.919809" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-23T00:00:59.920437" level="INFO">${karaf_connection_index} = 96</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-23T00:00:59.920143" elapsed="0.000320"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-23T00:00:59.920854" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-23T00:00:59.920633" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-23T00:00:59.954118" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-23T00:00:59.921390" elapsed="0.032874"/>
</kw>
<msg time="2026-08-23T00:00:59.954463" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-23T00:00:59.954512" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.921035" elapsed="0.033513"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-23T00:00:59.977911" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-23T00:00:59.955157" elapsed="0.022869"/>
</kw>
<msg time="2026-08-23T00:00:59.978186" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-23T00:00:59.978232" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.954769" elapsed="0.023500"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.978627" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.978358" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.978333" elapsed="0.000377"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.979159" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:59.978855" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.979518" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.979304" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.979286" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-23T00:00:59.979655" 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-08-23T00:00:59.982215" elapsed="0.000158"/>
</kw>
<msg time="2026-08-23T00:00:59.982497" 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-08-23T00:00:59.981160" 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-08-23T00:00:59.982970" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.983331" 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-08-23T00:00:59.980507" 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-08-23T00:00:59.979950" 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-08-23T00:00:59.919503" elapsed="0.064210"/>
</kw>
<msg time="2026-08-23T00:00:59.983918" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:00:59.983969" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.918935" elapsed="0.065072"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-23T00:00:59.984197" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-23T00:00:59.984087" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.984067" 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-08-23T00:00:59.984715" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.985053" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-23T00:00:59.985123" 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-08-23T00:00:59.918246" elapsed="0.066988"/>
</kw>
<msg time="2026-08-23T00:00:59.985331" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:00:59.985375" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.913376" elapsed="0.072035"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:00:59.985903" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:00:59.985534" elapsed="0.000426"/>
</branch>
<status status="PASS" start="2026-08-23T00:00:59.985510" elapsed="0.000475"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-23T00:00:59.913240" elapsed="0.072769"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-23T00:00:59.774402" elapsed="0.211643"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-23T00:00:59.771973" elapsed="0.214135"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-23T00:00:59.766857" elapsed="0.219313"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:00:59.766421" elapsed="0.219799"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-23T00:00:59.763561" elapsed="0.222743"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.988709" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:00:59.987972" elapsed="0.000777"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.998060" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:59.997808" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:00:59.998505" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:00:59.998258" 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-08-23T00:01:00.007411" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:00.007660" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:00.007800" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:00.000697" elapsed="0.007509">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:00:59.998634" elapsed="0.009658">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:00.008482" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:00.008327" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-08-23T00:00:59.998615" elapsed="0.009956">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:00.008982" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:00.009120" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:00.009081" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:00.009063" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:00.009329" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:00.009399" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:00:59.992985" elapsed="0.016552">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:00.009626" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:00:59.989051" elapsed="0.020671">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:00.009943" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:00.009801" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:00.009784" elapsed="0.000237"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:00.010210" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:00.010073" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:00.010058" elapsed="0.000263"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:00:59.987368" elapsed="0.023059">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:01.013477" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:01.012468" elapsed="0.001084"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:01.024423" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:01.024161" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:01.024891" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:01.024641" 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-08-23T00:01:01.033307" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:01.033614" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:01.033775" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:01.027117" elapsed="0.007193">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:01.025015" elapsed="0.009411">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:01.034714" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:01.034476" elapsed="0.000332"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:01.024990" elapsed="0.009852">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:01.035366" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:01.035557" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:01.035502" elapsed="0.000139"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:01.035477" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:01.035868" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:01.035969" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:01.018070" elapsed="0.018044">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:01.036211" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:01.014134" elapsed="0.022210">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:01.036678" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:01.036455" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:01.036431" elapsed="0.000360"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:01.037061" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:01.036866" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:01.036844" elapsed="0.000327"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:01.011323" elapsed="0.025957">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:02.040354" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:02.039357" elapsed="0.001071"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:02.051935" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:02.051670" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:02.052395" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:02.052140" 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-08-23T00:01:02.061202" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:02.061438" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:02.061560" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:02.054720" elapsed="0.007255">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:02.052517" elapsed="0.009545">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:02.062269" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:02.062099" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:02.052494" elapsed="0.009867">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:02.062811" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:02.062952" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:02.062912" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:02.062893" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:02.063164" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:02.063243" elapsed="0.000018"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:02.046665" elapsed="0.016732">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:02.063511" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:02.040959" elapsed="0.022707">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:02.063977" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:02.063778" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:02.063754" elapsed="0.000332"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:02.064352" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:02.064159" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:02.064138" elapsed="0.000323"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:02.038206" elapsed="0.026361">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:03.067688" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:03.066648" elapsed="0.001114"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:03.080102" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:03.079839" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:03.080560" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:03.080305" 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-08-23T00:01:03.089750" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:03.089972" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:03.090091" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:03.082782" elapsed="0.007700">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:03.080698" elapsed="0.009868">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:03.090776" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:03.090619" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:03.080675" elapsed="0.010195">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:03.091266" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:03.091411" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:03.091366" elapsed="0.000091"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:03.091348" elapsed="0.000131"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:03.091640" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:03.091714" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:03.073827" elapsed="0.017992">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:03.091890" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:03.068253" elapsed="0.023732">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:03.092211" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:03.092065" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:03.092048" elapsed="0.000245"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:03.092493" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:03.092352" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:03.092336" elapsed="0.000238"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:03.065482" elapsed="0.027186">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:04.095551" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:04.094570" elapsed="0.001100"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:04.108792" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:04.108381" elapsed="0.000482"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:04.109503" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:04.109128" elapsed="0.000441"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-23T00:01:04.119933" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:04.120196" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:04.120334" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:04.112732" elapsed="0.008187">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:04.109704" elapsed="0.011341">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:04.121347" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:04.121100" elapsed="0.000340"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:04.109670" elapsed="0.011805">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:04.122077" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:04.122283" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:04.122221" elapsed="0.000125"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:04.122194" elapsed="0.000182"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:04.122596" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:04.122699" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:04.101323" elapsed="0.021526">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:04.122945" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:04.096166" elapsed="0.026911">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:04.123393" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:04.123188" elapsed="0.000283"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:04.123164" elapsed="0.000340"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:04.123816" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:04.123598" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:04.123558" elapsed="0.000374"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:04.093481" elapsed="0.030560">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:05.127465" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:05.126358" elapsed="0.001163"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:05.139332" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:05.139059" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:05.139813" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:05.139539" 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-08-23T00:01:05.148983" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:05.149234" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:05.149358" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:05.142208" elapsed="0.007605">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:05.139956" elapsed="0.009952">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:05.150107" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:05.149947" elapsed="0.000228"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:05.139923" elapsed="0.010276">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:05.150615" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:05.150770" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:05.150728" elapsed="0.000092"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:05.150709" 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-08-23T00:01:05.151002" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:05.151077" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:05.132728" elapsed="0.018459">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:05.151257" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:05.127879" elapsed="0.023476">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:05.151599" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:05.151437" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:05.151420" elapsed="0.000260"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:05.151877" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:05.151735" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:05.151719" elapsed="0.000240"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:05.125076" elapsed="0.026976">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:06.155174" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:06.154171" elapsed="0.001078"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:06.167965" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:06.167259" elapsed="0.000815"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:06.169076" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:06.168422" elapsed="0.000756"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-23T00:01:06.182748" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:06.182994" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:06.183120" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:06.174225" elapsed="0.009293">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:06.169336" elapsed="0.014289">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:06.183847" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:06.183665" elapsed="0.000249"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:06.169291" elapsed="0.014649">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:06.184361" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:06.184504" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:06.184462" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:06.184443" elapsed="0.000129"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:06.184756" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:06.184832" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:06.160171" elapsed="0.024771">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:06.185014" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:06.155790" elapsed="0.029322">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:06.185358" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:06.185209" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:06.185191" elapsed="0.000248"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:06.185652" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:06.185494" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:06.185478" elapsed="0.000254"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:06.153013" elapsed="0.032799">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:07.188918" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:07.187905" elapsed="0.001090"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:07.199704" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:07.199422" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:07.200158" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:07.199910" 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-08-23T00:01:07.208892" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:07.209139" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:07.209283" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:07.202379" elapsed="0.007337">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:07.200288" elapsed="0.009518">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:07.210012" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:07.209846" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:07.200262" elapsed="0.009845">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:07.210504" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:07.210662" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:07.210619" elapsed="0.000092"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:07.210600" 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-08-23T00:01:07.210876" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:07.210949" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:07.193404" elapsed="0.017652">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:07.211127" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:07.189553" elapsed="0.021667">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:07.211449" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:07.211299" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:07.211282" elapsed="0.000246"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:07.211748" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:07.211597" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:07.211567" elapsed="0.000260"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:07.186731" elapsed="0.025173">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:08.214627" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:08.213630" elapsed="0.001075"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:08.226673" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:08.226296" elapsed="0.000453"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:08.227215" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:08.226964" 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-08-23T00:01:08.236625" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:08.236903" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:08.237060" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:08.229560" elapsed="0.008001">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:08.227333" elapsed="0.010387">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:08.237990" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:08.237771" elapsed="0.000318"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:08.227311" elapsed="0.010811">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:08.238670" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:08.238862" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:08.238808" elapsed="0.000115"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:08.238784" elapsed="0.000169"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:08.239149" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:08.239248" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:08.219968" elapsed="0.019426">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:08.239491" elapsed="0.000020"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:08.215185" elapsed="0.024457">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:08.239953" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:08.239754" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:08.239731" elapsed="0.000331"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:08.240327" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:08.240135" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:08.240114" elapsed="0.000322"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:08.212627" elapsed="0.027918">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:09.243957" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:09.242817" elapsed="0.001220"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:09.255709" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:09.255326" elapsed="0.000452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:09.256336" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:09.255990" 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-08-23T00:01:09.266020" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:09.266324" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:09.266452" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:09.259277" elapsed="0.007602">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:09.256502" elapsed="0.010463">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:09.267176" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:09.267001" elapsed="0.000244"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:09.256472" elapsed="0.010799">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:09.267840" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:09.268039" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:09.267983" elapsed="0.000131"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:09.267958" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:09.268354" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:09.268455" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:09.248946" elapsed="0.019681">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:09.268727" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:09.244623" elapsed="0.024237">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:09.269203" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:09.268972" elapsed="0.000314"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:09.268948" elapsed="0.000371"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:09.269616" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:09.269396" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:09.269374" elapsed="0.000355"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:09.241520" elapsed="0.028320">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:10.273013" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:10.271983" elapsed="0.001109"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:10.286193" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:10.285926" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:10.286663" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:10.286397" 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-08-23T00:01:10.295653" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:10.295889" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:10.296022" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:10.288873" elapsed="0.007553">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:10.286801" elapsed="0.009711">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:10.296725" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:10.296550" elapsed="0.000242"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:10.286776" elapsed="0.010042">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:10.297207" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:10.297371" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:10.297319" elapsed="0.000102"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:10.297296" elapsed="0.000148"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:10.297607" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:10.297681" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:10.277891" elapsed="0.019898">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:10.297860" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:10.273624" elapsed="0.024330">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:10.298176" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:10.298032" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:10.298016" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:10.298449" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:10.298311" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:10.298295" elapsed="0.000233"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:10.270803" elapsed="0.027819">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:11.301359" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:11.300391" elapsed="0.001039"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:11.312609" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:11.312204" elapsed="0.000467"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:11.313079" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:11.312832" 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-08-23T00:01:11.322261" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:11.322488" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:11.322697" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:11.315466" elapsed="0.007764">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:11.313202" elapsed="0.010151">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:11.323649" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:11.323404" elapsed="0.000340"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:11.313177" elapsed="0.010602">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:11.324307" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:11.324502" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:11.324445" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:11.324421" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:11.324816" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:11.324916" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:11.306068" elapsed="0.018994">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:11.325159" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:11.301944" elapsed="0.023345">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:11.325618" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:11.325399" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:11.325376" elapsed="0.000357"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:11.326002" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:11.325807" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:11.325787" elapsed="0.000325"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:11.299359" elapsed="0.026862">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:12.329267" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:12.328273" elapsed="0.001069"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:12.347095" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:12.346440" elapsed="0.000770"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:12.348221" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:12.347577" elapsed="0.000754"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-23T00:01:12.359850" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:12.360114" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:12.360246" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:12.353243" elapsed="0.007511">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:12.348504" elapsed="0.012375">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:12.361192" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:12.360935" elapsed="0.000353"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:12.348455" elapsed="0.012870">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:12.361964" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:12.362169" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:12.362112" elapsed="0.000121"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:12.362086" elapsed="0.000178"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:12.362465" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:12.362566" elapsed="0.000040"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:12.335723" elapsed="0.027015">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:12.362839" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:12.329877" elapsed="0.033096">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:12.363288" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:12.363085" elapsed="0.000283"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:12.363062" elapsed="0.000340"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:12.363696" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:12.363478" elapsed="0.000312"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:12.363456" elapsed="0.000368"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:12.327114" elapsed="0.036821">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:13.366926" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:13.365940" elapsed="0.001059"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:13.377738" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:13.377457" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:13.378199" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:13.377951" 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-08-23T00:01:13.387635" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:13.387861" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:13.387978" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:13.380745" elapsed="0.007658">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:13.378326" elapsed="0.010164">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:13.388813" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:13.388535" elapsed="0.000372"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:13.378302" elapsed="0.010639">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:13.389464" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:13.389680" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:13.389623" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:13.389597" elapsed="0.000177"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:13.389981" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:13.390082" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:13.373068" elapsed="0.017160">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:13.390326" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:13.367493" elapsed="0.022965">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:13.390791" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:13.390569" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:13.390546" elapsed="0.000358"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:13.391175" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:13.390980" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:13.390959" elapsed="0.000325"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:13.364837" elapsed="0.026555">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:14.394511" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:14.393496" elapsed="0.001129"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:14.406381" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:14.406024" elapsed="0.000424"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:14.407024" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:14.406680" 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-08-23T00:01:14.416833" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:14.417085" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:14.417215" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:14.410333" elapsed="0.007327">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:14.407191" elapsed="0.010587">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:14.418081" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:14.417841" elapsed="0.000334"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:14.407161" elapsed="0.011049">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:14.418820" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:14.419016" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:14.418960" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:14.418935" elapsed="0.000175"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:14.419312" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:14.419413" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:14.399808" elapsed="0.019752">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:14.419681" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:14.395178" elapsed="0.024638">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:14.420135" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:14.419927" elapsed="0.000286"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:14.419903" elapsed="0.000344"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:14.420556" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:14.420322" elapsed="0.000345"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:14.420300" elapsed="0.000422"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:14.392329" elapsed="0.028511">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:15.423938" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:15.422915" elapsed="0.001100"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:15.434974" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:15.434708" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:15.435427" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:15.435179" 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-08-23T00:01:15.445282" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:15.445597" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:15.445747" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:15.437916" elapsed="0.008314">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:15.435558" elapsed="0.010825">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:15.446734" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:15.446440" elapsed="0.000390"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:15.435531" elapsed="0.011334">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:15.447469" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:15.447696" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:15.447635" elapsed="0.000127"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:15.447606" elapsed="0.000187"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:15.447995" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:15.448094" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:15.428881" elapsed="0.019392">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:15.448372" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:15.424515" elapsed="0.023988">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:15.448842" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:15.448639" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:15.448613" elapsed="0.000341"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:15.449239" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:15.449029" elapsed="0.000289"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:15.449007" elapsed="0.000343"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:15.421758" elapsed="0.027702">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:16.451185" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:16.450696" elapsed="0.000531"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:16.458831" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:16.458514" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:16.459289" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:16.459036" 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-08-23T00:01:16.468715" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:16.468953" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:16.469071" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:16.461828" elapsed="0.007637">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:16.459412" elapsed="0.010136">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:16.469787" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:16.469600" elapsed="0.000254"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:16.459390" elapsed="0.010489">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:16.470256" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:16.470392" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:16.470351" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:16.470334" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:16.470618" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:16.470691" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:16.454094" elapsed="0.016704">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:16.470867" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:16.451464" elapsed="0.019499">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:16.471183" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:16.471041" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:16.471024" elapsed="0.000273"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:16.471494" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:16.471352" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:16.471336" elapsed="0.000235"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:16.450046" elapsed="0.021624">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:17.473981" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:17.473177" elapsed="0.000858"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:17.486505" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:17.486128" elapsed="0.000468"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:17.487169" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:17.486817" elapsed="0.000419"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-23T00:01:17.496919" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:17.497252" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:17.497433" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:17.490062" elapsed="0.007918">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:17.487354" elapsed="0.010718">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:17.498309" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:17.498144" elapsed="0.000233"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:17.487316" elapsed="0.011086">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:17.498815" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:17.498960" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:17.498916" elapsed="0.000094"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:17.498898" 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-08-23T00:01:17.499176" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:17.499269" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:17.479341" elapsed="0.020086">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:17.499528" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:17.474432" elapsed="0.025252">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:17.500020" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:17.499803" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:17.499777" elapsed="0.000363"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:17.500415" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:17.500228" elapsed="0.000251"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:17.500204" elapsed="0.000299"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:17.472355" elapsed="0.028251">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:18.503568" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:18.502531" elapsed="0.001144"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:18.515444" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:18.515172" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:18.515917" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:18.515667" 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-08-23T00:01:18.525634" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:18.525940" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:18.526084" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:18.518325" elapsed="0.008166">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:18.516042" elapsed="0.010627">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:18.526936" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:18.526718" elapsed="0.000287"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:18.516019" elapsed="0.011012">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:18.527480" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:18.527648" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:18.527602" elapsed="0.000094"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:18.527566" elapsed="0.000152"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:18.527863" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:18.527937" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:18.509810" elapsed="0.018238">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:18.528121" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:18.504164" elapsed="0.024055">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:18.528446" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:18.528300" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:18.528283" elapsed="0.000245"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:18.528740" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:18.528596" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:18.528566" elapsed="0.000255"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:18.501425" elapsed="0.027475">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:19.531935" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:19.530885" elapsed="0.001127"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:19.544110" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:19.543834" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:19.544557" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:19.544312" 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-08-23T00:01:19.552957" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:19.553242" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:19.553398" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:19.547011" elapsed="0.006970">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:19.544705" elapsed="0.009390">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:19.554365" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:19.554145" elapsed="0.000314"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:19.544677" elapsed="0.009817">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:19.555045" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:19.555256" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:19.555200" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:19.555175" elapsed="0.000172"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:19.555546" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:19.555668" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:19.537362" elapsed="0.018453">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:19.555913" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:19.532504" elapsed="0.023541">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:19.556356" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:19.556156" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:19.556133" elapsed="0.000334"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:19.556774" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:19.556543" elapsed="0.000327"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:19.556521" elapsed="0.000390"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:19.529760" elapsed="0.027269">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:20.560307" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:20.559151" elapsed="0.001235"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:20.572646" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:20.572361" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:20.573098" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:20.572851" 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-08-23T00:01:20.583966" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:20.584213" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:20.584335" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:20.575527" elapsed="0.009259">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:20.573227" elapsed="0.011648">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:20.585080" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:20.584913" elapsed="0.000233"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:20.573201" elapsed="0.011969">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:20.585589" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:20.585745" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:20.585695" elapsed="0.000106"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:20.585674" elapsed="0.000153"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:20.585986" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:20.586057" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:20.567416" elapsed="0.018748">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:20.586232" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:20.561030" elapsed="0.025296">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:20.586545" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:20.586404" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:20.586388" elapsed="0.000251"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:20.586836" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:20.586693" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:20.586678" elapsed="0.000236"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:20.557982" elapsed="0.029010">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:21.590209" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:21.589147" elapsed="0.001140"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:21.601802" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:21.601416" elapsed="0.000453"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:21.602428" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:21.602083" 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-08-23T00:01:21.612140" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:21.612393" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:21.612521" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:21.605392" elapsed="0.007689">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:21.602649" elapsed="0.010565">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:21.613520" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:21.613267" elapsed="0.000372"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:21.602615" elapsed="0.011061">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:21.614254" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:21.614454" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:21.614397" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:21.614371" elapsed="0.000176"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:21.614769" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:21.614870" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:21.595165" elapsed="0.019856">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:21.615118" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:21.590849" elapsed="0.024399">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:21.615557" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:21.615358" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:21.615335" elapsed="0.000354"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:21.615957" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:21.615764" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:21.615743" elapsed="0.000357"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:21.587919" elapsed="0.028309">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:22.618417" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:22.617751" elapsed="0.000717"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:22.630001" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:22.629737" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:22.630449" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:22.630204" 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-08-23T00:01:22.638187" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:22.638403" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:22.638529" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:22.632677" elapsed="0.006265">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:22.630571" elapsed="0.008454">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:22.639222" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:22.639061" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:22.630548" elapsed="0.008764">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:22.639719" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:22.639858" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:22.639818" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:22.639800" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:22.640069" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:22.640141" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:22.622537" elapsed="0.017711">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:22.640316" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:22.618830" elapsed="0.021581">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:22.640683" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:22.640524" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:22.640507" elapsed="0.000264"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:22.641060" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:22.640852" elapsed="0.000290"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:22.640830" elapsed="0.000346"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:22.616947" elapsed="0.024344">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:23.644431" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:23.643388" elapsed="0.001123"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:23.655639" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:23.655251" elapsed="0.000717"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:23.657079" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:23.656374" elapsed="0.000812"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-23T00:01:23.669710" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:23.669957" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:23.670081" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:23.662681" elapsed="0.007803">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:23.657351" elapsed="0.013218">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:23.670785" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:23.670625" elapsed="0.000228"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:23.657305" elapsed="0.013581">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:23.671295" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:23.671436" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:23.671394" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:23.671377" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:23.671664" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:23.671735" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:23.649120" elapsed="0.022736">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:23.671941" elapsed="0.000026"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:23.645173" elapsed="0.026881">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:23.672273" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:23.672131" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:23.672115" elapsed="0.000236"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:23.672540" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:23.672403" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:23.672388" elapsed="0.000246"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:23.642211" elapsed="0.030500">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:24.675283" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:24.674352" elapsed="0.000998"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:24.686503" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:24.686247" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:24.686971" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:24.686722" 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-08-23T00:01:24.696381" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:24.696565" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:24.696693" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:24.689317" elapsed="0.007806">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:24.687093" elapsed="0.010143">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:24.697516" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:24.697283" elapsed="0.000349"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:24.687069" elapsed="0.010601">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:24.698191" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:24.698381" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:24.698328" elapsed="0.000112"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:24.698304" elapsed="0.000167"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:24.698692" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:24.698794" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:24.680080" elapsed="0.018864">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:24.699043" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:24.675860" elapsed="0.023314">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:24.699484" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:24.699283" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:24.699260" elapsed="0.000359"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:24.699894" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:24.699697" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:24.699674" elapsed="0.000332"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:24.673387" elapsed="0.026728">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:25.702953" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:25.701979" elapsed="0.001044"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:25.714782" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:25.714506" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:25.715229" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:25.714984" 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-08-23T00:01:25.724086" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:25.724293" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:25.724403" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:25.717641" elapsed="0.007152">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:25.715372" elapsed="0.009503">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:25.725067" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:25.724911" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:25.715350" elapsed="0.009807">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:25.725529" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:25.725683" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:25.725644" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:25.725626" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:25.725945" elapsed="0.000051"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:25.726054" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:25.709049" elapsed="0.017121">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:25.726238" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:25.703507" elapsed="0.022824">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:25.726556" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:25.726410" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:25.726393" elapsed="0.000258"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:25.726845" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:25.726705" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:25.726689" elapsed="0.000233"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:25.700916" elapsed="0.026084">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:26.729559" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:26.728656" elapsed="0.001001"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:26.742027" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:26.741773" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:26.742490" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:26.742227" 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-08-23T00:01:26.751219" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:26.751405" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:26.751513" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:26.744830" elapsed="0.007053">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:26.742621" elapsed="0.009343">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:26.752156" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:26.751999" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:26.742599" elapsed="0.009647">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:26.752633" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:26.752771" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:26.752732" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:26.752714" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:26.752981" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:26.753052" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:26.735675" elapsed="0.017480">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:26.753223" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:26.730134" elapsed="0.023182">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:26.753535" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:26.753394" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:26.753377" elapsed="0.000253"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:26.753822" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:26.753684" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:26.753668" elapsed="0.000232"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:26.727686" elapsed="0.026290">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:27.756978" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:27.755978" elapsed="0.001076"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:27.768273" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:27.767912" elapsed="0.000428"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:27.768923" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:27.768553" 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-08-23T00:01:27.782779" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:27.783088" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:27.783258" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:27.774094" elapsed="0.009751">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:27.769096" elapsed="0.014866">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:27.784233" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:27.784013" elapsed="0.000311"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:27.769064" elapsed="0.015295">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:27.784930" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:27.785127" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:27.785069" elapsed="0.000122"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:27.785044" elapsed="0.000177"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:27.785437" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:27.785535" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:27.761771" elapsed="0.023935">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:27.785785" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:27.757550" elapsed="0.028334">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:27.786123" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:27.785964" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:27.785948" elapsed="0.000254"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:27.786395" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:27.786254" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:27.786239" elapsed="0.000233"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:27.754857" elapsed="0.031694">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:28.788567" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:28.787944" elapsed="0.000693"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:28.798412" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:28.798150" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:28.798875" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:28.798627" 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-08-23T00:01:28.806895" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:28.807237" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:28.807405" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:28.801294" elapsed="0.006669">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:28.798998" elapsed="0.009088">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:28.808388" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:28.808139" elapsed="0.000344"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:28.798975" elapsed="0.009543">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:28.809101" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:28.809300" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:28.809243" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:28.809218" elapsed="0.000175"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:28.809615" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:28.809718" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:28.792465" elapsed="0.017403">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:28.809967" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:28.788956" elapsed="0.021143">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:28.810413" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:28.810211" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:28.810187" elapsed="0.000337"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:28.810816" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:28.810621" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:28.810597" elapsed="0.000329"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:28.787198" elapsed="0.023835">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:29.814262" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:29.813239" elapsed="0.001097"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:29.825128" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:29.824865" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:29.825591" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:29.825329" 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-08-23T00:01:29.833741" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:29.834144" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:29.834387" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:29.828109" elapsed="0.007083">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:29.825719" elapsed="0.009653">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:29.835852" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:29.835449" elapsed="0.000552"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:29.825695" elapsed="0.010361">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:29.836937" elapsed="0.000056"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:29.837239" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:29.837152" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:29.837113" 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-08-23T00:01:29.837730" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:29.837887" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:29.820485" elapsed="0.017633">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:29.838270" elapsed="0.000033"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:29.814875" elapsed="0.023600">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:29.838990" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:29.838674" elapsed="0.000437"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:29.838638" elapsed="0.000524"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:29.839711" elapsed="0.000072"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:29.839278" elapsed="0.000594"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:29.839245" elapsed="0.000681"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:29.811999" elapsed="0.028106">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:30.843172" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:30.842161" elapsed="0.001084"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:30.856089" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:30.855815" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:30.856602" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:30.856301" 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-08-23T00:01:30.866055" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:30.866274" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:30.866399" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:30.859025" elapsed="0.007788">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:30.856729" elapsed="0.010167">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:30.867088" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:30.866932" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:30.856707" elapsed="0.010472">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:30.867555" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:30.867711" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:30.867670" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:30.867653" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:30.867922" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:30.867993" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:30.849396" elapsed="0.018727">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:30.868193" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:30.843776" elapsed="0.024510">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:30.868508" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:30.868365" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:30.868348" elapsed="0.000254"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:30.868797" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:30.868657" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:30.868641" elapsed="0.000235"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:30.841017" elapsed="0.027937">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:31.872249" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:31.871157" elapsed="0.001173"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:31.882668" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:31.882373" elapsed="0.000520"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:31.883315" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:31.883057" 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-08-23T00:01:31.891772" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:31.892049" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:31.892183" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:31.885779" elapsed="0.006858">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:31.883446" elapsed="0.009283">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:31.892967" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:31.892770" elapsed="0.000265"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:31.883420" elapsed="0.009640">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:31.893496" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:31.893659" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:31.893616" elapsed="0.000094"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:31.893595" elapsed="0.000137"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:31.893877" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:31.893953" elapsed="0.000018"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:31.876469" elapsed="0.017622">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:31.894174" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:31.872959" elapsed="0.021310">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:31.894496" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:31.894349" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:31.894332" elapsed="0.000256"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:31.894786" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:31.894645" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:31.894629" elapsed="0.000236"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:31.869926" elapsed="0.025016">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:32.898022" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:32.897018" elapsed="0.001078"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:32.909827" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:32.909547" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:32.910436" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:32.910028" elapsed="0.000455"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-23T00:01:32.919049" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:32.919356" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:32.919486" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:32.912869" elapsed="0.007036">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:32.910563" elapsed="0.009431">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:32.920210" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:32.920033" elapsed="0.000245"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:32.910538" elapsed="0.009765">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:32.920738" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:32.920880" elapsed="0.000054"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:32.920839" elapsed="0.000134"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:32.920821" elapsed="0.000175"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:32.921156" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:32.921229" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:32.904145" elapsed="0.017193">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:32.921409" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:32.898617" elapsed="0.022886">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:32.921746" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:32.921598" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:32.921566" elapsed="0.000259"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:32.922026" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:32.921880" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:32.921864" elapsed="0.000278"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:32.895849" elapsed="0.026401">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:33.925409" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:33.924340" elapsed="0.001159"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:33.937706" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:33.937414" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:33.938188" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:33.937909" 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-08-23T00:01:33.947262" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:33.947490" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:33.947630" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:33.940681" elapsed="0.007343">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:33.938315" elapsed="0.009797">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:33.948311" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:33.948151" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:33.938291" elapsed="0.010112">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:33.948806" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:33.948947" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:33.948907" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:33.948889" elapsed="0.000126"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:33.949159" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:33.949231" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:33.931759" elapsed="0.017633">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:33.949481" elapsed="0.000019"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:33.926054" elapsed="0.023551">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:33.949838" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:33.949689" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:33.949672" elapsed="0.000247"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:33.950148" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:33.949972" elapsed="0.000254"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:33.949957" elapsed="0.000301"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:33.923183" elapsed="0.027185">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:34.953324" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:34.952336" elapsed="0.001062"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:34.966676" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:34.966391" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:34.967137" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:34.966883" 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-08-23T00:01:34.975964" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:34.976245" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:34.976415" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:34.969361" elapsed="0.007591">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:34.967258" elapsed="0.009809">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:34.977346" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:34.977122" elapsed="0.000316"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:34.967235" elapsed="0.010237">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:34.978084" elapsed="0.000046"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:34.978315" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:34.978254" elapsed="0.000121"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:34.978224" elapsed="0.000180"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:34.978626" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:34.978726" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:34.957700" elapsed="0.021173">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:34.978970" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:34.953978" elapsed="0.025121">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:34.979405" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:34.979206" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:34.979183" elapsed="0.000332"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:34.979806" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:34.979609" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:34.979567" elapsed="0.000350"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:34.951241" elapsed="0.028783">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:35.983095" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:35.982066" elapsed="0.001103"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:35.996670" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:35.996288" elapsed="0.000450"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:35.997293" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:35.996951" 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-08-23T00:01:36.007044" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:36.007343" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:36.007501" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:36.000336" elapsed="0.007713">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:35.997462" elapsed="0.010702">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:36.008433" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:36.008214" elapsed="0.000313"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:35.997430" elapsed="0.011131">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:36.009121" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:36.009315" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:36.009259" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:36.009235" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:36.009627" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:36.009730" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:35.989260" elapsed="0.020617">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:36.009977" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:35.983696" elapsed="0.026413">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:36.010461" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:36.010250" elapsed="0.000292"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:36.010219" elapsed="0.000357"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:36.010874" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:36.010677" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:36.010654" elapsed="0.000335"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:35.980930" elapsed="0.030183">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:37.014096" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:37.013113" elapsed="0.001055"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:37.026768" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:37.026478" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:37.027218" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:37.026970" 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-08-23T00:01:37.035904" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:37.036136" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:37.036255" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:37.029762" elapsed="0.006903">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:37.027344" elapsed="0.009406">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:37.036944" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:37.036787" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:37.027321" elapsed="0.009716">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:37.037417" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:37.037556" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:37.037516" elapsed="0.000102"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:37.037498" elapsed="0.000143"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:37.037786" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:37.037859" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:37.020370" elapsed="0.017595">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:37.038036" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:37.014745" elapsed="0.023388">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:37.038359" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:37.038214" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:37.038197" elapsed="0.000243"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:37.038682" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:37.038495" elapsed="0.000258"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:37.038479" elapsed="0.000298"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:37.012007" elapsed="0.026849">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:38.041867" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:38.040845" elapsed="0.001095"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:38.053049" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:38.052688" elapsed="0.000427"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:38.053694" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:38.053328" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-23T00:01:38.063706" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:38.063935" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:38.064054" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:38.056877" elapsed="0.007682">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:38.053865" elapsed="0.010834">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:38.065006" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:38.064750" elapsed="0.000363"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:38.053834" elapsed="0.011315">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:38.065716" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:38.065914" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:38.065858" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:38.065832" 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-08-23T00:01:38.066215" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:38.066315" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:38.046604" elapsed="0.019859">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:38.066562" elapsed="0.000043"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:38.042434" elapsed="0.024287">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:38.067039" elapsed="0.000071"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:38.066835" elapsed="0.000327"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:38.066811" elapsed="0.000386"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:38.067471" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:38.067274" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:38.067252" elapsed="0.000352"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:38.039761" elapsed="0.027958">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:39.070773" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:39.069779" elapsed="0.001068"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:39.083377" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:39.083114" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:39.083863" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:39.083610" 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-08-23T00:01:39.092893" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:39.093131" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:39.093250" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:39.086271" elapsed="0.007388">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:39.083989" elapsed="0.009755">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:39.093944" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:39.093781" elapsed="0.000230"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:39.083966" elapsed="0.010070">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:39.094429" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:39.094572" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:39.094532" elapsed="0.000103"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:39.094514" elapsed="0.000143"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:39.094801" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:39.094872" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:39.076984" elapsed="0.017993">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:39.095047" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:39.071344" elapsed="0.023797">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:39.095370" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:39.095223" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:39.095204" elapsed="0.000246"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:39.095743" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:39.095572" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:39.095547" elapsed="0.000277"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:39.068651" elapsed="0.027250">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:40.098916" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:40.097916" elapsed="0.001075"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:40.110176" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:40.109618" elapsed="0.000619"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:40.110663" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:40.110393" 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-08-23T00:01:40.120717" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:40.120954" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:40.121075" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:40.113117" elapsed="0.008352">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:40.110791" elapsed="0.010766">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:40.121781" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:40.121615" elapsed="0.000234"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:40.110767" elapsed="0.011108">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:40.122273" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:40.122415" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:40.122374" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:40.122356" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:40.122658" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:40.122732" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:40.103393" elapsed="0.019446">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:40.122910" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:40.099489" elapsed="0.023518">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:40.123238" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:40.123087" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:40.123071" elapsed="0.000248"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:40.123514" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:40.123372" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:40.123357" elapsed="0.000254"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:40.096775" elapsed="0.026915">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:41.126984" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:41.125912" elapsed="0.001151"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:41.138172" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:41.137907" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:41.138643" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:41.138378" 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-08-23T00:01:41.147467" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:41.147752" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:41.147882" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:41.141147" elapsed="0.007147">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:41.138779" elapsed="0.009633">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:41.148630" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:41.148453" elapsed="0.000243"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:41.138750" elapsed="0.009971">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:41.149126" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:41.149297" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:41.149234" elapsed="0.000134"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:41.149208" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:41.149622" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:41.149723" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:41.133352" elapsed="0.016519">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:41.149965" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:41.127572" elapsed="0.022522">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:41.150403" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:41.150202" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:41.150179" elapsed="0.000334"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:41.150805" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:41.150607" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:41.150566" elapsed="0.000349"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:41.124715" elapsed="0.026307">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:42.154100" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:42.153101" elapsed="0.001074"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:42.166726" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:42.166406" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:42.167174" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:42.166928" 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-08-23T00:01:42.176809" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:42.177259" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:42.177518" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:42.169622" elapsed="0.008771">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:42.167301" elapsed="0.011321">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:42.179100" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:42.178711" elapsed="0.000552"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:42.167277" elapsed="0.012047">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:42.180269" elapsed="0.000062"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:42.180629" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:42.180506" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:42.180463" 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-08-23T00:01:42.181158" elapsed="0.000052"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:42.181327" elapsed="0.000036"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:42.160267" elapsed="0.021338">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:42.181776" elapsed="0.000037"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:42.154708" elapsed="0.027293">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:42.182537" elapsed="0.000078"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:42.182190" elapsed="0.000513"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:42.182150" elapsed="0.000611"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:42.183229" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:42.182892" elapsed="0.000472"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:42.182855" elapsed="0.000567"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:42.151927" elapsed="0.031713">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:43.187275" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:43.186039" elapsed="0.001330"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:43.198462" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:43.198183" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:43.199067" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:43.198721" 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-08-23T00:01:43.208709" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:43.208950" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:43.209071" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:43.202200" elapsed="0.007321">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:43.199245" elapsed="0.010383">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:43.209826" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:43.209667" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:43.199209" elapsed="0.010708">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:43.210314" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:43.210474" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:43.210417" elapsed="0.000114"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:43.210397" elapsed="0.000157"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:43.210719" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:43.210792" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:43.193370" elapsed="0.017530">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:43.210969" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:43.188062" elapsed="0.023000">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:43.211286" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:43.211141" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:43.211125" elapsed="0.000240"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:43.211595" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:43.211418" elapsed="0.000240"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:43.211403" elapsed="0.000280"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:43.184573" elapsed="0.027189">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:44.214724" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:44.213736" elapsed="0.001061"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:44.228610" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:44.228328" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:44.229062" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:44.228814" 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-08-23T00:01:44.238551" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:44.238805" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:44.238925" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:44.231473" elapsed="0.007840">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:44.229190" elapsed="0.010207">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:44.239609" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:44.239434" elapsed="0.000245"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:44.229163" elapsed="0.010541">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:44.240089" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:44.240229" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:44.240189" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:44.240171" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:44.240447" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:44.240518" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:44.220868" elapsed="0.019773">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:44.240714" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:44.215284" elapsed="0.025525">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:44.241036" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:44.240890" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:44.240873" elapsed="0.000244"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:44.241313" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:44.241171" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:44.241156" elapsed="0.000241"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:44.212618" elapsed="0.028856">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:45.244532" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:45.243531" elapsed="0.001107"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:45.257723" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:45.257437" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:45.258203" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:45.257925" 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-08-23T00:01:45.268295" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:45.268757" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:45.269010" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:45.260638" elapsed="0.009198">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:45.258331" elapsed="0.011744">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:45.270536" elapsed="0.000080"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:45.270159" elapsed="0.000558"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:45.258306" elapsed="0.012468">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:45.271674" elapsed="0.000062"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:45.271990" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:45.271902" elapsed="0.000182"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:45.271861" 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-08-23T00:01:45.272457" elapsed="0.000049"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:45.272644" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:45.251169" elapsed="0.021714">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:45.273037" elapsed="0.000034"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:45.245133" elapsed="0.028112">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:45.273885" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:45.273447" elapsed="0.000607"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:45.273405" elapsed="0.000705"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:45.274555" elapsed="0.000080"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:45.274233" elapsed="0.000483"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:45.274198" elapsed="0.000570"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:45.242357" elapsed="0.032591">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:46.278013" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:46.277008" elapsed="0.001077"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:46.290801" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:46.290521" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:46.291247" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:46.291002" 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-08-23T00:01:46.301878" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:46.302102" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:46.302219" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:46.293623" elapsed="0.009010">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:46.291372" elapsed="0.011347">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:46.302913" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:46.302756" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:46.291347" elapsed="0.011659">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:46.303383" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:46.303696" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:46.303654" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:46.303465" 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-08-23T00:01:46.303910" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:46.303982" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:46.284158" elapsed="0.019929">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:46.304158" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:46.278659" elapsed="0.025594">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:46.304474" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:46.304332" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:46.304316" elapsed="0.000237"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:46.304760" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:46.304621" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:46.304605" elapsed="0.000235"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:46.275884" elapsed="0.029033">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:47.307735" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:47.306723" elapsed="0.001081"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:47.321532" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:47.321270" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:47.321997" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:47.321751" 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-08-23T00:01:47.330924" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:47.331149" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:47.331273" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:47.324184" elapsed="0.007494">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:47.322115" elapsed="0.009646">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:47.331950" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:47.331796" elapsed="0.000219"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:47.322093" elapsed="0.009946">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:47.332411" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:47.332546" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:47.332507" elapsed="0.000100"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:47.332490" elapsed="0.000139"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:47.332771" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:47.332840" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:47.313752" elapsed="0.019192">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:47.333012" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:47.308288" elapsed="0.024816">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:47.333321" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:47.333180" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:47.333164" elapsed="0.000235"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:47.333603" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:47.333451" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:47.333436" elapsed="0.000247"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:47.305695" elapsed="0.028065">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:48.336772" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:48.335781" elapsed="0.001065"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:48.348650" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:48.348374" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:48.349096" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:48.348851" 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-08-23T00:01:48.358336" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:48.358560" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:48.358697" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:48.351517" elapsed="0.007568">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:48.349222" elapsed="0.009945">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:48.359391" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:48.359202" elapsed="0.000257"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:48.349198" elapsed="0.010286">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:48.359879" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:48.360016" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:48.359976" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:48.359959" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:48.360225" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:48.360296" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:48.343067" elapsed="0.017344">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:48.360517" elapsed="0.000027"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:48.337337" elapsed="0.023352">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:48.361001" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:48.360800" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:48.360777" elapsed="0.000337"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:48.361383" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:48.361188" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:48.361167" elapsed="0.000328"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:48.334615" elapsed="0.027008">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:49.364797" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:49.363779" elapsed="0.001094"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:49.376820" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:49.376418" elapsed="0.000470"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:49.377448" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:49.377101" 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-08-23T00:01:49.388158" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:49.388461" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:49.388657" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:49.381072" elapsed="0.008023">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:49.377645" elapsed="0.011549">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:49.389456" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:49.389238" elapsed="0.000288"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:49.377610" elapsed="0.011942">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:49.390067" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:49.390222" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:49.390178" elapsed="0.000091"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:49.390158" 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-08-23T00:01:49.390461" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:49.390539" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:49.370083" elapsed="0.020591">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:49.390746" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:49.365371" elapsed="0.025471">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:49.391068" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:49.390922" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:49.390905" elapsed="0.000241"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:49.391362" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:49.391219" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:49.391203" elapsed="0.000239"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:49.362555" elapsed="0.028965">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:50.394746" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:50.393734" elapsed="0.001086"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:50.406131" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:50.405764" elapsed="0.000436"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:50.406783" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:50.406414" 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-08-23T00:01:50.415410" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:50.415698" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:50.415843" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:50.409991" elapsed="0.006304">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:50.406959" elapsed="0.009441">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:50.416818" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:50.416458" elapsed="0.000461"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:50.406927" elapsed="0.010028">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:50.417558" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:50.417786" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:50.417728" elapsed="0.000122"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:50.417700" elapsed="0.000181"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:50.418085" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:50.418184" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:50.399628" elapsed="0.018709">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:50.418435" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:50.395376" elapsed="0.023194">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:50.418910" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:50.418705" elapsed="0.000283"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:50.418681" elapsed="0.000341"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:50.419292" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:50.419096" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:50.419074" elapsed="0.000329"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:50.392480" elapsed="0.027034">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:51.422673" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:51.421658" elapsed="0.001092"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:51.433919" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:51.433655" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:51.434364" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:51.434120" 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-08-23T00:01:51.448560" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:51.449207" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:51.449502" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:51.436877" elapsed="0.013572">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:51.434494" elapsed="0.016212">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:51.451284" elapsed="0.000074"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:51.450800" elapsed="0.000667"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:51.434468" elapsed="0.017057">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:51.452609" elapsed="0.000086"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:51.453015" elapsed="0.000047"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:51.452893" elapsed="0.000252"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:51.452842" elapsed="0.000354"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:51.453624" elapsed="0.000060"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:51.453801" elapsed="0.000035"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:51.428935" elapsed="0.025110">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:51.454200" elapsed="0.000035"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:51.423250" elapsed="0.031163">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:51.454974" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:51.454636" elapsed="0.000469"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:51.454552" elapsed="0.000608"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:51.455634" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:51.455284" elapsed="0.000479"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:51.455247" elapsed="0.000570"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:51.420429" elapsed="0.035564">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:52.459155" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:52.458099" elapsed="0.001132"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:52.475530" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:52.475156" elapsed="0.000467"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:52.476196" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:52.475841" 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-08-23T00:01:52.487665" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:52.487957" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:52.488114" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:52.479641" elapsed="0.009013">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:52.476371" elapsed="0.012401">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:52.489060" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:52.488823" elapsed="0.000333"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:52.476338" elapsed="0.012853">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:52.489744" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:52.489941" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:52.489883" elapsed="0.000121"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:52.489859" elapsed="0.000175"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:52.490234" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:52.490334" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:52.466104" elapsed="0.024376">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:52.490602" elapsed="0.000023"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:52.459778" elapsed="0.030960">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:52.491051" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:52.490849" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:52.490826" elapsed="0.000337"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:52.491432" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:52.491238" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:52.491217" elapsed="0.000326"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:52.456956" elapsed="0.034719">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:53.494693" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:53.493686" elapsed="0.001084"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:53.505889" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:53.505627" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:53.506335" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:53.506089" 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-08-23T00:01:53.515568" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:53.515807" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:53.515925" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:53.508743" elapsed="0.007566">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:53.506458" elapsed="0.009935">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:53.516605" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:53.516428" elapsed="0.000244"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:53.506435" elapsed="0.010262">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:53.517075" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:53.517212" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:53.517172" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:53.517155" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:53.517475" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:53.517592" elapsed="0.000024"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:53.500875" elapsed="0.016867">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:53.517839" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:53.495262" elapsed="0.022716">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:53.518290" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:53.518088" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:53.518064" elapsed="0.000338"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:53.518694" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:53.518478" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:53.518456" elapsed="0.000350"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:53.492499" elapsed="0.026415">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:54.521987" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:54.520941" elapsed="0.001120"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:54.534067" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:54.533674" elapsed="0.000462"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:54.534767" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:54.534349" elapsed="0.000484"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-23T00:01:54.544173" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:54.544399" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:54.544513" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:54.538119" elapsed="0.006850">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:54.534937" elapsed="0.010117">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:54.545248" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:54.545091" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:54.534906" elapsed="0.010433">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:54.545773" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:54.545915" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:54.545874" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:54.545856" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:54.546128" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:54.546199" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:54.527674" elapsed="0.018630">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:54.546372" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:54.522558" elapsed="0.023907">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:54.546818" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:54.546555" elapsed="0.000341"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:54.546530" elapsed="0.000399"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:54.547196" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:54.547004" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:54.546983" elapsed="0.000324"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:54.519814" elapsed="0.027601">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:55.550501" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:55.549441" elapsed="0.001135"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:55.562492" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:55.562033" elapsed="0.000541"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:55.563045" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:55.562798" 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-08-23T00:01:55.571809" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:55.572047" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:55.572162" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:55.565436" elapsed="0.007112">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:55.563169" elapsed="0.009522">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:55.572959" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:55.572742" elapsed="0.000310"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:55.563146" elapsed="0.009941">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:55.573636" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:55.573830" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:55.573774" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:55.573750" 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-08-23T00:01:55.574155" elapsed="0.000039"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:55.574286" elapsed="0.000028"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:55.555961" elapsed="0.018506">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:55.574594" elapsed="0.000024"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:55.551111" elapsed="0.023620">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:55.575043" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:55.574841" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:55.574818" elapsed="0.000335"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:55.575418" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:55.575227" elapsed="0.000267"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:55.575206" elapsed="0.000319"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:55.548306" elapsed="0.027346">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:56.579002" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:56.577840" elapsed="0.001242"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:56.591723" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:56.591415" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:56.592204" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:56.591947" 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-08-23T00:01:56.600817" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:56.601086" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:56.601218" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:56.594794" elapsed="0.006855">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:56.592345" elapsed="0.009398">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:56.601958" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:56.601782" elapsed="0.000243"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:56.592317" elapsed="0.009733">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:56.602486" elapsed="0.000081"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:56.602709" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:56.602666" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:56.602646" elapsed="0.000131"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:56.602922" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:56.602994" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:56.585905" elapsed="0.017200">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:56.603176" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:56.579687" elapsed="0.023592">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:56.603513" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:56.603367" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:56.603350" elapsed="0.000260"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:56.603809" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:56.603666" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:56.603650" elapsed="0.000238"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:56.576557" elapsed="0.027409">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:57.606878" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:57.605884" elapsed="0.001098"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:57.619100" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:57.618826" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:57.619559" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:57.619308" 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-08-23T00:01:57.629175" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:57.629415" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:57.629535" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:57.621992" elapsed="0.007963">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:57.619722" elapsed="0.010317">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:57.630233" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:57.630077" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:57.619699" elapsed="0.010626">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:57.630716" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:57.630853" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:57.630813" elapsed="0.000111"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:57.630796" 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-08-23T00:01:57.631104" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:57.631180" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:57.613047" elapsed="0.018240">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:57.631356" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:57.607487" elapsed="0.023964">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:57.631690" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:57.631531" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:57.631514" elapsed="0.000256"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:57.631965" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:57.631824" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:57.631808" elapsed="0.000235"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:57.604808" elapsed="0.027314">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:58.635028" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:58.634049" elapsed="0.001051"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:58.647332" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:58.647058" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:58.647798" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:58.647532" 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-08-23T00:01:58.656655" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:58.656883" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:58.657002" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:58.650174" elapsed="0.007216">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:58.647925" elapsed="0.009547">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:58.657687" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:58.657509" elapsed="0.000246"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:58.647901" elapsed="0.009878">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:58.658159" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:58.658297" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:58.658257" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:58.658240" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:58.658502" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:58.658572" elapsed="0.000035"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:58.641200" elapsed="0.017499">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:58.658767" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:58.635693" elapsed="0.023169">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:58.659082" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:58.658940" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:58.658924" elapsed="0.000236"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:58.659384" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:58.659213" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:58.659198" elapsed="0.000267"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:58.632971" elapsed="0.026572">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:01:59.662680" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:01:59.661527" elapsed="0.001230"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:59.676473" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:59.676085" elapsed="0.000488"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:01:59.677087" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:01:59.676828" 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-08-23T00:01:59.685991" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:01:59.686280" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:01:59.686458" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:01:59.679299" elapsed="0.007697">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:01:59.677210" elapsed="0.009901">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:59.687389" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:59.687161" elapsed="0.000322"/>
</branch>
<status status="FAIL" start="2026-08-23T00:01:59.677185" elapsed="0.010332">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:59.688115" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:59.688315" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:01:59.688259" elapsed="0.000126"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:59.688234" elapsed="0.000183"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:59.688642" elapsed="0.000040"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:01:59.688770" elapsed="0.000026"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:01:59.667265" elapsed="0.021684">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:01:59.689049" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:01:59.663250" elapsed="0.025932">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:59.689494" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:59.689293" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:59.689270" elapsed="0.000359"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:01:59.689902" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:01:59.689706" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:01:59.689684" elapsed="0.000331"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:01:59.660404" elapsed="0.029720">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:02:00.693435" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:02:00.692389" elapsed="0.001121"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:00.706970" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:00.706453" elapsed="0.000584"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:00.707611" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:00.707250" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-23T00:02:00.715347" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:02:00.715569" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=503, reason=Service Unavailable 
 headers={'Content-Type': 'application/xml', 'Content-Length': '425'} 
 body=&lt;?xml version="1.0" ?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-path xmlns:a="urn:TBD:params:xml:ns:yang:network-topology"&gt;/a:network-topology/a:topology[a:topology-id='topology-netconf']/a:node[a:node-id='netconf-test-device']&lt;/error-path&gt;&lt;error-message&gt;Mount point does not exist&lt;/error-message&gt;&lt;error-tag&gt;resource-denied-transport&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-08-23T00:02:00.715705" level="FAIL">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-08-23T00:02:00.710347" elapsed="0.005744">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<status status="FAIL" start="2026-08-23T00:02:00.707782" elapsed="0.008431">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:00.716406" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:00.716249" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-08-23T00:02:00.707751" elapsed="0.008744">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:00.716948" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:02:00.717138" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:00.717084" elapsed="0.000115"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:02:00.717060" elapsed="0.000169"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:00.717424" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:02:00.717521" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-08-23T00:02:00.700164" elapsed="0.017521">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-08-23T00:02:00.717787" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-08-23T00:02:00.694074" elapsed="0.023842">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:00.718221" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:00.718024" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:02:00.718001" elapsed="0.000329"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:00.718614" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:00.718404" elapsed="0.000288"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:02:00.718382" elapsed="0.000342"/>
</if>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<status status="FAIL" start="2026-08-23T00:02:00.691166" elapsed="0.027665">HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<msg time="2026-08-23T00:02:00.718960" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>60s</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${NODE_CHECKER}</arg>
<arg>${empty_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-08-23T00:00:59.986546" elapsed="60.732543">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:02:00.720872" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:02:00.720244" elapsed="0.000666"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-08-23T00:02:00.721212" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:00.721013" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:00.720988" elapsed="0.000352"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-08-23T00:02:00.721608" elapsed="0.000302"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-08-23T00:02:00.723135" level="FAIL">'4968' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-08-23T00:02:00.722653" elapsed="0.000566">'4968' does not contain '-'</status>
</kw>
<msg time="2026-08-23T00:02:00.723349" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-23T00:02:00.722135" elapsed="0.001249"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-23T00:02:00.724137" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-23T00:02:00.723634" elapsed="0.000543"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:02:00.724810" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:02:00.724400" elapsed="0.000437"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:02:00.725284" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:02:00.724990" elapsed="0.000320"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-08-23T00:02:00.725841" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968

Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-08-23T00:02:00.725461" elapsed="0.000428"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:00.726282" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:00.726041" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-08-23T00:02:00.726981" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=4968'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-08-23T00:02:00.726642" elapsed="0.000385"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:00.726392" elapsed="0.000670"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:00.726374" elapsed="0.000713"/>
</if>
<arg>4968</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-23T00:02:00.719713" elapsed="0.007420"/>
</kw>
<doc>Check that the device data deletion makes its way into the checker node.</doc>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=4968</tag>
<status status="FAIL" start="2026-08-23T00:00:59.762997" elapsed="60.964182">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4968

Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: HTTPError: 503 Server Error: Service Unavailable for url: http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</status>
</test>
<test id="s1-s8-t22" name="Check_Device_Data_Deletion_Is_Visible_On_Configurer" line="221">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-23T00:02:00.730838" elapsed="0.000213"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-23T00:02:00.730516" elapsed="0.000592"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-23T00:02:00.732177" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:00.732006" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:00.731987" elapsed="0.000278"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-23T00:02:00.737389" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:00.737280" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:00.737261" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-23T00:02:00.738447" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-23T00:02:00.738070" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-23T00:02:00.738954" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-23T00:02:00.738649" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-23T00:02:00.739024" elapsed="0.000034"/>
</return>
<msg time="2026-08-23T00:02:00.739186" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-23T00:02:00.737696" 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-08-23T00:02:00.745861" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:00.745705" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:00.745686" 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-08-23T00:02:00.747118" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:00.747010" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:00.746991" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-23T00:02:00.747645" level="INFO">${karaf_connection_index} = 94</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-23T00:02:00.747325" elapsed="0.000348"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-23T00:02:00.748062" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-23T00:02:00.747830" elapsed="0.000259"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-23T00:02:00.780194" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-23T00:02:00.748615" elapsed="0.031685"/>
</kw>
<msg time="2026-08-23T00:02:00.780476" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-23T00:02:00.780524" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:00.748261" elapsed="0.032300"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-23T00:02:00.801643" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-23T00:02:00.781110" elapsed="0.020647"/>
</kw>
<msg time="2026-08-23T00:02:00.801917" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-23T00:02:00.801964" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:00.780769" elapsed="0.021234"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:00.802305" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:00.802084" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:00.802064" elapsed="0.000321"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:00.802848" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:00.802529" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:00.803209" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:00.802989" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:00.802971" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-23T00:02:00.803321" 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-08-23T00:02:00.805826" elapsed="0.000149"/>
</kw>
<msg time="2026-08-23T00:02:00.806035" 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-08-23T00:02:00.804805" elapsed="0.001357"/>
</kw>
<kw name="Open 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-08-23T00:02:00.806434" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:00.806785" 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-08-23T00:02:00.804132" elapsed="0.002847"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-23T00:02:00.803600" elapsed="0.003445"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-23T00:02:00.746707" elapsed="0.060436"/>
</kw>
<msg time="2026-08-23T00:02:00.807235" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:02:00.807280" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:00.746084" elapsed="0.061235"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-23T00:02:00.807543" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-08-23T00:02:00.807393" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:00.807375" elapsed="0.000275"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:00.808051" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:00.808416" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-23T00:02:00.808489" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-23T00:02:00.745350" elapsed="0.063323"/>
</kw>
<msg time="2026-08-23T00:02:00.808771" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:02:00.808817" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:00.739608" elapsed="0.069247"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:00.809182" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:00.808931" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:00.808914" elapsed="0.000348"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-23T00:02:00.739450" elapsed="0.069836"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-23T00:02:00.814830" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:00.814721" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:00.814702" 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-08-23T00:02:00.816041" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:00.815934" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:00.815916" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-23T00:02:00.816598" level="INFO">${karaf_connection_index} = 95</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-23T00:02:00.816282" elapsed="0.000344"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-23T00:02:00.817005" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-23T00:02:00.816781" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-23T00:02:00.849412" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-23T00:02:00.817517" elapsed="0.032021"/>
</kw>
<msg time="2026-08-23T00:02:00.849742" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-23T00:02:00.849790" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:00.817186" elapsed="0.032642"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-23T00:02:00.870289" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-23T00:02:00.850358" elapsed="0.020043"/>
</kw>
<msg time="2026-08-23T00:02:00.870562" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-23T00:02:00.870631" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:00.850005" elapsed="0.020665"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:00.870978" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:00.870750" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:00.870729" elapsed="0.000330"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:00.871765" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:00.871232" 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-08-23T00:02:00.872136" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:00.871912" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:00.871893" elapsed="0.000392"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-23T00:02:00.872321" 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-08-23T00:02:00.874808" elapsed="0.000151"/>
</kw>
<msg time="2026-08-23T00:02:00.875021" 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-08-23T00:02:00.873793" elapsed="0.001354"/>
</kw>
<kw name="Open 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-08-23T00:02:00.875419" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:00.875787" 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-08-23T00:02:00.873140" elapsed="0.002834"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-23T00:02:00.872601" elapsed="0.003438"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-23T00:02:00.815633" elapsed="0.060506"/>
</kw>
<msg time="2026-08-23T00:02:00.876257" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:02:00.876301" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:00.815050" elapsed="0.061290"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-23T00:02:00.876527" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-23T00:02:00.876418" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:00.876399" 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-08-23T00:02:00.877036" 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-08-23T00:02:00.877369" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-23T00:02:00.877443" 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-08-23T00:02:00.814367" elapsed="0.063186"/>
</kw>
<msg time="2026-08-23T00:02:00.877771" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:02:00.877822" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:00.809556" elapsed="0.068304"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:00.878190" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:00.877938" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:00.877920" elapsed="0.000350"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-23T00:02:00.809417" elapsed="0.068876"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-23T00:02:00.883775" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:00.883659" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:00.883639" 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-08-23T00:02:00.885035" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:00.884925" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:00.884907" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-23T00:02:00.885550" level="INFO">${karaf_connection_index} = 96</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-23T00:02:00.885246" elapsed="0.000347"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-23T00:02:00.885977" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-23T00:02:00.885754" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-23T00:02:00.919382" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-23T00:02:00.886508" elapsed="0.032977"/>
</kw>
<msg time="2026-08-23T00:02:00.919732" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-23T00:02:00.919787" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:00.886160" elapsed="0.033665"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-23T00:02:00.944147" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-23T00:02:00.920358" elapsed="0.023940"/>
</kw>
<msg time="2026-08-23T00:02:00.944474" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-23T00:02:00.944520" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:00.919998" elapsed="0.024560"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:00.944943" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:00.944671" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:00.944645" elapsed="0.000382"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:00.945492" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V "i "s "i "b "l "e "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:00.945170" 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-08-23T00:02:00.945890" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:00.945658" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:00.945638" elapsed="0.000338"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-23T00:02:00.946011" 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-08-23T00:02:00.948875" elapsed="0.000153"/>
</kw>
<msg time="2026-08-23T00:02:00.949103" 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-08-23T00:02:00.947794" elapsed="0.001448"/>
</kw>
<kw name="Open 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-08-23T00:02:00.949515" elapsed="0.000098"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:00.949875" 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-08-23T00:02:00.947143" elapsed="0.002920"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-23T00:02:00.946295" 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-08-23T00:02:00.884618" elapsed="0.065622"/>
</kw>
<msg time="2026-08-23T00:02:00.950339" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:02:00.950383" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:00.884007" elapsed="0.066413"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-23T00:02:00.950628" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-23T00:02:00.950497" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:00.950478" elapsed="0.000234"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:00.951109" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:00.951458" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-23T00:02:00.951531" 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-08-23T00:02:00.883270" elapsed="0.068452"/>
</kw>
<msg time="2026-08-23T00:02:00.951818" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:02:00.951864" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "a "t "a "_ "D "e "l "e "t "i "o "n "_ "I "s "_ "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:00.878556" elapsed="0.073347"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:00.952294" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:00.952024" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:00.952005" elapsed="0.000382"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-23T00:02:00.878415" elapsed="0.073999"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-23T00:02:00.739268" elapsed="0.213179"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-23T00:02:00.736916" elapsed="0.215592"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-23T00:02:00.731709" elapsed="0.220858"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:00.731259" elapsed="0.221423"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-23T00:02:00.728067" elapsed="0.224673"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:02:00.954282" level="INFO">${url} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:02:00.953894" elapsed="0.000416"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:00.961764" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:00.961479" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:00.962219" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:00.961967" 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-08-23T00:02:00.980790" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:02:00.981121" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Content-Length': '61'} 
 body=&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt; 
 </msg>
<msg time="2026-08-23T00:02:00.981376" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:02:00.964650" elapsed="0.016790"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:00.962331" elapsed="0.019207"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:00.981995" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:00.981635" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:00.962313" elapsed="0.019880"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:00.990308" level="INFO">&lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:00.984723" elapsed="0.005696"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:00.984066" elapsed="0.006433"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:00.984023" elapsed="0.006533"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:00.997476" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:00.991218" elapsed="0.006437"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:00.990721" elapsed="0.007048"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:00.990683" elapsed="0.007159"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:02:00.999397" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:02:00.998348" elapsed="0.001111"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.000286" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:00.999665" elapsed="0.000762"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.001170" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:02:01.000857" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:01.000483" elapsed="0.000751"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:00.999616" elapsed="0.001640"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.001911" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:02:01.001510" 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-08-23T00:02:01.002244" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.002010" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.002813" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:02:01.002485" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:01.002326" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.001991" 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-08-23T00:02:01.003072" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:02:01.003941" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:02:01.003612" 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-08-23T00:02:01.004125" elapsed="0.002370"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:02:00.983058" elapsed="0.023515"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:02:01.006853" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-08-23T00:02:01.006667" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.006647" 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-08-23T00:02:01.007111" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-08-23T00:02:01.007184" elapsed="0.000015"/>
</return>
<msg time="2026-08-23T00:02:01.009629" level="INFO">${response_text} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:02:00.957078" elapsed="0.052583"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:02:01.009727" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:02:01.009888" level="INFO">${data} = &lt;data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;&lt;/data&gt;</msg>
<var>${data}</var>
<arg>${url}</arg>
<arg>session=${node}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="PASS" start="2026-08-23T00:02:00.954529" elapsed="0.055387"/>
</kw>
<if>
<branch type="IF" condition="not ${contains}">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-23T00:02:01.010206" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:01.009989" elapsed="0.000603"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.009972" elapsed="0.000648"/>
</if>
<if>
<branch type="IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.010885" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.010677" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.010660" elapsed="0.000308"/>
</if>
<arg>${NODE_CONFIGURER}</arg>
<arg>${empty_data}</arg>
<status status="PASS" start="2026-08-23T00:02:00.953474" elapsed="0.057546"/>
</kw>
<arg>60s</arg>
<arg>1s</arg>
<arg>Check_Config_Data</arg>
<arg>${NODE_CONFIGURER}</arg>
<arg>${empty_data}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-23T00:02:00.952914" elapsed="0.058160"/>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.012400" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:02:01.011948" elapsed="0.000480"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-08-23T00:02:01.012669" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-23T00:02:01.012502" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.012484" elapsed="0.000268"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.012918" elapsed="0.000023"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.013094" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.013273" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.013445" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.013677" elapsed="0.000023"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.013848" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.014011" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.014256" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.014093" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:02:01.014077" elapsed="0.000255"/>
</if>
<arg>4968</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-08-23T00:02:01.011543" elapsed="0.002839"/>
</kw>
<doc>Check that the device data deletion makes its way into the checker node.</doc>
<status status="PASS" start="2026-08-23T00:02:00.727407" elapsed="0.287021"/>
</test>
<test id="s1-s8-t23" name="Deconfigure_Device_In_Netconf" line="226">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-23T00:02:01.018026" elapsed="0.000213"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-23T00:02:01.017755" 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-08-23T00:02:01.019309" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:01.019197" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.019178" 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-08-23T00:02:01.024407" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:01.024293" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.024273" elapsed="0.000202"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.025494" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-23T00:02:01.025108" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.026006" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-23T00:02:01.025695" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-23T00:02:01.026078" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:02:01.026233" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-23T00:02:01.024724" 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-08-23T00:02:01.031751" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:01.031641" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.031622" 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-08-23T00:02:01.033034" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:01.032926" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.032907" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-23T00:02:01.033560" level="INFO">${karaf_connection_index} = 94</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-23T00:02:01.033249" elapsed="0.000355"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-23T00:02:01.034000" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-23T00:02:01.033763" elapsed="0.000263"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-23T00:02:01.065336" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-23T00:02:01.034513" elapsed="0.031041"/>
</kw>
<msg time="2026-08-23T00:02:01.065870" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-23T00:02:01.065943" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.034179" elapsed="0.031819"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-23T00:02:01.082932" level="INFO">"t "x "t ". "C "R "U "D ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-23T00:02:01.066923" elapsed="0.016111"/>
</kw>
<msg time="2026-08-23T00:02:01.083291" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-23T00:02:01.083338" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.066305" elapsed="0.017072"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.083732" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.083469" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.083441" elapsed="0.000377"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.084301" level="INFO"> "t "x "t ". "C "R "U "D ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:01.083960" 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-08-23T00:02:01.084675" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.084440" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.084422" elapsed="0.000339"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-23T00:02:01.084799" 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-08-23T00:02:01.087390" elapsed="0.000161"/>
</kw>
<msg time="2026-08-23T00:02:01.087635" 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-08-23T00:02:01.086330" 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-08-23T00:02:01.088046" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.088464" 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-08-23T00:02:01.085685" elapsed="0.003040"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-23T00:02:01.085108" 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-08-23T00:02:01.032620" elapsed="0.056286"/>
</kw>
<msg time="2026-08-23T00:02:01.089001" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:02:01.089050" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.031968" elapsed="0.057133"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-23T00:02:01.089299" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-23T00:02:01.089182" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.089163" elapsed="0.000222"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.089865" 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-08-23T00:02:01.090227" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-23T00:02:01.090302" 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-08-23T00:02:01.031285" elapsed="0.059129"/>
</kw>
<msg time="2026-08-23T00:02:01.090510" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:02:01.090555" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.026668" elapsed="0.064029"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.091026" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.090777" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.090759" elapsed="0.000347"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-23T00:02:01.026510" elapsed="0.064620"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-23T00:02:01.096736" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:01.096624" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.096604" 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-08-23T00:02:01.098196" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:01.098084" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.098066" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-23T00:02:01.098733" level="INFO">${karaf_connection_index} = 95</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-23T00:02:01.098409" elapsed="0.000351"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-23T00:02:01.099148" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-23T00:02:01.098915" elapsed="0.000259"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-23T00:02:01.132063" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-23T00:02:01.099690" elapsed="0.032477"/>
</kw>
<msg time="2026-08-23T00:02:01.132346" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-23T00:02:01.132393" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.099332" elapsed="0.033098"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-23T00:02:01.148948" level="INFO">"t "x "t ". "C "R "U "D ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-23T00:02:01.132967" elapsed="0.016083"/>
</kw>
<msg time="2026-08-23T00:02:01.149212" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-23T00:02:01.149258" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.132622" elapsed="0.016675"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.149623" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.149375" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.149355" elapsed="0.000349"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.150142" level="INFO"> "t "x "t ". "C "R "U "D ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:01.149845" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.150489" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.150275" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.150257" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-23T00:02:01.150617" 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-08-23T00:02:01.153038" elapsed="0.000147"/>
</kw>
<msg time="2026-08-23T00:02:01.153245" 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-08-23T00:02:01.152021" 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-08-23T00:02:01.153662" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.153991" 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-08-23T00:02:01.151398" elapsed="0.002775"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-23T00:02:01.150874" elapsed="0.003364"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-23T00:02:01.097775" elapsed="0.056561"/>
</kw>
<msg time="2026-08-23T00:02:01.154428" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:02:01.154472" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.097013" elapsed="0.057498"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-23T00:02:01.154713" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-23T00:02:01.154604" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.154570" 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-08-23T00:02:01.155178" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.155546" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-23T00:02:01.155642" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-23T00:02:01.096242" elapsed="0.059510"/>
</kw>
<msg time="2026-08-23T00:02:01.155843" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:02:01.155887" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.091407" elapsed="0.064518"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.156246" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.155999" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.155982" elapsed="0.000369"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-23T00:02:01.091268" elapsed="0.065107"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-23T00:02:01.161936" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:01.161828" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.161808" 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-08-23T00:02:01.163141" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:01.163033" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.163014" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-23T00:02:01.163659" level="INFO">${karaf_connection_index} = 96</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-23T00:02:01.163349" elapsed="0.000336"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-23T00:02:01.164059" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-23T00:02:01.163844" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-23T00:02:01.205160" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-23T00:02:01.164616" elapsed="0.040707"/>
</kw>
<msg time="2026-08-23T00:02:01.205524" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-23T00:02:01.205573" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.164240" elapsed="0.041393"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-23T00:02:01.220370" level="INFO">"t "x "t ". "C "R "U "D ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-23T00:02:01.206267" elapsed="0.014744"/>
</kw>
<msg time="2026-08-23T00:02:01.221242" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-23T00:02:01.221307" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.205854" elapsed="0.015508"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.221875" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.221488" elapsed="0.000465"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.221451" elapsed="0.000541"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.222676" level="INFO"> "t "x "t ". "C "R "U "D ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:01.222192" 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-08-23T00:02:01.223157" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.222860" elapsed="0.000373"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.222835" elapsed="0.000434"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-23T00:02:01.223324" 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-08-23T00:02:01.226848" elapsed="0.000200"/>
</kw>
<msg time="2026-08-23T00:02:01.227124" 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-08-23T00:02:01.225496" elapsed="0.001795"/>
</kw>
<kw name="Open 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-08-23T00:02:01.227667" elapsed="0.000099"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.228117" 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-08-23T00:02:01.224672" elapsed="0.003712"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-23T00:02:01.223769" elapsed="0.004700"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-23T00:02:01.162731" elapsed="0.065889"/>
</kw>
<msg time="2026-08-23T00:02:01.228738" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:02:01.228793" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.162151" elapsed="0.066692"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-23T00:02:01.229071" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-08-23T00:02:01.228939" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.228916" elapsed="0.000257"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.229839" 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-08-23T00:02:01.230303" elapsed="0.000036"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-23T00:02:01.230408" 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-08-23T00:02:01.161476" elapsed="0.069083"/>
</kw>
<msg time="2026-08-23T00:02:01.230712" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:02:01.230764" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "D "e "c "o "n "f "i "g "u "r "e "_ "D "e "v "i "c "e "_ "I "n "_ "N "e "t "c "o "n "f "[K"
...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.156656" elapsed="0.074156"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.231176" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.230907" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.230884" elapsed="0.000371"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-23T00:02:01.156497" elapsed="0.074782"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-23T00:02:01.026322" elapsed="0.204991"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-23T00:02:01.023913" elapsed="0.207466"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-23T00:02:01.018901" elapsed="0.212538"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.018450" elapsed="0.213038"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-23T00:02:01.015247" elapsed="0.216299"/>
</kw>
<kw name="Remove_Device_From_Netconf" owner="NetconfKeywords">
<kw name="Pop From Dictionary" owner="Collections">
<msg time="2026-08-23T00:02:01.232563" level="INFO">${device_type} = configure-via-topology</msg>
<var>${device_type}</var>
<arg>${NetconfKeywords__mounted_device_types}</arg>
<arg>${device_name}</arg>
<doc>Pops the given ``key`` from the ``dictionary`` and returns its value.</doc>
<status status="PASS" start="2026-08-23T00:02:01.232248" elapsed="0.000360"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.233211" level="INFO">${mapping} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping}</var>
<arg>DEVICE_NAME=${device_name}</arg>
<arg>RESTCONF_ROOT=${RESTCONF_ROOT}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-23T00:02:01.232776" elapsed="0.000463"/>
</kw>
<kw name="Set_Variable_If_At_Least_Scandium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Set_Variable_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Set Variable If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-23T00:02:01.251897" elapsed="0.000460"/>
</kw>
<msg time="2026-08-23T00:02:01.252416" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>BuiltIn.Set_Variable_If</arg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-23T00:02:01.251515" elapsed="0.000951"/>
</kw>
<arg>scandium</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Compare ${lower_bound} to titanium and return scandium if titanium is at least ${lower_bound},
return calcium otherwise.</doc>
<status status="PASS" start="2026-08-23T00:02:01.251124" elapsed="0.001484"/>
</kw>
<msg time="2026-08-23T00:02:01.252654" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Set_Variable_If_At_Least</arg>
<arg>scandium</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-23T00:02:01.242294" elapsed="0.010405"/>
</kw>
<msg time="2026-08-23T00:02:01.252809" level="INFO">${version} = scandium</msg>
<var>${version}</var>
<arg>scandium</arg>
<arg>calcium</arg>
<doc>Compare scandium to titanium and return ${value_if_true} if titanium is at least scandium, return ${value_if_false} otherwise.</doc>
<status status="PASS" start="2026-08-23T00:02:01.241970" elapsed="0.010863"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.294915" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:02:01.294508" elapsed="0.000437"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-08-23T00:02:01.295718" level="FAIL">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology.titanium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-08-23T00:02:01.295444" elapsed="0.000355">File '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-08-23T00:02:01.295893" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-08-23T00:02:01.295109" elapsed="0.000809"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.296484" level="INFO">${file_path} = /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-23T00:02:01.296077" elapsed="0.000435"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-08-23T00:02:01.296827" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/location.uri"&gt;/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/variables/netconf/device/scandium/configure-via-topology/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-08-23T00:02:01.296989" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-08-23T00:02:01.296687" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.297417" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:01.297169" 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-08-23T00:02:01.298427" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:01.298169" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.298909" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-08-23T00:02:01.298642" elapsed="0.000292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.299611" level="INFO">${value} = netconf-test-device</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-23T00:02:01.299298" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-23T00:02:01.300394" level="INFO">${encoded} = netconf-test-device</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-23T00:02:01.300141" elapsed="0.000279"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-23T00:02:01.300471" elapsed="0.000030"/>
</return>
<msg time="2026-08-23T00:02:01.302413" level="INFO">${encoded_value} = netconf-test-device</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-23T00:02:01.299823" elapsed="0.002616"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-23T00:02:01.302606" elapsed="0.000243"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-08-23T00:02:01.299165" elapsed="0.003726"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.303442" level="INFO">${value} = /rests</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-08-23T00:02:01.303136" elapsed="0.000332"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-08-23T00:02:01.304383" level="INFO">${encoded} = /rests</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-08-23T00:02:01.304126" elapsed="0.000288"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-08-23T00:02:01.304466" elapsed="0.000030"/>
</return>
<msg time="2026-08-23T00:02:01.304689" level="INFO">${encoded_value} = /rests</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-08-23T00:02:01.303668" elapsed="0.001048"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-08-23T00:02:01.304866" elapsed="0.000225"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/rests</var>
<status status="PASS" start="2026-08-23T00:02:01.303006" elapsed="0.002126"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-08-23T00:02:01.298989" elapsed="0.006178"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-08-23T00:02:01.305212" elapsed="0.000027"/>
</return>
<msg time="2026-08-23T00:02:01.305369" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/rests'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-08-23T00:02:01.297848" elapsed="0.007546"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:01.297532" elapsed="0.007894"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.305612" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.305451" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.297512" elapsed="0.008179"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.306415" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:02:01.305836" elapsed="0.000607"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-08-23T00:02:01.306493" 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/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="PASS" start="2026-08-23T00:02:01.293894" elapsed="0.012741"/>
</kw>
<msg time="2026-08-23T00:02:01.306688" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-23T00:02:01.281351" elapsed="0.025385"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.319108" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.331515" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../variables/netconf/device/scandium/configure-via-topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.343905" 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-08-23T00:02:01.344097" 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-08-23T00:02:01.344269" 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-08-23T00:02:01.344661" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.344500" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-08-23T00:02:01.344485" 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-08-23T00:02:01.344880" 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-08-23T00:02:01.345045" 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-08-23T00:02:01.345254" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-08-23T00:02:01.344457" elapsed="0.000852"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-08-23T00:02:01.344353" elapsed="0.000981"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.345479" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-08-23T00:02:01.345555" elapsed="0.000016"/>
</return>
<msg time="2026-08-23T00:02:01.345691" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-08-23T00:02:01.277010" elapsed="0.068707"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.346990" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:01.346738" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-08-23T00:02:01.361794" level="INFO">DELETE Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:02:01.361896" level="INFO">DELETE Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-08-23T00:02:01.362118" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:02:01.349198" elapsed="0.012981"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:01.347104" elapsed="0.015164"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.362694" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.362325" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.347087" elapsed="0.015795"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.370864" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:01.365146" elapsed="0.005815"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:01.364664" elapsed="0.006374"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.364622" elapsed="0.006471"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.374638" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:01.371732" elapsed="0.002953"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:01.371217" elapsed="0.003505"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.371181" elapsed="0.003568"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.375297" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:02:01.374918" 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-08-23T00:02:01.375646" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.375396" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.376187" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:02:01.375887" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:01.375728" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.375377" elapsed="0.000894"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.376829" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:02:01.376448" 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-08-23T00:02:01.377158" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.376927" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.377709" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:02:01.377397" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:01.377240" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.376909" elapsed="0.000920"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-23T00:02:01.377978" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:02:01.378794" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:02:01.378492" 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-08-23T00:02:01.378974" elapsed="0.002367"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_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-08-23T00:02:01.363683" elapsed="0.017723"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-08-23T00:02:01.381452" elapsed="0.000030"/>
</return>
<msg time="2026-08-23T00:02:01.383694" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-08-23T00:02:01.345978" elapsed="0.037744"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:02:01.383776" elapsed="0.000027"/>
</return>
<arg>${DIRECTORY_WITH_DEVICE_TEMPLATES}${/}${version}${/}${device_type}</arg>
<arg>${mapping}</arg>
<arg>session=${session}</arg>
<arg>location=${location}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-08-23T00:02:01.253050" elapsed="0.130850"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${NODE_CONFIGURER}</arg>
<doc>Tell Netconf to deconfigure the specified device</doc>
<status status="PASS" start="2026-08-23T00:02:01.231798" elapsed="0.152165"/>
</kw>
<doc>Make request to deconfigure the device on Netconf connector.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-08-23T00:02:01.014699" elapsed="0.369379"/>
</test>
<test id="s1-s8-t24" name="Check_Device_Deconfigured_On_Configurer" line="232">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-23T00:02:01.387806" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-23T00:02:01.387519" 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-08-23T00:02:01.389084" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:01.388975" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.388956" 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-08-23T00:02:01.394079" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:01.393973" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.393954" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.395140" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-23T00:02:01.394760" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.395646" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-23T00:02:01.395325" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-23T00:02:01.395717" elapsed="0.000029"/>
</return>
<msg time="2026-08-23T00:02:01.395872" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-23T00:02:01.394369" 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-08-23T00:02:01.401506" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:01.401398" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.401379" 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-08-23T00:02:01.402760" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:01.402652" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.402633" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-23T00:02:01.403263" level="INFO">${karaf_connection_index} = 94</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-23T00:02:01.402968" elapsed="0.000321"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-23T00:02:01.403689" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-23T00:02:01.403444" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-23T00:02:01.438206" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-23T00:02:01.404220" elapsed="0.034140"/>
</kw>
<msg time="2026-08-23T00:02:01.438531" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-23T00:02:01.438601" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.403871" elapsed="0.034770"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-23T00:02:01.456380" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-23T00:02:01.439170" elapsed="0.017341"/>
</kw>
<msg time="2026-08-23T00:02:01.456695" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-23T00:02:01.456742" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.438819" elapsed="0.017961"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.457081" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.456860" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.456839" elapsed="0.000322"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.457615" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:01.457301" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.457971" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.457757" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.457739" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-23T00:02:01.458085" 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-08-23T00:02:01.460570" elapsed="0.000174"/>
</kw>
<msg time="2026-08-23T00:02:01.460805" 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-08-23T00:02:01.459527" elapsed="0.001408"/>
</kw>
<kw name="Open 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-08-23T00:02:01.461205" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.461532" 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-08-23T00:02:01.458908" elapsed="0.002828"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-23T00:02:01.458349" elapsed="0.003451"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-23T00:02:01.402325" elapsed="0.059573"/>
</kw>
<msg time="2026-08-23T00:02:01.461990" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:02:01.462035" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.401742" elapsed="0.060330"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-23T00:02:01.462256" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-23T00:02:01.462150" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.462132" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.462760" 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-08-23T00:02:01.463096" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-23T00:02:01.463167" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-23T00:02:01.401061" elapsed="0.062214"/>
</kw>
<msg time="2026-08-23T00:02:01.463369" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:02:01.463412" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.396260" elapsed="0.067190"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.463931" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.463675" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.463556" elapsed="0.000455"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-23T00:02:01.396120" elapsed="0.067915"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-23T00:02:01.469733" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:01.469621" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.469600" 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-08-23T00:02:01.470959" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:01.470851" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.470833" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-23T00:02:01.471464" level="INFO">${karaf_connection_index} = 95</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-23T00:02:01.471169" elapsed="0.000322"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-23T00:02:01.471885" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-23T00:02:01.471663" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-23T00:02:01.513752" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-23T00:02:01.472421" elapsed="0.041435"/>
</kw>
<msg time="2026-08-23T00:02:01.514035" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-23T00:02:01.514082" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.472067" elapsed="0.042052"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-23T00:02:01.533715" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-23T00:02:01.514657" elapsed="0.019163"/>
</kw>
<msg time="2026-08-23T00:02:01.533980" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-23T00:02:01.534026" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.514290" elapsed="0.019773"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.534361" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.534141" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.534121" elapsed="0.000319"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.534904" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:01.534604" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.535254" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.535040" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.535022" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-23T00:02:01.535368" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<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-08-23T00:02:01.537860" elapsed="0.000150"/>
</kw>
<msg time="2026-08-23T00:02:01.538071" 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-08-23T00:02:01.536849" elapsed="0.001349"/>
</kw>
<kw name="Open 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-08-23T00:02:01.538467" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.538821" 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-08-23T00:02:01.536165" 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-08-23T00:02:01.535637" elapsed="0.003429"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-23T00:02:01.470523" elapsed="0.068680"/>
</kw>
<msg time="2026-08-23T00:02:01.539296" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:02:01.539340" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.469954" elapsed="0.069424"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-23T00:02:01.539559" elapsed="0.000054"/>
</return>
<status status="PASS" start="2026-08-23T00:02:01.539454" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.539436" 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-08-23T00:02:01.540066" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.540402" elapsed="0.000040"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-23T00:02:01.540491" 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-08-23T00:02:01.469257" elapsed="0.071371"/>
</kw>
<msg time="2026-08-23T00:02:01.540723" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:02:01.540768" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.464297" elapsed="0.076509"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.541133" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.540882" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.540864" elapsed="0.000348"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-23T00:02:01.464161" elapsed="0.077075"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-23T00:02:01.546901" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:01.546791" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.546770" 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-08-23T00:02:01.548120" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:01.548013" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.547994" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-23T00:02:01.548677" level="INFO">${karaf_connection_index} = 96</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-23T00:02:01.548330" elapsed="0.000374"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-23T00:02:01.549081" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-23T00:02:01.548859" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-23T00:02:01.587619" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-23T00:02:01.549624" elapsed="0.038238"/>
</kw>
<msg time="2026-08-23T00:02:01.588144" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-23T00:02:01.588213" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.549265" elapsed="0.039009"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-23T00:02:01.610650" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-23T00:02:01.589235" elapsed="0.021572"/>
</kw>
<msg time="2026-08-23T00:02:01.610999" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-23T00:02:01.611047" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.588647" elapsed="0.022439"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.611503" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.611199" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.611165" elapsed="0.000547"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.612232" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o "n "f "i "g "u "r "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:01.611865" elapsed="0.000438"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.612641" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.612373" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.612354" elapsed="0.000369"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-23T00:02:01.612763" 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-08-23T00:02:01.615393" elapsed="0.000161"/>
</kw>
<msg time="2026-08-23T00:02:01.615637" 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-08-23T00:02:01.614354" 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-08-23T00:02:01.616052" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.616383" elapsed="0.000110"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-23T00:02:01.613700" 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-08-23T00:02:01.613091" elapsed="0.003612"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-23T00:02:01.547711" elapsed="0.069094"/>
</kw>
<msg time="2026-08-23T00:02:01.616903" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:02:01.616949" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.547119" elapsed="0.069872"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-23T00:02:01.617179" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-23T00:02:01.617070" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.617051" 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-08-23T00:02:01.617710" 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-08-23T00:02:01.618066" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-23T00:02:01.618140" 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-08-23T00:02:01.546420" elapsed="0.071833"/>
</kw>
<msg time="2026-08-23T00:02:01.618353" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:02:01.618400" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "o ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.541497" elapsed="0.076944"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.618890" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.618519" elapsed="0.000426"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.618501" elapsed="0.000469"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-23T00:02:01.541359" elapsed="0.077636"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-23T00:02:01.395949" elapsed="0.223081"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-23T00:02:01.393611" elapsed="0.225484"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-23T00:02:01.388686" elapsed="0.230471"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.388218" elapsed="0.230987"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-23T00:02:01.385389" elapsed="0.233874"/>
</kw>
<kw name="Wait_Device_Fully_Removed" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Completely_Gone" owner="NetconfKeywords">
<kw name="Check_Device_Has_No_Netconf_Connector" owner="NetconfKeywords">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.632452" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:02:01.630345" elapsed="0.002172"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.632879" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-23T00:02:01.632724" elapsed="0.000214"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-23T00:02:01.632593" elapsed="0.000372"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.633274" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.633030" elapsed="0.000301"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.634077" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:02:01.633604" elapsed="0.000500"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:01.633356" elapsed="0.000784"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.634328" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.634166" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.633012" elapsed="0.001392"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-23T00:02:01.634439" elapsed="0.000029"/>
</return>
<msg time="2026-08-23T00:02:01.634607" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-23T00:02:01.629877" elapsed="0.004869"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-23T00:02:01.634796" elapsed="0.000027"/>
</return>
<msg time="2026-08-23T00:02:01.634942" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-23T00:02:01.629365" elapsed="0.005602"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.642168" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:01.641914" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.642623" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:01.642365" 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-08-23T00:02:01.652310" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:02:01.652571" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1011'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}} 
 </msg>
<msg time="2026-08-23T00:02:01.652750" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:02:01.644928" elapsed="0.007860"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:01.642734" elapsed="0.010116"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.653103" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.652889" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.642716" elapsed="0.010511"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.658482" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:01.654677" elapsed="0.004011"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:01.654351" elapsed="0.004392"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.654324" elapsed="0.004456"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.662547" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:01.659174" elapsed="0.003480"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:01.658861" elapsed="0.003846"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.658836" elapsed="0.003905"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.663513" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:02:01.662968" 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-08-23T00:02:01.664016" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.663683" elapsed="0.000415"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.664898" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:02:01.664355" elapsed="0.000572"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:01.664133" elapsed="0.000833"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.663656" elapsed="0.001331"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.665512" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:02:01.665147" 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-08-23T00:02:01.665865" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.665633" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.666402" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:02:01.666103" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:01.665947" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.665613" elapsed="0.000875"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-23T00:02:01.666656" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:02:01.667470" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:02:01.667168" 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-08-23T00:02:01.667664" elapsed="0.002350"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:02:01.653751" elapsed="0.016327"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:02:01.670256" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:01.670149" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.670130" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-23T00:02:01.673531" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-23T00:02:01.670470" elapsed="0.003091"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-23T00:02:01.673636" elapsed="0.000031"/>
</return>
<msg time="2026-08-23T00:02:01.673798" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:02:01.637607" elapsed="0.036218"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:02:01.673883" elapsed="0.000026"/>
</return>
<msg time="2026-08-23T00:02:01.674031" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-23T00:02:01.635185" elapsed="0.038872"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.674470" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:01.674217" elapsed="0.000344"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.675132" level="INFO">${actual_count} = 0</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:02:01.674735" elapsed="0.000424"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-23T00:02:01.675207" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:02:01.675362" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-23T00:02:01.621935" elapsed="0.053452"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.675828" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-23T00:02:01.675542" elapsed="0.000342"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="PASS" start="2026-08-23T00:02:01.621191" elapsed="0.054754"/>
</kw>
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.686530" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:02:01.684389" elapsed="0.002169"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.687237" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:02:01.686913" elapsed="0.000351"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-23T00:02:01.686762" elapsed="0.000540"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.687868" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:02:01.687528" elapsed="0.000367"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-23T00:02:01.687381" elapsed="0.000551"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-23T00:02:01.686627" elapsed="0.001334"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.688772" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:02:01.688262" elapsed="0.000538"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:01.688025" elapsed="0.000813"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.689031" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.688864" elapsed="0.000225"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.689269" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.689113" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.688008" elapsed="0.001338"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-23T00:02:01.689380" elapsed="0.000027"/>
</return>
<msg time="2026-08-23T00:02:01.689529" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-23T00:02:01.683933" elapsed="0.005621"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-23T00:02:01.689617" elapsed="0.000027"/>
</return>
<msg time="2026-08-23T00:02:01.689763" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>config</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-23T00:02:01.683354" elapsed="0.006435"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-23T00:02:01.696957" level="INFO">GET Request : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01vks93zjo9m791xa2semhqhy7b4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:02:01.697070" level="INFO">GET Response : url=http://10.30.170.200:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-23T00:02:01.697164" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:02:01.690551" elapsed="0.006639"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} == 404 or ${resp.status_code} == 409">
<return>
<status status="PASS" start="2026-08-23T00:02:01.703400" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-08-23T00:02:01.697273" elapsed="0.006209"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.697254" elapsed="0.006262"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.703749" elapsed="0.000079"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The request failed with code ${resp.status_code}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.704037" elapsed="0.000029"/>
</kw>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config in node1 using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="PASS" start="2026-08-23T00:02:01.690149" elapsed="0.014000"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device has no Netconf connectors nor associated data.</doc>
<status status="PASS" start="2026-08-23T00:02:01.620678" elapsed="0.083551"/>
</kw>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Completely_Gone</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-23T00:02:01.620043" elapsed="0.084258"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${NODE_CONFIGURER}</arg>
<doc>Wait until all netconf connectors for the device with the given name disappear.
Call of Remove_Device_From_Netconf returns before netconf gets
around deleting the device's connector. To ensure the device is
really gone from netconf, use this keyword to make sure all
connectors disappear. If a call to Remove_Device_From_Netconf
is not made before using this keyword, the wait will fail.
Using this keyword is more readable than putting the WUKS below
into a test case.</doc>
<status status="PASS" start="2026-08-23T00:02:01.619480" elapsed="0.084910"/>
</kw>
<doc>Check that the device is really going to be gone. Fail if still there after one minute.
This is an expected behavior as the unmount request is sent to the config subsystem which
then triggers asynchronous disconnection of the device which is reflected in the operational
data once completed. This test makes sure this asynchronous operation does not take
unreasonable amount of time.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-08-23T00:02:01.384294" elapsed="0.320274"/>
</test>
<test id="s1-s8-t25" name="Check_Device_Deconfigured_On_Checker" line="241">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-23T00:02:01.709263" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-23T00:02:01.708904" elapsed="0.000627"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-23T00:02:01.710527" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:01.710418" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.710400" elapsed="0.000369"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-23T00:02:01.715972" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:01.715863" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.715840" elapsed="0.000202"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.717129" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-23T00:02:01.716694" elapsed="0.000463"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.717640" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-23T00:02:01.717315" elapsed="0.000352"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-23T00:02:01.717713" elapsed="0.000029"/>
</return>
<msg time="2026-08-23T00:02:01.717869" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-23T00:02:01.716267" 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-08-23T00:02:01.723382" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:01.723273" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.723254" 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-08-23T00:02:01.724654" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:01.724520" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.724475" elapsed="0.000249"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-23T00:02:01.725166" level="INFO">${karaf_connection_index} = 94</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-23T00:02:01.724866" elapsed="0.000327"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-23T00:02:01.725593" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-23T00:02:01.725349" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-23T00:02:01.756617" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-23T00:02:01.726113" elapsed="0.030607"/>
</kw>
<msg time="2026-08-23T00:02:01.756882" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-23T00:02:01.756929" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.725780" elapsed="0.031230"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-23T00:02:01.772865" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-23T00:02:01.757526" elapsed="0.015442"/>
</kw>
<msg time="2026-08-23T00:02:01.773127" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-23T00:02:01.773174" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.757184" elapsed="0.016028"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.773509" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.773291" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.773270" elapsed="0.000342"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.774051" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:01.773754" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.774399" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.774187" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.774169" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-23T00:02:01.774514" 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-08-23T00:02:01.777032" elapsed="0.000150"/>
</kw>
<msg time="2026-08-23T00:02:01.777244" 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-08-23T00:02:01.775960" elapsed="0.001418"/>
</kw>
<kw name="Open 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-08-23T00:02:01.777811" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.778147" 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-08-23T00:02:01.775320" 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-08-23T00:02:01.774792" elapsed="0.003611"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-23T00:02:01.724189" elapsed="0.054314"/>
</kw>
<msg time="2026-08-23T00:02:01.778622" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:02:01.778669" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.723621" elapsed="0.055089"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-23T00:02:01.778896" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-23T00:02:01.778790" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.778771" 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-08-23T00:02:01.779375" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.779729" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-23T00:02:01.779803" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-23T00:02:01.722934" elapsed="0.056978"/>
</kw>
<msg time="2026-08-23T00:02:01.780038" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:02:01.780085" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.718251" elapsed="0.061872"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.780448" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.780201" elapsed="0.000370"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.780183" elapsed="0.000522"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-23T00:02:01.718113" elapsed="0.062617"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-23T00:02:01.786041" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:01.785934" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.785915" 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-08-23T00:02:01.787235" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:01.787128" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.787110" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-23T00:02:01.787758" level="INFO">${karaf_connection_index} = 95</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-23T00:02:01.787441" elapsed="0.000343"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-23T00:02:01.788154" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-23T00:02:01.787938" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-23T00:02:01.818824" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-23T00:02:01.788714" elapsed="0.030210"/>
</kw>
<msg time="2026-08-23T00:02:01.819083" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-23T00:02:01.819128" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.788333" elapsed="0.030830"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-23T00:02:01.836940" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-23T00:02:01.819686" elapsed="0.017357"/>
</kw>
<msg time="2026-08-23T00:02:01.837204" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-23T00:02:01.837249" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.819326" elapsed="0.017960"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.837610" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.837364" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.837344" elapsed="0.000348"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.838125" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:01.837830" elapsed="0.000360"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.838467" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.838257" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.838239" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-23T00:02:01.838575" 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-08-23T00:02:01.841144" elapsed="0.000149"/>
</kw>
<msg time="2026-08-23T00:02:01.841353" 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-08-23T00:02:01.839995" 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-08-23T00:02:01.841769" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.842098" 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-08-23T00:02:01.839367" elapsed="0.002910"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-23T00:02:01.838847" elapsed="0.003494"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-23T00:02:01.786830" elapsed="0.055607"/>
</kw>
<msg time="2026-08-23T00:02:01.842528" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:02:01.842571" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.786256" elapsed="0.056409"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-23T00:02:01.843014" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-08-23T00:02:01.842745" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.842726" elapsed="0.000374"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.843491" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.843849" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-23T00:02:01.843922" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-23T00:02:01.785594" elapsed="0.058437"/>
</kw>
<msg time="2026-08-23T00:02:01.844124" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:02:01.844168" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.780996" elapsed="0.063209"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.844524" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.844280" elapsed="0.000389"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.844263" elapsed="0.000431"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-23T00:02:01.780857" elapsed="0.063861"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-23T00:02:01.850059" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:01.849953" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.849935" 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-08-23T00:02:01.851278" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:01.851171" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.851153" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-23T00:02:01.851820" level="INFO">${karaf_connection_index} = 96</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-23T00:02:01.851485" elapsed="0.000361"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-23T00:02:01.852221" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-23T00:02:01.852002" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-23T00:02:01.886412" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-23T00:02:01.852777" elapsed="0.033930"/>
</kw>
<msg time="2026-08-23T00:02:01.887088" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-23T00:02:01.887194" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.852404" elapsed="0.034873"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-23T00:02:01.903565" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-08-23T00:02:01.888517" elapsed="0.015176"/>
</kw>
<msg time="2026-08-23T00:02:01.903861" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-23T00:02:01.903907" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.887718" elapsed="0.016226"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.904290" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.904038" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.904012" elapsed="0.000359"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.904885" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h "e "c "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:01.904511" 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-08-23T00:02:01.905322" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.905103" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.905083" elapsed="0.000320"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-23T00:02:01.905441" 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-08-23T00:02:01.908148" elapsed="0.000161"/>
</kw>
<msg time="2026-08-23T00:02:01.908373" 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-08-23T00:02:01.907066" 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-08-23T00:02:01.908962" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.909297" 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-08-23T00:02:01.906375" 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-08-23T00:02:01.905796" 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-08-23T00:02:01.850872" elapsed="0.058804"/>
</kw>
<msg time="2026-08-23T00:02:01.909771" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:02:01.909817" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.850274" elapsed="0.059581"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-23T00:02:01.910038" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-23T00:02:01.909931" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.909912" 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-08-23T00:02:01.910767" 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-08-23T00:02:01.911103" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-23T00:02:01.911174" 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-08-23T00:02:01.849617" elapsed="0.061666"/>
</kw>
<msg time="2026-08-23T00:02:01.911377" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:02:01.911419" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "C "h ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.844983" elapsed="0.066473"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.911882" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.911530" elapsed="0.000407"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.911513" elapsed="0.000447"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-23T00:02:01.844843" elapsed="0.067141"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-23T00:02:01.717946" elapsed="0.194072"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-23T00:02:01.715470" elapsed="0.196610"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-23T00:02:01.710131" elapsed="0.202007"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:01.709702" elapsed="0.202483"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-23T00:02:01.705827" elapsed="0.206414"/>
</kw>
<kw name="Wait_Device_Fully_Removed" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Completely_Gone" owner="NetconfKeywords">
<kw name="Check_Device_Has_No_Netconf_Connector" owner="NetconfKeywords">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.924996" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:02:01.922889" elapsed="0.002135"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.925396" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-23T00:02:01.925244" elapsed="0.000210"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-23T00:02:01.925117" elapsed="0.000363"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.925798" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.925543" elapsed="0.000313"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.926594" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:02:01.926109" elapsed="0.000515"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:01.925881" elapsed="0.000779"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.926847" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.926685" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.925526" elapsed="0.001399"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-23T00:02:01.926960" elapsed="0.000027"/>
</return>
<msg time="2026-08-23T00:02:01.927108" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-23T00:02:01.922421" elapsed="0.004713"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-23T00:02:01.927180" elapsed="0.000025"/>
</return>
<msg time="2026-08-23T00:02:01.927322" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-23T00:02:01.921939" elapsed="0.005408"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.936442" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:01.936188" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.936943" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:01.936692" 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-08-23T00:02:01.947056" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:02:01.947291" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1011'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}} 
 </msg>
<msg time="2026-08-23T00:02:01.947456" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:02:01.939108" elapsed="0.008388"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:01.937057" elapsed="0.010505"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:01.947857" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.947625" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.937039" elapsed="0.010948"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.953663" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:01.949517" elapsed="0.004231"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:01.949194" elapsed="0.004761"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.949167" elapsed="0.004831"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.958124" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:01.954412" elapsed="0.003782"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:01.954082" elapsed="0.004165"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.954058" elapsed="0.004227"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.959130" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:02:01.958528" 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-08-23T00:02:01.959648" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.959277" elapsed="0.000461"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.960460" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:02:01.960014" elapsed="0.000486"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:01.959776" elapsed="0.000779"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.959251" elapsed="0.001376"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.961404" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:02:01.960865" 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-08-23T00:02:01.961921" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:01.961549" elapsed="0.000457"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.962735" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:02:01.962274" elapsed="0.000500"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:01.962042" elapsed="0.000786"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.961524" elapsed="0.001336"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-08-23T00:02:01.963080" elapsed="0.000535"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:02:01.964283" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:02:01.963859" 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-08-23T00:02:01.964547" elapsed="0.002765"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:02:01.948514" elapsed="0.018864"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:02:01.967556" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:01.967448" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:01.967430" elapsed="0.000213"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-23T00:02:01.970833" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-23T00:02:01.967792" elapsed="0.003071"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-23T00:02:01.970916" elapsed="0.000033"/>
</return>
<msg time="2026-08-23T00:02:01.971081" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:02:01.931864" elapsed="0.039244"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:02:01.971166" elapsed="0.000026"/>
</return>
<msg time="2026-08-23T00:02:01.971313" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-23T00:02:01.927560" elapsed="0.043779"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.971769" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:01.971496" elapsed="0.000362"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.972405" level="INFO">${actual_count} = 0</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:02:01.972012" elapsed="0.000420"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-23T00:02:01.972479" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:02:01.972691" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-23T00:02:01.914520" elapsed="0.058198"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:02:01.973133" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-23T00:02:01.972872" elapsed="0.000314"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="PASS" start="2026-08-23T00:02:01.914073" elapsed="0.059171"/>
</kw>
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:02:02.031627" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:02:02.029478" elapsed="0.002184"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:02:02.032360" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:02:02.032033" elapsed="0.000353"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-23T00:02:02.031879" elapsed="0.000545"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:02:02.033023" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:02:02.032694" elapsed="0.000357"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-23T00:02:02.032505" elapsed="0.000581"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-23T00:02:02.031732" elapsed="0.001384"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:02:02.033949" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:02:02.033450" elapsed="0.000527"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:02.033190" elapsed="0.000824"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:02.034206" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:02.034040" elapsed="0.000224"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:02.034446" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:02.034288" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:02.033169" elapsed="0.001355"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-23T00:02:02.034562" elapsed="0.000048"/>
</return>
<msg time="2026-08-23T00:02:02.034739" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-23T00:02:02.028998" elapsed="0.005767"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-23T00:02:02.034812" elapsed="0.000025"/>
</return>
<msg time="2026-08-23T00:02:02.034953" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>config</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-23T00:02:02.028226" elapsed="0.006752"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-23T00:02:02.042487" level="INFO">GET Request : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kaowb5l9l5sj68bygkw0gxbc2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:02:02.042662" level="INFO">GET Response : url=http://10.30.170.79:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-23T00:02:02.042810" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:02:02.035767" elapsed="0.007081"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} == 404 or ${resp.status_code} == 409">
<return>
<status status="PASS" start="2026-08-23T00:02:02.049498" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-08-23T00:02:02.042969" elapsed="0.006632"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:02.042940" elapsed="0.006699"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:02.049859" elapsed="0.000111"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The request failed with code ${resp.status_code}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:02.050178" elapsed="0.000030"/>
</kw>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config in node3 using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="PASS" start="2026-08-23T00:02:02.035343" elapsed="0.014949"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device has no Netconf connectors nor associated data.</doc>
<status status="PASS" start="2026-08-23T00:02:01.913560" elapsed="0.136813"/>
</kw>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Completely_Gone</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-23T00:02:01.912988" elapsed="0.137459"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${NODE_CHECKER}</arg>
<doc>Wait until all netconf connectors for the device with the given name disappear.
Call of Remove_Device_From_Netconf returns before netconf gets
around deleting the device's connector. To ensure the device is
really gone from netconf, use this keyword to make sure all
connectors disappear. If a call to Remove_Device_From_Netconf
is not made before using this keyword, the wait will fail.
Using this keyword is more readable than putting the WUKS below
into a test case.</doc>
<status status="PASS" start="2026-08-23T00:02:01.912455" elapsed="0.138084"/>
</kw>
<doc>Check that the device is going to be gone from the checker node. Fail if still there after one minute.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-08-23T00:02:01.704923" elapsed="0.345801"/>
</test>
<test id="s1-s8-t26" name="Check_Device_Deconfigured_On_Setter" line="246">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-08-23T00:02:02.055332" elapsed="0.000227"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-08-23T00:02:02.055069" 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-08-23T00:02:02.056694" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:02.056555" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:02.056536" elapsed="0.000232"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-23T00:02:02.061889" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:02.061781" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:02.061762" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-08-23T00:02:02.062978" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-08-23T00:02:02.062566" elapsed="0.000441"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-08-23T00:02:02.063478" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-08-23T00:02:02.063168" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-08-23T00:02:02.063553" elapsed="0.000043"/>
</return>
<msg time="2026-08-23T00:02:02.063730" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-08-23T00:02:02.062185" elapsed="0.001571"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-23T00:02:02.069260" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:02.069152" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:02.069133" 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-08-23T00:02:02.070504" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:02.070396" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:02.070378" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-23T00:02:02.071046" level="INFO">${karaf_connection_index} = 94</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-23T00:02:02.070742" elapsed="0.000331"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-23T00:02:02.071463" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-23T00:02:02.071234" elapsed="0.000255"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-23T00:02:02.102919" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-23T00:02:02.072002" elapsed="0.031172"/>
</kw>
<msg time="2026-08-23T00:02:02.103370" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-23T00:02:02.103419" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:02.071663" elapsed="0.031793"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-23T00:02:02.120052" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e "t "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-08-23T00:02:02.104244" elapsed="0.015913"/>
</kw>
<msg time="2026-08-23T00:02:02.120321" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-23T00:02:02.120368" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:02.103821" elapsed="0.016584"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:02.120758" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:02.120485" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:02.120465" elapsed="0.000379"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:02.121295" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e "t "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-08-23T00:02:02.120988" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:02.121680" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:02.121433" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:02.121414" elapsed="0.000350"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-23T00:02:02.121799" 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-08-23T00:02:02.124453" elapsed="0.000187"/>
</kw>
<msg time="2026-08-23T00:02:02.124735" 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-08-23T00:02:02.123302" elapsed="0.001569"/>
</kw>
<kw name="Open 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-08-23T00:02:02.125149" elapsed="0.000085"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:02.125532" elapsed="0.000105"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-08-23T00:02:02.122664" 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-08-23T00:02:02.122072" elapsed="0.003749"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-23T00:02:02.070093" elapsed="0.055828"/>
</kw>
<msg time="2026-08-23T00:02:02.126014" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:02:02.126058" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:02.069478" elapsed="0.056617"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-23T00:02:02.126281" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-08-23T00:02:02.126173" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:02.126153" 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-08-23T00:02:02.126811" 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-08-23T00:02:02.127150" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-23T00:02:02.127223" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-23T00:02:02.068811" elapsed="0.058522"/>
</kw>
<msg time="2026-08-23T00:02:02.127446" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:02:02.127494" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:02.064128" elapsed="0.063403"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:02.127989" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:02.127730" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:02.127708" elapsed="0.000360"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-08-23T00:02:02.063988" elapsed="0.064201"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-23T00:02:02.133682" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:02.133538" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:02.133519" 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-08-23T00:02:02.134921" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:02.134813" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:02.134795" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-23T00:02:02.135432" level="INFO">${karaf_connection_index} = 95</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-23T00:02:02.135132" elapsed="0.000327"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-23T00:02:02.135870" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-23T00:02:02.135643" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-23T00:02:02.166306" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-23T00:02:02.136389" elapsed="0.030018"/>
</kw>
<msg time="2026-08-23T00:02:02.166568" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-23T00:02:02.166634" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:02.136056" elapsed="0.030616"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-23T00:02:02.184550" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e "t "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-08-23T00:02:02.167181" elapsed="0.017484"/>
</kw>
<msg time="2026-08-23T00:02:02.184846" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-23T00:02:02.184892" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:02.166842" elapsed="0.018086"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:02.185222" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:02.185004" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:02.184985" elapsed="0.000317"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:02.185763" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e "t "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-08-23T00:02:02.185443" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:02.186109" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:02.185895" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:02.185877" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-23T00:02:02.186222" 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-08-23T00:02:02.188712" elapsed="0.000156"/>
</kw>
<msg time="2026-08-23T00:02:02.188930" 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-08-23T00:02:02.187648" elapsed="0.001408"/>
</kw>
<kw name="Open 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-08-23T00:02:02.189323" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:02.189673" 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-08-23T00:02:02.187024" elapsed="0.002830"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-23T00:02:02.186475" elapsed="0.003441"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-23T00:02:02.134474" elapsed="0.055539"/>
</kw>
<msg time="2026-08-23T00:02:02.190104" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:02:02.190148" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:02.133903" elapsed="0.056282"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-23T00:02:02.190404" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-23T00:02:02.190296" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:02.190277" 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-08-23T00:02:02.190893" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:02.191222" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-23T00:02:02.191294" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-23T00:02:02.133193" elapsed="0.058209"/>
</kw>
<msg time="2026-08-23T00:02:02.191495" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:02:02.191539" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:02.128475" elapsed="0.063202"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:02.192007" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:02.191758" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:02.191740" elapsed="0.000345"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-08-23T00:02:02.128332" elapsed="0.063777"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-08-23T00:02:02.197460" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:02.197353" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:02.197334" 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-08-23T00:02:02.198689" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:02.198560" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:02.198542" elapsed="0.000214"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-08-23T00:02:02.199188" level="INFO">${karaf_connection_index} = 96</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-08-23T00:02:02.198896" elapsed="0.000319"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-08-23T00:02:02.199603" level="INFO">${current_connection_index} = 98</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-08-23T00:02:02.199368" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-08-23T00:02:02.230831" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "- "c "l "u "s "t "e "r "i "n "[78Cg "[A[78C.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-08-23T00:02:02.200115" elapsed="0.030994"/>
</kw>
<msg time="2026-08-23T00:02:02.231270" level="INFO">${status_write} = PASS</msg>
<msg time="2026-08-23T00:02:02.231317" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "n "e "t "c "o "n "f "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:02.199786" elapsed="0.031568"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-08-23T00:02:02.248831" level="INFO">"t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e "t "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-08-23T00:02:02.231886" elapsed="0.017042"/>
</kw>
<msg time="2026-08-23T00:02:02.249085" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-08-23T00:02:02.249132" level="INFO">${message_wait} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:02.231523" elapsed="0.017647"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:02.249464" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:02.249245" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:02.249226" elapsed="0.000316"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:02.249999" level="INFO"> "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e "t "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-08-23T00:02:02.249703" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:02.250384" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:02.250168" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:02.250149" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-08-23T00:02:02.250497" 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-08-23T00:02:02.252958" elapsed="0.000152"/>
</kw>
<msg time="2026-08-23T00:02:02.253170" 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-08-23T00:02:02.251918" elapsed="0.001379"/>
</kw>
<kw name="Open 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-08-23T00:02:02.253564" elapsed="0.000093"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:02.253910" 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-08-23T00:02:02.251297" elapsed="0.002794"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-08-23T00:02:02.250770" elapsed="0.003385"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-08-23T00:02:02.198260" elapsed="0.055993"/>
</kw>
<msg time="2026-08-23T00:02:02.254345" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:02:02.254389" level="INFO">${message} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:02.197691" elapsed="0.056735"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-08-23T00:02:02.254637" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-08-23T00:02:02.254502" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:02.254483" elapsed="0.000238"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:02.255110" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:02.255438" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-08-23T00:02:02.255509" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-08-23T00:02:02.197015" elapsed="0.058621"/>
</kw>
<msg time="2026-08-23T00:02:02.255731" level="INFO">${status} = PASS</msg>
<msg time="2026-08-23T00:02:02.255775" level="INFO">${output} =  "t "x "t ". "C "R "U "D ". "C "h "e "c "k "_ "D "e "v "i "c "e "_ "D "e "c "o "n "f "i "g "u "r "e "d "_ "O "n "_ "S "e ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:02.192369" elapsed="0.063443"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:02.256130" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:02.255886" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:02.255869" elapsed="0.000337"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-08-23T00:02:02.192232" elapsed="0.063998"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-08-23T00:02:02.063810" elapsed="0.192448"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-08-23T00:02:02.061396" elapsed="0.194919"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-08-23T00:02:02.056259" elapsed="0.200111"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-08-23T00:02:02.055816" elapsed="0.200599"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-08-23T00:02:02.052083" elapsed="0.204386"/>
</kw>
<kw name="Wait_Device_Fully_Removed" owner="NetconfKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Device_Completely_Gone" owner="NetconfKeywords">
<kw name="Check_Device_Has_No_Netconf_Connector" owner="NetconfKeywords">
<kw name="Count_Netconf_Connectors_For_Device" owner="NetconfKeywords">
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:02:02.269659" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:02:02.267531" elapsed="0.002155"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:02.270005" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-08-23T00:02:02.269855" elapsed="0.000244"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-08-23T00:02:02.269738" elapsed="0.000388"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:02.270430" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:02.270190" elapsed="0.000298"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:02:02.271243" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:02:02.270760" elapsed="0.000510"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:02.270512" elapsed="0.000796"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:02.271496" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:02.271333" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:02.270173" elapsed="0.001415"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-23T00:02:02.271626" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:02:02.271777" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-23T00:02:02.267079" elapsed="0.004724"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-23T00:02:02.271849" elapsed="0.000026"/>
</return>
<msg time="2026-08-23T00:02:02.271993" level="INFO">${uri} = /rests/data/network-topology:network-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>operational</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-23T00:02:02.266571" elapsed="0.005448"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:02.279257" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:02.279005" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:02.279714" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:02.279453" 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-08-23T00:02:02.295247" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:02:02.295570" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1011'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}} 
 </msg>
<msg time="2026-08-23T00:02:02.295858" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:02:02.281900" elapsed="0.014020"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:02.279825" elapsed="0.016192"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:02.296416" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:02.296076" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:02.279807" elapsed="0.016837"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:02.304059" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"topology-netconf","topology-types":{"netconf-node-topology:topology-netconf":{"ssh-transport-topology-parameters":{"mac":{"mac-alg":["hmac-sha2-256","hmac-sha2-512","hmac-sha1"]},"host-key":{"host-key-alg":["ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519","rsa-sha2-512","rsa-sha2-256","ssh-rsa"]},"key-exchange":{"key-exchange-alg":["sntrup761x25519-sha512","mlkem768x25519-sha256","mlkem1024nistp384-sha384","mlkem768nistp256-sha256","curve25519-sha256","curve448-sha512","ecdh-sha2-nistp521","ecdh-sha2-nistp384","ecdh-sha2-nistp256","diffie-hellman-group-exchange-sha256","diffie-hellman-group18-sha512","diffie-hellman-group17-sha512","diffie-hellman-group16-sha512","diffie-hellman-group15-sha512","diffie-hellman-group14-sha256"]},"encryption":{"encryption-alg":["chacha20-poly1305","aes128-ctr","aes192-ctr","aes256-ctr","AEAD_AES_128_GCM","AEAD_AES_256_GCM","aes128-cbc","aes192-cbc","aes256-cbc"]}}}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:02.298991" elapsed="0.005148"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:02.298468" elapsed="0.005763"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:02.298426" elapsed="0.005845"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:02.308096" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:02.304696" elapsed="0.003467"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:02.304354" elapsed="0.003860"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:02.304329" elapsed="0.003920"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:02:02.309103" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:02:02.308477" 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-08-23T00:02:02.309570" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:02.309244" elapsed="0.000435"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:02:02.310265" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:02:02.309961" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:02.309721" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:02.309218" elapsed="0.001132"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:02:02.310896" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:02:02.310507" 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-08-23T00:02:02.311225" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:02.310994" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:02:02.311782" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:02:02.311464" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:02.311308" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:02.310976" 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-08-23T00:02:02.312011" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-08-23T00:02:02.312840" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:02:02.312516" 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-08-23T00:02:02.313019" elapsed="0.002359"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-08-23T00:02:02.297490" elapsed="0.017952"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-08-23T00:02:02.315637" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-08-23T00:02:02.315511" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:02.315493" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-08-23T00:02:02.318873" level="INFO">${text_normalized} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-08-23T00:02:02.315847" elapsed="0.003057"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-08-23T00:02:02.318957" elapsed="0.000029"/>
</return>
<msg time="2026-08-23T00:02:02.319116" level="INFO">${response_text} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-08-23T00:02:02.274666" elapsed="0.044477"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-08-23T00:02:02.319202" elapsed="0.000026"/>
</return>
<msg time="2026-08-23T00:02:02.319350" level="INFO">${mounts} = {
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topo...</msg>
<var>${mounts}</var>
<arg>${uri}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-08-23T00:02:02.272233" elapsed="0.047145"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-08-23T00:02:02.319807" level="INFO">{
 "network-topology:network-topology": {
  "topology": [
   {
    "topology-id": "topology-netconf",
    "topology-types": {
     "netconf-node-topology:topology-netconf": {
      "ssh-transport-topology-parameters": {
       "encryption": {
        "encryption-alg": [
         "AEAD_AES_128_GCM",
         "AEAD_AES_256_GCM",
         "aes128-cbc",
         "aes128-ctr",
         "aes192-cbc",
         "aes192-ctr",
         "aes256-cbc",
         "aes256-ctr",
         "chacha20-poly1305"
        ]
       },
       "host-key": {
        "host-key-alg": [
         "ecdsa-sha2-nistp256",
         "ecdsa-sha2-nistp384",
         "ecdsa-sha2-nistp521",
         "rsa-sha2-256",
         "rsa-sha2-512",
         "ssh-ed25519",
         "ssh-rsa"
        ]
       },
       "key-exchange": {
        "key-exchange-alg": [
         "curve25519-sha256",
         "curve448-sha512",
         "diffie-hellman-group-exchange-sha256",
         "diffie-hellman-group14-sha256",
         "diffie-hellman-group15-sha512",
         "diffie-hellman-group16-sha512",
         "diffie-hellman-group17-sha512",
         "diffie-hellman-group18-sha512",
         "ecdh-sha2-nistp256",
         "ecdh-sha2-nistp384",
         "ecdh-sha2-nistp521",
         "mlkem1024nistp384-sha384",
         "mlkem768nistp256-sha256",
         "mlkem768x25519-sha256",
         "sntrup761x25519-sha512"
        ]
       },
       "mac": {
        "mac-alg": [
         "hmac-sha1",
         "hmac-sha2-256",
         "hmac-sha2-512"
        ]
       }
      }
     }
    }
   }
  ]
 }
}
</msg>
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-08-23T00:02:02.319537" elapsed="0.000366"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:02:02.320449" level="INFO">${actual_count} = 0</msg>
<var>${actual_count}</var>
<arg>len('''${mounts}'''.split('"node-id": "${device_name}"'))-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:02:02.320059" elapsed="0.000417"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="PASS" start="2026-08-23T00:02:02.320523" elapsed="0.000028"/>
</return>
<msg time="2026-08-23T00:02:02.320695" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="PASS" start="2026-08-23T00:02:02.258829" elapsed="0.061903"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-08-23T00:02:02.321146" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-08-23T00:02:02.320888" elapsed="0.000312"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="PASS" start="2026-08-23T00:02:02.258361" elapsed="0.062898"/>
</kw>
<kw name="Generate URI" owner="Restconf">
<kw name="Generate RFC8040 URI" owner="Restconf">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:02:02.332000" level="INFO">${node_value_path} = </msg>
<var>${node_value_path}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:02:02.329759" elapsed="0.002268"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:02:02.332703" level="INFO">${node_value_path} = /topology=topology-netconf</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:02:02.332361" elapsed="0.000401"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-08-23T00:02:02.332211" elapsed="0.000590"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:02:02.333354" level="INFO">${node_value_path} = /topology=topology-netconf/node=netconf-test-device</msg>
<var>${node_value_path}</var>
<arg>${node_value_path}/${nv}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:02:02.333033" elapsed="0.000348"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-08-23T00:02:02.332884" elapsed="0.000533"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-08-23T00:02:02.332080" elapsed="0.001367"/>
</for>
<if>
<branch type="IF" condition="&quot;${datastore_flag}&quot; == &quot;config&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-08-23T00:02:02.334233" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-08-23T00:02:02.333767" elapsed="0.000493"/>
</kw>
<status status="PASS" start="2026-08-23T00:02:02.333512" elapsed="0.000785"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/data/${identifier}${node_value_path}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:02.334490" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:02.334322" elapsed="0.000225"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${uri}</var>
<arg>${RESTCONF_ROOT}/operations/${identifier}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:02.334746" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-08-23T00:02:02.334572" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:02.333494" elapsed="0.001330"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-23T00:02:02.334859" elapsed="0.000026"/>
</return>
<msg time="2026-08-23T00:02:02.335007" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>${identifier}</arg>
<arg>${datastore_flag}</arg>
<arg>@{node_value_list}</arg>
<status status="PASS" start="2026-08-23T00:02:02.329174" elapsed="0.005860"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-08-23T00:02:02.335081" elapsed="0.000026"/>
</return>
<msg time="2026-08-23T00:02:02.335224" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config</msg>
<var>${uri}</var>
<arg>network-topology:network-topology</arg>
<arg>config</arg>
<arg>topology=topology-netconf</arg>
<arg>node=${device_name}</arg>
<doc>Returns the proper URI to use. Variable input error checking is done to ensure the ${datastore_flag} variable
is config, operational or rpc. @{node_value_list} is expected to be in the format of node=value. RFC8040 can
use that as is with '=' delimiter</doc>
<status status="PASS" start="2026-08-23T00:02:02.328611" elapsed="0.006638"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-08-23T00:02:02.342707" level="INFO">GET Request : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 path_url=/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node02rgc6xlh841a1pm04qf3g71dn2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-08-23T00:02:02.342866" level="INFO">GET Response : url=http://10.30.170.12:8181/rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-08-23T00:02:02.342998" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-08-23T00:02:02.336020" elapsed="0.007014"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} == 404 or ${resp.status_code} == 409">
<return>
<status status="PASS" start="2026-08-23T00:02:02.349366" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-08-23T00:02:02.343146" elapsed="0.006302"/>
</branch>
<status status="PASS" start="2026-08-23T00:02:02.343119" elapsed="0.006363"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:02.349713" elapsed="0.000109"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The request failed with code ${resp.status_code}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-08-23T00:02:02.350037" elapsed="0.000028"/>
</kw>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for /rests/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=config in node2 using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="PASS" start="2026-08-23T00:02:02.335620" elapsed="0.014525"/>
</kw>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Check that the specified device has no Netconf connectors nor associated data.</doc>
<status status="PASS" start="2026-08-23T00:02:02.257862" elapsed="0.092358"/>
</kw>
<arg>${timeout}</arg>
<arg>${period}</arg>
<arg>Check_Device_Completely_Gone</arg>
<arg>${device_name}</arg>
<arg>session=${session}</arg>
<arg>log_response=${log_response}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-08-23T00:02:02.257275" elapsed="0.093014"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>session=${NODE_SETTER}</arg>
<doc>Wait until all netconf connectors for the device with the given name disappear.
Call of Remove_Device_From_Netconf returns before netconf gets
around deleting the device's connector. To ensure the device is
really gone from netconf, use this keyword to make sure all
connectors disappear. If a call to Remove_Device_From_Netconf
is not made before using this keyword, the wait will fail.
Using this keyword is more readable than putting the WUKS below
into a test case.</doc>
<status status="PASS" start="2026-08-23T00:02:02.256802" elapsed="0.093574"/>
</kw>
<doc>Check that the device is going to be gone from the setter node. Fail if still there after one minute.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-08-23T00:02:02.051157" elapsed="0.299374"/>
</test>
<kw name="Teardown_Everything" type="TEARDOWN">
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-08-23T00:02:02.351710" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-08-23T00:02:02.351604" elapsed="0.000465"/>
</kw>
<kw name="Stop_Testtool" owner="NetconfKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-08-23T00:02:02.353673" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-08-23T00:02:02.353202" elapsed="0.000510"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-08-23T00:02:02.353924" elapsed="0.000309"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-08-23T00:02:02.352883" elapsed="0.001444"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-08-23T00:02:02.685940" level="INFO">[?2004l^C[?2004h[jenkins@releng-63244-201-1-mininet-ovs-217-0 ~]&gt;</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-08-23T00:02:02.354530" elapsed="0.331537"/>
</kw>
<kw name="Get File" owner="SSHLibrary">
<msg time="2026-08-23T00:02:02.738732" level="INFO">'testtool--netconf-clustering-txt-CRUD.1787443033.867.log' -&gt; '/w/workspace/netconf-csit-3node-clustering-only-titanium/testtool--netconf-clustering-txt-CRUD.1787443033.867.log'</msg>
<arg>${testtool_log}</arg>
<doc>Downloads file(s) from the remote machine to the local machine.</doc>
<status status="PASS" start="2026-08-23T00:02:02.686281" elapsed="0.052591"/>
</kw>
<doc>Stop testtool and download its log.</doc>
<status status="PASS" start="2026-08-23T00:02:02.352356" elapsed="0.386685"/>
</kw>
<doc>Teardown the test infrastructure, perform cleanup and release all resources.</doc>
<status status="PASS" start="2026-08-23T00:02:02.351287" elapsed="0.387874"/>
</kw>
<doc>netconf clustered CRUD test suite.

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

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


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

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

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

The suite checks the integrity of the presence of the device and the data
seen on the device only for nodes that have at least one of the roles
("CONFIGURER", "SETTER" and "CHECKER") assigned. A better design would have
a "checker list" of sorts and have only one checking test case that runs
through the check list and performs the test on each node listed. However
this currently has fairly low priority due to Beryllium delivery date so
it was left out.</doc>
<status status="FAIL" start="2026-08-22T23:57:08.800243" elapsed="293.938989"/>
</suite>
<status status="FAIL" start="2026-08-22T23:16:28.187097" elapsed="2734.555118"/>
</suite>
<statistics>
<total>
<stat pass="57" fail="83" skip="0">All Tests</stat>
</total>
<tag>
<stat pass="28" fail="12" skip="0">critical</stat>
<stat pass="0" fail="16" skip="0">https://bugs.opendaylight.org/show_bug.cgi?id=4968</stat>
<stat pass="0" fail="7" skip="0">https://bugs.opendaylight.org/show_bug.cgi?id=5761</stat>
<stat pass="0" fail="3" skip="0">https://bugs.opendaylight.org/show_bug.cgi?id=5762</stat>
<stat pass="0" fail="4" skip="0">https://bugs.opendaylight.org/show_bug.cgi?id=6067</stat>
</tag>
<suite>
<stat name="netconf-clustering.txt" id="s1" pass="57" fail="83" skip="0">netconf-clustering.txt</stat>
<stat name="CRUD" id="s1-s1" pass="11" fail="15" skip="0">netconf-clustering.txt.CRUD</stat>
<stat name="Bug8086" id="s1-s2" pass="11" fail="15" skip="0">netconf-clustering.txt.Bug8086</stat>
<stat name="Restart Odl With Tell Based False" id="s1-s3" pass="2" fail="1" skip="0">netconf-clustering.txt.Restart Odl With Tell Based False</stat>
<stat name="Entity" id="s1-s4" pass="4" fail="13" skip="0">netconf-clustering.txt.Entity</stat>
<stat name="Restart Odl With Tell Based False" id="s1-s5" pass="2" fail="1" skip="0">netconf-clustering.txt.Restart Odl With Tell Based False</stat>
<stat name="Outages" id="s1-s6" pass="12" fail="10" skip="0">netconf-clustering.txt.Outages</stat>
<stat name="Entity" id="s1-s7" pass="4" fail="13" skip="0">netconf-clustering.txt.Entity</stat>
<stat name="CRUD" id="s1-s8" pass="11" fail="15" skip="0">netconf-clustering.txt.CRUD</stat>
</suite>
</statistics>
<errors>
<msg time="2026-08-22T23:16:28.452596" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/NetconfKeywords.robot' on line 20: Suite 'netconf-clustering.txt.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-08-22T23:16:28.475068" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/NexusKeywords.robot' on line 20: Suite 'netconf-clustering.txt.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-08-22T23:16:28.542555" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/SSHKeywords.robot' on line 16: Suite 'netconf-clustering.txt.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-08-22T23:16:28.578945" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/Utils.robot' on line 4: Suite 'netconf-clustering.txt.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-08-22T23:16:28.651924" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/RemoteBash.robot' on line 25: Suite 'netconf-clustering.txt.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-08-22T23:16:28.685133" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/KarafKeywords.robot' on line 9: Suite 'netconf-clustering.txt.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-08-22T23:27:12.338534" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/KarafKeywords.robot' on line 9: Suite 'netconf-clustering.txt.Entity' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-08-22T23:27:12.339840" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/SSHKeywords.robot' on line 16: Suite 'netconf-clustering.txt.Entity' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-08-22T23:27:12.340373" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/Utils.robot' on line 4: Suite 'netconf-clustering.txt.Entity' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-08-22T23:27:12.350542" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/NetconfKeywords.robot' on line 20: Suite 'netconf-clustering.txt.Entity' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-08-22T23:27:12.352163" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/NexusKeywords.robot' on line 20: Suite 'netconf-clustering.txt.Entity' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-08-22T23:27:12.354166" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/RemoteBash.robot' on line 25: Suite 'netconf-clustering.txt.Entity' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-08-22T23:36:42.949112" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/KarafKeywords.robot' on line 9: Suite 'netconf-clustering.txt.Outages' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-08-22T23:36:42.950322" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/SSHKeywords.robot' on line 16: Suite 'netconf-clustering.txt.Outages' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-08-22T23:36:42.950845" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/Utils.robot' on line 4: Suite 'netconf-clustering.txt.Outages' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-08-22T23:36:42.960770" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/NetconfKeywords.robot' on line 20: Suite 'netconf-clustering.txt.Outages' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-08-22T23:36:42.962270" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/NexusKeywords.robot' on line 20: Suite 'netconf-clustering.txt.Outages' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-08-22T23:36:42.964352" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/RemoteBash.robot' on line 25: Suite 'netconf-clustering.txt.Outages' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-08-22T23:48:26.140772" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/KarafKeywords.robot' on line 9: Suite 'netconf-clustering.txt.Entity' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-08-22T23:48:26.142557" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/SSHKeywords.robot' on line 16: Suite 'netconf-clustering.txt.Entity' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-08-22T23:48:26.143853" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/Utils.robot' on line 4: Suite 'netconf-clustering.txt.Entity' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-08-22T23:48:26.154091" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/NetconfKeywords.robot' on line 20: Suite 'netconf-clustering.txt.Entity' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-08-22T23:48:26.155718" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/NexusKeywords.robot' on line 20: Suite 'netconf-clustering.txt.Entity' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-08-22T23:48:26.157735" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/RemoteBash.robot' on line 25: Suite 'netconf-clustering.txt.Entity' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-08-22T23:57:08.809285" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/NetconfKeywords.robot' on line 20: Suite 'netconf-clustering.txt.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-08-22T23:57:08.812820" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/NexusKeywords.robot' on line 20: Suite 'netconf-clustering.txt.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-08-22T23:57:08.817258" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/SSHKeywords.robot' on line 16: Suite 'netconf-clustering.txt.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-08-22T23:57:08.817792" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/Utils.robot' on line 4: Suite 'netconf-clustering.txt.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-08-22T23:57:08.825936" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/RemoteBash.robot' on line 25: Suite 'netconf-clustering.txt.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-08-22T23:57:08.826730" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/KarafKeywords.robot' on line 9: Suite 'netconf-clustering.txt.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
</errors>
</robot>
